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/177] 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 6eeb65e5e..6e730882a 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 a6b460b98..5a8f4cf43 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/177] 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 000000000..034e84803 --- /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/177] 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 000000000..676233afa --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,21 @@ +# Node.js +# Build a general Node.js project with npm. +# Add steps that analyze code, save build artifacts, deploy, and more: +# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript + +trigger: +- master + +pool: + vmImage: ubuntu-latest + +steps: +- task: NodeTool@0 + inputs: + versionSpec: '10.x' + displayName: 'Install Node.js' + +- script: | + npm install + npm run build + displayName: 'npm install and build' 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/177] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..c9903e895 --- /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/177] 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 000000000..e8a93615c --- /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/177] 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 000000000..dd84ea782 --- /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 000000000..48d5f81fa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..bbcbbe7d6 --- /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/177] Update CNAME --- CNAME | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CNAME b/CNAME index c9903e895..aa0085b19 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/177] 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 298a76bbc..206445bb3 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/177] 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 000000000..709c9a747 --- /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 426afca7b0e34b93e8ee306b04d72842691f8fe6 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 16 Sep 2025 15:26:43 +1200 Subject: [PATCH 010/177] 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 3cd40ef00..12917553b 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 973da2b09..4e74c3a0f 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 8cf44257f..4bcc5bb77 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 ddbeb5ade..0622a2db9 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 098d7e9c6..330e941b7 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 790aeee00..bef0e8fa2 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 3d343d1ab..4217c8418 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 d65563c04..c8583916c 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 8b9306d7f..84ea3123b 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 7d092c15c..d7bce1ec7 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 887ca6b04..0e1eff066 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 c47bf47cb..a46d5e44a 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 3fa42fb8088d484a8ad6cf6814a17e912f34541c Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 16 Sep 2025 16:00:56 +1200 Subject: [PATCH 011/177] 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 c193ce358..d662d39a0 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 a46d5e44a..203eaf598 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 1e8ac963a..9592c6887 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 c6dca5b43cf98530946a0b7348f26498e3ed1a4f Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 16 Sep 2025 20:56:30 +1200 Subject: [PATCH 012/177] 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 d7bce1ec7..caba743b1 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 111d64b42466e02734adce6e2c3b949ee403d417 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Wed, 17 Sep 2025 14:42:17 +1200 Subject: [PATCH 013/177] 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 c8583916c..0e11c8d19 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 7091556545ca797a9c2922436b827a36c4622fa0 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Wed, 17 Sep 2025 14:50:01 +1200 Subject: [PATCH 014/177] 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 0e11c8d19..fb6dd21fe 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 0b4eaea0d7e39f630f15c83d6ac65d8f1e966413 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Wed, 17 Sep 2025 14:58:30 +1200 Subject: [PATCH 015/177] 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 330e941b7..cf1915036 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 3183235608d667e30e7c5d4aea1066329a3b5140 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 18 Sep 2025 14:41:15 +1200 Subject: [PATCH 016/177] 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 fb6dd21fe..8d61113a4 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 caba743b1..15e178f8c 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 203eaf598..8a6bc2d8a 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 9592c6887..a859ca797 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 d33d7b43d8f101c14d772e851258498cc9a72d6e Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Mon, 22 Sep 2025 09:40:39 +1200 Subject: [PATCH 017/177] 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 8a6bc2d8a..a11500559 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 82a541580a6a45018e573da02b042b237043335c Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Mon, 22 Sep 2025 09:41:09 +1200 Subject: [PATCH 018/177] 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 84ea3123b..bdde4b857 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 9d8ec4dc88ad54e09083895c2290f2b2cf2f29d4 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Mon, 22 Sep 2025 09:59:15 +1200 Subject: [PATCH 019/177] 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 12917553b..99d189131 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 bef0e8fa2..29c5e1118 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 4217c8418..28453121c 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 bdde4b857..6f92fa5be 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 0e1eff066..a9b193d79 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 75eaacb8b0ce4eda5f870166d396c52c189827e9 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Mon, 22 Sep 2025 10:04:13 +1200 Subject: [PATCH 020/177] 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 cf1915036..bde3b1299 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 7d6b0db99..ed66a50af 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 429237ff55139d5a468b6753ad19bc6c0bbaf7a2 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 021/177] 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 | 36 +- .../wallet/wdk/src/sequence/types/sessions.ts | 6 + packages/wallet/wdk/test/sessions.test.ts | 39 +- pnpm-lock.yaml | 1767 ++++---- 15 files changed, 4071 insertions(+), 3383 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 a42d143d6..967fad8fe 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 79ca49296..a9e6b4440 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 1bc32aed4..d84206d67 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 000000000..6bf1086d4 --- /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 098d7e9c6..a85c16469 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -6,6 +6,7 @@ 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 { Extensions } from '@0xsequence/wallet-primitives' +import { ExplicitSessionConfig } from '../../wdk/src/sequence/types/sessions.js' const { PermissionBuilder, ERC20PermissionBuilder } = Utils @@ -58,7 +59,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 @@ -221,7 +222,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 @@ -504,7 +505,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 @@ -572,7 +573,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 @@ -661,7 +662,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 @@ -758,7 +759,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 @@ -863,7 +864,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 @@ -982,7 +983,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 76b62a3f3..623fc1faa 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 4bff6bdb4..dcc7d81ce 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 c920a0ac5..3770dd880 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 ad251cab4..a488c98b7 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 a554f86fe..c65bc0ffc 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 773a176e5..c2909696d 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 c47bf47cb..bd6a15e38 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -1,8 +1,7 @@ -import { Signers as CoreSigners, Envelope } from '@0xsequence/wallet-core' +import { Envelope, type ExplicitSession } from '@0xsequence/wallet-core' import { Attestation, Config, - Constants, GenericTree, Payload, Signature as SequenceSignature, @@ -14,11 +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' - -export type AuthorizeImplicitSessionArgs = { - target: string - applicationData?: Hex.Hex -} +import { AuthorizeImplicitSessionArgs } from './types/sessions.js' export interface SessionsInterface { /** @@ -91,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". @@ -112,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. @@ -120,8 +109,7 @@ export interface SessionsInterface { */ modifyExplicitSession( walletAddress: Address.Address, - sessionAddress: Address.Address, - permissions: CoreSigners.Session.ExplicitParams, + explicitSession: ExplicitSession, origin?: string, ): Promise @@ -326,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 000000000..1efef2490 --- /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 bd1500e5d..f6d8a144b 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 555a669ef..f06089e93 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 @@ -34,13 +34,13 @@ importers: 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) + 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 @@ -68,13 +68,13 @@ importers: 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) + 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@17.6.3) + 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@17.6.3) + 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@17.6.3)) + 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@17.6.3) + version: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) packages/wallet/dapp-client: dependencies: @@ -286,16 +286,16 @@ 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@17.6.3)) + 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: ^17.2.2 version: 17.6.3 @@ -304,7 +304,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.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@17.6.3)) + 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@17.6.3) + 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,16 +397,16 @@ 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@17.6.3)) + 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: ^17.2.2 version: 17.6.3 @@ -415,34 +415,34 @@ 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.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': @@ -586,167 +586,167 @@ 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==} + '@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,172 +759,181 @@ 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'} - '@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] + '@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} @@ -941,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==} @@ -963,56 +972,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.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.2': - resolution: {integrity: sha512-ovqjR8NjCBdBf1U+R/Gvn0RazTtXS9n6wqs84iFaCS1NHbw9ksVE4dfmsYcLoyUVd9BWE0bjkphOWrrz8uz/uw==} + '@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.2': - resolution: {integrity: sha512-I8d4W7tPqbdbHRI4z1iBfaoJIBrEG4fnWKIe+Rj1vIucNZ5cEinfwkBt3RcDF00bFRZRDpvKuDjgMFD3OyRBnw==} + '@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.2': - resolution: {integrity: sha512-lvhz02dU3Ec5thzfQ2RCUeOFADjNkS/px1W7MBt7HMhf0/amMfT8Z/aXOwEA+cVWN7HSDRSUc8hHILoHmvajsg==} + '@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.2': - resolution: {integrity: sha512-v+5PPfL8UP+KKHS3Mox7QMoeFdMlaV0zeNMIF7eLC4qTiVSO0RPNnK0nkBZSD5BEkkf//c+vI9s/iHxddCZchA==} + '@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.2': - resolution: {integrity: sha512-PHLYOC9W2cu6I/JEKo77+LW4uPNvyEQiSkVRUQPsOIsf01PRr8PtPhwtz3XNnC9At8CrzPkzqQ9/kYDg4R4Inw==} + '@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.2': - resolution: {integrity: sha512-lpmUF9FfLFns4JbTu+5aJGA8aR9dXaA12eoNe9CJbVkGib0FDiPa4kBGTwy0xDxKNGlv3bLDViyx1U+qafmuJQ==} + '@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.2': - resolution: {integrity: sha512-aMjogoGnRepas0LQ/PBPsvvUzj+IoXw2IoDSEShEtrsu2toBiaxEWzOQuPZ8nie8+1iF7TA63S7rlp3YWAjNEg==} + '@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.2': - resolution: {integrity: sha512-FxwauyexSFu78wEqR/+NB9MnqXVj6SxJKwcVs2CRjeSX/jBagDCgtR2W36PZUYm0WPgY1pQ3C1+nn7zSnwROuw==} + '@next/swc-win32-x64-msvc@15.5.3': + resolution: {integrity: sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1021,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': @@ -1049,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] @@ -1209,11 +1228,11 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.9': - resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} + '@types/node@20.19.17': + resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==} - '@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==} @@ -1242,63 +1261,63 @@ packages: '@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': @@ -1339,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 @@ -1387,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: @@ -1399,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: @@ -1460,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==} @@ -1532,15 +1562,15 @@ 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==} 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: @@ -1561,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'} @@ -1613,13 +1646,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'} @@ -1635,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==} @@ -1668,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: '*' @@ -1711,8 +1737,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: @@ -1790,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 @@ -1834,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' @@ -1852,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: @@ -1908,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: @@ -1932,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: @@ -2150,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==} @@ -2193,25 +2224,22 @@ 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.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'} @@ -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.2: - resolution: {integrity: sha512-oH1rmFso+84NIkocfuxaGKcXIjMUTmnzV2x0m8qsYtB4gD6iflLMESXt5XJ8cFgWMBei4v88rNr/j+peNg72XA==} + 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 @@ -3065,8 +3090,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 +3132,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'} @@ -3129,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: @@ -3150,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==} @@ -3197,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: @@ -3272,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: @@ -3287,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: @@ -3336,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: @@ -3394,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==} @@ -3460,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: @@ -3473,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: @@ -3600,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 @@ -3639,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 @@ -3696,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 @@ -3712,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 @@ -3726,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: @@ -3813,92 +3834,92 @@ 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 - '@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': {} @@ -3906,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 @@ -3931,114 +3952,129 @@ 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/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 + '@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': @@ -4049,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.2': {} + '@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.2': + '@next/swc-darwin-arm64@15.5.3': optional: true - '@next/swc-darwin-x64@15.4.2': + '@next/swc-darwin-x64@15.5.3': optional: true - '@next/swc-linux-arm64-gnu@15.4.2': + '@next/swc-linux-arm64-gnu@15.5.3': optional: true - '@next/swc-linux-arm64-musl@15.4.2': + '@next/swc-linux-arm64-musl@15.5.3': optional: true - '@next/swc-linux-x64-gnu@15.4.2': + '@next/swc-linux-x64-gnu@15.5.3': optional: true - '@next/swc-linux-x64-musl@15.4.2': + '@next/swc-linux-x64-musl@15.5.3': optional: true - '@next/swc-win32-arm64-msvc@15.4.2': + '@next/swc-win32-arm64-msvc@15.5.3': optional: true - '@next/swc-win32-x64-msvc@15.4.2': + '@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 @@ -4148,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 @@ -4235,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: @@ -4255,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 @@ -4263,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: @@ -4281,7 +4325,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 20.19.9 + '@types/node': 20.19.17 '@types/inquirer@6.5.0': dependencies: @@ -4296,11 +4340,11 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.19.9': + '@types/node@20.19.17': dependencies: undici-types: 6.21.0 - '@types/node@22.16.5': + '@types/node@22.18.6': dependencies: undici-types: 6.21.0 @@ -4326,7 +4370,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 20.19.9 + '@types/node': 20.19.17 '@types/tinycolor2@1.4.6': {} @@ -4336,15 +4380,15 @@ snapshots: 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 @@ -4353,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 @@ -4413,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@17.6.3))': + '@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@17.6.3) + vitest: 3.2.4(@types/node@22.18.6)(happy-dom@17.6.3) transitivePeerDependencies: - supports-color @@ -4453,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: @@ -4477,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 @@ -4526,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: @@ -4536,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: @@ -4622,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 @@ -4698,16 +4746,16 @@ 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: {} - 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: @@ -4749,6 +4797,8 @@ snapshots: chardet@0.7.0: {} + chardet@2.1.0: {} + check-error@2.1.1: {} chokidar@3.6.0: @@ -4797,18 +4847,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: {} @@ -4830,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: {} @@ -4864,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: @@ -4913,7 +4951,7 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.4: + detect-libc@2.1.0: optional: true diff@4.0.2: {} @@ -5054,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: {} @@ -5097,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 @@ -5115,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 @@ -5129,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: @@ -5144,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 @@ -5162,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 @@ -5232,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: {} @@ -5260,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 @@ -5305,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: @@ -5370,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 @@ -5497,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 @@ -5516,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: {} @@ -5560,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 @@ -5577,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: @@ -5584,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: @@ -5595,9 +5636,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 @@ -5735,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: {} @@ -5749,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 @@ -5792,8 +5830,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - json-buffer@3.0.1: {} json-canonicalize@2.0.0: {} @@ -5806,7 +5842,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -5825,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: @@ -5902,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: @@ -5912,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: @@ -5983,25 +6019,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.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@next/env': 15.4.2 + '@next/env': 15.5.3 '@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) + 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.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.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' - babel-plugin-macros @@ -6012,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 @@ -6027,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 @@ -6131,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 @@ -6191,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 @@ -6209,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: @@ -6243,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: {} @@ -6298,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 @@ -6320,7 +6356,7 @@ snapshots: pvutils@1.1.3: {} - quansync@0.2.10: {} + quansync@0.2.11: {} queue-microtask@1.2.3: {} @@ -6331,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: @@ -6420,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: {} @@ -6516,34 +6554,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 +6626,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 @@ -6608,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: {} @@ -6631,8 +6664,6 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - stackback@0.0.2: {} std-env@3.9.0: {} @@ -6652,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: @@ -6706,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: {} @@ -6722,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: @@ -6762,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: @@ -6776,7 +6807,7 @@ snapshots: tinyrainbow@2.0.0: {} - tinyspy@4.0.3: {} + tinyspy@4.0.4: {} title-case@2.1.1: dependencies: @@ -6799,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 @@ -6821,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: @@ -6887,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 @@ -6943,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: @@ -6960,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 @@ -6981,45 +7012,45 @@ 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@17.6.3): + 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 + '@types/node': 22.18.6 happy-dom: 17.6.3 transitivePeerDependencies: - jiti @@ -7111,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 ed2a81acf79c9ae26d14aa23570e3e69446728d0 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Tue, 23 Sep 2025 21:38:44 +0300 Subject: [PATCH 022/177] 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 623fc1faa..14fbdc329 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 6281b2ca3624e88cbeb5927aeb2de5db8217e224 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Wed, 24 Sep 2025 11:48:41 +0200 Subject: [PATCH 023/177] 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 967fad8fe..a42d143d6 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 a9e6b4440..79ca49296 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 85494a5f65c7d339c30f3eba520af5b214b4805d Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Wed, 24 Sep 2025 19:11:03 +0300 Subject: [PATCH 024/177] 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 dcc7d81ce..6d2b42a6d 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 a488c98b7..62ca16df0 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 46bc6027492d6ed5fa62e2bcdf8817657f0ab339 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Wed, 24 Sep 2025 19:50:59 +0300 Subject: [PATCH 025/177] 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 6d2b42a6d..584b146b7 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 830c08d8ebb57648b64b854816dae2f4ba471e18 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 26 Sep 2025 14:48:28 +0200 Subject: [PATCH 026/177] 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 e18bf7d94..23f175d2f 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 044abf50eb12c9bfa2d4c7a285ed23c25a2d1cb2 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 30 Sep 2025 17:37:55 +1300 Subject: [PATCH 027/177] 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 db4733e2b..05a02da09 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 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 028/177] 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 e8a93615c..ff1a25baf 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 c484c0024e9b557e355b2a6f4594a4eae4c2b300 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 2 Oct 2025 15:03:27 +1300 Subject: [PATCH 029/177] 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 99d189131..316f9a9ad 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 28453121c..2672721c6 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 8d61113a4..46e3d9f52 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 6f92fa5be..a9f5144a1 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 15e178f8c..149b17565 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 a9b193d79..b8efe28c2 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 c30c3ea6bee3f32eb2f5122bc32411e1d40ebeb8 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 7 Oct 2025 05:41:17 +1300 Subject: [PATCH 030/177] 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 79ca49296..0638fbe94 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 db28608fc..d7c0cb617 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 e1a2bd174..66e7c4c4c 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 0e4f30732..274af44eb 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 d680f67f7..a8e850af4 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 23f175d2f..f64a8f005 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 a9e6b4440..0638fbe94 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 d99cd41ce..d95bf19dd 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 ff7077de2e9b812baf0068bfd167d18474601399 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 7 Oct 2025 11:27:34 +1300 Subject: [PATCH 031/177] 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 46e3d9f52..67180acea 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 74ff7da9c2f6c7a8cae71bf55bdc61f3405144f8 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 7 Oct 2025 11:28:02 +1300 Subject: [PATCH 032/177] 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 67180acea..f4e94568d 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 149b17565..6e20d5597 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 bb047b6263a4ad8e392d1c50bd95650a8edd3f38 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 7 Oct 2025 11:28:39 +1300 Subject: [PATCH 033/177] 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 f4e94568d..38ba2056c 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 ed4064af1870a7f6841a19a9378164059795336a 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 034/177] 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 14fbdc329..8689cddb8 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 584b146b7..3f3614888 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 62ca16df0..88146cd8a 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 7e9b483ce2a00e6fc16de843c47ca4cc2dc37f7c 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 035/177] 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 8689cddb8..c29bd0881 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 3f3614888..c6e384486 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 3770dd880..791c37cd5 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 3831cc2dc8cff03a8660273a261034a5c99b4c07 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Fri, 10 Oct 2025 07:32:09 +1300 Subject: [PATCH 036/177] 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 316f9a9ad..c991f955e 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 aa154df91..6a0bd156b 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 c29bd0881..c1048b9e9 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 f59aeb9e0063d974e69db26acb0e9ad119cb2b6d Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Mon, 13 Oct 2025 16:22:33 +0300 Subject: [PATCH 037/177] 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 c1048b9e9..7d1f8e669 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 c6e384486..5b4818bf1 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 ec43955c856e66314d2c8dd35532ebae326c3a4a Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 16 Oct 2025 15:00:59 -0400 Subject: [PATCH 038/177] 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 f63417f9e..25f62ba2a 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 0357eadede53eb25bbd151a43b32f38d04701e2b Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Fri, 17 Oct 2025 14:51:48 +0300 Subject: [PATCH 039/177] 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 7d1f8e669..afe0095d9 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 5b4818bf1..d92936fa2 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 c65bc0ffc..2fa2eaac4 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 b06a1cfc0d3a8f072c72a6c27a16a981908ede74 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 040/177] 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 0a4106482..28bacf399 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 a42d143d6..967fad8fe 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 63fd273bc..73a079116 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 6b1ea35be..29f042bf6 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 b51ee450c..fa04faa2d 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 c35614659..2a3c09e46 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 55bf3f7f2..be043ee98 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 4859839b5..1ff39166f 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 d7c0cb617..952b80f8f 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 6e10f600b..21a2f827b 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 66e7c4c4c..05c2b21bf 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 12260aef4..d04527fa0 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 274af44eb..f9edc19c4 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 a8e850af4..c43cdbab4 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 d95bf19dd..2412059e3 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 af067e95b..e4975daaf 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 d0f4cba93..adbadd236 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 aa0333e53..15772c27d 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 4468f086d..baa473b81 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 11ae0dd64..e2d95ec33 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 5fb0b6724..53c531a9b 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 d84206d67..b36e917ca 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 f64a8f005..000000000 --- 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 0638fbe94..000000000 --- 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 c991f955e..ef3d81b3a 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 cf5b3df46..bc565e1cc 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 c48f42aea..8f57d8aae 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 afe0095d9..ae012f442 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 d92936fa2..4b8a182c9 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 791c37cd5..9ffb334d9 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 88146cd8a..a6ea2ef9b 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 c1eec3cef..3e1355558 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 5b786b0fe..9bbf85a4c 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 c46f67090..c85054794 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 c9a0a7b70..0afb52a87 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 0dbe84ef8..442136904 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 e16a4bee4..bc39ba16b 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 289bf5b64..51160a049 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 f06089e93..ad45d777b 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 8a2704936cd19fa034462cc421bf5fa5f7812f5f 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 041/177] 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 fd760378b..000000000 --- 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 1ff39166f..dc28bfc77 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 29850be34..000000000 --- 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 85e9257f2..000000000 --- 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 952b80f8f..000000000 --- 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 000000000..52362d5c9 --- /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 000000000..3ed5a6962 --- /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 21a2f827b..0768490c9 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 05c2b21bf..996c1baee 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 f9edc19c4..01c928906 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 c43cdbab4..37b2e5a08 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 2412059e3..b41e97806 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 ae012f442..6a7b3572e 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 4b8a182c9..088407359 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 a6ea2ef9b..72e3dbe11 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 442136904..2405e6f2d 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 bc39ba16b..824cb00f6 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 bddb8a3d709745f3cf95e633a8a89e547fa679cb Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 21 Oct 2025 12:26:44 +0200 Subject: [PATCH 042/177] 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 25f62ba2a..b0ef2bbde 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 5556e7ee72d08f0b20ea2c20b18b35dfd8fe121c Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 21 Oct 2025 12:42:17 +0200 Subject: [PATCH 043/177] 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 6b372552c..bfd12d278 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 bb92e561ad0a614e5ffbc371c5912ac684d87996 Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Wed, 22 Oct 2025 19:05:01 +0300 Subject: [PATCH 044/177] 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 088407359..6e6a182d8 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 9c2f3a12c1d7df69ac7636509e312a7a6fef282c Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Fri, 24 Oct 2025 17:07:21 +0300 Subject: [PATCH 045/177] 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 6e6a182d8..2c38fc18b 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 9ffb334d9..d16662c37 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 2fa2eaac4..0995a6701 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 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 046/177] 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 c48f42aea..b10524e42 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 5b786b0fe..05e0a9171 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 494683100..17a890312 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 7bef40ed4728e96f609bbbb697ff0387bc6ec616 Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Mon, 27 Oct 2025 11:20:50 -0400 Subject: [PATCH 047/177] 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 a859ca797..e05d81ae1 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 0909e3e7c5a8dde2b29447d5fecd6224b218c392 Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Thu, 30 Oct 2025 19:12:46 -0400 Subject: [PATCH 048/177] 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 0afb52a87..c4217064b 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 e24a32900..dd8b27b80 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 c6cb53aa8..cd950a5d1 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 2405e6f2d..1d6d39c01 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 136a072e4..6169a361a 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 9ecb034508569818881fe78f262017f88ece0e36 Mon Sep 17 00:00:00 2001 From: Patryk Kalinowski Date: Fri, 31 Oct 2025 18:16:30 +0100 Subject: [PATCH 049/177] 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 3a654edb4..d6316ddf0 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 c4217064b..1ff7a19e4 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 dd8b27b80..143edc0cd 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 cd950a5d1..f037189cb 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 ec60b5bb6ca6de98d9d357dc1b6bffe8f33a850c Mon Sep 17 00:00:00 2001 From: Patryk Kalinowski Date: Tue, 4 Nov 2025 17:45:00 +0100 Subject: [PATCH 050/177] 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 ec0af4487..4eea436ee 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 d6316ddf0..6ee2f2130 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 1ff7a19e4..4274bedff 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 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 051/177] 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 0d6a359ce..dd0a9df8d 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 052/177] 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 034e84803..0d8ac2906 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 053/177] 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 206445bb3..4018e3576 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 054/177] 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 4018e3576..759987dd1 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 055/177] 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 faa8ce1c7..1cf0716bd 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 056/177] 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 000000000..cb7bbaf78 --- /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 057/177] 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 000000000..68b7dfb9f --- /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 9175b15bc5b9bd54c14c7efeac3f77336df43939 Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Mon, 17 Nov 2025 17:41:08 +0000 Subject: [PATCH 058/177] 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 001b9a5f1..a83f23487 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 3d7582cbc..fca976a6e 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 1d6d39c01..be7624cc0 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 bbc06f9b7c8df794bb5d5d0b8995c3f498070a02 Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Mon, 17 Nov 2025 17:50:52 +0000 Subject: [PATCH 059/177] 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 77e15da6c..cd6542245 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 140b3f1ca..a394d8a7f 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 6a0bd156b..58ef96dcb 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 6a7b3572e..6785c18cd 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 b418f1406..c21eaa800 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 c53ada141..0abced190 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 f6d8a144b..9f2add500 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 87da6b9ecbe89419b18109959fff870b1d0f80e2 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 30 Oct 2025 09:07:47 +1300 Subject: [PATCH 060/177] 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 e373b0469..e20f3a5b7 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 4e74c3a0f..481b91c27 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 a9f5144a1..c8ef19213 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 b8efe28c2..733604da0 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 f1e5dcc50258f200fd5bcb509048c7634cc113db Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Fri, 31 Oct 2025 12:11:39 +1300 Subject: [PATCH 061/177] 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 e20f3a5b7..cd72b2256 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 481b91c27..71b112865 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 58ef96dcb..bfbc28b17 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 c8f05ee8d..1359abdbe 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 c8ef19213..c3f67ca24 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 733604da0..a1fd0fe23 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 9f2add500..67e081fb0 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 854184452f34d046a619b40e6aaa2ff7d8faa7ff Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 18 Nov 2025 10:17:58 +1300 Subject: [PATCH 062/177] 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 a83f23487..527d7c3e7 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 d91f5106a2730845105b90fecd203686ca703c4f Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Wed, 19 Nov 2025 15:24:43 +0300 Subject: [PATCH 063/177] 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 3e1355558..7d382d41c 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 5db652082e59d5e36cf99fde5472a110a04621c9 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Wed, 19 Nov 2025 15:35:45 +0300 Subject: [PATCH 064/177] 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 a394d8a7f..e9e821d4b 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 f2cd6716f28cc68ea2baa0551446ff2e0fc3d2b4 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 20 Nov 2025 10:02:47 +1300 Subject: [PATCH 065/177] 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 be7624cc0..6a2d8b128 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 fe4f5bb70db5c32fb904f45346cb8369de1f2567 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 20 Nov 2025 10:04:31 +1300 Subject: [PATCH 066/177] SSR safety test --- packages/wallet/wdk/package.json | 3 +- packages/wallet/wdk/test/test-ssr-safety.mjs | 308 +++++++++++++++++++ turbo.json | 3 +- 3 files changed, 312 insertions(+), 2 deletions(-) create mode 100644 packages/wallet/wdk/test/test-ssr-safety.mjs diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 9bbf85a4c..4d5b752a6 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -10,8 +10,9 @@ "scripts": { "build": "tsc", "dev": "tsc --watch", - "test": "vitest run", + "test": "vitest run && node test/test-ssr-safety.mjs", "test:coverage": "vitest run --coverage", + "test:ssr": "node test/test-ssr-safety.mjs", "typecheck": "tsc --noEmit", "clean": "rimraf dist" }, diff --git a/packages/wallet/wdk/test/test-ssr-safety.mjs b/packages/wallet/wdk/test/test-ssr-safety.mjs new file mode 100644 index 000000000..55ef7723d --- /dev/null +++ b/packages/wallet/wdk/test/test-ssr-safety.mjs @@ -0,0 +1,308 @@ +#!/usr/bin/env node +/** + * Comprehensive SSR Safety Test (Runtime Execution) + * + * This script tests that the entire wdk package can be imported and used in a Node.js + * environment (SSR context) without throwing errors about missing window. + * + * It executes the code at runtime to catch any SSR issues. + * + * Run with: node test-ssr-comprehensive.mjs + */ + +import { readFile } from 'fs/promises' +import { fileURLToPath } from 'url' +import { dirname, join } from 'path' +import { createRequire } from 'module' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) +const require = createRequire(import.meta.url) + +console.log('Testing SSR safety with runtime execution...\n') + +// Ensure we're in a Node.js environment (no window) +if (typeof window !== 'undefined') { + console.error('ERROR: window is defined! This should not happen in Node.js.') + process.exit(1) +} + +console.log('✓ window is undefined (as expected in Node.js)\n') + +const errors = [] +const warnings = [] + +// Read package.json to get package name and exports +let packageJson +try { + const packageJsonPath = join(__dirname, '..', 'package.json') + packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8')) +} catch (err) { + console.error('Failed to read package.json:', err.message) + process.exit(1) +} + +// Test 1: Import main module via package name +console.log('='.repeat(60)) +console.log('Test 1: Importing package via package name') +console.log('='.repeat(60)) + +let wdk +try { + // Use the package name from package.json + const packageName = packageJson.name + console.log(`Importing ${packageName}...`) + + // Try to resolve the package + const packagePath = require.resolve(packageName) + console.log(` Package resolved to: ${packagePath}`) + + // Import the package + wdk = await import(packageName) + console.log('✓ Successfully imported package') + console.log(' Top-level exports:', Object.keys(wdk)) + +} catch (error) { + // Check if it's an SSR-related error + if (error.message.includes('window is not defined') || + error.message.includes('window') || + error.message.includes('document is not defined') || + error.message.includes('document') || + error.message.includes('localStorage') || + error.message.includes('sessionStorage')) { + errors.push(`SSR ERROR: Package accesses browser globals at module load time: ${error.message}`) + if (error.stack) { + console.error('\nError stack:') + console.error(error.stack) + } + } else { + errors.push(`Failed to import package: ${error.message}`) + if (error.stack) { + console.error('Stack:', error.stack) + } + } + + // Don't exit immediately - let the summary show the error + if (errors.length > 0) { + // Skip remaining tests if import failed + wdk = null + } +} + +// Test 2: Recursively access and test all exports +console.log('\n' + '='.repeat(60)) +console.log('Test 2: Accessing and testing all exports') +console.log('='.repeat(60)) + +if (!wdk) { + console.log('Skipping - package import failed') +} else { + async function testExports(obj, path = '', depth = 0) { + if (depth > 5) return // Prevent infinite recursion + + for (const [key, value] of Object.entries(obj)) { + const currentPath = path ? `${path}.${key}` : key + + try { + // Skip if it's a circular reference or already tested + if (value === null || value === undefined) { + continue + } + + // Test accessing the value (this executes any getters) + const accessed = value + + // Test different types + if (typeof accessed === 'function') { + // Try to get function properties + try { + const props = Object.getOwnPropertyNames(accessed) + if (props.length > 0 && depth < 3) { + // Test static properties on functions + for (const prop of props.slice(0, 3)) { + try { + const propValue = accessed[prop] + if (typeof propValue === 'object' && propValue !== null && depth < 2) { + await testExports(propValue, `${currentPath}.${prop}`, depth + 1) + } + } catch (err) { + if (err.message.includes('window') || err.message.includes('document')) { + errors.push(`${currentPath}.${prop}: ${err.message}`) + } + } + } + } + } catch (err) { + if (err.message.includes('window') || err.message.includes('document')) { + errors.push(`${currentPath}: ${err.message}`) + } + } + } else if (typeof accessed === 'object' && accessed !== null) { + // Test object properties + if (Array.isArray(accessed)) { + // Test array elements + for (let i = 0; i < Math.min(accessed.length, 3); i++) { + try { + const item = accessed[i] + if (typeof item === 'object' && item !== null && depth < 3) { + await testExports(item, `${currentPath}[${i}]`, depth + 1) + } + } catch (err) { + if (err.message.includes('window') || err.message.includes('document')) { + errors.push(`${currentPath}[${i}]: ${err.message}`) + } + } + } + } else { + // Test object properties recursively + await testExports(accessed, currentPath, depth + 1) + } + } + + } catch (error) { + // Check if it's an SSR-related error + if (error.message.includes('window is not defined') || + error.message.includes('window') || + error.message.includes('document is not defined') || + error.message.includes('document') || + error.message.includes('localStorage') || + error.message.includes('sessionStorage')) { + errors.push(`${currentPath}: ${error.message}`) + } else { + // Other errors are warnings (might be expected, like missing dependencies) + warnings.push(`${currentPath}: ${error.message}`) + } + } + } +} + + // Test all top-level exports + console.log('Testing all exports recursively...') + await testExports(wdk) +} + +// Test 3: Try to access specific critical exports and use them +console.log('\n' + '='.repeat(60)) +console.log('Test 3: Testing critical exports with actual usage') +console.log('='.repeat(60)) + +if (!wdk) { + console.log('Skipping - package import failed') +} else { + // Test ManagerOptionsDefaults + try { + if (wdk.Sequence?.ManagerOptionsDefaults) { + console.log('Testing ManagerOptionsDefaults...') + const defaults = wdk.Sequence.ManagerOptionsDefaults + + // Access all properties + Object.keys(defaults).forEach(key => { + try { + const value = defaults[key] + console.log(` ✓ ${key}: ${typeof value}`) + + // If it's a function, try calling it + if (typeof value === 'function' && key === 'relayers') { + const result = value() + console.log(` Called ${key}(), returned:`, Array.isArray(result) ? `${result.length} items` : typeof result) + } + } catch (err) { + if (err.message.includes('window') || err.message.includes('document')) { + errors.push(`ManagerOptionsDefaults.${key}: ${err.message}`) + } + } + }) + } +} catch (err) { + if (err.message.includes('window') || err.message.includes('document')) { + errors.push(`ManagerOptionsDefaults: ${err.message}`) + } +} + +// Test applyManagerOptionsDefaults function +try { + if (wdk.Sequence?.applyManagerOptionsDefaults) { + console.log('Testing applyManagerOptionsDefaults...') + const result = wdk.Sequence.applyManagerOptionsDefaults() + console.log(' ✓ Function executed successfully') + console.log(' Result keys:', Object.keys(result).slice(0, 5).join(', '), '...') + } +} catch (err) { + if (err.message.includes('window') || err.message.includes('document')) { + errors.push(`applyManagerOptionsDefaults: ${err.message}`) + } + } +} + +// Test 4: Try importing sub-modules that might be imported separately +console.log('\n' + '='.repeat(60)) +console.log('Test 4: Testing sub-module imports') +console.log('='.repeat(60)) + +if (!wdk) { + console.log('Skipping - package import failed') +} else { + // Get the package path and try importing from dist + try { + const packagePath = require.resolve(packageJson.name) + const packageDir = dirname(packagePath) + + // Try to import from the exports field if available + if (packageJson.exports) { + for (const [exportPath, exportConfig] of Object.entries(packageJson.exports)) { + if (exportPath === '.') { + const modulePath = exportConfig.default || exportConfig.types + if (modulePath) { + try { + const fullPath = join(packageDir, '..', modulePath) + console.log(`Testing import from ${exportPath}...`) + const subModule = await import(fullPath) + console.log(` ✓ Imported successfully`) + + // Test accessing exports + const subExports = Object.keys(subModule) + if (subExports.length > 0) { + console.log(` Exports: ${subExports.slice(0, 5).join(', ')}${subExports.length > 5 ? '...' : ''}`) + } + } catch (err) { + if (err.message.includes('window') || err.message.includes('document')) { + errors.push(`Import ${exportPath}: ${err.message}`) + } else if (!err.message.includes('Cannot find module')) { + warnings.push(`Import ${exportPath}: ${err.message}`) + } + } + } + } + } + } + } catch (err) { + warnings.push(`Could not test sub-modules: ${err.message}`) + } +} + +// Summary +console.log('\n' + '='.repeat(60)) +console.log('Test Summary') +console.log('='.repeat(60)) + +if (errors.length === 0) { + console.log('\n✅ All SSR Safety Tests PASSED!') + console.log('The package can be safely imported and used in a Node.js/SSR environment.') + if (warnings.length > 0) { + console.log(`\n⚠️ ${warnings.length} warning(s) (non-SSR related):`) + warnings.slice(0, 5).forEach(warn => console.log(` - ${warn}`)) + if (warnings.length > 5) { + console.log(` ... and ${warnings.length - 5} more`) + } + } + process.exit(0) +} else { + console.log('\n❌ ERRORS FOUND:') + errors.forEach(err => console.log(` - ${err}`)) + console.log('\n❌ SSR Safety Test FAILED!') + if (warnings.length > 0) { + console.log(`\n⚠️ ${warnings.length} warning(s):`) + warnings.slice(0, 5).forEach(warn => console.log(` - ${warn}`)) + } + process.exit(1) +} diff --git a/turbo.json b/turbo.json index 563d48c60..fcf046270 100644 --- a/turbo.json +++ b/turbo.json @@ -25,7 +25,8 @@ "repo/**/*.ts", "repo/**/*.tsx", "test/**/*.ts", - "test/**/*.tsx" + "test/**/*.tsx", + "test/**/*.mjs" ], "outputs": [] }, From c62502733fdc439ea00af1c1d2b4391e71cb1f91 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Thu, 20 Nov 2025 10:13:48 +1300 Subject: [PATCH 067/177] Fix CI job --- .github/workflows/tests.yml | 2 +- packages/wallet/wdk/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 62fc357db..1babc7378 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -23,7 +23,7 @@ jobs: tests: name: Run all tests runs-on: ubuntu-latest - needs: [install] + needs: [build] steps: - uses: actions/checkout@v4 - uses: ./.github/actions/install-dependencies diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 4d5b752a6..c8eb55f91 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "tsc", "dev": "tsc --watch", - "test": "vitest run && node test/test-ssr-safety.mjs", + "test": "vitest run && npm run test:ssr", "test:coverage": "vitest run --coverage", "test:ssr": "node test/test-ssr-safety.mjs", "typecheck": "tsc --noEmit", From 020506151bc62c845a04f3863b5ffad87c1aff71 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Thu, 20 Nov 2025 14:02:40 +0300 Subject: [PATCH 068/177] 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 6785c18cd..c3738969d 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 2c38fc18b..3c5a29cba 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 072fa056f..502c238bd 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 0995a6701..8928d354e 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 b993b2aac815a8076457b27eb283ce77c0dc38b3 Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Thu, 20 Nov 2025 17:23:30 +0100 Subject: [PATCH 069/177] 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 | 2 +- .../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, 292 insertions(+), 25 deletions(-) diff --git a/packages/wallet/primitives/src/config.ts b/packages/wallet/primitives/src/config.ts index d662d39a0..27bb7f032 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 46185a49d..fc2173ebf 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 7df3a5807..4dbaa0f84 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 c85054794..a005a1619 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 6a2d8b128..f77c94943 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 d96f0a316..9496ce969 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -253,7 +253,7 @@ 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) { + async initSessionModule(modules: Module[], identitySigners: Address.Address[], guardTopology?: Config.Topology) { if (this.hasSessionModule(modules)) { throw new Error('session-module-already-initialized') } diff --git a/packages/wallet/wdk/src/sequence/types/module.ts b/packages/wallet/wdk/src/sequence/types/module.ts index df254a648..014a97ae6 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 e05d81ae1..2cc7afc1d 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 6169a361a..44e7e2cb5 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 45db67613..ec3265b50 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 8282eb98d970bf4e5de3b1cb4f19f6102de65aa4 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 17:34:04 +0100 Subject: [PATCH 070/177] 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 f77c94943..8951a9867 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 a7ad874ad7ce483b3569fe475c7637c3c78e2e12 Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Thu, 20 Nov 2025 20:11:02 +0100 Subject: [PATCH 071/177] 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 3d2c2e9d4..0fbeffd97 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 1d6147825..2963459c4 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 6c2fe2de2..906e68e02 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 3d2c2e9d4..0fbeffd97 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 1d6147825..2963459c4 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 d908edc2d..83ba97735 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 bba908e69..3a381a275 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 e5668967a..4eb401739 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 a7ec3a3d4..7b596d782 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 0eec0d29d..6e90f3503 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 106c486da..5b98c40e9 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 af9069cd6..54e9faea7 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 be043ee98..3ddc0e968 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 738e1398c..e6ad8804e 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 19170f88e..cecf89b03 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 19170f88e..cecf89b03 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 b01f2eb98..722d94e4c 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 19170f88e..cecf89b03 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 ad45d777b..c814fa1ae 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 51af743ed..d11de66b7 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 2aa79b5db4559aebd1cdb379690303989dfe179f Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 21:22:02 +0100 Subject: [PATCH 072/177] 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 a6c2a13f7..74f83154b 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 42b8cbb3b..d5985a862 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 0768490c9..04db6aa40 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 0638fbe94..ca5dbe9c8 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 996c1baee..9d4861363 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 01c928906..14d697aa2 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 b41e97806..5c0bd1663 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 f67a016fa..88d442510 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 36fe6e5f5..7fdc008ad 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 98ce34f92829341fc392ac0807603788529bbe9d Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 21:44:38 +0100 Subject: [PATCH 073/177] Update api.gen.ts --- packages/services/api/src/api.gen.ts | 5141 +++++++++++++------------- 1 file changed, 2594 insertions(+), 2547 deletions(-) diff --git a/packages/services/api/src/api.gen.ts b/packages/services/api/src/api.gen.ts index 967fad8fe..bf07aa039 100644 --- a/packages/services/api/src/api.gen.ts +++ b/packages/services/api/src/api.gen.ts @@ -1,1507 +1,1397 @@ /* eslint-disable */ -// sequence-api v0.4.0 d43a5aac616814072c69e63f2f81fe65ea10a7e0 +// sequence-api v0.4.0 d7026da603b2c29baf21c6aceeebc86eada372d8 // -- -// Code generated by webrpc-gen@v0.25.3 with typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen@v0.31.0 with typescript generator. DO NOT EDIT. // // webrpc-gen -schema=api.ridl -target=typescript -client -out=./clients/api.gen.ts -export const WebrpcHeader = 'Webrpc' - -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' +// 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.4.0' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = 'd43a5aac616814072c69e63f2f81fe65ea10a7e0' +export const WebrpcSchemaHash = 'd7026da603b2c29baf21c6aceeebc86eada372d8' -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 APIClient { + /** + * + * Runtime + * + */ + 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('@') + clock(headers?: object, signal?: AbortSignal): Promise - return { - webrpcGenVersion: webrpcGenVersion ?? '', - codeGenName: codeGenName ?? '', - codeGenVersion: codeGenVersion ?? '', - schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '', - } -} + getSequenceContext(headers?: object, signal?: AbortSignal): Promise -// -// Types -// + /** + * + * Auth + * + * TODO: rename 'ewtString' arg to 'ethauthProof' + */ + getAuthToken(req: GetAuthTokenRequest, headers?: object, signal?: AbortSignal): Promise -export enum SortOrder { - DESC = 'DESC', - ASC = 'ASC', -} + getAuthToken2(req: GetAuthToken2Request, headers?: object, signal?: AbortSignal): Promise -export enum SardinePaymentType { - ach = 'ach', - debit = 'debit', - credit = 'credit', - us_debit = 'us_debit', - international_debit = 'international_debit', - international_credit = 'international_credit', -} + sendPasswordlessLink( + req: SendPasswordlessLinkRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export enum SardineQuoteType { - buy = 'buy', - sell = 'sell', -} + registerPublicKey( + req: RegisterPublicKeyRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export enum GetLifiSwapRouteDirection { - to = 'to', - from = 'from', -} + getPublicKey(req: GetPublicKeyRequest, headers?: object, signal?: AbortSignal): Promise -export enum TokenType { - ERC20 = 'ERC20', - ERC721 = 'ERC721', - ERC1155 = 'ERC1155', -} + /** + * + * Contacts / Friends + * + */ + friendList(req: FriendListRequest, headers?: object, signal?: AbortSignal): Promise -export enum TransakBuySell { - UNKNOWN = 'UNKNOWN', - BUY = 'BUY', - SELL = 'SELL', -} + getFriendByAddress( + req: GetFriendByAddressRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export enum TradeType { - EXACT_INPUT = 'EXACT_INPUT', - EXACT_OUTPUT = 'EXACT_OUTPUT', -} + searchFriends(req: SearchFriendsRequest, headers?: object, signal?: AbortSignal): Promise -export enum CheckoutOptionCrypto { - none = 'none', - partially = 'partially', - all = 'all', -} + addFriend(req: AddFriendRequest, headers?: object, signal?: AbortSignal): Promise -export enum CheckoutOptionNFTCheckoutProvider { - unknown = 'unknown', - sardine = 'sardine', - transak = 'transak', -} + updateFriendNickname( + req: UpdateFriendNicknameRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export enum CheckoutOptionOnRampProvider { - unknown = 'unknown', - sardine = 'sardine', - transak = 'transak', -} + removeFriend(req: RemoveFriendRequest, headers?: object, signal?: AbortSignal): Promise -export enum CheckoutOptionSwapProvider { - unknown = 'unknown', - lifi = 'lifi', -} + /** + * + * Chain-Utils + * + */ + contractCall(req: ContractCallRequest, headers?: object, signal?: AbortSignal): Promise -export interface Version { - webrpcVersion: string - schemaVersion: string - schemaHash: string - appVersion: string -} + decodeContractCall( + req: DecodeContractCallRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface RuntimeStatus { - healthOK: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - checks: RuntimeChecks - numTxnsRelayed: { [key: string]: NumTxnsRelayed } -} + lookupContractCallSelectors( + req: LookupContractCallSelectorsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface NumTxnsRelayed { - chainID: number - prev: number - current: number - period: number -} + /** + * + * User Storage + * + */ + userStorageFetch( + req: UserStorageFetchRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface RuntimeChecks {} + userStorageSave(req: UserStorageSaveRequest, headers?: object, signal?: AbortSignal): Promise -export interface SequenceContext { - factory: string - mainModule: string - mainModuleUpgradable: string - guestModule: string - utils: string -} + userStorageDelete( + req: UserStorageDeleteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface PublicKey { - id: string - x: string - y: string -} + userStorageFetchAll( + req: UserStorageFetchAllRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface User { - address: string - username: string - avatar: string - bio: string - location: string - locale: string - backup?: boolean - backupConfirmed?: boolean - maxInvites?: number - updatedAt?: string - createdAt?: string -} + /** + * + * Wallet utils + * + */ + getMoonpayLink(req: GetMoonpayLinkRequest, headers?: object, signal?: AbortSignal): Promise -export interface WalletBackup { - accountAddress: string - secretHash: string - encryptedWallet: string - userConfirmed: boolean - updatedAt?: string - createdAt?: string -} + /** + * - IsUsingGoogleMail(domain: string) => (yes: bool) + */ + resolveENSAddress( + req: ResolveENSAddressRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface Friend { - id: number - userAddress: string - friendAddress: string - nickname: string - user?: User - createdAt?: string -} + /** + * TODO: we can add walletContext optional in the future when we need it + * NOTE: chainId can be either a number or canonical name + */ + isValidSignature( + req: IsValidSignatureRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface MetaTxn { - id: string - chainId: string - walletAddress: string - contract: string - input: string -} + isValidMessageSignature( + req: IsValidMessageSignatureRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface Call { - to: string - value?: string - data?: string - gasLimit?: string - delegateCall?: boolean - onlyFallback?: boolean - behaviorOnError?: number -} + isValidTypedDataSignature( + req: IsValidTypedDataSignatureRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface IntentCallsPayload { - chainId: string - space?: string - nonce?: string - calls: Array -} + isValidETHAuthProof( + req: IsValidETHAuthProofRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface IntentConfig { - id: number - configHash: string - originIntentAddress: string - destinationIntentAddress: string - mainSigner: string - calls: Array - preconditions: Array - executionStatus?: string - metaTxnId?: string - txnHash?: string - updatedAt?: string - createdAt?: string -} + getOnRampURL(req: GetOnRampURLRequest, headers?: object, signal?: AbortSignal): Promise -export interface MetaTxnReceipt { - metaTxID: string - status: string - txnReceipt?: string - revertReason?: string -} + transakGetCountries(headers?: object, signal?: AbortSignal): Promise -export interface InviteCode { - usesLeft: number - ownerAccount: string - email?: string - url: string - createdAt?: string - expiresAt?: string -} + transakGetCryptoCurrencies(headers?: object, signal?: AbortSignal): Promise -export interface InviteCodeAccount { - claimedByUserAddress: string - claimedAt?: string -} + transakGetFiatCurrencies(headers?: object, signal?: AbortSignal): Promise -export interface InviteInfo { - expiryInHours: number - max: number - invites: Array -} + transakGetPrice(req: TransakGetPriceRequest, headers?: object, signal?: AbortSignal): Promise -export interface ContractCall { - signature: string - function: string - args: Array -} + transakGetSupportedNFTCheckoutChains( + headers?: object, + signal?: AbortSignal, + ): Promise -export interface TupleComponent { - name?: string - type: string - value: any -} + transakGetWidgetURL( + req: TransakGetWidgetURLRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface AddressOverrides { - trailsLiFiSapientSignerAddress?: string - trailsRelaySapientSignerAddress?: string - trailsCCTPV2SapientSignerAddress?: string -} + /** + * + * Price Feed + * + */ + getCoinPrices(req: GetCoinPricesRequest, headers?: object, signal?: AbortSignal): Promise -export interface TakerFee { - address: string - bps: number -} + getCollectiblePrices( + req: GetCollectiblePricesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface OriginCall { - chainId: number - to: string - transactionData: string - transactionValue: string -} + /** + * + * Price Feed utils + * + */ + getExchangeRate(req: GetExchangeRateRequest, headers?: object, signal?: AbortSignal): Promise -export interface IntentPrecondition { - type: string - chainId: string - data: any -} + /** + * + * Util / misc + * + */ + memoryStore(req: MemoryStoreRequest, headers?: object, signal?: AbortSignal): Promise -export interface UserStorage { - userAddress: string - key: string - value: any -} + memoryLoad(req: MemoryLoadRequest, headers?: object, signal?: AbortSignal): Promise -export interface Token { - chainId: number - contractAddress: string - tokenId?: string -} + /** + * + * Legacy + * + */ + getInviteInfo(headers?: object, signal?: AbortSignal): Promise -export interface Price { - value: number - currency: string -} + /** + * NOTE: we're still using this from SW-API to Sequence-API to claim invite code + */ + isValidAccessCode( + req: IsValidAccessCodeRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface TokenPrice { - token: Token - price?: Price - price24hChange?: Price - price24hVol?: Price - floorPrice: Price - buyPrice: Price - sellPrice: Price - updatedAt: string -} + internalClaimAccessCode( + req: InternalClaimAccessCodeRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface ExchangeRate { - name: string - symbol: string - value: number - vsCurrency: string - currencyType: string -} + /** + * Utils + */ + blockNumberAtTime( + req: BlockNumberAtTimeRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface LinkedWallet { - id: number - walletType?: string - walletAddress: string - linkedWalletAddress: string - createdAt?: string -} + /** + * + * Paper + * TODO: deprecate in the future + * + */ + paperSessionSecret( + req: PaperSessionSecretRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface Page { - pageSize?: number - page?: number - totalRecords?: number - column?: string - before?: any - after?: any - sort?: Array - more?: boolean -} + paperSessionSecret2( + req: PaperSessionSecret2Request, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SortBy { - column: string - order: SortOrder -} + /** + * + * Linked wallets (v0 -- simple support) + * + */ + linkWallet(req: LinkWalletRequest, headers?: object, signal?: AbortSignal): Promise -export interface SardineNFTCheckoutParams { - name: string - imageUrl: string - network: string - recipientAddress: string - blockchainNftId: string - contractAddress: string - quantity: number - decimals?: number - tokenAmount: string - tokenAddress: string - tokenSymbol: string - tokenDecimals?: number - calldata: string - platform: string - approvedSpenderAddress?: string -} + getLinkedWallets( + req: GetLinkedWalletsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SardineNFTCheckout { - token: string - expiresAt: string - orderId: string -} + removeLinkedWallet( + req: RemoveLinkedWalletRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SardineOrder { - id: string - createdAt?: string - referenceId: string - status: string - fiatCurrency: string - fiatExchangeRateUSD: number - transactionId: string - expiresAt?: string - total: number - subTotal: number - transactionFee: number - networkFee: number - paymentCurrency?: string - paymentMethodType?: string - transactionType: string - name: string - price: number - imageUrl: string - contractAddress?: string - transactionHash?: string - recipientAddress: string -} + /** + * 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( + req: GenerateWaaSVerificationURLRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SardineRegion { - countryCode: string - isAllowedOnRamp: boolean - isAllowedOnNFT: boolean - isBasicKycRequired: Array - isSsnRequired: Array - name: string - currencyCode: string - isPayrollSupported: boolean - supportedDocuments: Array - paymentMethods: Array - states: Array -} + validateWaaSVerificationNonce( + req: ValidateWaaSVerificationNonceRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SardineRegionPaymentMethod { - name: string - isAllowedOnRamp: boolean - isAllowedOnNFT: boolean - subTypes: Array - type: string - subType: string -} + /** + * + * + * WaaS child wallet adoption + * + */ + listAdoptedWallets( + req: ListAdoptedWalletsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SardineRegionState { - code: string - name: string - isAllowedOnRamp: boolean - isAllowedOnNFT: boolean -} + getLifiChains(headers?: object, signal?: AbortSignal): Promise -export interface SardineSupportedToken { - network: string - assetSymbol: string - assetName: string - chainId: string - tokenName: string - token: string - tokenAddress: string -} + getLifiTokens(req: GetLifiTokensRequest, headers?: object, signal?: AbortSignal): Promise -export interface SardineSupportedTokenForSwap { - isSupported: boolean - isSupportedForAbstraction: boolean - currentBalance: string -} + /** + * All parameters except `params` are deprecated. + * Use only the `params` object to pass values. + */ + getLifiSwapRoutes( + req: GetLifiSwapRoutesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SardineEnabledToken { - network: string - assetSymbol: string - assetName: string - chainId: string - tokenName: string - token: string - tokenAddress: string -} + getLifiSwapQuote( + req: GetLifiSwapQuoteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SardineGetQuoteParams { - assetType: string - network: string - total: number - currency?: string - paymentType?: SardinePaymentType - quoteType?: SardineQuoteType - walletAddress?: string -} + /** + * + * Chain abstraction + * + */ + getIntentCallsPayloads( + req: GetIntentCallsPayloadsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SardineQuote { - quantity: number - network: string - assetType: string - total: number - currency: string - expiresAt: string - paymentType: string - price: number - subtotal: number - transactionFee: number - networkFee: number - highNetworkFee: boolean - minTransactionValue: number - maxTransactionValue: number - liquidityProvider: string -} - -export interface SardineFiatCurrency { - currencyCode: string - name: string - currencySymbol: string - paymentOptions: Array - supportingCountries: Array -} + commitIntentConfig( + req: CommitIntentConfigRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface SardinePaymentOption { - name: string - dailyLimit: number - weeklyLimit: number - monthlyLimit: number - maxAmount: number - minAmount: number - subTypes: Array - type: string - subType: string - processingTime: string -} + getIntentConfig(req: GetIntentConfigRequest, headers?: object, signal?: AbortSignal): Promise -export interface LifiToken { - chainId: number - address: string - symbol: string - name: string - decimals: number - priceUsd: number - price?: string - coinKey: string - logoUri: string -} + /** + * + * Inventory, payments and management + * + */ + listCurrencyGroups(headers?: object, signal?: AbortSignal): Promise -export interface GetLifiSwapRouteParams { - direction: GetLifiSwapRouteDirection - chainId: number - walletAddress: string - tokenAddress: string - tokenAmount: string -} + addOffchainInventory( + req: AddOffchainInventoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface LifiSwapRoute { - fromChainId: number - toChainId: number - fromTokens: Array - toTokens: Array -} + getOffchainInventory( + req: GetOffchainInventoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface GetLifiSwapQuoteParams { - chainId: number - walletAddress: string - fromTokenAddress: string - toTokenAddress: string - fromTokenAmount?: string - toTokenAmount?: string - includeApprove: boolean - slippageBps: number -} + listOffchainInventories( + req: ListOffchainInventoriesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise -export interface LifiSwapQuote { - currencyAddress: string - currencyBalance: string - price: string - maxPrice: string - to: string - transactionData: string - transactionValue: string - approveData: string - amount: string - amountMin: string + updateOffchainInventory( + req: UpdateOffchainInventoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + deleteOffchainInventory( + req: DeleteOffchainInventoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + requestOffchainPayment( + req: RequestOffchainPaymentRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + listOffchainPayments( + req: ListOffchainPaymentsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * + * Packs + * + */ + savePack(req: SavePackRequest, headers?: object, signal?: AbortSignal): Promise + + getPack(req: GetPackRequest, headers?: object, signal?: AbortSignal): Promise + + getPackIds(req: GetPackIdsRequest, headers?: object, signal?: AbortSignal): Promise + + deletePack(req: DeletePackRequest, headers?: object, signal?: AbortSignal): Promise + + updatePackContent( + req: UpdatePackContentRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + getRevealTxData(req: GetRevealTxDataRequest, headers?: object, signal?: AbortSignal): Promise + + checkoutOptionsPrimary( + req: CheckoutOptionsPrimaryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + checkoutOptionsSecondary( + req: CheckoutOptionsSecondaryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + checkoutOptionsGetTransakContractID( + req: CheckoutOptionsGetTransakContractIDRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + fortePayCreateIntent( + req: FortePayCreateIntentRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + fortePayGetPaymentStatuses( + req: FortePayGetPaymentStatusesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * + * CCTP + * + */ + getCCTPTransfer(req: GetCCTPTransferRequest, headers?: object, signal?: AbortSignal): Promise + + queueCCTPTransfer( + req: QueueCCTPTransferRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * + * Intent Machine Worker + * + */ + queueIntentConfigExecution( + req: QueueIntentConfigExecutionRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + getIntentConfigExecutionStatus( + req: GetIntentConfigExecutionStatusRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + listIntentConfigs( + req: ListIntentConfigsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + queueMetaTxnReceipt( + req: QueueMetaTxnReceiptRequest, + headers?: object, + signal?: AbortSignal, + ): Promise } -export interface CurrencyGroup { - name: string - tokens: Array +// +// Schema types +// + +export enum SortOrder { + DESC = 'DESC', + ASC = 'ASC', } -export interface CurrencyGroupToken { - chainId: number - tokenAddress: string +export enum GetLifiSwapRouteDirection { + to = 'to', + from = 'from', } -export interface OffchainInventory { - id: number - projectId: number - chainId: number - externalProductId: string - paymentTokenAddress: string - paymentTokenType: TokenType - paymentTokenId: number - paymentAmount: number - paymentRecipient: string - chainedCallAddress?: string - chainedCallData?: string - allowCrossChainPayments?: boolean - callbackURL?: string - createdAt: string - deletedAt?: string +export enum TokenType { + ERC20 = 'ERC20', + ERC721 = 'ERC721', + ERC1155 = 'ERC1155', } -export interface CCTPTransfer { - id: string - sourceTxHash: string - sourceChainId: number - destinationChainId: number - message: string - attestation: string - status: string - createdAt: string - updatedAt: string +export enum TransakBuySell { + UNKNOWN = 'UNKNOWN', + BUY = 'BUY', + SELL = 'SELL', } -export interface OffchainPayment { - id: number - offchainInventoryId: number - productRecipient: string - paymentChainId: number - paymentTokenAddress: string - expiration: string - createdAt: string - completedAt?: string - processedAt?: string +export enum TradeType { + EXACT_INPUT = 'EXACT_INPUT', + EXACT_OUTPUT = 'EXACT_OUTPUT', } -export interface PaymentResponse { - paymentId: number - offchainInventoryId: number - chainId: number - externalProductId: string - paymentTokenAddress: string - paymentTokenType: TokenType - paymentTokenId: number - paymentTotal: number - expiration: string - signature: string - txTo: string - txData: string +export enum CheckoutOptionCrypto { + none = 'none', + partially = 'partially', + all = 'all', } -export interface AdoptedChildWallet { - address: string +export enum CheckoutOptionNFTCheckoutProvider { + unknown = 'unknown', + transak = 'transak', } -export interface Pack { - id: number - chainId: number - projectId: number - contractAddress: string - packId: string - content: Array - createdAt?: string +export enum CheckoutOptionOnRampProvider { + unknown = 'unknown', + transak = 'transak', } -export interface PackContent { - tokenAddresses: Array - isERC721: Array - tokenIds: Array> - amounts: Array> +export enum CheckoutOptionSwapProvider { + unknown = 'unknown', + lifi = 'lifi', } -export interface TransakCountry { - alpha2: string - alpha3: string - isAllowed: boolean - isLightKycAllowed: boolean - name: string - currencyCode: string - supportedDocuments: Array - partners: Array - states: Array +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string } -export interface TransakPartner { - name: string - isCardPayment: boolean - currencyCode: string +export interface RuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + checks: RuntimeChecks + numTxnsRelayed: { [key: string]: NumTxnsRelayed } } -export interface TransakState { - code: string - name: string - isAllowed: boolean +export interface NumTxnsRelayed { + chainID: number + prev: number + current: number + period: number } -export interface TransakCryptoCurrency { - id: string - coinID: string - address: string - addressAdditionalData: any - createdAt: string - decimals: number - image: TransakCryptoCurrencyImage - isAllowed: boolean - isPopular: boolean - isStable: boolean - name: string - roundOff: number - symbol: string - isIgnorePriceVerification: boolean - imageBk: TransakCryptoCurrencyImage - kycCountriesNotSupported: Array - network: TransakCryptoCurrencyNetwork - uniqueID: string - tokenType: string - tokenIdentifier: string - isPayInAllowed: boolean - isSuspended: boolean +export interface RuntimeChecks {} + +export interface SequenceContext { + factory: string + mainModule: string + mainModuleUpgradable: string + guestModule: string + utils: string } -export interface TransakCryptoCurrencyImage { - large: string - small: string - thumb: string +export interface PublicKey { + id: string + x: string + y: string } -export interface TransakCryptoCurrencyNetwork { - name: string - fiatCurrenciesNotSupported: Array - chainID: string +export interface User { + address: string + username: string + avatar: string + bio: string + location: string + locale: string + backup?: boolean + backupConfirmed?: boolean + maxInvites?: number + updatedAt?: string + createdAt?: string } -export interface TransakCryptoCurrencyNetworkFiatNotSupported { - fiatCurrency: string - paymentMethod: string +export interface WalletBackup { + accountAddress: string + secretHash: string + encryptedWallet: string + userConfirmed: boolean + updatedAt?: string + createdAt?: string } -export interface TransakFiatCurrency { - symbol: string - supportingCountries: Array - logoSymbol: string - name: string - paymentOptions: Array - isPopular: boolean - isAllowed: boolean - roundOff: number - isPayOutAllowed: boolean - defaultCountryForNFT: string - icon: string - displayMessage: string +export interface Friend { + id: number + userAddress: string + friendAddress: string + nickname: string + user?: User + createdAt?: string } -export interface TransakFiatCurrencyPaymentOption { - name: string +export interface MetaTxn { id: string - isNftAllowed: boolean - isNonCustodial: boolean - processingTime: string - displayText: boolean - icon: string - limitCurrency: string - isActive: boolean - provider: string - maxAmount: number - minAmount: number - defaultAmount: number - isConverted: boolean - visaPayoutCountries: Array - mastercardPayoutCountries: Array - isPayOutAllowed: boolean - minAmountForPayOut: number - maxAmountForPayOut: number - defaultAmountForPayOut: number + chainId: string + walletAddress: string + contract: string + input: string } -export interface TransakPrice { - quoteID: string - conversionPrice: number - marketConversionPrice: number - slippage: number - fiatCurrency: string - cryptoCurrency: string - paymentMethod: string - fiatAmount: number - cryptoAmount: number - isBuyOrSell: string - network: string - feeDecimal: number - totalFee: number - feeBreakdown: Array - nonce: number - cryptoLiquidityProvider: string - notes: Array +export interface Call { + to: string + value?: string + data?: string + gasLimit?: string + delegateCall?: boolean + onlyFallback?: boolean + behaviorOnError?: number } -export interface TransakPriceFeeBreakdown { - Name: string - Value: number - ID: string - Ids: Array +export interface IntentCallsPayload { + chainId: string + space?: string + nonce?: string + calls: Array } -export interface TransakGetPriceParams { - fiatCurrency: string - cryptoCurrency: string - isBuyOrSell: TransakBuySell - network: string - paymentMethod: string - fiatAmount: number - cryptoAmount: number - quoteCountryCode: string +export interface IntentConfig { + id: number + configHash: string + originIntentAddress: string + destinationIntentAddress: string + mainSigner: string + calls: Array + preconditions: Array + executionStatus?: string + metaTxnId?: string + txnHash?: string + updatedAt?: string + createdAt?: string } -export interface TransakChain { - name: string - chainId: number +export interface MetaTxnReceipt { + metaTxID: string + status: string + txnReceipt?: string + revertReason?: string } -export interface CheckoutOptionsPrimaryParams { - quantity: string - tokenId: string +export interface InviteCode { + usesLeft: number + ownerAccount: string + email?: string + url: string + createdAt?: string + expiresAt?: string } -export interface CheckoutOptionsSecondaryParams { - collectionAddress: string - marketplaceAddress: string - currencyAddress: string - priceAmount: string - tokenId: string +export interface InviteCodeAccount { + claimedByUserAddress: string + claimedAt?: string } -export interface CheckoutOptions { - crypto: CheckoutOptionCrypto - swap: Array - nftCheckout: Array - onRamp: Array +export interface InviteInfo { + expiryInHours: number + max: number + invites: Array } -export interface FortePayCreateIntent { - blockchain: string - buyer: FortePayBuyer - currency: string - idempotencyKey: string - items: Array - seller: FortePaySeller - transactionType: string +export interface ContractCall { + signature: string + function: string + args: Array } -export interface FortePayBuyer { - wallet: FortePayWallet - email: string - id: string +export interface TupleComponent { + name?: string + type: string + value: any } -export interface FortePaySeller { - wallet: FortePayWallet +export interface AddressOverrides { + trailsLiFiSapientSignerAddress?: string + trailsRelaySapientSignerAddress?: string + trailsCCTPV2SapientSignerAddress?: string } -export interface FortePayWallet { +export interface TakerFee { address: string - blockchain: string + bps: number } -export interface FortePayItem { - amount: string - id: string - imageUrl: string - listingData: FortePayItemListingData - nftData: FortePayItemNFTData - mintData: FortePayItemMintData - title: string +export interface OriginCall { + chainId: number + to: string + transactionData: string + transactionValue: string } -export interface FortePayItemListingData { - orderHash: string - protocol: string - protocolAddress: string - auctionHouse: string - tokenAddress: string - calldata: string - payToAddress: string - structuredCalldata: any +export interface IntentPrecondition { + type: string + chainId: string + data: any } -export interface FortePayItemNFTData { +export interface UserStorage { + userAddress: string + key: string + value: any +} + +export interface Token { + chainId: number contractAddress: string - tokenId: string + tokenId?: string } -export interface FortePayItemMintData { - nonce: string - protocol: string - protocolAddress: string - signature: string - tokenIds: Array - calldata: string - payToAddress: string - tokenContractAddress: string - structuredCalldata: any +export interface Price { + value: number + currency: string } -export interface FortePayIntent { - flow: string - widgetData: string - paymentIntentId: string - notes: Array +export interface TokenPrice { + token: Token + price?: Price + price24hChange?: Price + price24hVol?: Price + floorPrice: Price + buyPrice: Price + sellPrice: Price + updatedAt: string } -export interface FortePaymentStatus { - paymentIntentId: string - status: string +export interface ExchangeRate { + name: string + symbol: string + value: number + vsCurrency: string + currencyType: string } -export interface CrossChainFee { - providerFee: string - trailsSwapFee: string - providerFeeUSD: number - trailsSwapFeeUSD: number - totalFeeAmount: string - totalFeeUSD: number +export interface LinkedWallet { + id: number + walletType?: string + walletAddress: string + linkedWalletAddress: string + createdAt?: string } -export interface MetaTxnFeeDetail { - metaTxnID: string - estimatedGasLimit: string - feeNative: string +export interface Page { + pageSize?: number + page?: number + totalRecords?: number + column?: string + before?: any + after?: any + sort?: Array + more?: boolean } -export interface ChainExecuteQuote { - chainId: string - totalGasLimit: string - gasPrice: string - totalFeeAmount: string - nativeTokenSymbol: string - nativeTokenPrice?: string - metaTxnFeeDetails: Array - totalFeeUSD?: string +export interface SortBy { + column: string + order: SortOrder } -export interface ExecuteQuote { - chainQuotes: Array +export interface LifiToken { + chainId: number + address: string + symbol: string + name: string + decimals: number + priceUsd: number + price?: string + coinKey: string + logoUri: string } -export interface TrailsFee { - executeQuote: ExecuteQuote - crossChainFee?: CrossChainFee - takerFeeAmount?: string - takerFeeUSD?: number - trailsFixedFeeUSD: number - feeToken?: string - originTokenTotalAmount?: string - totalFeeAmount?: string - totalFeeUSD?: string - quoteProvider?: string +export interface GetLifiSwapRouteParams { + direction: GetLifiSwapRouteDirection + chainId: number + walletAddress: string + tokenAddress: string + tokenAmount: string } -export interface IntentQuote { - fromAmount: string - fromAmountMin: string - toAmount: string - toAmountMin: string - priceImpact: number - priceImpactUsd: string - maxSlippage: number - quoteProvider: string - quoteProviderRequestId: string - quoteProviderFeeUsd: string - feeQuotes: { [key: string]: string } +export interface LifiSwapRoute { + fromChainId: number + toChainId: number + fromTokens: Array + toTokens: Array } -export interface API { - /** - * - * Runtime - * - */ - ping(headers?: object, signal?: AbortSignal): Promise - version(headers?: object, signal?: AbortSignal): Promise - runtimeStatus(headers?: object, signal?: AbortSignal): Promise - clock(headers?: object, signal?: AbortSignal): Promise - getSequenceContext(headers?: object, signal?: AbortSignal): Promise - /** - * - * 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 - 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 - searchFriends(args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise - addFriend(args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise - updateFriendNickname( - args: UpdateFriendNicknameArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - removeFriend(args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise - /** - * - * 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 - /** - * - * 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 - /** - * - * Wallet utils - * - */ - getMoonpayLink(args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise - /** - * - IsUsingGoogleMail(domain: string) => (yes: bool) - */ - 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 - 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 - sardineGetSupportedRegions(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 - sardineGetEnabledTokens(headers?: object, signal?: AbortSignal): Promise - sardineGetQuote(args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Deprecated. Use SardineGetClientToken() instead. - */ - getSardineClientToken(headers?: object, signal?: AbortSignal): Promise - /** - * Deprecated. Use SardineGetNFTCheckoutToken() instead. - */ - getSardineNFTCheckoutToken( - args: GetSardineNFTCheckoutTokenArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Deprecated. Use SardineGetNFTCheckoutOrderStatus() instead. - */ - 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 - /** - * - * Price Feed - * - */ - getCoinPrices(args: GetCoinPricesArgs, 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 - /** - * Utils - */ - 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 - /** - * - * 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 - /** - * 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 - /** - * - * - * WaaS child wallet adoption - * - */ - 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 - 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 - 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 - /** - * - * 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 - 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 - /** - * - * CCTP - * - */ - getCCTPTransfer(args: GetCCTPTransferArgs, 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 GetLifiSwapQuoteParams { + chainId: number + walletAddress: string + fromTokenAddress: string + toTokenAddress: string + fromTokenAmount?: string + toTokenAmount?: string + includeApprove: boolean + slippageBps: number +} + +export interface LifiSwapQuote { + currencyAddress: string + currencyBalance: string + price: string + maxPrice: string + to: string + transactionData: string + transactionValue: string + approveData: string + amount: string + amountMin: string +} + +export interface CurrencyGroup { + name: string + tokens: Array +} + +export interface CurrencyGroupToken { + chainId: number + tokenAddress: string +} + +export interface OffchainInventory { + id: number + projectId: number + chainId: number + externalProductId: string + paymentTokenAddress: string + paymentTokenType: TokenType + paymentTokenId: number + paymentAmount: number + paymentRecipient: string + chainedCallAddress?: string + chainedCallData?: string + allowCrossChainPayments?: boolean + callbackURL?: string + createdAt: string + deletedAt?: string +} + +export interface CCTPTransfer { + id: string + sourceTxHash: string + sourceChainId: number + destinationChainId: number + message: string + attestation: string + status: string + createdAt: string + updatedAt: string +} + +export interface OffchainPayment { + id: number + offchainInventoryId: number + productRecipient: string + paymentChainId: number + paymentTokenAddress: string + expiration: string + createdAt: string + completedAt?: string + processedAt?: string +} + +export interface PaymentResponse { + paymentId: number + offchainInventoryId: number + chainId: number + externalProductId: string + paymentTokenAddress: string + paymentTokenType: TokenType + paymentTokenId: number + paymentTotal: number + expiration: string + signature: string + txTo: string + txData: string +} + +export interface AdoptedChildWallet { + address: string +} + +export interface Pack { + id: number + chainId: number + projectId: number + contractAddress: string + packId: string + content: Array + createdAt?: string +} + +export interface PackContent { + tokenAddresses: Array + isERC721: Array + tokenIds: Array> + amounts: Array> +} + +export interface TransakCountry { + alpha2: string + alpha3: string + isAllowed: boolean + isLightKycAllowed: boolean + name: string + currencyCode: string + supportedDocuments: Array + partners: Array + states: Array +} + +export interface TransakPartner { + name: string + isCardPayment: boolean + currencyCode: string +} + +export interface TransakState { + code: string + name: string + isAllowed: boolean +} + +export interface TransakCryptoCurrency { + id: string + coinID: string + address: string + addressAdditionalData: any + createdAt: string + decimals: number + image: TransakCryptoCurrencyImage + isAllowed: boolean + isPopular: boolean + isStable: boolean + name: string + roundOff: number + symbol: string + isIgnorePriceVerification: boolean + imageBk: TransakCryptoCurrencyImage + kycCountriesNotSupported: Array + network: TransakCryptoCurrencyNetwork + uniqueID: string + tokenType: string + tokenIdentifier: string + isPayInAllowed: boolean + isSuspended: boolean +} + +export interface TransakCryptoCurrencyImage { + large: string + small: string + thumb: string +} + +export interface TransakCryptoCurrencyNetwork { + name: string + fiatCurrenciesNotSupported: Array + chainID: string +} + +export interface TransakCryptoCurrencyNetworkFiatNotSupported { + fiatCurrency: string + paymentMethod: string +} + +export interface TransakFiatCurrency { + symbol: string + supportingCountries: Array + logoSymbol: string + name: string + paymentOptions: Array + isPopular: boolean + isAllowed: boolean + roundOff: number + isPayOutAllowed: boolean + defaultCountryForNFT: string + icon: string + displayMessage: string +} + +export interface TransakFiatCurrencyPaymentOption { + name: string + id: string + isNftAllowed: boolean + isNonCustodial: boolean + processingTime: string + displayText: boolean + icon: string + limitCurrency: string + isActive: boolean + provider: string + maxAmount: number + minAmount: number + defaultAmount: number + isConverted: boolean + visaPayoutCountries: Array + mastercardPayoutCountries: Array + isPayOutAllowed: boolean + minAmountForPayOut: number + maxAmountForPayOut: number + defaultAmountForPayOut: number +} + +export interface TransakPrice { + quoteID: string + conversionPrice: number + marketConversionPrice: number + slippage: number + fiatCurrency: string + cryptoCurrency: string + paymentMethod: string + fiatAmount: number + cryptoAmount: number + isBuyOrSell: string + network: string + feeDecimal: number + totalFee: number + feeBreakdown: Array + nonce: number + cryptoLiquidityProvider: string + notes: Array +} + +export interface TransakPriceFeeBreakdown { + Name: string + Value: number + ID: string + Ids: Array +} + +export interface TransakGetPriceParams { + fiatCurrency: string + cryptoCurrency: string + isBuyOrSell: TransakBuySell + network: string + paymentMethod: string + fiatAmount: number + cryptoAmount: number + quoteCountryCode: string +} + +export interface TransakNFTData { + imageUrl: string + nftName: string + collectionAddress: string + tokenIds: Array + prices: Array + quantity: number + nftType: string +} + +export interface TransakGetWidgetURLParams { + targetContractAddress?: string + isNft?: boolean + calldata?: string + cryptoCurrencyCode?: string + estimatedGasLimit?: number + nftData: Array + walletAddress?: string + disableWalletAddressForm?: boolean + partnerOrderId?: string + network?: string + referrerDomain?: string + fiatAmount?: string + fiatCurrency?: string + defaultFiatAmount?: string + defaultCryptoCurrency?: string + cryptoCurrencyList?: string + networks?: string +} + +export interface TransakChain { + name: string + chainId: number +} + +export interface CheckoutOptionsPrimaryParams { + quantity: string + tokenId: string +} + +export interface CheckoutOptionsSecondaryParams { + collectionAddress: string + marketplaceAddress: string + currencyAddress: string + priceAmount: string + tokenId: string +} + +export interface CheckoutOptions { + crypto: CheckoutOptionCrypto + swap: Array + nftCheckout: Array + onRamp: Array +} + +export interface FortePayCreateIntent { + blockchain: string + buyer: FortePayBuyer + currency: string + idempotencyKey: string + items: Array + seller: FortePaySeller + transactionType: string +} + +export interface FortePayBuyer { + wallet: FortePayWallet + email: string + id: string +} + +export interface FortePaySeller { + wallet: FortePayWallet +} + +export interface FortePayWallet { + address: string + blockchain: string +} + +export interface FortePayItem { + amount: string + id: string + imageUrl: string + listingData: FortePayItemListingData + nftData: FortePayItemNFTData + mintData: FortePayItemMintData + title: string +} + +export interface FortePayItemListingData { + orderHash: string + protocol: string + protocolAddress: string + auctionHouse: string + tokenAddress: string + calldata: string + payToAddress: string + structuredCalldata: any +} + +export interface FortePayItemNFTData { + contractAddress: string + tokenId: string +} + +export interface FortePayItemMintData { + nonce: string + protocol: string + protocolAddress: string + signature: string + tokenIds: Array + calldata: string + payToAddress: string + tokenContractAddress: string + structuredCalldata: any +} + +export interface FortePayIntent { + flow: string + widgetData: string + paymentIntentId: string + notes: Array +} + +export interface FortePaymentStatus { + paymentIntentId: string + status: string +} + +export interface CrossChainFee { + providerFee: string + trailsSwapFee: string + providerFeeUSD: number + trailsSwapFeeUSD: number + totalFeeAmount: string + totalFeeUSD: number +} + +export interface MetaTxnFeeDetail { + metaTxnID: string + estimatedGasLimit: string + feeNative: string +} + +export interface ChainExecuteQuote { + chainId: string + totalGasLimit: string + gasPrice: string + totalFeeAmount: string + nativeTokenSymbol: string + nativeTokenPrice?: string + metaTxnFeeDetails: Array + totalFeeUSD?: string +} + +export interface ExecuteQuote { + chainQuotes: Array +} + +export interface TrailsFee { + executeQuote: ExecuteQuote + crossChainFee?: CrossChainFee + takerFeeAmount?: string + takerFeeUSD?: number + trailsFixedFeeUSD: number + feeToken?: string + originTokenTotalAmount?: string + totalFeeAmount?: string + totalFeeUSD?: string + quoteProvider?: string +} + +export interface IntentQuote { + fromAmount: string + fromAmountMin: string + toAmount: string + toAmountMin: string + priceImpact: number + priceImpactUsd: string + maxSlippage: number + quoteProvider: string + quoteProviderRequestId: string + quoteProviderFeeUsd: string + feeQuotes: { [key: string]: string } } -export interface PingArgs {} +export interface PingRequest {} -export interface PingReturn { +export interface PingResponse { status: boolean } -export interface VersionArgs {} -export interface VersionReturn { +export interface VersionRequest {} + +export interface VersionResponse { version: Version } -export interface RuntimeStatusArgs {} -export interface RuntimeStatusReturn { +export interface RuntimeStatusRequest {} + +export interface RuntimeStatusResponse { status: RuntimeStatus } -export interface ClockArgs {} -export interface ClockReturn { +export interface ClockRequest {} + +export interface ClockResponse { serverTime: string } -export interface GetSequenceContextArgs {} -export interface GetSequenceContextReturn { +export interface GetSequenceContextRequest {} + +export interface GetSequenceContextResponse { data: SequenceContext } -export interface GetAuthTokenArgs { + +export interface GetAuthTokenRequest { ewtString: string testnetMode?: boolean } -export interface GetAuthTokenReturn { +export interface GetAuthTokenResponse { status: boolean jwtToken: string address: string user?: User } -export interface GetAuthToken2Args { + +export interface GetAuthToken2Request { ewtString: string chainID: string } -export interface GetAuthToken2Return { +export interface GetAuthToken2Response { status: boolean jwtToken: string address: string user?: User } -export interface SendPasswordlessLinkArgs { + +export interface SendPasswordlessLinkRequest { email: string redirectUri: string intent: string } -export interface SendPasswordlessLinkReturn { +export interface SendPasswordlessLinkResponse { status: boolean } -export interface RegisterPublicKeyArgs { + +export interface RegisterPublicKeyRequest { publicKey: PublicKey } -export interface RegisterPublicKeyReturn { +export interface RegisterPublicKeyResponse { status: boolean } -export interface GetPublicKeyArgs { + +export interface GetPublicKeyRequest { id: string } -export interface GetPublicKeyReturn { +export interface GetPublicKeyResponse { publicKey: PublicKey } -export interface FriendListArgs { + +export interface FriendListRequest { nickname?: string page?: Page } -export interface FriendListReturn { +export interface FriendListResponse { page: Page friends: Array } -export interface GetFriendByAddressArgs { + +export interface GetFriendByAddressRequest { friendAddress: string } -export interface GetFriendByAddressReturn { +export interface GetFriendByAddressResponse { status: boolean friend: Friend } -export interface SearchFriendsArgs { + +export interface SearchFriendsRequest { filterUsername: string page?: Page } -export interface SearchFriendsReturn { +export interface SearchFriendsResponse { friends: Array } -export interface AddFriendArgs { + +export interface AddFriendRequest { friendAddress: string optionalNickname?: string } -export interface AddFriendReturn { +export interface AddFriendResponse { status: boolean friend?: Friend } -export interface UpdateFriendNicknameArgs { + +export interface UpdateFriendNicknameRequest { friendAddress: string nickname: string } -export interface UpdateFriendNicknameReturn { +export interface UpdateFriendNicknameResponse { status: boolean friend?: Friend } -export interface RemoveFriendArgs { + +export interface RemoveFriendRequest { friendAddress: string } -export interface RemoveFriendReturn { +export interface RemoveFriendResponse { status: boolean } -export interface ContractCallArgs { + +export interface ContractCallRequest { chainID: string contract: string inputExpr: string @@ -1509,298 +1399,263 @@ export interface ContractCallArgs { args: Array } -export interface ContractCallReturn { +export interface ContractCallResponse { returns: Array } -export interface DecodeContractCallArgs { + +export interface DecodeContractCallRequest { callData: string } -export interface DecodeContractCallReturn { +export interface DecodeContractCallResponse { call: ContractCall } -export interface LookupContractCallSelectorsArgs { + +export interface LookupContractCallSelectorsRequest { selectors: Array } -export interface LookupContractCallSelectorsReturn { +export interface LookupContractCallSelectorsResponse { signatures: Array> } -export interface UserStorageFetchArgs { + +export interface UserStorageFetchRequest { key: string } -export interface UserStorageFetchReturn { +export interface UserStorageFetchResponse { object: any } -export interface UserStorageSaveArgs { + +export interface UserStorageSaveRequest { key: string object: any } -export interface UserStorageSaveReturn { +export interface UserStorageSaveResponse { ok: boolean } -export interface UserStorageDeleteArgs { + +export interface UserStorageDeleteRequest { key: string } -export interface UserStorageDeleteReturn { +export interface UserStorageDeleteResponse { ok: boolean } -export interface UserStorageFetchAllArgs { + +export interface UserStorageFetchAllRequest { keys?: Array } -export interface UserStorageFetchAllReturn { +export interface UserStorageFetchAllResponse { objects: { [key: string]: any } } -export interface GetMoonpayLinkArgs { + +export interface GetMoonpayLinkRequest { url: string } -export interface GetMoonpayLinkReturn { +export interface GetMoonpayLinkResponse { signedUrl: string } -export interface ResolveENSAddressArgs { + +export interface ResolveENSAddressRequest { ens: string } -export interface ResolveENSAddressReturn { +export interface ResolveENSAddressResponse { address: string ok: boolean } -export interface IsValidSignatureArgs { + +export interface IsValidSignatureRequest { chainId: string walletAddress: string digest: string signature: string } -export interface IsValidSignatureReturn { +export interface IsValidSignatureResponse { isValid: boolean } -export interface IsValidMessageSignatureArgs { + +export interface IsValidMessageSignatureRequest { chainId: string walletAddress: string message: string signature: string } -export interface IsValidMessageSignatureReturn { +export interface IsValidMessageSignatureResponse { isValid: boolean } -export interface IsValidTypedDataSignatureArgs { + +export interface IsValidTypedDataSignatureRequest { chainId: string walletAddress: string typedData: any signature: string } -export interface IsValidTypedDataSignatureReturn { +export interface IsValidTypedDataSignatureResponse { isValid: boolean } -export interface IsValidETHAuthProofArgs { + +export interface IsValidETHAuthProofRequest { chainId: string walletAddress: string ethAuthProofString: string } -export interface IsValidETHAuthProofReturn { +export interface IsValidETHAuthProofResponse { isValid: boolean } -export interface GetOnRampURLArgs { + +export interface GetOnRampURLRequest { chainId: string } -export interface GetOnRampURLReturn { +export interface GetOnRampURLResponse { url: string } -export interface SardineGetClientTokenArgs {} - -export interface SardineGetClientTokenReturn { - token: string -} -export interface SardineGetNFTCheckoutTokenArgs { - params: SardineNFTCheckoutParams -} - -export interface SardineGetNFTCheckoutTokenReturn { - resp: SardineNFTCheckout -} -export interface SardineGetNFTCheckoutOrderStatusArgs { - orderId: string -} - -export interface SardineGetNFTCheckoutOrderStatusReturn { - resp: SardineOrder -} -export interface SardineGetSupportedRegionsArgs {} - -export interface SardineGetSupportedRegionsReturn { - regions: Array -} -export interface SardineGetSupportedFiatCurrenciesArgs {} -export interface SardineGetSupportedFiatCurrenciesReturn { - tokens: Array -} -export interface SardineGetSupportedTokensArgs {} +export interface TransakGetCountriesRequest {} -export interface SardineGetSupportedTokensReturn { - tokens: Array -} -export interface SardineGetSupportedTokenForSwapArgs { - network: string - tokenAddress: string +export interface TransakGetCountriesResponse { + regions: Array } -export interface SardineGetSupportedTokenForSwapReturn { - token: SardineSupportedTokenForSwap -} -export interface SardineGetEnabledTokensArgs {} +export interface TransakGetCryptoCurrenciesRequest {} -export interface SardineGetEnabledTokensReturn { - tokens: Array -} -export interface SardineGetQuoteArgs { - params: SardineGetQuoteParams +export interface TransakGetCryptoCurrenciesResponse { + currencies: Array } -export interface SardineGetQuoteReturn { - quote: SardineQuote -} -export interface GetSardineClientTokenArgs {} +export interface TransakGetFiatCurrenciesRequest {} -export interface GetSardineClientTokenReturn { - token: string -} -export interface GetSardineNFTCheckoutTokenArgs { - params: SardineNFTCheckoutParams +export interface TransakGetFiatCurrenciesResponse { + currencies: Array } -export interface GetSardineNFTCheckoutTokenReturn { - resp: SardineNFTCheckout -} -export interface GetSardineNFTCheckoutOrderStatusArgs { - orderId: string +export interface TransakGetPriceRequest { + params: TransakGetPriceParams } -export interface GetSardineNFTCheckoutOrderStatusReturn { - resp: SardineOrder +export interface TransakGetPriceResponse { + price: TransakPrice } -export interface TransakGetCountriesArgs {} -export interface TransakGetCountriesReturn { - regions: Array -} -export interface TransakGetCryptoCurrenciesArgs {} +export interface TransakGetSupportedNFTCheckoutChainsRequest {} -export interface TransakGetCryptoCurrenciesReturn { - currencies: Array +export interface TransakGetSupportedNFTCheckoutChainsResponse { + chains: Array } -export interface TransakGetFiatCurrenciesArgs {} -export interface TransakGetFiatCurrenciesReturn { - currencies: Array -} -export interface TransakGetPriceArgs { - params: TransakGetPriceParams +export interface TransakGetWidgetURLRequest { + params: TransakGetWidgetURLParams } -export interface TransakGetPriceReturn { - price: TransakPrice +export interface TransakGetWidgetURLResponse { + url: string } -export interface TransakGetSupportedNFTCheckoutChainsArgs {} -export interface TransakGetSupportedNFTCheckoutChainsReturn { - chains: Array -} -export interface GetCoinPricesArgs { +export interface GetCoinPricesRequest { tokens: Array } -export interface GetCoinPricesReturn { +export interface GetCoinPricesResponse { tokenPrices: Array } -export interface GetCollectiblePricesArgs { + +export interface GetCollectiblePricesRequest { tokens: Array } -export interface GetCollectiblePricesReturn { +export interface GetCollectiblePricesResponse { tokenPrices: Array } -export interface GetExchangeRateArgs { + +export interface GetExchangeRateRequest { toCurrency: string } -export interface GetExchangeRateReturn { +export interface GetExchangeRateResponse { exchangeRate: ExchangeRate } -export interface MemoryStoreArgs { + +export interface MemoryStoreRequest { key: string value: string } -export interface MemoryStoreReturn { +export interface MemoryStoreResponse { ok: boolean } -export interface MemoryLoadArgs { + +export interface MemoryLoadRequest { key: string } -export interface MemoryLoadReturn { +export interface MemoryLoadResponse { value: string } -export interface GetInviteInfoArgs {} -export interface GetInviteInfoReturn { +export interface GetInviteInfoRequest {} + +export interface GetInviteInfoResponse { inviteInfo: InviteInfo } -export interface IsValidAccessCodeArgs { + +export interface IsValidAccessCodeRequest { accessCode: string } -export interface IsValidAccessCodeReturn { +export interface IsValidAccessCodeResponse { status: boolean } -export interface InternalClaimAccessCodeArgs { + +export interface InternalClaimAccessCodeRequest { address: string accessCode: string } -export interface InternalClaimAccessCodeReturn { +export interface InternalClaimAccessCodeResponse { status: boolean } -export interface BlockNumberAtTimeArgs { + +export interface BlockNumberAtTimeRequest { chainId: number timestamps: Array } -export interface BlockNumberAtTimeReturn { +export interface BlockNumberAtTimeResponse { blocks: Array } -export interface PaperSessionSecretArgs { + +export interface PaperSessionSecretRequest { chainName: string contractAddress: string paramsJson: string contractType: string } -export interface PaperSessionSecretReturn { +export interface PaperSessionSecretResponse { secret: string } -export interface PaperSessionSecret2Args { + +export interface PaperSessionSecret2Request { chainName: string contractAddress: string paramsJson: string abi: string } -export interface PaperSessionSecret2Return { +export interface PaperSessionSecret2Response { secret: string } -export interface LinkWalletArgs { + +export interface LinkWalletRequest { parentWalletAddress: string parentWalletMessage: string parentWalletSignature: string @@ -1811,20 +1666,22 @@ export interface LinkWalletArgs { linkedWalletType?: string } -export interface LinkWalletReturn { +export interface LinkWalletResponse { status: boolean } -export interface GetLinkedWalletsArgs { + +export interface GetLinkedWalletsRequest { parentWalletAddress: string parentWalletMessage: string parentWalletSignature: string signatureChainId: string } -export interface GetLinkedWalletsReturn { +export interface GetLinkedWalletsResponse { linkedWallets: Array } -export interface RemoveLinkedWalletArgs { + +export interface RemoveLinkedWalletRequest { parentWalletAddress: string parentWalletMessage: string parentWalletSignature: string @@ -1832,48 +1689,54 @@ export interface RemoveLinkedWalletArgs { signatureChainId: string } -export interface RemoveLinkedWalletReturn { +export interface RemoveLinkedWalletResponse { status: boolean } -export interface GenerateWaaSVerificationURLArgs { + +export interface GenerateWaaSVerificationURLRequest { walletAddress: string } -export interface GenerateWaaSVerificationURLReturn { +export interface GenerateWaaSVerificationURLResponse { nonce: string verificationURL: string } -export interface ValidateWaaSVerificationNonceArgs { + +export interface ValidateWaaSVerificationNonceRequest { nonce: string signature: string sessionId: string chainId: string } -export interface ValidateWaaSVerificationNonceReturn { +export interface ValidateWaaSVerificationNonceResponse { walletAddress: string } -export interface ListAdoptedWalletsArgs { + +export interface ListAdoptedWalletsRequest { page?: Page } -export interface ListAdoptedWalletsReturn { +export interface ListAdoptedWalletsResponse { page: Page wallets: Array } -export interface GetLifiChainsArgs {} -export interface GetLifiChainsReturn { +export interface GetLifiChainsRequest {} + +export interface GetLifiChainsResponse { chains: Array } -export interface GetLifiTokensArgs { + +export interface GetLifiTokensRequest { chainIds: Array } -export interface GetLifiTokensReturn { +export interface GetLifiTokensResponse { tokens: Array } -export interface GetLifiSwapRoutesArgs { + +export interface GetLifiSwapRoutesRequest { params: GetLifiSwapRouteParams chainId: number toTokenAddress: string @@ -1881,17 +1744,19 @@ export interface GetLifiSwapRoutesArgs { walletAddress: string } -export interface GetLifiSwapRoutesReturn { +export interface GetLifiSwapRoutesResponse { routes: Array } -export interface GetLifiSwapQuoteArgs { + +export interface GetLifiSwapQuoteRequest { params: GetLifiSwapQuoteParams } -export interface GetLifiSwapQuoteReturn { +export interface GetLifiSwapQuoteResponse { quote: LifiSwapQuote } -export interface GetIntentCallsPayloadsArgs { + +export interface GetIntentCallsPayloadsRequest { userAddress: string destinationChainId: number destinationTokenAddress: string @@ -1910,7 +1775,7 @@ export interface GetIntentCallsPayloadsArgs { tradeType?: TradeType } -export interface GetIntentCallsPayloadsReturn { +export interface GetIntentCallsPayloadsResponse { calls: Array preconditions: Array metaTxns: Array @@ -1920,7 +1785,8 @@ export interface GetIntentCallsPayloadsReturn { originIntentAddress: string destinationIntentAddress: string } -export interface CommitIntentConfigArgs { + +export interface CommitIntentConfigRequest { originIntentAddress: string destinationIntentAddress: string mainSigner: string @@ -1929,124 +1795,140 @@ export interface CommitIntentConfigArgs { addressOverrides?: AddressOverrides } -export interface CommitIntentConfigReturn { +export interface CommitIntentConfigResponse { config: IntentConfig } -export interface GetIntentConfigArgs { + +export interface GetIntentConfigRequest { intentAddress: string } -export interface GetIntentConfigReturn { +export interface GetIntentConfigResponse { config: IntentConfig } -export interface ListCurrencyGroupsArgs {} -export interface ListCurrencyGroupsReturn { +export interface ListCurrencyGroupsRequest {} + +export interface ListCurrencyGroupsResponse { currencyGroups: Array } -export interface AddOffchainInventoryArgs { + +export interface AddOffchainInventoryRequest { inventory: OffchainInventory } -export interface AddOffchainInventoryReturn { +export interface AddOffchainInventoryResponse { inventoryId: number } -export interface GetOffchainInventoryArgs { + +export interface GetOffchainInventoryRequest { inventoryId: number } -export interface GetOffchainInventoryReturn { +export interface GetOffchainInventoryResponse { inventory: OffchainInventory } -export interface ListOffchainInventoriesArgs { + +export interface ListOffchainInventoriesRequest { projectId: number } -export interface ListOffchainInventoriesReturn { +export interface ListOffchainInventoriesResponse { inventory: Array } -export interface UpdateOffchainInventoryArgs { + +export interface UpdateOffchainInventoryRequest { inventory: OffchainInventory } -export interface UpdateOffchainInventoryReturn {} -export interface DeleteOffchainInventoryArgs { +export interface UpdateOffchainInventoryResponse {} + +export interface DeleteOffchainInventoryRequest { inventoryId: number } -export interface DeleteOffchainInventoryReturn { +export interface DeleteOffchainInventoryResponse { ok: boolean } -export interface RequestOffchainPaymentArgs { + +export interface RequestOffchainPaymentRequest { inventoryId: number recipient: string chainId?: number tokenAddress?: string } -export interface RequestOffchainPaymentReturn { +export interface RequestOffchainPaymentResponse { payment: PaymentResponse } -export interface ListOffchainPaymentsArgs { + +export interface ListOffchainPaymentsRequest { inventoryId: number page?: Page } -export interface ListOffchainPaymentsReturn { +export interface ListOffchainPaymentsResponse { page: Page payments: Array } -export interface SavePackArgs { + +export interface SavePackRequest { pack: Pack } -export interface SavePackReturn { +export interface SavePackResponse { merkleRoot: string } -export interface GetPackArgs { + +export interface GetPackRequest { contractAddress: string packId: string chainId: number } -export interface GetPackReturn { +export interface GetPackResponse { pack: Pack } -export interface GetPackIdsArgs { + +export interface GetPackIdsRequest { contractAddress: string chainId: number } -export interface GetPackIdsReturn { +export interface GetPackIdsResponse { packIds: Array } -export interface DeletePackArgs { + +export interface DeletePackRequest { contractAddress: string packId: string chainId: number } -export interface DeletePackReturn { +export interface DeletePackResponse { status: boolean } -export interface UpdatePackContentArgs { + +export interface UpdatePackContentRequest { pack: Pack } -export interface UpdatePackContentReturn { +export interface UpdatePackContentResponse { merkleRoot: string } -export interface GetRevealTxDataArgs { + +export interface GetRevealTxDataRequest { contractAddress: string packId: string chainId: number userAddress: string } -export interface GetRevealTxDataReturn { +export interface GetRevealTxDataResponse { txData: string } -export interface CheckoutOptionsPrimaryArgs { + +export interface CheckoutOptionsPrimaryRequest { chainId: number wallet: string contractAddress: string @@ -2054,92 +1936,103 @@ export interface CheckoutOptionsPrimaryArgs { params: Array } -export interface CheckoutOptionsPrimaryReturn { +export interface CheckoutOptionsPrimaryResponse { options: CheckoutOptions } -export interface CheckoutOptionsSecondaryArgs { + +export interface CheckoutOptionsSecondaryRequest { chainId: number wallet: string params: Array } -export interface CheckoutOptionsSecondaryReturn { +export interface CheckoutOptionsSecondaryResponse { options: CheckoutOptions } -export interface CheckoutOptionsGetTransakContractIDArgs { + +export interface CheckoutOptionsGetTransakContractIDRequest { chainId: number contractAddress: string } -export interface CheckoutOptionsGetTransakContractIDReturn { +export interface CheckoutOptionsGetTransakContractIDResponse { contractId: string } -export interface FortePayCreateIntentArgs { + +export interface FortePayCreateIntentRequest { intent: FortePayCreateIntent } -export interface FortePayCreateIntentReturn { +export interface FortePayCreateIntentResponse { resp: FortePayIntent } -export interface FortePayGetPaymentStatusesArgs { + +export interface FortePayGetPaymentStatusesRequest { paymentIntentIds: Array } -export interface FortePayGetPaymentStatusesReturn { +export interface FortePayGetPaymentStatusesResponse { statuses: Array } -export interface GetCCTPTransferArgs { + +export interface GetCCTPTransferRequest { id: string } -export interface GetCCTPTransferReturn { +export interface GetCCTPTransferResponse { transfer: CCTPTransfer } -export interface QueueCCTPTransferArgs { + +export interface QueueCCTPTransferRequest { sourceTxHash?: string metaTxHash?: string sourceChainId: number destinationChainId: number } -export interface QueueCCTPTransferReturn { +export interface QueueCCTPTransferResponse { transfer: CCTPTransfer } -export interface QueueIntentConfigExecutionArgs { + +export interface QueueIntentConfigExecutionRequest { intentConfigId: number } -export interface QueueIntentConfigExecutionReturn { +export interface QueueIntentConfigExecutionResponse { status: boolean } -export interface GetIntentConfigExecutionStatusArgs { + +export interface GetIntentConfigExecutionStatusRequest { intentConfigId: number } -export interface GetIntentConfigExecutionStatusReturn { +export interface GetIntentConfigExecutionStatusResponse { executionStatus: string } -export interface ListIntentConfigsArgs { + +export interface ListIntentConfigsRequest { page?: Page executionStatus?: string } -export interface ListIntentConfigsReturn { +export interface ListIntentConfigsResponse { page: Page intentConfigs: Array } -export interface QueueMetaTxnReceiptArgs { + +export interface QueueMetaTxnReceiptRequest { metaTxID: string } -export interface QueueMetaTxnReceiptReturn { +export interface QueueMetaTxnReceiptResponse { status: boolean } // // Client // -export class API implements API { + +export class API implements APIClient { protected hostname: string protected fetch: Fetch protected path = '/rpc/API/' @@ -2153,1723 +2046,1850 @@ export class API implements API { return this.hostname + this.path + name } - ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + queryKey = { + ping: () => ['API', 'ping'] as const, + version: () => ['API', 'version'] as const, + runtimeStatus: () => ['API', 'runtimeStatus'] as const, + clock: () => ['API', 'clock'] as const, + getSequenceContext: () => ['API', 'getSequenceContext'] as const, + getAuthToken: (req: GetAuthTokenRequest) => ['API', 'getAuthToken', req] as const, + getAuthToken2: (req: GetAuthToken2Request) => ['API', 'getAuthToken2', req] as const, + sendPasswordlessLink: (req: SendPasswordlessLinkRequest) => ['API', 'sendPasswordlessLink', req] as const, + registerPublicKey: (req: RegisterPublicKeyRequest) => ['API', 'registerPublicKey', req] as const, + getPublicKey: (req: GetPublicKeyRequest) => ['API', 'getPublicKey', req] as const, + friendList: (req: FriendListRequest) => ['API', 'friendList', req] as const, + getFriendByAddress: (req: GetFriendByAddressRequest) => ['API', 'getFriendByAddress', req] as const, + searchFriends: (req: SearchFriendsRequest) => ['API', 'searchFriends', req] as const, + addFriend: (req: AddFriendRequest) => ['API', 'addFriend', req] as const, + updateFriendNickname: (req: UpdateFriendNicknameRequest) => ['API', 'updateFriendNickname', req] as const, + removeFriend: (req: RemoveFriendRequest) => ['API', 'removeFriend', req] as const, + contractCall: (req: ContractCallRequest) => ['API', 'contractCall', req] as const, + decodeContractCall: (req: DecodeContractCallRequest) => ['API', 'decodeContractCall', req] as const, + lookupContractCallSelectors: (req: LookupContractCallSelectorsRequest) => + ['API', 'lookupContractCallSelectors', req] as const, + userStorageFetch: (req: UserStorageFetchRequest) => ['API', 'userStorageFetch', req] as const, + userStorageSave: (req: UserStorageSaveRequest) => ['API', 'userStorageSave', req] as const, + userStorageDelete: (req: UserStorageDeleteRequest) => ['API', 'userStorageDelete', req] as const, + userStorageFetchAll: (req: UserStorageFetchAllRequest) => ['API', 'userStorageFetchAll', req] as const, + getMoonpayLink: (req: GetMoonpayLinkRequest) => ['API', 'getMoonpayLink', req] as const, + resolveENSAddress: (req: ResolveENSAddressRequest) => ['API', 'resolveENSAddress', req] as const, + isValidSignature: (req: IsValidSignatureRequest) => ['API', 'isValidSignature', req] as const, + isValidMessageSignature: (req: IsValidMessageSignatureRequest) => ['API', 'isValidMessageSignature', req] as const, + isValidTypedDataSignature: (req: IsValidTypedDataSignatureRequest) => + ['API', 'isValidTypedDataSignature', req] as const, + isValidETHAuthProof: (req: IsValidETHAuthProofRequest) => ['API', 'isValidETHAuthProof', req] as const, + getOnRampURL: (req: GetOnRampURLRequest) => ['API', 'getOnRampURL', req] as const, + transakGetCountries: () => ['API', 'transakGetCountries'] as const, + transakGetCryptoCurrencies: () => ['API', 'transakGetCryptoCurrencies'] as const, + transakGetFiatCurrencies: () => ['API', 'transakGetFiatCurrencies'] as const, + transakGetPrice: (req: TransakGetPriceRequest) => ['API', 'transakGetPrice', req] as const, + transakGetSupportedNFTCheckoutChains: () => ['API', 'transakGetSupportedNFTCheckoutChains'] as const, + transakGetWidgetURL: (req: TransakGetWidgetURLRequest) => ['API', 'transakGetWidgetURL', req] as const, + getCoinPrices: (req: GetCoinPricesRequest) => ['API', 'getCoinPrices', req] as const, + getCollectiblePrices: (req: GetCollectiblePricesRequest) => ['API', 'getCollectiblePrices', req] as const, + getExchangeRate: (req: GetExchangeRateRequest) => ['API', 'getExchangeRate', req] as const, + memoryStore: (req: MemoryStoreRequest) => ['API', 'memoryStore', req] as const, + memoryLoad: (req: MemoryLoadRequest) => ['API', 'memoryLoad', req] as const, + getInviteInfo: () => ['API', 'getInviteInfo'] as const, + isValidAccessCode: (req: IsValidAccessCodeRequest) => ['API', 'isValidAccessCode', req] as const, + internalClaimAccessCode: (req: InternalClaimAccessCodeRequest) => ['API', 'internalClaimAccessCode', req] as const, + blockNumberAtTime: (req: BlockNumberAtTimeRequest) => ['API', 'blockNumberAtTime', req] as const, + paperSessionSecret: (req: PaperSessionSecretRequest) => ['API', 'paperSessionSecret', req] as const, + paperSessionSecret2: (req: PaperSessionSecret2Request) => ['API', 'paperSessionSecret2', req] as const, + linkWallet: (req: LinkWalletRequest) => ['API', 'linkWallet', req] as const, + getLinkedWallets: (req: GetLinkedWalletsRequest) => ['API', 'getLinkedWallets', req] as const, + removeLinkedWallet: (req: RemoveLinkedWalletRequest) => ['API', 'removeLinkedWallet', req] as const, + generateWaaSVerificationURL: (req: GenerateWaaSVerificationURLRequest) => + ['API', 'generateWaaSVerificationURL', req] as const, + validateWaaSVerificationNonce: (req: ValidateWaaSVerificationNonceRequest) => + ['API', 'validateWaaSVerificationNonce', req] as const, + listAdoptedWallets: (req: ListAdoptedWalletsRequest) => ['API', 'listAdoptedWallets', req] as const, + getLifiChains: () => ['API', 'getLifiChains'] as const, + getLifiTokens: (req: GetLifiTokensRequest) => ['API', 'getLifiTokens', req] as const, + getLifiSwapRoutes: (req: GetLifiSwapRoutesRequest) => ['API', 'getLifiSwapRoutes', req] as const, + getLifiSwapQuote: (req: GetLifiSwapQuoteRequest) => ['API', 'getLifiSwapQuote', req] as const, + getIntentCallsPayloads: (req: GetIntentCallsPayloadsRequest) => ['API', 'getIntentCallsPayloads', req] as const, + commitIntentConfig: (req: CommitIntentConfigRequest) => ['API', 'commitIntentConfig', req] as const, + getIntentConfig: (req: GetIntentConfigRequest) => ['API', 'getIntentConfig', req] as const, + listCurrencyGroups: () => ['API', 'listCurrencyGroups'] as const, + addOffchainInventory: (req: AddOffchainInventoryRequest) => ['API', 'addOffchainInventory', req] as const, + getOffchainInventory: (req: GetOffchainInventoryRequest) => ['API', 'getOffchainInventory', req] as const, + listOffchainInventories: (req: ListOffchainInventoriesRequest) => ['API', 'listOffchainInventories', req] as const, + updateOffchainInventory: (req: UpdateOffchainInventoryRequest) => ['API', 'updateOffchainInventory', req] as const, + deleteOffchainInventory: (req: DeleteOffchainInventoryRequest) => ['API', 'deleteOffchainInventory', req] as const, + requestOffchainPayment: (req: RequestOffchainPaymentRequest) => ['API', 'requestOffchainPayment', req] as const, + listOffchainPayments: (req: ListOffchainPaymentsRequest) => ['API', 'listOffchainPayments', req] as const, + savePack: (req: SavePackRequest) => ['API', 'savePack', req] as const, + getPack: (req: GetPackRequest) => ['API', 'getPack', req] as const, + getPackIds: (req: GetPackIdsRequest) => ['API', 'getPackIds', req] as const, + deletePack: (req: DeletePackRequest) => ['API', 'deletePack', req] as const, + updatePackContent: (req: UpdatePackContentRequest) => ['API', 'updatePackContent', req] as const, + getRevealTxData: (req: GetRevealTxDataRequest) => ['API', 'getRevealTxData', req] as const, + checkoutOptionsPrimary: (req: CheckoutOptionsPrimaryRequest) => ['API', 'checkoutOptionsPrimary', req] as const, + checkoutOptionsSecondary: (req: CheckoutOptionsSecondaryRequest) => + ['API', 'checkoutOptionsSecondary', req] as const, + checkoutOptionsGetTransakContractID: (req: CheckoutOptionsGetTransakContractIDRequest) => + ['API', 'checkoutOptionsGetTransakContractID', req] as const, + fortePayCreateIntent: (req: FortePayCreateIntentRequest) => ['API', 'fortePayCreateIntent', req] as const, + fortePayGetPaymentStatuses: (req: FortePayGetPaymentStatusesRequest) => + ['API', 'fortePayGetPaymentStatuses', req] as const, + getCCTPTransfer: (req: GetCCTPTransferRequest) => ['API', 'getCCTPTransfer', req] as const, + queueCCTPTransfer: (req: QueueCCTPTransferRequest) => ['API', 'queueCCTPTransfer', req] as const, + queueIntentConfigExecution: (req: QueueIntentConfigExecutionRequest) => + ['API', 'queueIntentConfigExecution', req] as const, + getIntentConfigExecutionStatus: (req: GetIntentConfigExecutionStatusRequest) => + ['API', 'getIntentConfigExecutionStatus', req] as const, + listIntentConfigs: (req: ListIntentConfigsRequest) => ['API', 'listIntentConfigs', req] as const, + queueMetaTxnReceipt: (req: QueueMetaTxnReceiptRequest) => ['API', 'queueMetaTxnReceipt', req] as const, + } + + 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, - } + return JsonDecode(_data, 'PingResponse') }) }, (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( + 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, - } + return JsonDecode(_data, 'VersionResponse') }) }, (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( + 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, - } + return JsonDecode(_data, 'RuntimeStatusResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - clock = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Clock'), createHTTPRequest({}, headers, signal)).then( + 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, - } + return JsonDecode(_data, 'ClockResponse') }) }, (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( + 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, - } + return JsonDecode(_data, 'GetSequenceContextResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getAuthToken = (args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetAuthToken'), createHTTPRequest(args, headers, signal)).then( + getAuthToken = (req: GetAuthTokenRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetAuthToken'), + createHttpRequest(JsonEncode(req, 'GetAuthTokenRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - jwtToken: _data.jwtToken, - address: _data.address, - user: _data.user, - } + return JsonDecode(_data, 'GetAuthTokenResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getAuthToken2 = (args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetAuthToken2'), createHTTPRequest(args, headers, signal)).then( + getAuthToken2 = ( + req: GetAuthToken2Request, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('GetAuthToken2'), + createHttpRequest(JsonEncode(req, 'GetAuthToken2Request'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - jwtToken: _data.jwtToken, - address: _data.address, - user: _data.user, - } + return JsonDecode(_data, 'GetAuthToken2Response') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } sendPasswordlessLink = ( - args: SendPasswordlessLinkArgs, + req: SendPasswordlessLinkRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SendPasswordlessLink'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('SendPasswordlessLink'), + createHttpRequest(JsonEncode(req, 'SendPasswordlessLinkRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'SendPasswordlessLinkResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } registerPublicKey = ( - args: RegisterPublicKeyArgs, + req: RegisterPublicKeyRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RegisterPublicKey'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('RegisterPublicKey'), + createHttpRequest(JsonEncode(req, 'RegisterPublicKeyRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'RegisterPublicKeyResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getPublicKey = (args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetPublicKey'), createHTTPRequest(args, headers, signal)).then( + getPublicKey = (req: GetPublicKeyRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetPublicKey'), + createHttpRequest(JsonEncode(req, 'GetPublicKeyRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - publicKey: _data.publicKey, - } + return JsonDecode(_data, 'GetPublicKeyResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - friendList = (args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('FriendList'), createHTTPRequest(args, headers, signal)).then( + friendList = (req: FriendListRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('FriendList'), + createHttpRequest(JsonEncode(req, 'FriendListRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - friends: >_data.friends, - } + return JsonDecode(_data, 'FriendListResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getFriendByAddress = ( - args: GetFriendByAddressArgs, + req: GetFriendByAddressRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetFriendByAddress'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetFriendByAddress'), + createHttpRequest(JsonEncode(req, 'GetFriendByAddressRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - friend: _data.friend, - } + return JsonDecode(_data, 'GetFriendByAddressResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - searchFriends = (args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SearchFriends'), createHTTPRequest(args, headers, signal)).then( + searchFriends = ( + req: SearchFriendsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('SearchFriends'), + createHttpRequest(JsonEncode(req, 'SearchFriendsRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - friends: >_data.friends, - } + return JsonDecode(_data, 'SearchFriendsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - addFriend = (args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('AddFriend'), createHTTPRequest(args, headers, signal)).then( + addFriend = (req: AddFriendRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('AddFriend'), + createHttpRequest(JsonEncode(req, 'AddFriendRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - friend: _data.friend, - } + return JsonDecode(_data, 'AddFriendResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updateFriendNickname = ( - args: UpdateFriendNicknameArgs, + req: UpdateFriendNicknameRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdateFriendNickname'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('UpdateFriendNickname'), + createHttpRequest(JsonEncode(req, 'UpdateFriendNicknameRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - friend: _data.friend, - } + return JsonDecode(_data, 'UpdateFriendNicknameResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - removeFriend = (args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('RemoveFriend'), createHTTPRequest(args, headers, signal)).then( + removeFriend = (req: RemoveFriendRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('RemoveFriend'), + createHttpRequest(JsonEncode(req, 'RemoveFriendRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'RemoveFriendResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - contractCall = (args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('ContractCall'), createHTTPRequest(args, headers, signal)).then( + contractCall = (req: ContractCallRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ContractCall'), + createHttpRequest(JsonEncode(req, 'ContractCallRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - returns: >_data.returns, - } + return JsonDecode(_data, 'ContractCallResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } decodeContractCall = ( - args: DecodeContractCallArgs, + req: DecodeContractCallRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('DecodeContractCall'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('DecodeContractCall'), + createHttpRequest(JsonEncode(req, 'DecodeContractCallRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - call: _data.call, - } + return JsonDecode(_data, 'DecodeContractCallResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } lookupContractCallSelectors = ( - args: LookupContractCallSelectorsArgs, + req: LookupContractCallSelectorsRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('LookupContractCallSelectors'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('LookupContractCallSelectors'), + createHttpRequest(JsonEncode(req, 'LookupContractCallSelectorsRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - signatures: >>_data.signatures, - } + return JsonDecode(_data, 'LookupContractCallSelectorsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } userStorageFetch = ( - args: UserStorageFetchArgs, + req: UserStorageFetchRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UserStorageFetch'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('UserStorageFetch'), + createHttpRequest(JsonEncode(req, 'UserStorageFetchRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - object: _data.object, - } + return JsonDecode(_data, 'UserStorageFetchResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } userStorageSave = ( - args: UserStorageSaveArgs, + req: UserStorageSaveRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UserStorageSave'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('UserStorageSave'), + createHttpRequest(JsonEncode(req, 'UserStorageSaveRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'UserStorageSaveResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } userStorageDelete = ( - args: UserStorageDeleteArgs, + req: UserStorageDeleteRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UserStorageDelete'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('UserStorageDelete'), + createHttpRequest(JsonEncode(req, 'UserStorageDeleteRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'UserStorageDeleteResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } userStorageFetchAll = ( - args: UserStorageFetchAllArgs, + req: UserStorageFetchAllRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UserStorageFetchAll'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('UserStorageFetchAll'), + createHttpRequest(JsonEncode(req, 'UserStorageFetchAllRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - objects: <{ [key: string]: any }>_data.objects, - } + return JsonDecode(_data, 'UserStorageFetchAllResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getMoonpayLink = ( - args: GetMoonpayLinkArgs, + req: GetMoonpayLinkRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetMoonpayLink'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetMoonpayLink'), + createHttpRequest(JsonEncode(req, 'GetMoonpayLinkRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - signedUrl: _data.signedUrl, - } + return JsonDecode(_data, 'GetMoonpayLinkResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } resolveENSAddress = ( - args: ResolveENSAddressArgs, + req: ResolveENSAddressRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ResolveENSAddress'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('ResolveENSAddress'), + createHttpRequest(JsonEncode(req, 'ResolveENSAddressRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - address: _data.address, - ok: _data.ok, - } + return JsonDecode(_data, 'ResolveENSAddressResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } isValidSignature = ( - args: IsValidSignatureArgs, + req: IsValidSignatureRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidSignature'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('IsValidSignature'), + createHttpRequest(JsonEncode(req, 'IsValidSignatureRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - isValid: _data.isValid, - } + return JsonDecode(_data, 'IsValidSignatureResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } isValidMessageSignature = ( - args: IsValidMessageSignatureArgs, + req: IsValidMessageSignatureRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidMessageSignature'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('IsValidMessageSignature'), + createHttpRequest(JsonEncode(req, 'IsValidMessageSignatureRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - isValid: _data.isValid, - } + return JsonDecode(_data, 'IsValidMessageSignatureResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } isValidTypedDataSignature = ( - args: IsValidTypedDataSignatureArgs, + req: IsValidTypedDataSignatureRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidTypedDataSignature'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('IsValidTypedDataSignature'), + createHttpRequest(JsonEncode(req, 'IsValidTypedDataSignatureRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - isValid: _data.isValid, - } + return JsonDecode(_data, 'IsValidTypedDataSignatureResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } isValidETHAuthProof = ( - args: IsValidETHAuthProofArgs, + req: IsValidETHAuthProofRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidETHAuthProof'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('IsValidETHAuthProof'), + createHttpRequest(JsonEncode(req, 'IsValidETHAuthProofRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - isValid: _data.isValid, - } + return JsonDecode(_data, 'IsValidETHAuthProofResponse') }) }, (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, - } + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, ) } - sardineGetClientToken = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SardineGetClientToken'), createHTTPRequest({}, headers, signal)).then( + getOnRampURL = (req: GetOnRampURLRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetOnRampURL'), + createHttpRequest(JsonEncode(req, 'GetOnRampURLRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - token: _data.token, - } + return JsonDecode(_data, 'GetOnRampURLResponse') }) }, (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, - } + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - (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( + transakGetCountries = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('TransakGetCountries'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - resp: _data.resp, - } + return JsonDecode(_data, 'TransakGetCountriesResponse') }) }, (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, - } + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, ) } - sardineGetSupportedFiatCurrencies = ( + transakGetCryptoCurrencies = ( headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('SardineGetSupportedFiatCurrencies'), createHTTPRequest({}, headers, signal)).then( + ): Promise => { + return this.fetch(this.url('TransakGetCryptoCurrencies'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - tokens: >_data.tokens, - } + return JsonDecode(_data, 'TransakGetCryptoCurrenciesResponse') }) }, (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, - } + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - (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( + transakGetFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('TransakGetFiatCurrencies'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - token: _data.token, - } + return JsonDecode(_data, 'TransakGetFiatCurrenciesResponse') }) }, (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, - } + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, ) } - sardineGetQuote = ( - args: SardineGetQuoteArgs, + transakGetPrice = ( + req: TransakGetPriceRequest, 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( + ): Promise => { + return this.fetch( + this.url('TransakGetPrice'), + createHttpRequest(JsonEncode(req, 'TransakGetPriceRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - token: _data.token, - } + return JsonDecode(_data, 'TransakGetPriceResponse') }) }, (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, - } + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, ) } - getSardineNFTCheckoutOrderStatus = ( - args: GetSardineNFTCheckoutOrderStatusArgs, + transakGetSupportedNFTCheckoutChains = ( 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 || ''}` }) - }, - ) - } - - transakGetCryptoCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('TransakGetCryptoCurrencies'), createHTTPRequest({}, headers, signal)).then( + ): Promise => { + return this.fetch(this.url('TransakGetSupportedNFTCheckoutChains'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - currencies: >_data.currencies, - } + return JsonDecode( + _data, + 'TransakGetSupportedNFTCheckoutChainsResponse', + ) }) }, (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, - } + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, ) } - transakGetPrice = ( - args: TransakGetPriceArgs, + transakGetWidgetURL = ( + req: TransakGetWidgetURLRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('TransakGetPrice'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('TransakGetWidgetURL'), + createHttpRequest(JsonEncode(req, 'TransakGetWidgetURLRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - price: _data.price, - } + return JsonDecode(_data, 'TransakGetWidgetURLResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - transakGetSupportedNFTCheckoutChains = ( + getCoinPrices = ( + req: GetCoinPricesRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('TransakGetSupportedNFTCheckoutChains'), createHTTPRequest({}, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetCoinPrices'), + createHttpRequest(JsonEncode(req, 'GetCoinPricesRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - chains: >_data.chains, - } + return JsonDecode(_data, 'GetCoinPricesResponse') }) }, (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, - } + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, ) } getCollectiblePrices = ( - args: GetCollectiblePricesArgs, + req: GetCollectiblePricesRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetCollectiblePrices'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetCollectiblePrices'), + createHttpRequest(JsonEncode(req, 'GetCollectiblePricesRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - tokenPrices: >_data.tokenPrices, - } + return JsonDecode(_data, 'GetCollectiblePricesResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getExchangeRate = ( - args: GetExchangeRateArgs, + req: GetExchangeRateRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetExchangeRate'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetExchangeRate'), + createHttpRequest(JsonEncode(req, 'GetExchangeRateRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - exchangeRate: _data.exchangeRate, - } + return JsonDecode(_data, 'GetExchangeRateResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - memoryStore = (args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('MemoryStore'), createHTTPRequest(args, headers, signal)).then( + memoryStore = (req: MemoryStoreRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('MemoryStore'), + createHttpRequest(JsonEncode(req, 'MemoryStoreRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'MemoryStoreResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - memoryLoad = (args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('MemoryLoad'), createHTTPRequest(args, headers, signal)).then( + memoryLoad = (req: MemoryLoadRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('MemoryLoad'), + createHttpRequest(JsonEncode(req, 'MemoryLoadRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - value: _data.value, - } + return JsonDecode(_data, 'MemoryLoadResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getInviteInfo = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetInviteInfo'), createHTTPRequest({}, headers, signal)).then( + 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, - } + return JsonDecode(_data, 'GetInviteInfoResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } isValidAccessCode = ( - args: IsValidAccessCodeArgs, + req: IsValidAccessCodeRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('IsValidAccessCode'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('IsValidAccessCode'), + createHttpRequest(JsonEncode(req, 'IsValidAccessCodeRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'IsValidAccessCodeResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } internalClaimAccessCode = ( - args: InternalClaimAccessCodeArgs, + req: InternalClaimAccessCodeRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('InternalClaimAccessCode'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('InternalClaimAccessCode'), + createHttpRequest(JsonEncode(req, 'InternalClaimAccessCodeRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'InternalClaimAccessCodeResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } blockNumberAtTime = ( - args: BlockNumberAtTimeArgs, + req: BlockNumberAtTimeRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('BlockNumberAtTime'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('BlockNumberAtTime'), + createHttpRequest(JsonEncode(req, 'BlockNumberAtTimeRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - blocks: >_data.blocks, - } + return JsonDecode(_data, 'BlockNumberAtTimeResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } paperSessionSecret = ( - args: PaperSessionSecretArgs, + req: PaperSessionSecretRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('PaperSessionSecret'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('PaperSessionSecret'), + createHttpRequest(JsonEncode(req, 'PaperSessionSecretRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - secret: _data.secret, - } + return JsonDecode(_data, 'PaperSessionSecretResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } paperSessionSecret2 = ( - args: PaperSessionSecret2Args, + req: PaperSessionSecret2Request, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('PaperSessionSecret2'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('PaperSessionSecret2'), + createHttpRequest(JsonEncode(req, 'PaperSessionSecret2Request'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - secret: _data.secret, - } + return JsonDecode(_data, 'PaperSessionSecret2Response') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - linkWallet = (args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('LinkWallet'), createHTTPRequest(args, headers, signal)).then( + linkWallet = (req: LinkWalletRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('LinkWallet'), + createHttpRequest(JsonEncode(req, 'LinkWalletRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'LinkWalletResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getLinkedWallets = ( - args: GetLinkedWalletsArgs, + req: GetLinkedWalletsRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetLinkedWallets'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetLinkedWallets'), + createHttpRequest(JsonEncode(req, 'GetLinkedWalletsRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - linkedWallets: >_data.linkedWallets, - } + return JsonDecode(_data, 'GetLinkedWalletsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } removeLinkedWallet = ( - args: RemoveLinkedWalletArgs, + req: RemoveLinkedWalletRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RemoveLinkedWallet'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('RemoveLinkedWallet'), + createHttpRequest(JsonEncode(req, 'RemoveLinkedWalletRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'RemoveLinkedWalletResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } generateWaaSVerificationURL = ( - args: GenerateWaaSVerificationURLArgs, + req: GenerateWaaSVerificationURLRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GenerateWaaSVerificationURL'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GenerateWaaSVerificationURL'), + createHttpRequest(JsonEncode(req, 'GenerateWaaSVerificationURLRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - nonce: _data.nonce, - verificationURL: _data.verificationURL, - } + return JsonDecode(_data, 'GenerateWaaSVerificationURLResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } validateWaaSVerificationNonce = ( - args: ValidateWaaSVerificationNonceArgs, + req: ValidateWaaSVerificationNonceRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ValidateWaaSVerificationNonce'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('ValidateWaaSVerificationNonce'), + createHttpRequest(JsonEncode(req, 'ValidateWaaSVerificationNonceRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - walletAddress: _data.walletAddress, - } + return JsonDecode(_data, 'ValidateWaaSVerificationNonceResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listAdoptedWallets = ( - args: ListAdoptedWalletsArgs, + req: ListAdoptedWalletsRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListAdoptedWallets'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('ListAdoptedWallets'), + createHttpRequest(JsonEncode(req, 'ListAdoptedWalletsRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - wallets: >_data.wallets, - } + return JsonDecode(_data, 'ListAdoptedWalletsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getLifiChains = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetLifiChains'), createHTTPRequest({}, headers, signal)).then( + 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, - } + return JsonDecode(_data, 'GetLifiChainsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getLifiTokens = (args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetLifiTokens'), createHTTPRequest(args, headers, signal)).then( + getLifiTokens = ( + req: GetLifiTokensRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('GetLifiTokens'), + createHttpRequest(JsonEncode(req, 'GetLifiTokensRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - tokens: >_data.tokens, - } + return JsonDecode(_data, 'GetLifiTokensResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getLifiSwapRoutes = ( - args: GetLifiSwapRoutesArgs, + req: GetLifiSwapRoutesRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetLifiSwapRoutes'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetLifiSwapRoutes'), + createHttpRequest(JsonEncode(req, 'GetLifiSwapRoutesRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - routes: >_data.routes, - } + return JsonDecode(_data, 'GetLifiSwapRoutesResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getLifiSwapQuote = ( - args: GetLifiSwapQuoteArgs, + req: GetLifiSwapQuoteRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetLifiSwapQuote'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetLifiSwapQuote'), + createHttpRequest(JsonEncode(req, 'GetLifiSwapQuoteRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - quote: _data.quote, - } + return JsonDecode(_data, 'GetLifiSwapQuoteResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getIntentCallsPayloads = ( - args: GetIntentCallsPayloadsArgs, + req: GetIntentCallsPayloadsRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetIntentCallsPayloads'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetIntentCallsPayloads'), + createHttpRequest(JsonEncode(req, 'GetIntentCallsPayloadsRequest'), 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, - } + return JsonDecode(_data, 'GetIntentCallsPayloadsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } commitIntentConfig = ( - args: CommitIntentConfigArgs, + req: CommitIntentConfigRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('CommitIntentConfig'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('CommitIntentConfig'), + createHttpRequest(JsonEncode(req, 'CommitIntentConfigRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - config: _data.config, - } + return JsonDecode(_data, 'CommitIntentConfigResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getIntentConfig = ( - args: GetIntentConfigArgs, + req: GetIntentConfigRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetIntentConfig'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetIntentConfig'), + createHttpRequest(JsonEncode(req, 'GetIntentConfigRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - config: _data.config, - } + return JsonDecode(_data, 'GetIntentConfigResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - listCurrencyGroups = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('ListCurrencyGroups'), createHTTPRequest({}, headers, signal)).then( + 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, - } + return JsonDecode(_data, 'ListCurrencyGroupsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } addOffchainInventory = ( - args: AddOffchainInventoryArgs, + req: AddOffchainInventoryRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('AddOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('AddOffchainInventory'), + createHttpRequest(JsonEncode(req, 'AddOffchainInventoryRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - inventoryId: _data.inventoryId, - } + return JsonDecode(_data, 'AddOffchainInventoryResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getOffchainInventory = ( - args: GetOffchainInventoryArgs, + req: GetOffchainInventoryRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetOffchainInventory'), + createHttpRequest(JsonEncode(req, 'GetOffchainInventoryRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - inventory: _data.inventory, - } + return JsonDecode(_data, 'GetOffchainInventoryResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listOffchainInventories = ( - args: ListOffchainInventoriesArgs, + req: ListOffchainInventoriesRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListOffchainInventories'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('ListOffchainInventories'), + createHttpRequest(JsonEncode(req, 'ListOffchainInventoriesRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - inventory: >_data.inventory, - } + return JsonDecode(_data, 'ListOffchainInventoriesResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updateOffchainInventory = ( - args: UpdateOffchainInventoryArgs, + req: UpdateOffchainInventoryRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdateOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('UpdateOffchainInventory'), + createHttpRequest(JsonEncode(req, 'UpdateOffchainInventoryRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return {} + return JsonDecode(_data, 'UpdateOffchainInventoryResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } deleteOffchainInventory = ( - args: DeleteOffchainInventoryArgs, + req: DeleteOffchainInventoryRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('DeleteOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('DeleteOffchainInventory'), + createHttpRequest(JsonEncode(req, 'DeleteOffchainInventoryRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'DeleteOffchainInventoryResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } requestOffchainPayment = ( - args: RequestOffchainPaymentArgs, + req: RequestOffchainPaymentRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RequestOffchainPayment'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('RequestOffchainPayment'), + createHttpRequest(JsonEncode(req, 'RequestOffchainPaymentRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - payment: _data.payment, - } + return JsonDecode(_data, 'RequestOffchainPaymentResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listOffchainPayments = ( - args: ListOffchainPaymentsArgs, + req: ListOffchainPaymentsRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListOffchainPayments'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('ListOffchainPayments'), + createHttpRequest(JsonEncode(req, 'ListOffchainPaymentsRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - payments: >_data.payments, - } + return JsonDecode(_data, 'ListOffchainPaymentsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - savePack = (args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SavePack'), createHTTPRequest(args, headers, signal)).then( + savePack = (req: SavePackRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('SavePack'), + createHttpRequest(JsonEncode(req, 'SavePackRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - merkleRoot: _data.merkleRoot, - } + return JsonDecode(_data, 'SavePackResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getPack = (args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetPack'), createHTTPRequest(args, headers, signal)).then( + getPack = (req: GetPackRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetPack'), createHttpRequest(JsonEncode(req, 'GetPackRequest'), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - pack: _data.pack, - } + return JsonDecode(_data, 'GetPackResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getPackIds = (args: GetPackIdsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetPackIds'), createHTTPRequest(args, headers, signal)).then( + getPackIds = (req: GetPackIdsRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetPackIds'), + createHttpRequest(JsonEncode(req, 'GetPackIdsRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - packIds: >_data.packIds, - } + return JsonDecode(_data, 'GetPackIdsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - deletePack = (args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('DeletePack'), createHTTPRequest(args, headers, signal)).then( + deletePack = (req: DeletePackRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('DeletePack'), + createHttpRequest(JsonEncode(req, 'DeletePackRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'DeletePackResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updatePackContent = ( - args: UpdatePackContentArgs, + req: UpdatePackContentRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdatePackContent'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('UpdatePackContent'), + createHttpRequest(JsonEncode(req, 'UpdatePackContentRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - merkleRoot: _data.merkleRoot, - } + return JsonDecode(_data, 'UpdatePackContentResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getRevealTxData = ( - args: GetRevealTxDataArgs, + req: GetRevealTxDataRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetRevealTxData'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetRevealTxData'), + createHttpRequest(JsonEncode(req, 'GetRevealTxDataRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - txData: _data.txData, - } + return JsonDecode(_data, 'GetRevealTxDataResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } checkoutOptionsPrimary = ( - args: CheckoutOptionsPrimaryArgs, + req: CheckoutOptionsPrimaryRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('CheckoutOptionsPrimary'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('CheckoutOptionsPrimary'), + createHttpRequest(JsonEncode(req, 'CheckoutOptionsPrimaryRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - options: _data.options, - } + return JsonDecode(_data, 'CheckoutOptionsPrimaryResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } checkoutOptionsSecondary = ( - args: CheckoutOptionsSecondaryArgs, + req: CheckoutOptionsSecondaryRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('CheckoutOptionsSecondary'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('CheckoutOptionsSecondary'), + createHttpRequest(JsonEncode(req, 'CheckoutOptionsSecondaryRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - options: _data.options, - } + return JsonDecode(_data, 'CheckoutOptionsSecondaryResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } checkoutOptionsGetTransakContractID = ( - args: CheckoutOptionsGetTransakContractIDArgs, + req: CheckoutOptionsGetTransakContractIDRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('CheckoutOptionsGetTransakContractID'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('CheckoutOptionsGetTransakContractID'), + createHttpRequest(JsonEncode(req, 'CheckoutOptionsGetTransakContractIDRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractId: _data.contractId, - } + return JsonDecode( + _data, + 'CheckoutOptionsGetTransakContractIDResponse', + ) }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } fortePayCreateIntent = ( - args: FortePayCreateIntentArgs, + req: FortePayCreateIntentRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('FortePayCreateIntent'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('FortePayCreateIntent'), + createHttpRequest(JsonEncode(req, 'FortePayCreateIntentRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - resp: _data.resp, - } + return JsonDecode(_data, 'FortePayCreateIntentResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } fortePayGetPaymentStatuses = ( - args: FortePayGetPaymentStatusesArgs, + req: FortePayGetPaymentStatusesRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('FortePayGetPaymentStatuses'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('FortePayGetPaymentStatuses'), + createHttpRequest(JsonEncode(req, 'FortePayGetPaymentStatusesRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - statuses: >_data.statuses, - } + return JsonDecode(_data, 'FortePayGetPaymentStatusesResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getCCTPTransfer = ( - args: GetCCTPTransferArgs, + req: GetCCTPTransferRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetCCTPTransfer'), + createHttpRequest(JsonEncode(req, 'GetCCTPTransferRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - transfer: _data.transfer, - } + return JsonDecode(_data, 'GetCCTPTransferResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } queueCCTPTransfer = ( - args: QueueCCTPTransferArgs, + req: QueueCCTPTransferRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('QueueCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('QueueCCTPTransfer'), + createHttpRequest(JsonEncode(req, 'QueueCCTPTransferRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - transfer: _data.transfer, - } + return JsonDecode(_data, 'QueueCCTPTransferResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } queueIntentConfigExecution = ( - args: QueueIntentConfigExecutionArgs, + req: QueueIntentConfigExecutionRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('QueueIntentConfigExecution'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('QueueIntentConfigExecution'), + createHttpRequest(JsonEncode(req, 'QueueIntentConfigExecutionRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'QueueIntentConfigExecutionResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getIntentConfigExecutionStatus = ( - args: GetIntentConfigExecutionStatusArgs, + req: GetIntentConfigExecutionStatusRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetIntentConfigExecutionStatus'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('GetIntentConfigExecutionStatus'), + createHttpRequest(JsonEncode(req, 'GetIntentConfigExecutionStatusRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - executionStatus: _data.executionStatus, - } + return JsonDecode(_data, 'GetIntentConfigExecutionStatusResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listIntentConfigs = ( - args: ListIntentConfigsArgs, + req: ListIntentConfigsRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ListIntentConfigs'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('ListIntentConfigs'), + createHttpRequest(JsonEncode(req, 'ListIntentConfigsRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - intentConfigs: >_data.intentConfigs, - } + return JsonDecode(_data, 'ListIntentConfigsResponse') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } queueMetaTxnReceipt = ( - args: QueueMetaTxnReceiptArgs, + req: QueueMetaTxnReceiptRequest, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('QueueMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + ): Promise => { + return this.fetch( + this.url('QueueMetaTxnReceipt'), + createHttpRequest(JsonEncode(req, 'QueueMetaTxnReceiptRequest'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'QueueMetaTxnReceiptResponse') }) }, (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 reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } - reqHeaders[WebrpcHeader] = WebrpcHeaderValue - - return { - method: 'POST', - headers: reqHeaders, - body: JSON.stringify(body || {}), - signal, +const createHttpRequest = (body: string = '{}', headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { + ...headers, + 'Content-Type': 'application/json', + [WebrpcHeader]: WebrpcHeaderValue, } + return { method: 'POST', headers: reqHeaders, body, signal } } const buildResponse = (res: Response): Promise => { @@ -3878,13 +3898,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) { @@ -3895,504 +3911,481 @@ const buildResponse = (res: Response): Promise => { }) } +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + +export const JsonEncode = (obj: T, _typ: string = ''): string => { + return JSON.stringify(obj) +} + +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 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 = 2000, - 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 : 2000 + 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 UnsupportedNetworkError extends WebrpcError { - constructor( - name: string = 'UnsupportedNetwork', - code: number = 3008, - message: string = `Unsupported network`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'UnsupportedNetwork' + this.code = typeof error.code === 'number' ? error.code : 3008 + this.message = error.message || `Unsupported network` + this.status = typeof error.status === 'number' ? error.status : 422 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, UnsupportedNetworkError.prototype) } } @@ -4406,7 +4399,7 @@ export enum errors { WebrpcBadResponse = 'WebrpcBadResponse', WebrpcServerPanic = 'WebrpcServerPanic', WebrpcInternalError = 'WebrpcInternalError', - WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcClientAborted = 'WebrpcClientAborted', WebrpcStreamLost = 'WebrpcStreamLost', WebrpcStreamFinished = 'WebrpcStreamFinished', Unauthorized = 'Unauthorized', @@ -4445,7 +4438,7 @@ export enum WebrpcErrorCodes { WebrpcBadResponse = -5, WebrpcServerPanic = -6, WebrpcInternalError = -7, - WebrpcClientDisconnected = -8, + WebrpcClientAborted = -8, WebrpcStreamLost = -9, WebrpcStreamFinished = -10, Unauthorized = 1000, @@ -4484,7 +4477,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { [-5]: WebrpcBadResponseError, [-6]: WebrpcServerPanicError, [-7]: WebrpcInternalErrorError, - [-8]: WebrpcClientDisconnectedError, + [-8]: WebrpcClientAbortedError, [-9]: WebrpcStreamLostError, [-10]: WebrpcStreamFinishedError, [1000]: UnauthorizedError, @@ -4514,4 +4507,58 @@ export const webrpcErrorByCode: { [code: number]: any } = { [3008]: UnsupportedNetworkError, } -export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise +// +// Webrpc +// + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.31.0;gen-typescript@v0.22.5;sequence-api@v0.4.0' + +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 ?? '', + } +} From 031a6332ab83197bb5934d652acf741b2bff5bb3 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 21:46:48 +0100 Subject: [PATCH 074/177] Update metadata.gen.ts --- .../services/metadata/src/metadata.gen.ts | 2264 ++++++++++------- 1 file changed, 1289 insertions(+), 975 deletions(-) diff --git a/packages/services/metadata/src/metadata.gen.ts b/packages/services/metadata/src/metadata.gen.ts index 05cdfb194..9390aee76 100644 --- a/packages/services/metadata/src/metadata.gen.ts +++ b/packages/services/metadata/src/metadata.gen.ts @@ -1,73 +1,357 @@ /* eslint-disable */ -// sequence-metadata v0.4.0 5cb74ff169ce80c2e42e65d6bbc98b1daaa0945f +// sequence-metadata v0.4.0 673a5fa528008c7f9558810fbb24aad978ed7a84 // -- -// Code generated by webrpc-gen@v0.25.3 with typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen@v0.31.0 with typescript generator. DO NOT EDIT. // -// webrpc-gen -schema=metadata.ridl -target=typescript -client -ignore=@deprecated -out=./clients/metadata.gen.ts +// webrpc-gen -schema=metadata.ridl -target=typescript -client -ignore=@deprecated -compat -out=./clients/metadata.gen.ts -export const WebrpcHeader = 'Webrpc' - -export const WebrpcHeaderValue = 'webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-metadata@v0.4.0' - -// 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.0' +export const WebrpcSchemaVersion = 'v0.4.0' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = '5cb74ff169ce80c2e42e65d6bbc98b1daaa0945f' +export const WebrpcSchemaHash = '673a5fa528008c7f9558810fbb24aad978ed7a84' -type WebrpcGenVersions = { - webrpcGenVersion: string - codeGenName: string - codeGenVersion: string - schemaName: string - schemaVersion: string +// +// Client interface +// + +export interface MetadataClient { + ping(headers?: object, signal?: AbortSignal): Promise + + version(headers?: object, signal?: AbortSignal): Promise + + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + + getTask(req: GetTaskArgs, headers?: object, signal?: AbortSignal): Promise + + getTaskStatus(req: GetTaskStatusArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * Contract Info -- returns contract meta-info for contracts found in registered chain's token-lists + */ + getContractInfo(req: GetContractInfoArgs, headers?: object, signal?: AbortSignal): Promise + + getContractInfoBatch( + req: GetContractInfoBatchArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Find Contract Info across all chains token-lists. Similar to GetContractInfo above, + * but it will traverse all chains and results from all. + */ + findContractInfo(req: FindContractInfoArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * map of contractAddress :: []ContractInfo + */ + findContractInfoBatch( + req: FindContractInfoBatchArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Refresh Contract Info -- refresh contract meta-info + */ + refreshContractInfo( + req: RefreshContractInfoArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + refreshContractInfoBatch( + req: RefreshContractInfoBatchArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Search for contract infos using a query string + */ + searchContractsByQuery( + req: SearchContractsByQueryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * GetTokenMetadata - fetch token metadata for a particular contract and respective tokenIDs + */ + getTokenMetadata(req: GetTokenMetadataArgs, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenMetadataBatch allows you to query the token metadata of a batch of contracts and respective tokenIDs + * where map is contractAddress::[]tokenID => contractAddress::[]TokenMetadata + * + * Note, we limit each request to 50 contracts max and 50 tokens max per contract. + */ + getTokenMetadataBatch( + req: GetTokenMetadataBatchArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * RefreshTokenMetadata allows you to refresh a contract metadata for contract-level and token-level metadata. + */ + refreshTokenMetadata( + req: RefreshTokenMetadataArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Search ERC721 & ERC1155 token metadata by query string 'q' + */ + searchTokenMetadataByQuery( + req: SearchTokenMetadataByQueryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Search ERC721 & ERC1155 token metadata by filter object 'filter' + * which allows to search by text or properties. + */ + searchTokenMetadata( + req: SearchTokenMetadataArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Search ERC721 & ERC1155 for token IDs by filter object 'filter' + * which allows to search by text or properties. + */ + searchTokenMetadataTokenIDs( + req: SearchTokenMetadataTokenIDsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Get token metadata property filters for a contract address + */ + getTokenMetadataPropertyFilters( + req: GetTokenMetadataPropertyFiltersArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Gets Token Directory supported networks + */ + getTokenDirectoryNetworks( + req: GetTokenDirectoryNetworksArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Gets Token Directory entries + */ + getTokenDirectory( + req: GetTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Search in Token Directory + */ + searchTokenDirectory( + req: SearchTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Niftyswap querying data + */ + getNiftyswapTokenQuantity( + req: GetNiftyswapTokenQuantityArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * map of tokenID :: quantity + */ + getNiftyswapUnitPrices( + req: GetNiftyswapUnitPricesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * map of tokenID :: price + */ + getNiftyswapUnitPricesWithQuantities( + req: GetNiftyswapUnitPricesWithQuantitiesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise } +export interface CollectionsClient { + createCollection(req: CreateCollectionArgs, headers?: object, signal?: AbortSignal): Promise -export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader) - if (!headerValue) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } + getCollection(req: GetCollectionArgs, headers?: object, signal?: AbortSignal): Promise - return parseWebrpcGenVersions(headerValue) + listCollections(req: ListCollectionsArgs, headers?: object, signal?: AbortSignal): Promise + + updateCollection(req: UpdateCollectionArgs, headers?: object, signal?: AbortSignal): Promise + + deleteCollection(req: DeleteCollectionArgs, headers?: object, signal?: AbortSignal): Promise + + publishCollection( + req: PublishCollectionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + unpublishCollection( + req: UnpublishCollectionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + createContractCollection( + req: CreateContractCollectionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + getContractCollection( + req: GetContractCollectionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + listContractCollections( + req: ListContractCollectionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + updateContractCollection( + req: UpdateContractCollectionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + deleteContractCollection( + req: DeleteContractCollectionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + createToken(req: CreateTokenArgs, headers?: object, signal?: AbortSignal): Promise + + getToken(req: GetTokenArgs, headers?: object, signal?: AbortSignal): Promise + + listTokens(req: ListTokensArgs, headers?: object, signal?: AbortSignal): Promise + + updateToken(req: UpdateTokenArgs, headers?: object, signal?: AbortSignal): Promise + + deleteToken(req: DeleteTokenArgs, headers?: object, signal?: AbortSignal): Promise + + createAsset(req: CreateAssetArgs, headers?: object, signal?: AbortSignal): Promise + + getAsset(req: GetAssetArgs, headers?: object, signal?: AbortSignal): Promise + + updateAsset(req: UpdateAssetArgs, headers?: object, signal?: AbortSignal): Promise + + deleteAsset(req: DeleteAssetArgs, headers?: object, signal?: AbortSignal): Promise } +export interface AdminClient { + /** + * ContractInfo + */ + refreshContractInfoUpdatedBefore( + req: RefreshContractInfoUpdatedBeforeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise -function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(';') - if (versions.length < 3) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } + /** + * TokenMetadata + */ + refreshTokenMetadataUpdatedBefore( + req: RefreshTokenMetadataUpdatedBeforeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise - const [_, webrpcGenVersion] = versions[0]!.split('@') - const [codeGenName, codeGenVersion] = versions[1]!.split('@') - const [schemaName, schemaVersion] = versions[2]!.split('@') + /** + * Contract Info Overrides + */ + getContractInfoOverride( + req: GetContractInfoOverrideArgs, + headers?: object, + signal?: AbortSignal, + ): Promise - return { - webrpcGenVersion: webrpcGenVersion ?? '', - codeGenName: codeGenName ?? '', - codeGenVersion: codeGenVersion ?? '', - schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '', - } + getContractInfoOverrides( + req: GetContractInfoOverridesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + addContractInfoOverride( + req: AddContractInfoOverrideArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + updateContractInfoOverride( + req: UpdateContractInfoOverrideArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + removeContractInfoOverride( + req: RemoveContractInfoOverrideArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + /** + * Token Directory + */ + isInTokenDirectory( + req: IsInTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + setTokenDirectoryFeatureIndex( + req: SetTokenDirectoryFeatureIndexArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + addContractToTokenDirectory( + req: AddContractToTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + removeContractFromTokenDirectory( + req: RemoveContractFromTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + refreshTokenDirectory(headers?: object, signal?: AbortSignal): Promise } // -// Types +// Schema types // export enum ContractType { @@ -366,177 +650,24 @@ export interface Task { result: Array } -export interface Metadata { - ping(headers?: object, signal?: AbortSignal): Promise - version(headers?: object, signal?: AbortSignal): Promise - runtimeStatus(headers?: object, signal?: AbortSignal): Promise - getTask(args: GetTaskArgs, headers?: object, signal?: AbortSignal): Promise - getTaskStatus(args: GetTaskStatusArgs, headers?: object, signal?: AbortSignal): Promise - /** - * Contract Info -- returns contract meta-info for contracts found in registered chain's token-lists - */ - getContractInfo(args: GetContractInfoArgs, headers?: object, signal?: AbortSignal): Promise - getContractInfoBatch( - args: GetContractInfoBatchArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Find Contract Info across all chains token-lists. Similar to GetContractInfo above, - * but it will traverse all chains and results from all. - */ - findContractInfo(args: FindContractInfoArgs, headers?: object, signal?: AbortSignal): Promise - /** - * map of contractAddress :: []ContractInfo - */ - findContractInfoBatch( - args: FindContractInfoBatchArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Refresh Contract Info -- refresh contract meta-info - */ - refreshContractInfo( - args: RefreshContractInfoArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - refreshContractInfoBatch( - args: RefreshContractInfoBatchArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Search for contract infos using a query string - */ - searchContractsByQuery( - args: SearchContractsByQueryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * GetTokenMetadata - fetch token metadata for a particular contract and respective tokenIDs - */ - getTokenMetadata(args: GetTokenMetadataArgs, headers?: object, signal?: AbortSignal): Promise - /** - * GetTokenMetadataBatch allows you to query the token metadata of a batch of contracts and respective tokenIDs - * where map is contractAddress::[]tokenID => contractAddress::[]TokenMetadata - * - * Note, we limit each request to 50 contracts max and 50 tokens max per contract. - */ - getTokenMetadataBatch( - args: GetTokenMetadataBatchArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * RefreshTokenMetadata allows you to refresh a contract metadata for contract-level and token-level metadata. - */ - refreshTokenMetadata( - args: RefreshTokenMetadataArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Search ERC721 & ERC1155 token metadata by query string 'q' - */ - searchTokenMetadataByQuery( - args: SearchTokenMetadataByQueryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Search ERC721 & ERC1155 token metadata by filter object 'filter' - * which allows to search by text or properties. - */ - searchTokenMetadata( - args: SearchTokenMetadataArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Search ERC721 & ERC1155 for token IDs by filter object 'filter' - * which allows to search by text or properties. - */ - searchTokenMetadataTokenIDs( - args: SearchTokenMetadataTokenIDsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Get token metadata property filters for a contract address - */ - getTokenMetadataPropertyFilters( - args: GetTokenMetadataPropertyFiltersArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Gets Token Directory supported networks - */ - getTokenDirectoryNetworks( - args: GetTokenDirectoryNetworksArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Gets Token Directory entries - */ - getTokenDirectory( - args: GetTokenDirectoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Search in Token Directory - */ - searchTokenDirectory( - args: SearchTokenDirectoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Niftyswap querying data - */ - getNiftyswapTokenQuantity( - args: GetNiftyswapTokenQuantityArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * map of tokenID :: quantity - */ - getNiftyswapUnitPrices( - args: GetNiftyswapUnitPricesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * map of tokenID :: price - */ - getNiftyswapUnitPricesWithQuantities( - args: GetNiftyswapUnitPricesWithQuantitiesArgs, - 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 GetTaskArgs { taskId: number } @@ -544,6 +675,7 @@ export interface GetTaskArgs { export interface GetTaskReturn { task: Task } + export interface GetTaskStatusArgs { taskId: number } @@ -551,6 +683,7 @@ export interface GetTaskStatusArgs { export interface GetTaskStatusReturn { status?: TaskStatus } + export interface GetContractInfoArgs { chainID: string contractAddress: string @@ -560,6 +693,7 @@ export interface GetContractInfoReturn { contractInfo: ContractInfo taskID?: number } + export interface GetContractInfoBatchArgs { chainID: string contractAddresses: Array @@ -569,6 +703,7 @@ export interface GetContractInfoBatchReturn { contractInfoMap: { [key: string]: ContractInfo } taskID?: number } + export interface FindContractInfoArgs { contractAddress: string } @@ -576,6 +711,7 @@ export interface FindContractInfoArgs { export interface FindContractInfoReturn { contractInfoList: Array } + export interface FindContractInfoBatchArgs { contractAddresses: Array } @@ -583,6 +719,7 @@ export interface FindContractInfoBatchArgs { export interface FindContractInfoBatchReturn { contractInfoByChain: { [key: string]: Array } } + export interface RefreshContractInfoArgs { chainID: string contractAddress: string @@ -591,6 +728,7 @@ export interface RefreshContractInfoArgs { export interface RefreshContractInfoReturn { taskID?: number } + export interface RefreshContractInfoBatchArgs { chainID: string contractAddresses: Array @@ -599,6 +737,7 @@ export interface RefreshContractInfoBatchArgs { export interface RefreshContractInfoBatchReturn { taskID?: number } + export interface SearchContractsByQueryArgs { q: string chainID?: string @@ -611,6 +750,7 @@ export interface SearchContractsByQueryReturn { contractInfo: Array nextPage: Page } + export interface GetTokenMetadataArgs { chainID: string contractAddress: string @@ -621,6 +761,7 @@ export interface GetTokenMetadataReturn { tokenMetadata: Array taskID?: number } + export interface GetTokenMetadataBatchArgs { chainID: string contractTokenMap: { [key: string]: Array } @@ -630,16 +771,18 @@ export interface GetTokenMetadataBatchReturn { contractTokenMetadata: { [key: string]: Array } taskID?: number } + export interface RefreshTokenMetadataArgs { chainID: string contractAddress: string tokenIDs?: Array - refreshAll?: boolean + newMints?: boolean } export interface RefreshTokenMetadataReturn { taskID: number } + export interface SearchTokenMetadataByQueryArgs { q: string chainID?: string @@ -651,6 +794,7 @@ export interface SearchTokenMetadataByQueryReturn { tokenMetadata: Array nextPage: Page } + export interface SearchTokenMetadataArgs { chainID: string contractAddress: string @@ -662,6 +806,7 @@ export interface SearchTokenMetadataReturn { page: Page tokenMetadata: Array } + export interface SearchTokenMetadataTokenIDsArgs { chainID: string contractAddress: string @@ -673,6 +818,7 @@ export interface SearchTokenMetadataTokenIDsReturn { page: Page tokenIDs: Array } + export interface GetTokenMetadataPropertyFiltersArgs { chainID: string contractAddress: string @@ -683,6 +829,7 @@ export interface GetTokenMetadataPropertyFiltersArgs { export interface GetTokenMetadataPropertyFiltersReturn { filters: Array } + export interface GetTokenDirectoryNetworksArgs { includeTestnets?: boolean onlyFeatured?: boolean @@ -692,6 +839,7 @@ export interface GetTokenDirectoryNetworksReturn { chainIDs: Array networks: Array } + export interface GetTokenDirectoryArgs { chainID?: string includeTestnets?: boolean @@ -703,6 +851,7 @@ export interface GetTokenDirectoryReturn { contracts: Array page: Page } + export interface SearchTokenDirectoryArgs { query: string chainID?: number @@ -715,6 +864,7 @@ export interface SearchTokenDirectoryReturn { contracts: Array page: Page } + export interface GetNiftyswapTokenQuantityArgs { chainID: string contractAddress: string @@ -724,6 +874,7 @@ export interface GetNiftyswapTokenQuantityArgs { export interface GetNiftyswapTokenQuantityReturn { quantity: { [key: string]: string } } + export interface GetNiftyswapUnitPricesArgs { chainID: string contractAddress: string @@ -734,6 +885,7 @@ export interface GetNiftyswapUnitPricesArgs { export interface GetNiftyswapUnitPricesReturn { prices: { [key: string]: string } } + export interface GetNiftyswapUnitPricesWithQuantitiesArgs { chainID: string contractAddress: string @@ -745,58 +897,6 @@ export interface GetNiftyswapUnitPricesWithQuantitiesReturn { prices: { [key: string]: GetNiftyswapUnitPricesResponse } } -export interface Collections { - createCollection(args: CreateCollectionArgs, headers?: object, signal?: AbortSignal): Promise - getCollection(args: GetCollectionArgs, headers?: object, signal?: AbortSignal): Promise - listCollections(args: ListCollectionsArgs, headers?: object, signal?: AbortSignal): Promise - updateCollection(args: UpdateCollectionArgs, headers?: object, signal?: AbortSignal): Promise - deleteCollection(args: DeleteCollectionArgs, headers?: object, signal?: AbortSignal): Promise - publishCollection( - args: PublishCollectionArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - unpublishCollection( - args: UnpublishCollectionArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - createContractCollection( - args: CreateContractCollectionArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getContractCollection( - args: GetContractCollectionArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - listContractCollections( - args: ListContractCollectionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - updateContractCollection( - args: UpdateContractCollectionArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - deleteContractCollection( - args: DeleteContractCollectionArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - createToken(args: CreateTokenArgs, headers?: object, signal?: AbortSignal): Promise - getToken(args: GetTokenArgs, headers?: object, signal?: AbortSignal): Promise - listTokens(args: ListTokensArgs, headers?: object, signal?: AbortSignal): Promise - updateToken(args: UpdateTokenArgs, headers?: object, signal?: AbortSignal): Promise - deleteToken(args: DeleteTokenArgs, headers?: object, signal?: AbortSignal): Promise - createAsset(args: CreateAssetArgs, headers?: object, signal?: AbortSignal): Promise - getAsset(args: GetAssetArgs, headers?: object, signal?: AbortSignal): Promise - updateAsset(args: UpdateAssetArgs, headers?: object, signal?: AbortSignal): Promise - deleteAsset(args: DeleteAssetArgs, headers?: object, signal?: AbortSignal): Promise -} - export interface CreateCollectionArgs { projectId?: number collection: Collection @@ -805,6 +905,7 @@ export interface CreateCollectionArgs { export interface CreateCollectionReturn { collection: Collection } + export interface GetCollectionArgs { projectId?: number collectionId: number @@ -813,6 +914,7 @@ export interface GetCollectionArgs { export interface GetCollectionReturn { collection: Collection } + export interface ListCollectionsArgs { projectId?: number page?: Page @@ -822,6 +924,7 @@ export interface ListCollectionsReturn { page: Page collections: Array } + export interface UpdateCollectionArgs { projectId?: number collection: Collection @@ -830,6 +933,7 @@ export interface UpdateCollectionArgs { export interface UpdateCollectionReturn { collection: Collection } + export interface DeleteCollectionArgs { projectId?: number collectionId: number @@ -838,6 +942,7 @@ export interface DeleteCollectionArgs { export interface DeleteCollectionReturn { status: boolean } + export interface PublishCollectionArgs { projectId?: number collectionId: number @@ -847,6 +952,7 @@ export interface PublishCollectionArgs { export interface PublishCollectionReturn { collection: Collection } + export interface UnpublishCollectionArgs { projectId?: number collectionId: number @@ -855,6 +961,7 @@ export interface UnpublishCollectionArgs { export interface UnpublishCollectionReturn { collection: Collection } + export interface CreateContractCollectionArgs { projectId: number contractCollection: ContractCollection @@ -863,6 +970,7 @@ export interface CreateContractCollectionArgs { export interface CreateContractCollectionReturn { contractCollection: ContractCollection } + export interface GetContractCollectionArgs { projectId: number chainId: number @@ -872,6 +980,7 @@ export interface GetContractCollectionArgs { export interface GetContractCollectionReturn { contractCollection: ContractCollection } + export interface ListContractCollectionsArgs { projectId: number collectionId?: number @@ -883,6 +992,7 @@ export interface ListContractCollectionsReturn { collections: Array page: Page } + export interface UpdateContractCollectionArgs { projectId: number contractCollection: ContractCollection @@ -891,6 +1001,7 @@ export interface UpdateContractCollectionArgs { export interface UpdateContractCollectionReturn { ok: boolean } + export interface DeleteContractCollectionArgs { projectId: number chainId: number @@ -900,6 +1011,7 @@ export interface DeleteContractCollectionArgs { export interface DeleteContractCollectionReturn { ok: boolean } + export interface CreateTokenArgs { projectId?: number collectionId: number @@ -911,6 +1023,7 @@ export interface CreateTokenReturn { token: TokenMetadata assets: Array } + export interface GetTokenArgs { projectId?: number collectionId: number @@ -921,6 +1034,7 @@ export interface GetTokenReturn { token: TokenMetadata assets: Array } + export interface ListTokensArgs { projectId?: number collectionId: number @@ -931,6 +1045,7 @@ export interface ListTokensReturn { page: Page tokens: Array } + export interface UpdateTokenArgs { projectId?: number collectionId: number @@ -942,6 +1057,7 @@ export interface UpdateTokenArgs { export interface UpdateTokenReturn { token: TokenMetadata } + export interface DeleteTokenArgs { projectId?: number collectionId: number @@ -951,6 +1067,7 @@ export interface DeleteTokenArgs { export interface DeleteTokenReturn { status: boolean } + export interface CreateAssetArgs { projectId?: number asset: Asset @@ -959,6 +1076,7 @@ export interface CreateAssetArgs { export interface CreateAssetReturn { asset: Asset } + export interface GetAssetArgs { projectId?: number assetId: number @@ -967,6 +1085,7 @@ export interface GetAssetArgs { export interface GetAssetReturn { asset: Asset } + export interface UpdateAssetArgs { projectId?: number asset: Asset @@ -975,6 +1094,7 @@ export interface UpdateAssetArgs { export interface UpdateAssetReturn { asset: Asset } + export interface DeleteAssetArgs { projectId?: number assetId: number @@ -984,77 +1104,6 @@ export interface DeleteAssetReturn { status: boolean } -export interface Admin { - /** - * ContractInfo - */ - refreshContractInfoUpdatedBefore( - args: RefreshContractInfoUpdatedBeforeArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * TokenMetadata - */ - refreshTokenMetadataUpdatedBefore( - args: RefreshTokenMetadataUpdatedBeforeArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Contract Info Overrides - */ - getContractInfoOverride( - args: GetContractInfoOverrideArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getContractInfoOverrides( - args: GetContractInfoOverridesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - addContractInfoOverride( - args: AddContractInfoOverrideArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - updateContractInfoOverride( - args: UpdateContractInfoOverrideArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - removeContractInfoOverride( - args: RemoveContractInfoOverrideArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - /** - * Token Directory - */ - isInTokenDirectory( - args: IsInTokenDirectoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - setTokenDirectoryFeatureIndex( - args: SetTokenDirectoryFeatureIndexArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - addContractToTokenDirectory( - args: AddContractToTokenDirectoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - removeContractFromTokenDirectory( - args: RemoveContractFromTokenDirectoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - refreshTokenDirectory(headers?: object, signal?: AbortSignal): Promise -} - export interface RefreshContractInfoUpdatedBeforeArgs { before: string maxContractNumber: number @@ -1063,6 +1112,7 @@ export interface RefreshContractInfoUpdatedBeforeArgs { export interface RefreshContractInfoUpdatedBeforeReturn { taskIDs: Array } + export interface RefreshTokenMetadataUpdatedBeforeArgs { before: string maxTokenNumber: number @@ -1071,6 +1121,7 @@ export interface RefreshTokenMetadataUpdatedBeforeArgs { export interface RefreshTokenMetadataUpdatedBeforeReturn { taskIDs: Array } + export interface GetContractInfoOverrideArgs { chainID: string contractAddress: string @@ -1079,6 +1130,7 @@ export interface GetContractInfoOverrideArgs { export interface GetContractInfoOverrideReturn { contractInfoOverride: ContractInfoOverride } + export interface GetContractInfoOverridesArgs { chainID?: string page?: Page @@ -1088,6 +1140,7 @@ export interface GetContractInfoOverridesReturn { contractInfoOverrides: Array page: Page } + export interface AddContractInfoOverrideArgs { chainID: string contractAddress: string @@ -1097,6 +1150,7 @@ export interface AddContractInfoOverrideArgs { export interface AddContractInfoOverrideReturn { ok: boolean } + export interface UpdateContractInfoOverrideArgs { chainID: string contractAddress: string @@ -1106,6 +1160,7 @@ export interface UpdateContractInfoOverrideArgs { export interface UpdateContractInfoOverrideReturn { ok: boolean } + export interface RemoveContractInfoOverrideArgs { chainID: string contractAddress: string @@ -1114,6 +1169,7 @@ export interface RemoveContractInfoOverrideArgs { export interface RemoveContractInfoOverrideReturn { ok: boolean } + export interface IsInTokenDirectoryArgs { chainID: string contractAddress: string @@ -1123,6 +1179,7 @@ export interface IsInTokenDirectoryReturn { ok: boolean featureIndex: number } + export interface SetTokenDirectoryFeatureIndexArgs { chainID: string contractAddress: string @@ -1132,6 +1189,7 @@ export interface SetTokenDirectoryFeatureIndexArgs { export interface SetTokenDirectoryFeatureIndexReturn { ok: boolean } + export interface AddContractToTokenDirectoryArgs { chainID: string contractAddress: string @@ -1140,6 +1198,7 @@ export interface AddContractToTokenDirectoryArgs { export interface AddContractToTokenDirectoryReturn { ok: boolean } + export interface RemoveContractFromTokenDirectoryArgs { chainID: string contractAddress: string @@ -1148,6 +1207,7 @@ export interface RemoveContractFromTokenDirectoryArgs { export interface RemoveContractFromTokenDirectoryReturn { ok: boolean } + export interface RefreshTokenDirectoryArgs {} export interface RefreshTokenDirectoryReturn { @@ -1157,7 +1217,8 @@ export interface RefreshTokenDirectoryReturn { // // Client // -export class Metadata implements Metadata { + +export class Metadata implements MetadataClient { protected hostname: string protected fetch: Fetch protected path = '/rpc/Metadata/' @@ -1171,473 +1232,563 @@ export class Metadata implements Metadata { return this.hostname + this.path + name } + queryKey = { + ping: () => ['Metadata', 'ping'] as const, + version: () => ['Metadata', 'version'] as const, + runtimeStatus: () => ['Metadata', 'runtimeStatus'] as const, + getTask: (req: GetTaskArgs) => ['Metadata', 'getTask', req] as const, + getTaskStatus: (req: GetTaskStatusArgs) => ['Metadata', 'getTaskStatus', req] as const, + getContractInfo: (req: GetContractInfoArgs) => ['Metadata', 'getContractInfo', req] as const, + getContractInfoBatch: (req: GetContractInfoBatchArgs) => ['Metadata', 'getContractInfoBatch', req] as const, + findContractInfo: (req: FindContractInfoArgs) => ['Metadata', 'findContractInfo', req] as const, + findContractInfoBatch: (req: FindContractInfoBatchArgs) => ['Metadata', 'findContractInfoBatch', req] as const, + refreshContractInfo: (req: RefreshContractInfoArgs) => ['Metadata', 'refreshContractInfo', req] as const, + refreshContractInfoBatch: (req: RefreshContractInfoBatchArgs) => + ['Metadata', 'refreshContractInfoBatch', req] as const, + searchContractsByQuery: (req: SearchContractsByQueryArgs) => ['Metadata', 'searchContractsByQuery', req] as const, + getTokenMetadata: (req: GetTokenMetadataArgs) => ['Metadata', 'getTokenMetadata', req] as const, + getTokenMetadataBatch: (req: GetTokenMetadataBatchArgs) => ['Metadata', 'getTokenMetadataBatch', req] as const, + refreshTokenMetadata: (req: RefreshTokenMetadataArgs) => ['Metadata', 'refreshTokenMetadata', req] as const, + searchTokenMetadataByQuery: (req: SearchTokenMetadataByQueryArgs) => + ['Metadata', 'searchTokenMetadataByQuery', req] as const, + searchTokenMetadata: (req: SearchTokenMetadataArgs) => ['Metadata', 'searchTokenMetadata', req] as const, + searchTokenMetadataTokenIDs: (req: SearchTokenMetadataTokenIDsArgs) => + ['Metadata', 'searchTokenMetadataTokenIDs', req] as const, + getTokenMetadataPropertyFilters: (req: GetTokenMetadataPropertyFiltersArgs) => + ['Metadata', 'getTokenMetadataPropertyFilters', req] as const, + getTokenDirectoryNetworks: (req: GetTokenDirectoryNetworksArgs) => + ['Metadata', 'getTokenDirectoryNetworks', req] as const, + getTokenDirectory: (req: GetTokenDirectoryArgs) => ['Metadata', 'getTokenDirectory', req] as const, + searchTokenDirectory: (req: SearchTokenDirectoryArgs) => ['Metadata', 'searchTokenDirectory', req] as const, + getNiftyswapTokenQuantity: (req: GetNiftyswapTokenQuantityArgs) => + ['Metadata', 'getNiftyswapTokenQuantity', req] as const, + getNiftyswapUnitPrices: (req: GetNiftyswapUnitPricesArgs) => ['Metadata', 'getNiftyswapUnitPrices', req] as const, + getNiftyswapUnitPricesWithQuantities: (req: GetNiftyswapUnitPricesWithQuantitiesArgs) => + ['Metadata', 'getNiftyswapUnitPricesWithQuantities', 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)}`, + }) }, ) } - getTask = (args: GetTaskArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetTask'), createHTTPRequest(args, headers, signal)).then( + getTask = (req: GetTaskArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTask'), createHttpRequest(JsonEncode(req, 'GetTaskArgs'), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - task: _data.task, - } + return JsonDecode(_data, 'GetTaskReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getTaskStatus = (args: GetTaskStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetTaskStatus'), createHTTPRequest(args, headers, signal)).then( + getTaskStatus = (req: GetTaskStatusArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetTaskStatus'), + createHttpRequest(JsonEncode(req, 'GetTaskStatusArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'GetTaskStatusReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getContractInfo = ( - args: GetContractInfoArgs, + req: GetContractInfoArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetContractInfo'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetContractInfo'), + createHttpRequest(JsonEncode(req, 'GetContractInfoArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractInfo: _data.contractInfo, - taskID: _data.taskID, - } + return JsonDecode(_data, 'GetContractInfoReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getContractInfoBatch = ( - args: GetContractInfoBatchArgs, + req: GetContractInfoBatchArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetContractInfoBatch'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetContractInfoBatch'), + createHttpRequest(JsonEncode(req, 'GetContractInfoBatchArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractInfoMap: <{ [key: string]: ContractInfo }>_data.contractInfoMap, - taskID: _data.taskID, - } + return JsonDecode(_data, 'GetContractInfoBatchReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } findContractInfo = ( - args: FindContractInfoArgs, + req: FindContractInfoArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('FindContractInfo'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('FindContractInfo'), + createHttpRequest(JsonEncode(req, 'FindContractInfoArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractInfoList: >_data.contractInfoList, - } + return JsonDecode(_data, 'FindContractInfoReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } findContractInfoBatch = ( - args: FindContractInfoBatchArgs, + req: FindContractInfoBatchArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('FindContractInfoBatch'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('FindContractInfoBatch'), + createHttpRequest(JsonEncode(req, 'FindContractInfoBatchArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractInfoByChain: <{ [key: string]: Array }>_data.contractInfoByChain, - } + return JsonDecode(_data, 'FindContractInfoBatchReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } refreshContractInfo = ( - args: RefreshContractInfoArgs, + req: RefreshContractInfoArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('RefreshContractInfo'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('RefreshContractInfo'), + createHttpRequest(JsonEncode(req, 'RefreshContractInfoArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - taskID: _data.taskID, - } + return JsonDecode(_data, 'RefreshContractInfoReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } refreshContractInfoBatch = ( - args: RefreshContractInfoBatchArgs, + req: RefreshContractInfoBatchArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('RefreshContractInfoBatch'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('RefreshContractInfoBatch'), + createHttpRequest(JsonEncode(req, 'RefreshContractInfoBatchArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - taskID: _data.taskID, - } + return JsonDecode(_data, 'RefreshContractInfoBatchReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } searchContractsByQuery = ( - args: SearchContractsByQueryArgs, + req: SearchContractsByQueryArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('SearchContractsByQuery'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('SearchContractsByQuery'), + createHttpRequest(JsonEncode(req, 'SearchContractsByQueryArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractInfo: >_data.contractInfo, - nextPage: _data.nextPage, - } + return JsonDecode(_data, 'SearchContractsByQueryReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getTokenMetadata = ( - args: GetTokenMetadataArgs, + req: GetTokenMetadataArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetTokenMetadata'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetTokenMetadata'), + createHttpRequest(JsonEncode(req, 'GetTokenMetadataArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - tokenMetadata: >_data.tokenMetadata, - taskID: _data.taskID, - } + return JsonDecode(_data, 'GetTokenMetadataReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getTokenMetadataBatch = ( - args: GetTokenMetadataBatchArgs, + req: GetTokenMetadataBatchArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetTokenMetadataBatch'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetTokenMetadataBatch'), + createHttpRequest(JsonEncode(req, 'GetTokenMetadataBatchArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractTokenMetadata: <{ [key: string]: Array }>_data.contractTokenMetadata, - taskID: _data.taskID, - } + return JsonDecode(_data, 'GetTokenMetadataBatchReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } refreshTokenMetadata = ( - args: RefreshTokenMetadataArgs, + req: RefreshTokenMetadataArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('RefreshTokenMetadata'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('RefreshTokenMetadata'), + createHttpRequest(JsonEncode(req, 'RefreshTokenMetadataArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - taskID: _data.taskID, - } + return JsonDecode(_data, 'RefreshTokenMetadataReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } searchTokenMetadataByQuery = ( - args: SearchTokenMetadataByQueryArgs, + req: SearchTokenMetadataByQueryArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('SearchTokenMetadataByQuery'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('SearchTokenMetadataByQuery'), + createHttpRequest(JsonEncode(req, 'SearchTokenMetadataByQueryArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - tokenMetadata: >_data.tokenMetadata, - nextPage: _data.nextPage, - } + return JsonDecode(_data, 'SearchTokenMetadataByQueryReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } searchTokenMetadata = ( - args: SearchTokenMetadataArgs, + req: SearchTokenMetadataArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('SearchTokenMetadata'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('SearchTokenMetadata'), + createHttpRequest(JsonEncode(req, 'SearchTokenMetadataArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - tokenMetadata: >_data.tokenMetadata, - } + return JsonDecode(_data, 'SearchTokenMetadataReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } searchTokenMetadataTokenIDs = ( - args: SearchTokenMetadataTokenIDsArgs, + req: SearchTokenMetadataTokenIDsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('SearchTokenMetadataTokenIDs'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('SearchTokenMetadataTokenIDs'), + createHttpRequest(JsonEncode(req, 'SearchTokenMetadataTokenIDsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - tokenIDs: >_data.tokenIDs, - } + return JsonDecode(_data, 'SearchTokenMetadataTokenIDsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getTokenMetadataPropertyFilters = ( - args: GetTokenMetadataPropertyFiltersArgs, + req: GetTokenMetadataPropertyFiltersArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetTokenMetadataPropertyFilters'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetTokenMetadataPropertyFilters'), + createHttpRequest(JsonEncode(req, 'GetTokenMetadataPropertyFiltersArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - filters: >_data.filters, - } + return JsonDecode(_data, 'GetTokenMetadataPropertyFiltersReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getTokenDirectoryNetworks = ( - args: GetTokenDirectoryNetworksArgs, + req: GetTokenDirectoryNetworksArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetTokenDirectoryNetworks'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetTokenDirectoryNetworks'), + createHttpRequest(JsonEncode(req, 'GetTokenDirectoryNetworksArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - chainIDs: >_data.chainIDs, - networks: >_data.networks, - } + return JsonDecode(_data, 'GetTokenDirectoryNetworksReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getTokenDirectory = ( - args: GetTokenDirectoryArgs, + req: GetTokenDirectoryArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetTokenDirectory'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetTokenDirectory'), + createHttpRequest(JsonEncode(req, 'GetTokenDirectoryArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contracts: >_data.contracts, - page: _data.page, - } + return JsonDecode(_data, 'GetTokenDirectoryReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } searchTokenDirectory = ( - args: SearchTokenDirectoryArgs, + req: SearchTokenDirectoryArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('SearchTokenDirectory'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('SearchTokenDirectory'), + createHttpRequest(JsonEncode(req, 'SearchTokenDirectoryArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contracts: >_data.contracts, - page: _data.page, - } + return JsonDecode(_data, 'SearchTokenDirectoryReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getNiftyswapTokenQuantity = ( - args: GetNiftyswapTokenQuantityArgs, + req: GetNiftyswapTokenQuantityArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetNiftyswapTokenQuantity'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetNiftyswapTokenQuantity'), + createHttpRequest(JsonEncode(req, 'GetNiftyswapTokenQuantityArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - quantity: <{ [key: string]: string }>_data.quantity, - } + return JsonDecode(_data, 'GetNiftyswapTokenQuantityReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getNiftyswapUnitPrices = ( - args: GetNiftyswapUnitPricesArgs, + req: GetNiftyswapUnitPricesArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetNiftyswapUnitPrices'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetNiftyswapUnitPrices'), + createHttpRequest(JsonEncode(req, 'GetNiftyswapUnitPricesArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - prices: <{ [key: string]: string }>_data.prices, - } + return JsonDecode(_data, 'GetNiftyswapUnitPricesReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getNiftyswapUnitPricesWithQuantities = ( - args: GetNiftyswapUnitPricesWithQuantitiesArgs, + req: GetNiftyswapUnitPricesWithQuantitiesArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetNiftyswapUnitPricesWithQuantities'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetNiftyswapUnitPricesWithQuantities'), + createHttpRequest(JsonEncode(req, 'GetNiftyswapUnitPricesWithQuantitiesArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - prices: <{ [key: string]: GetNiftyswapUnitPricesResponse }>_data.prices, - } + return JsonDecode( + _data, + 'GetNiftyswapUnitPricesWithQuantitiesReturn', + ) }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } } -export class Collections implements Collections { +export class Collections implements CollectionsClient { protected hostname: string protected fetch: Fetch protected path = '/rpc/Collections/' @@ -1651,372 +1802,451 @@ export class Collections implements Collections { return this.hostname + this.path + name } + queryKey = { + createCollection: (req: CreateCollectionArgs) => ['Collections', 'createCollection', req] as const, + getCollection: (req: GetCollectionArgs) => ['Collections', 'getCollection', req] as const, + listCollections: (req: ListCollectionsArgs) => ['Collections', 'listCollections', req] as const, + updateCollection: (req: UpdateCollectionArgs) => ['Collections', 'updateCollection', req] as const, + deleteCollection: (req: DeleteCollectionArgs) => ['Collections', 'deleteCollection', req] as const, + publishCollection: (req: PublishCollectionArgs) => ['Collections', 'publishCollection', req] as const, + unpublishCollection: (req: UnpublishCollectionArgs) => ['Collections', 'unpublishCollection', req] as const, + createContractCollection: (req: CreateContractCollectionArgs) => + ['Collections', 'createContractCollection', req] as const, + getContractCollection: (req: GetContractCollectionArgs) => ['Collections', 'getContractCollection', req] as const, + listContractCollections: (req: ListContractCollectionsArgs) => + ['Collections', 'listContractCollections', req] as const, + updateContractCollection: (req: UpdateContractCollectionArgs) => + ['Collections', 'updateContractCollection', req] as const, + deleteContractCollection: (req: DeleteContractCollectionArgs) => + ['Collections', 'deleteContractCollection', req] as const, + createToken: (req: CreateTokenArgs) => ['Collections', 'createToken', req] as const, + getToken: (req: GetTokenArgs) => ['Collections', 'getToken', req] as const, + listTokens: (req: ListTokensArgs) => ['Collections', 'listTokens', req] as const, + updateToken: (req: UpdateTokenArgs) => ['Collections', 'updateToken', req] as const, + deleteToken: (req: DeleteTokenArgs) => ['Collections', 'deleteToken', req] as const, + createAsset: (req: CreateAssetArgs) => ['Collections', 'createAsset', req] as const, + getAsset: (req: GetAssetArgs) => ['Collections', 'getAsset', req] as const, + updateAsset: (req: UpdateAssetArgs) => ['Collections', 'updateAsset', req] as const, + deleteAsset: (req: DeleteAssetArgs) => ['Collections', 'deleteAsset', req] as const, + } + createCollection = ( - args: CreateCollectionArgs, + req: CreateCollectionArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('CreateCollection'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('CreateCollection'), + createHttpRequest(JsonEncode(req, 'CreateCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - collection: _data.collection, - } + return JsonDecode(_data, 'CreateCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getCollection = (args: GetCollectionArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetCollection'), createHTTPRequest(args, headers, signal)).then( + getCollection = (req: GetCollectionArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('GetCollection'), + createHttpRequest(JsonEncode(req, 'GetCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - collection: _data.collection, - } + return JsonDecode(_data, 'GetCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listCollections = ( - args: ListCollectionsArgs, + req: ListCollectionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('ListCollections'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('ListCollections'), + createHttpRequest(JsonEncode(req, 'ListCollectionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - collections: >_data.collections, - } + return JsonDecode(_data, 'ListCollectionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updateCollection = ( - args: UpdateCollectionArgs, + req: UpdateCollectionArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('UpdateCollection'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('UpdateCollection'), + createHttpRequest(JsonEncode(req, 'UpdateCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - collection: _data.collection, - } + return JsonDecode(_data, 'UpdateCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } deleteCollection = ( - args: DeleteCollectionArgs, + req: DeleteCollectionArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('DeleteCollection'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('DeleteCollection'), + createHttpRequest(JsonEncode(req, 'DeleteCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'DeleteCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } publishCollection = ( - args: PublishCollectionArgs, + req: PublishCollectionArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('PublishCollection'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('PublishCollection'), + createHttpRequest(JsonEncode(req, 'PublishCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - collection: _data.collection, - } + return JsonDecode(_data, 'PublishCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } unpublishCollection = ( - args: UnpublishCollectionArgs, + req: UnpublishCollectionArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('UnpublishCollection'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('UnpublishCollection'), + createHttpRequest(JsonEncode(req, 'UnpublishCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - collection: _data.collection, - } + return JsonDecode(_data, 'UnpublishCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } createContractCollection = ( - args: CreateContractCollectionArgs, + req: CreateContractCollectionArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('CreateContractCollection'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('CreateContractCollection'), + createHttpRequest(JsonEncode(req, 'CreateContractCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractCollection: _data.contractCollection, - } + return JsonDecode(_data, 'CreateContractCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getContractCollection = ( - args: GetContractCollectionArgs, + req: GetContractCollectionArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetContractCollection'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetContractCollection'), + createHttpRequest(JsonEncode(req, 'GetContractCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractCollection: _data.contractCollection, - } + return JsonDecode(_data, 'GetContractCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } listContractCollections = ( - args: ListContractCollectionsArgs, + req: ListContractCollectionsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('ListContractCollections'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('ListContractCollections'), + createHttpRequest(JsonEncode(req, 'ListContractCollectionsArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractCollections: >_data.contractCollections, - collections: >_data.collections, - page: _data.page, - } + return JsonDecode(_data, 'ListContractCollectionsReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updateContractCollection = ( - args: UpdateContractCollectionArgs, + req: UpdateContractCollectionArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('UpdateContractCollection'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('UpdateContractCollection'), + createHttpRequest(JsonEncode(req, 'UpdateContractCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'UpdateContractCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } deleteContractCollection = ( - args: DeleteContractCollectionArgs, + req: DeleteContractCollectionArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('DeleteContractCollection'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('DeleteContractCollection'), + createHttpRequest(JsonEncode(req, 'DeleteContractCollectionArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'DeleteContractCollectionReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - createToken = (args: CreateTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('CreateToken'), createHTTPRequest(args, headers, signal)).then( + createToken = (req: CreateTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('CreateToken'), + createHttpRequest(JsonEncode(req, 'CreateTokenArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - token: _data.token, - assets: >_data.assets, - } + return JsonDecode(_data, 'CreateTokenReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getToken = (args: GetTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetToken'), createHTTPRequest(args, headers, signal)).then( + getToken = (req: GetTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetToken'), createHttpRequest(JsonEncode(req, 'GetTokenArgs'), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - token: _data.token, - assets: >_data.assets, - } + return JsonDecode(_data, 'GetTokenReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - listTokens = (args: ListTokensArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('ListTokens'), createHTTPRequest(args, headers, signal)).then( + listTokens = (req: ListTokensArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ListTokens'), + createHttpRequest(JsonEncode(req, 'ListTokensArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - page: _data.page, - tokens: >_data.tokens, - } + return JsonDecode(_data, 'ListTokensReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - updateToken = (args: UpdateTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('UpdateToken'), createHTTPRequest(args, headers, signal)).then( + updateToken = (req: UpdateTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UpdateToken'), + createHttpRequest(JsonEncode(req, 'UpdateTokenArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - token: _data.token, - } + return JsonDecode(_data, 'UpdateTokenReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - deleteToken = (args: DeleteTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('DeleteToken'), createHTTPRequest(args, headers, signal)).then( + deleteToken = (req: DeleteTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('DeleteToken'), + createHttpRequest(JsonEncode(req, 'DeleteTokenArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'DeleteTokenReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - createAsset = (args: CreateAssetArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('CreateAsset'), createHTTPRequest(args, headers, signal)).then( + createAsset = (req: CreateAssetArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('CreateAsset'), + createHttpRequest(JsonEncode(req, 'CreateAssetArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - asset: _data.asset, - } + return JsonDecode(_data, 'CreateAssetReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - getAsset = (args: GetAssetArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetAsset'), createHTTPRequest(args, headers, signal)).then( + getAsset = (req: GetAssetArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetAsset'), createHttpRequest(JsonEncode(req, 'GetAssetArgs'), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - asset: _data.asset, - } + return JsonDecode(_data, 'GetAssetReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - updateAsset = (args: UpdateAssetArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('UpdateAsset'), createHTTPRequest(args, headers, signal)).then( + updateAsset = (req: UpdateAssetArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('UpdateAsset'), + createHttpRequest(JsonEncode(req, 'UpdateAssetArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - asset: _data.asset, - } + return JsonDecode(_data, 'UpdateAssetReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - deleteAsset = (args: DeleteAssetArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('DeleteAsset'), createHTTPRequest(args, headers, signal)).then( + deleteAsset = (req: DeleteAssetArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('DeleteAsset'), + createHttpRequest(JsonEncode(req, 'DeleteAssetArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + return JsonDecode(_data, 'DeleteAssetReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } } -export class Admin implements Admin { +export class Admin implements AdminClient { protected hostname: string protected fetch: Fetch protected path = '/rpc/Admin/' @@ -2030,243 +2260,294 @@ export class Admin implements Admin { return this.hostname + this.path + name } + queryKey = { + refreshContractInfoUpdatedBefore: (req: RefreshContractInfoUpdatedBeforeArgs) => + ['Admin', 'refreshContractInfoUpdatedBefore', req] as const, + refreshTokenMetadataUpdatedBefore: (req: RefreshTokenMetadataUpdatedBeforeArgs) => + ['Admin', 'refreshTokenMetadataUpdatedBefore', req] as const, + getContractInfoOverride: (req: GetContractInfoOverrideArgs) => ['Admin', 'getContractInfoOverride', req] as const, + getContractInfoOverrides: (req: GetContractInfoOverridesArgs) => + ['Admin', 'getContractInfoOverrides', req] as const, + addContractInfoOverride: (req: AddContractInfoOverrideArgs) => ['Admin', 'addContractInfoOverride', req] as const, + updateContractInfoOverride: (req: UpdateContractInfoOverrideArgs) => + ['Admin', 'updateContractInfoOverride', req] as const, + removeContractInfoOverride: (req: RemoveContractInfoOverrideArgs) => + ['Admin', 'removeContractInfoOverride', req] as const, + isInTokenDirectory: (req: IsInTokenDirectoryArgs) => ['Admin', 'isInTokenDirectory', req] as const, + setTokenDirectoryFeatureIndex: (req: SetTokenDirectoryFeatureIndexArgs) => + ['Admin', 'setTokenDirectoryFeatureIndex', req] as const, + addContractToTokenDirectory: (req: AddContractToTokenDirectoryArgs) => + ['Admin', 'addContractToTokenDirectory', req] as const, + removeContractFromTokenDirectory: (req: RemoveContractFromTokenDirectoryArgs) => + ['Admin', 'removeContractFromTokenDirectory', req] as const, + refreshTokenDirectory: () => ['Admin', 'refreshTokenDirectory'] as const, + } + refreshContractInfoUpdatedBefore = ( - args: RefreshContractInfoUpdatedBeforeArgs, + req: RefreshContractInfoUpdatedBeforeArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('RefreshContractInfoUpdatedBefore'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('RefreshContractInfoUpdatedBefore'), + createHttpRequest(JsonEncode(req, 'RefreshContractInfoUpdatedBeforeArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - taskIDs: >_data.taskIDs, - } + return JsonDecode(_data, 'RefreshContractInfoUpdatedBeforeReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } refreshTokenMetadataUpdatedBefore = ( - args: RefreshTokenMetadataUpdatedBeforeArgs, + req: RefreshTokenMetadataUpdatedBeforeArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('RefreshTokenMetadataUpdatedBefore'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('RefreshTokenMetadataUpdatedBefore'), + createHttpRequest(JsonEncode(req, 'RefreshTokenMetadataUpdatedBeforeArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - taskIDs: >_data.taskIDs, - } + return JsonDecode(_data, 'RefreshTokenMetadataUpdatedBeforeReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getContractInfoOverride = ( - args: GetContractInfoOverrideArgs, + req: GetContractInfoOverrideArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetContractInfoOverride'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetContractInfoOverride'), + createHttpRequest(JsonEncode(req, 'GetContractInfoOverrideArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractInfoOverride: _data.contractInfoOverride, - } + return JsonDecode(_data, 'GetContractInfoOverrideReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } getContractInfoOverrides = ( - args: GetContractInfoOverridesArgs, + req: GetContractInfoOverridesArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('GetContractInfoOverrides'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('GetContractInfoOverrides'), + createHttpRequest(JsonEncode(req, 'GetContractInfoOverridesArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - contractInfoOverrides: >_data.contractInfoOverrides, - page: _data.page, - } + return JsonDecode(_data, 'GetContractInfoOverridesReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } addContractInfoOverride = ( - args: AddContractInfoOverrideArgs, + req: AddContractInfoOverrideArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('AddContractInfoOverride'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('AddContractInfoOverride'), + createHttpRequest(JsonEncode(req, 'AddContractInfoOverrideArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'AddContractInfoOverrideReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } updateContractInfoOverride = ( - args: UpdateContractInfoOverrideArgs, + req: UpdateContractInfoOverrideArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('UpdateContractInfoOverride'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('UpdateContractInfoOverride'), + createHttpRequest(JsonEncode(req, 'UpdateContractInfoOverrideArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'UpdateContractInfoOverrideReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } removeContractInfoOverride = ( - args: RemoveContractInfoOverrideArgs, + req: RemoveContractInfoOverrideArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('RemoveContractInfoOverride'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('RemoveContractInfoOverride'), + createHttpRequest(JsonEncode(req, 'RemoveContractInfoOverrideArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'RemoveContractInfoOverrideReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } isInTokenDirectory = ( - args: IsInTokenDirectoryArgs, + req: IsInTokenDirectoryArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('IsInTokenDirectory'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('IsInTokenDirectory'), + createHttpRequest(JsonEncode(req, 'IsInTokenDirectoryArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - featureIndex: _data.featureIndex, - } + return JsonDecode(_data, 'IsInTokenDirectoryReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } setTokenDirectoryFeatureIndex = ( - args: SetTokenDirectoryFeatureIndexArgs, + req: SetTokenDirectoryFeatureIndexArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('SetTokenDirectoryFeatureIndex'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('SetTokenDirectoryFeatureIndex'), + createHttpRequest(JsonEncode(req, 'SetTokenDirectoryFeatureIndexArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'SetTokenDirectoryFeatureIndexReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } addContractToTokenDirectory = ( - args: AddContractToTokenDirectoryArgs, + req: AddContractToTokenDirectoryArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('AddContractToTokenDirectory'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('AddContractToTokenDirectory'), + createHttpRequest(JsonEncode(req, 'AddContractToTokenDirectoryArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'AddContractToTokenDirectoryReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } removeContractFromTokenDirectory = ( - args: RemoveContractFromTokenDirectoryArgs, + req: RemoveContractFromTokenDirectoryArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('RemoveContractFromTokenDirectory'), createHTTPRequest(args, headers, signal)).then( + return this.fetch( + this.url('RemoveContractFromTokenDirectory'), + createHttpRequest(JsonEncode(req, 'RemoveContractFromTokenDirectoryArgs'), headers, signal), + ).then( (res) => { return buildResponse(res).then((_data) => { - return { - ok: _data.ok, - } + return JsonDecode(_data, 'RemoveContractFromTokenDirectoryReturn') }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } refreshTokenDirectory = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('RefreshTokenDirectory'), createHTTPRequest({}, headers, signal)).then( + return this.fetch(this.url('RefreshTokenDirectory'), createHttpRequest('{}', headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return { - taskID: _data.taskID, - } + return JsonDecode(_data, 'RefreshTokenDirectoryReturn') }) }, (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 reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } - reqHeaders[WebrpcHeader] = WebrpcHeaderValue - - return { - method: 'POST', - headers: reqHeaders, - body: JSON.stringify(body || {}), - signal, +const createHttpRequest = (body: string = '{}', headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { + ...headers, + 'Content-Type': 'application/json', + [WebrpcHeader]: WebrpcHeaderValue, } + return { method: 'POST', headers: reqHeaders, body, signal } } const buildResponse = (res: Response): Promise => { @@ -2275,13 +2556,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) { @@ -2292,426 +2569,409 @@ const buildResponse = (res: Response): Promise => { }) } +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + +export const JsonEncode = (obj: T, _typ: string = ''): string => { + return JSON.stringify(obj) +} + +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 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 FailError extends WebrpcError { - constructor( - name: string = 'Fail', - code: number = 1005, - message: string = `Request Failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Fail' + this.code = typeof error.code === 'number' ? error.code : 1005 + 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, FailError.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 TaskFailedError extends WebrpcError { - constructor( - name: string = 'TaskFailed', - code: number = 1007, - message: string = `Task failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'TaskFailed' + this.code = typeof error.code === 'number' ? error.code : 1007 + this.message = error.message || `Task failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, TaskFailedError.prototype) } } export class DeprecatedError extends WebrpcError { - constructor( - name: string = 'Deprecated', - code: number = 1008, - message: string = `RPC method is deprecated`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'Deprecated' + this.code = typeof error.code === 'number' ? error.code : 1008 + this.message = error.message || `RPC method is deprecated` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, DeprecatedError.prototype) } } export class TimeoutError extends WebrpcError { - constructor( - name: string = 'Timeout', - code: number = 2000, - 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 : 2000 + 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 RequiredArgumentError extends WebrpcError { - constructor( - name: string = 'RequiredArgument', - code: number = 2002, - message: string = `Required argument missing`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'RequiredArgument' + this.code = typeof error.code === 'number' ? error.code : 2002 + this.message = error.message || `Required argument missing` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, RequiredArgumentError.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 ValidationFailedError extends WebrpcError { - constructor( - name: string = 'ValidationFailed', - code: number = 2004, - message: string = `Validation failed`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ValidationFailed' + this.code = typeof error.code === 'number' ? error.code : 2004 + this.message = error.message || `Validation failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, ValidationFailedError.prototype) } } export class RateLimitedError extends WebrpcError { - constructor( - name: string = 'RateLimited', - code: number = 2005, - message: string = `Rate limited`, - 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 : 2005 + this.message = error.message || `Rate limited` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, RateLimitedError.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 ProjectNotFoundError extends WebrpcError { - constructor( - name: string = 'ProjectNotFound', - code: number = 3002, - 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 : 3002 + this.message = error.message || `Project not found` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, ProjectNotFoundError.prototype) } } export class ChainNotFoundError extends WebrpcError { - constructor( - name: string = 'ChainNotFound', - code: number = 3003, - message: string = `Chain not found`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ChainNotFound' + this.code = typeof error.code === 'number' ? error.code : 3003 + this.message = error.message || `Chain not found` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, ChainNotFoundError.prototype) } } export class TokenDirectoryDisabledError extends WebrpcError { - constructor( - name: string = 'TokenDirectoryDisabled', - code: number = 4001, - message: string = `Token Directory is disabled`, - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'TokenDirectoryDisabled' + this.code = typeof error.code === 'number' ? error.code : 4001 + this.message = error.message || `Token Directory is disabled` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, TokenDirectoryDisabledError.prototype) } } @@ -2725,7 +2985,7 @@ export enum errors { WebrpcBadResponse = 'WebrpcBadResponse', WebrpcServerPanic = 'WebrpcServerPanic', WebrpcInternalError = 'WebrpcInternalError', - WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcClientAborted = 'WebrpcClientAborted', WebrpcStreamLost = 'WebrpcStreamLost', WebrpcStreamFinished = 'WebrpcStreamFinished', Unauthorized = 'Unauthorized', @@ -2758,7 +3018,7 @@ export enum WebrpcErrorCodes { WebrpcBadResponse = -5, WebrpcServerPanic = -6, WebrpcInternalError = -7, - WebrpcClientDisconnected = -8, + WebrpcClientAborted = -8, WebrpcStreamLost = -9, WebrpcStreamFinished = -10, Unauthorized = 1000, @@ -2791,7 +3051,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { [-5]: WebrpcBadResponseError, [-6]: WebrpcServerPanicError, [-7]: WebrpcInternalErrorError, - [-8]: WebrpcClientDisconnectedError, + [-8]: WebrpcClientAbortedError, [-9]: WebrpcStreamLostError, [-10]: WebrpcStreamFinishedError, [1000]: UnauthorizedError, @@ -2815,4 +3075,58 @@ export const webrpcErrorByCode: { [code: number]: any } = { [4001]: TokenDirectoryDisabledError, } -export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise +// +// Webrpc +// + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.31.0;gen-typescript@v0.22.5;sequence-metadata@v0.4.0' + +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 ?? '', + } +} From 137547226c1c869db9fab0fb44ddc8483fffc246 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 21:48:57 +0100 Subject: [PATCH 075/177] Update marketplace.gen.ts --- .../marketplace/src/marketplace.gen.ts | 1373 ++++++++++++++--- 1 file changed, 1176 insertions(+), 197 deletions(-) diff --git a/packages/services/marketplace/src/marketplace.gen.ts b/packages/services/marketplace/src/marketplace.gen.ts index f251bce5d..6a316623d 100644 --- a/packages/services/marketplace/src/marketplace.gen.ts +++ b/packages/services/marketplace/src/marketplace.gen.ts @@ -1,14 +1,14 @@ /* eslint-disable */ -// marketplace-api 7ab3354385f317680dd861e82a18aa351d8579d5 +// marketplace-api 652676d9951ceb12f6846907c7c4b5160c73c57a // -- -// Code generated by webrpc-gen@v0.25.1 with typescript generator. DO NOT EDIT. +// Code generated by webrpc-gen@v0.30.2 with github.com/webrpc/gen-typescript@v0.19.0 generator. DO NOT EDIT. // -// webrpc-gen -schema=marketplace.ridl -target=typescript -client -out=./clients/marketplace.gen.ts +// webrpc-gen -schema=./schema/schema.ridl -target=github.com/webrpc/gen-typescript@v0.19.0 -client -out=./clients/marketplace.gen.ts export const WebrpcHeader = 'Webrpc' export const WebrpcHeaderValue = - 'webrpc@v0.25.1;gen-typescript@v0.17.0;marketplace-api@v0.0.0-7ab3354385f317680dd861e82a18aa351d8579d5' + 'webrpc@v0.30.2;gen-typescript@v0.19.0;marketplace-api@v0.0.0-652676d9951ceb12f6846907c7c4b5160c73c57a' // WebRPC description and code-gen version export const WebRPCVersion = 'v1' @@ -17,7 +17,7 @@ export const WebRPCVersion = 'v1' export const WebRPCSchemaVersion = '' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = '7ab3354385f317680dd861e82a18aa351d8579d5' +export const WebRPCSchemaHash = '652676d9951ceb12f6846907c7c4b5160c73c57a' type WebrpcGenVersions = { webrpcGenVersion: string @@ -71,41 +71,9 @@ function parseWebrpcGenVersions(header: string): WebrpcGenVersions { // Types // -export interface TokenMetadata { - tokenId: string - name: string - description?: string - image?: string - video?: string - audio?: string - properties?: { [key: string]: any } - attributes: Array<{ [key: string]: any }> - image_data?: string - external_url?: string - background_color?: string - animation_url?: string - decimals?: number - updatedAt?: string - assets?: Array -} - -export interface Asset { - id: number - collectionId: number - tokenId: string - url?: string - metadataField: string - name?: string - filesize?: number - mimeType?: string - width?: number - height?: number - updatedAt?: string -} - export enum SortOrder { - DESC = 'DESC', ASC = 'ASC', + DESC = 'DESC', } export enum PropertyType { @@ -127,6 +95,7 @@ export enum MarketplaceKind { alienswap = 'alienswap', payment_processor = 'payment_processor', mintify = 'mintify', + magic_eden = 'magic_eden', } export enum OrderbookKind { @@ -138,6 +107,7 @@ export enum OrderbookKind { looks_rare = 'looks_rare', reservoir = 'reservoir', x2y2 = 'x2y2', + magic_eden = 'magic_eden', } export enum SourceKind { @@ -145,6 +115,8 @@ export enum SourceKind { external = 'external', sequence_marketplace_v1 = 'sequence_marketplace_v1', sequence_marketplace_v2 = 'sequence_marketplace_v2', + opensea = 'opensea', + magic_eden = 'magic_eden', } export enum OrderSide { @@ -153,6 +125,12 @@ export enum OrderSide { offer = 'offer', } +export enum OfferType { + unknown = 'unknown', + item = 'item', + collection = 'collection', +} + export enum OrderStatus { unknown = 'unknown', active = 'active', @@ -180,12 +158,6 @@ export enum CollectionPriority { export enum CollectionStatus { unknown = 'unknown', created = 'created', - syncing_contract_metadata = 'syncing_contract_metadata', - synced_contract_metadata = 'synced_contract_metadata', - syncing_metadata = 'syncing_metadata', - synced_metadata = 'synced_metadata', - syncing_tokens = 'syncing_tokens', - synced_tokens = 'synced_tokens', syncing_orders = 'syncing_orders', active = 'active', failed = 'failed', @@ -199,12 +171,30 @@ export enum ProjectStatus { inactive = 'inactive', } +export enum ItemsContractStatus { + unknown = 'unknown', + created = 'created', + syncing_contract_metadata = 'syncing_contract_metadata', + synced_contract_metadata = 'synced_contract_metadata', + syncing_tokens = 'syncing_tokens', + synced_tokens = 'synced_tokens', + active = 'active', + inactive = 'inactive', + incompatible_type = 'incompatible_type', +} + export enum CollectibleStatus { unknown = 'unknown', active = 'active', inactive = 'inactive', } +export enum CollectibleSource { + unknown = 'unknown', + indexer = 'indexer', + manual = 'manual', +} + export enum CurrencyStatus { unknown = 'unknown', created = 'created', @@ -238,24 +228,27 @@ export enum TransactionCrypto { export enum TransactionNFTCheckoutProvider { unknown = 'unknown', - sardine = 'sardine', transak = 'transak', + sardine = 'sardine', } export enum TransactionOnRampProvider { unknown = 'unknown', - sardine = 'sardine', transak = 'transak', + sardine = 'sardine', } export enum TransactionSwapProvider { unknown = 'unknown', - zerox = 'zerox', + lifi = 'lifi', } export enum ExecuteType { unknown = 'unknown', order = 'order', + createListing = 'createListing', + createItemOffer = 'createItemOffer', + createTraitOffer = 'createTraitOffer', } export enum ActivityAction { @@ -269,6 +262,33 @@ export enum ActivityAction { transfer = 'transfer', } +export enum PrimarySaleContractStatus { + unknown = 'unknown', + created = 'created', + syncing_items = 'syncing_items', + active = 'active', + inactive = 'inactive', + incompatible_type = 'incompatible_type', + failed = 'failed', +} + +export enum PrimarySaleVersion { + v0 = 'v0', + v1 = 'v1', +} + +export enum PrimarySaleItemDetailType { + unknown = 'unknown', + global = 'global', + individual = 'individual', +} + +export enum MetadataStatus { + NOT_AVAILABLE = 'NOT_AVAILABLE', + REFRESHING = 'REFRESHING', + AVAILABLE = 'AVAILABLE', +} + export interface Page { page: number pageSize: number @@ -305,6 +325,26 @@ export interface CollectiblesFilter { ordersNotCreatedBy?: Array inCurrencyAddresses?: Array notInCurrencyAddresses?: Array + prices?: Array +} + +export interface OrdersFilter { + searchText?: string + properties?: Array + marketplaces?: Array + inAccounts?: Array + notInAccounts?: Array + ordersCreatedBy?: Array + ordersNotCreatedBy?: Array + inCurrencyAddresses?: Array + notInCurrencyAddresses?: Array + prices?: Array +} + +export interface PriceFilter { + contractAddress: string + min?: string + max?: string } export interface Order { @@ -314,6 +354,7 @@ export interface Order { status: OrderStatus chainId: number originName: string + slug: string collectionContractAddress: string tokenId?: string createdBy: string @@ -386,6 +427,8 @@ export interface CollectionConfig { export interface CollectionLastSynced { allOrders: string newOrders: string + names: Array + cursors: { [key: string]: string } } export interface Project { @@ -398,12 +441,22 @@ export interface Project { deletedAt?: string } -export interface Collectible { +export interface ItemsContract { + status: ItemsContractStatus chainId: number contractAddress: string + contractType: ContractType + lastSynced: string + createdAt: string + updatedAt: string + deletedAt?: string +} + +export interface Collectible { status: CollectibleStatus tokenId: string decimals: number + source: CollectibleSource createdAt: string updatedAt: string deletedAt?: string @@ -420,6 +473,8 @@ export interface Currency { exchangeRate: number defaultChainCurrency: boolean nativeCurrency: boolean + openseaListing: boolean + openseaOffer: boolean createdAt: string updatedAt: string deletedAt?: string @@ -499,6 +554,16 @@ export interface CheckoutOptions { onRamp: Array } +export interface ExecuteInput { + chainId: string + signature: string + method: string + endpoint: string + executeType: ExecuteType + body: any + slug?: string +} + export interface Activity { chainId: number contractAddress: string @@ -520,6 +585,91 @@ export interface Activity { deletedAt?: string } +export interface PrimarySaleContract { + chainId: number + contractAddress: string + collectionAddress: string + contractType: ContractType + version: PrimarySaleVersion + currencyAddress: string + priceDecimals: number + status: PrimarySaleContractStatus + lastSynced: string + createdAt: string + updatedAt: string + deletedAt?: string +} + +export interface PrimarySaleItem { + itemAddress: string + contractType: ContractType + tokenId: string + itemType: PrimarySaleItemDetailType + startDate: string + endDate: string + currencyAddress: string + priceDecimals: number + priceAmount: string + priceAmountFormatted: string + priceUsd: number + priceUsdFormatted: string + supply: string + supplyCap: string + unlimitedSupply: boolean + createdAt: string + updatedAt: string + deletedAt?: string +} + +export interface CollectiblePrimarySaleItem { + metadata: TokenMetadata + primarySaleItem: PrimarySaleItem +} + +export interface PrimarySaleItemsFilter { + includeEmpty: boolean + searchText?: string + properties?: Array + detailTypes?: Array + startDateAfter?: string + startDateBefore?: string + endDateAfter?: string + endDateBefore?: string +} + +export interface TokenMetadata { + tokenId: string + name: string + description?: string + image?: string + video?: string + audio?: string + properties?: { [key: string]: any } + attributes: Array<{ [key: string]: any }> + image_data?: string + external_url?: string + background_color?: string + animation_url?: string + decimals?: number + updatedAt?: string + assets?: Array + status: MetadataStatus +} + +export interface Asset { + id: number + collectionId: number + tokenId: string + url?: string + metadataField: string + name?: string + filesize?: number + mimeType?: string + width?: number + height?: number + updatedAt?: string +} + export interface Admin { createCollection(args: CreateCollectionArgs, headers?: object, signal?: AbortSignal): Promise getCollection(args: GetCollectionArgs, headers?: object, signal?: AbortSignal): Promise @@ -530,14 +680,29 @@ export interface Admin { * determine what should happen here */ syncCollection(args: SyncCollectionArgs, headers?: object, signal?: AbortSignal): Promise + createPrimarySaleContract( + args: CreatePrimarySaleContractArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + deletePrimarySaleContract( + args: DeletePrimarySaleContractArgs, + headers?: object, + signal?: AbortSignal, + ): Promise createCurrency(args: CreateCurrencyArgs, headers?: object, signal?: AbortSignal): Promise createCurrencies(args: CreateCurrenciesArgs, headers?: object, signal?: AbortSignal): Promise updateCurrency(args: UpdateCurrencyArgs, headers?: object, signal?: AbortSignal): Promise - listCurrencies(headers?: object, signal?: AbortSignal): Promise + listCurrencies(args: ListCurrenciesArgs, headers?: object, signal?: AbortSignal): Promise deleteCurrency(args: DeleteCurrencyArgs, headers?: object, signal?: AbortSignal): Promise + /** + * This for manual adding of non minted ERC1155 tokens, it's used for purposes of Shop. + */ + addCollectibles(args: AddCollectiblesArgs, headers?: object, signal?: AbortSignal): Promise } export interface CreateCollectionArgs { + chainId: string projectId: number contractAddress: string } @@ -546,6 +711,7 @@ export interface CreateCollectionReturn { collection: Collection } export interface GetCollectionArgs { + chainId: string projectId: number contractAddress: string } @@ -554,6 +720,7 @@ export interface GetCollectionReturn { collection: Collection } export interface UpdateCollectionArgs { + chainId: string collection: Collection } @@ -561,6 +728,7 @@ export interface UpdateCollectionReturn { collection: Collection } export interface ListCollectionsArgs { + chainId: string projectId: number page?: Page } @@ -570,6 +738,7 @@ export interface ListCollectionsReturn { page?: Page } export interface DeleteCollectionArgs { + chainId: string projectId: number contractAddress: string } @@ -578,14 +747,30 @@ export interface DeleteCollectionReturn { collection: Collection } export interface SyncCollectionArgs { - projectId: number + chainId: string contractAddress: string } -export interface SyncCollectionReturn { - collection: Collection +export interface SyncCollectionReturn {} +export interface CreatePrimarySaleContractArgs { + chainId: string + projectId: number + primarySaleContractAddress: string + itemsContractAddress: string +} + +export interface CreatePrimarySaleContractReturn { + primarySaleContract: PrimarySaleContract } +export interface DeletePrimarySaleContractArgs { + chainId: string + projectId: number + primarySaleContractAddress: string +} + +export interface DeletePrimarySaleContractReturn {} export interface CreateCurrencyArgs { + chainId: string currency: Currency } @@ -593,6 +778,7 @@ export interface CreateCurrencyReturn { currency: Currency } export interface CreateCurrenciesArgs { + chainId: string currencies: Array } @@ -600,33 +786,53 @@ export interface CreateCurrenciesReturn { currency: { [key: string]: Currency } } export interface UpdateCurrencyArgs { + chainId: string currency: Currency } export interface UpdateCurrencyReturn { currency: Currency } -export interface ListCurrenciesArgs {} +export interface ListCurrenciesArgs { + chainId: string +} export interface ListCurrenciesReturn { currencies: Array } export interface DeleteCurrencyArgs { - chainId: number + chainId: string contractAddress: string } export interface DeleteCurrencyReturn { currency: Currency } +export interface AddCollectiblesArgs { + chainId: string + itemsContractAddress: string + tokenIds: Array +} + +export interface AddCollectiblesReturn {} export interface Marketplace { - listCurrencies(headers?: object, signal?: AbortSignal): Promise + listCurrencies(args: ListCurrenciesArgs, headers?: object, signal?: AbortSignal): Promise getCollectionDetail( args: GetCollectionDetailArgs, headers?: object, signal?: AbortSignal, ): Promise + getCollectionActiveListingsCurrencies( + args: GetCollectionActiveListingsCurrenciesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getCollectionActiveOffersCurrencies( + args: GetCollectionActiveOffersCurrenciesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getCollectible(args: GetCollectibleArgs, headers?: object, signal?: AbortSignal): Promise getLowestPriceOfferForCollectible( args: GetLowestPriceOfferForCollectibleArgs, @@ -658,6 +864,23 @@ export interface Marketplace { headers?: object, signal?: AbortSignal, ): Promise + listOrdersWithCollectibles( + args: ListOrdersWithCollectiblesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getCountOfAllOrders( + args: GetCountOfAllOrdersArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getCountOfFilteredOrders( + args: GetCountOfFilteredOrdersArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listListings(args: ListListingsArgs, headers?: object, signal?: AbortSignal): Promise + listOffers(args: ListOffersArgs, headers?: object, signal?: AbortSignal): Promise getCountOfListingsForCollectible( args: GetCountOfListingsForCollectibleArgs, headers?: object, @@ -745,7 +968,7 @@ export interface Marketplace { signal?: AbortSignal, ): Promise /** - * only used in a case of external transactions ( when we create off-chain transactions ) for instance opensea market + * only used in a case of external transactions ( when we create off-chain transactions ) for instance opensea market, use only ExecuteInput params and leave other root inputs empty, they are depracated and kept only for backward compatibility */ execute(args: ExecuteArgs, headers?: object, signal?: AbortSignal): Promise /** @@ -796,21 +1019,61 @@ export interface Marketplace { headers?: object, signal?: AbortSignal, ): Promise + supportedMarketplaces( + args: SupportedMarketplacesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getPrimarySaleItem( + args: GetPrimarySaleItemArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listPrimarySaleItems( + args: ListPrimarySaleItemsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getCountOfPrimarySaleItems( + args: GetCountOfPrimarySaleItemsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise } -export interface ListCurrenciesArgs {} +export interface ListCurrenciesArgs { + chainId: string +} export interface ListCurrenciesReturn { currencies: Array } export interface GetCollectionDetailArgs { + chainId: string contractAddress: string } export interface GetCollectionDetailReturn { collection: Collection } +export interface GetCollectionActiveListingsCurrenciesArgs { + chainId: string + contractAddress: string +} + +export interface GetCollectionActiveListingsCurrenciesReturn { + currencies: Array +} +export interface GetCollectionActiveOffersCurrenciesArgs { + chainId: string + contractAddress: string +} + +export interface GetCollectionActiveOffersCurrenciesReturn { + currencies: Array +} export interface GetCollectibleArgs { + chainId: string contractAddress: string tokenId: string } @@ -819,6 +1082,7 @@ export interface GetCollectibleReturn { metadata: TokenMetadata } export interface GetLowestPriceOfferForCollectibleArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -828,6 +1092,7 @@ export interface GetLowestPriceOfferForCollectibleReturn { order: Order } export interface GetHighestPriceOfferForCollectibleArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -837,6 +1102,7 @@ export interface GetHighestPriceOfferForCollectibleReturn { order: Order } export interface GetLowestPriceListingForCollectibleArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -846,6 +1112,7 @@ export interface GetLowestPriceListingForCollectibleReturn { order: Order } export interface GetHighestPriceListingForCollectibleArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -855,6 +1122,7 @@ export interface GetHighestPriceListingForCollectibleReturn { order: Order } export interface ListListingsForCollectibleArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -866,6 +1134,7 @@ export interface ListListingsForCollectibleReturn { page?: Page } export interface ListOffersForCollectibleArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -876,7 +1145,61 @@ export interface ListOffersForCollectibleReturn { offers: Array page?: Page } +export interface ListOrdersWithCollectiblesArgs { + chainId: string + side: OrderSide + contractAddress: string + filter?: OrdersFilter + page?: Page +} + +export interface ListOrdersWithCollectiblesReturn { + collectibles: Array + page?: Page +} +export interface GetCountOfAllOrdersArgs { + chainId: string + side: OrderSide + contractAddress: string +} + +export interface GetCountOfAllOrdersReturn { + count: number +} +export interface GetCountOfFilteredOrdersArgs { + chainId: string + side: OrderSide + contractAddress: string + filter?: OrdersFilter +} + +export interface GetCountOfFilteredOrdersReturn { + count: number +} +export interface ListListingsArgs { + chainId: string + contractAddress: string + filter?: OrderFilter + page?: Page +} + +export interface ListListingsReturn { + listings: Array + page?: Page +} +export interface ListOffersArgs { + chainId: string + contractAddress: string + filter?: OrderFilter + page?: Page +} + +export interface ListOffersReturn { + offers: Array + page?: Page +} export interface GetCountOfListingsForCollectibleArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -886,6 +1209,7 @@ export interface GetCountOfListingsForCollectibleReturn { count: number } export interface GetCountOfOffersForCollectibleArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -895,6 +1219,7 @@ export interface GetCountOfOffersForCollectibleReturn { count: number } export interface GetCollectibleLowestOfferArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -904,6 +1229,7 @@ export interface GetCollectibleLowestOfferReturn { order?: Order } export interface GetCollectibleHighestOfferArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -913,6 +1239,7 @@ export interface GetCollectibleHighestOfferReturn { order?: Order } export interface GetCollectibleLowestListingArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -922,6 +1249,7 @@ export interface GetCollectibleLowestListingReturn { order?: Order } export interface GetCollectibleHighestListingArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -931,6 +1259,7 @@ export interface GetCollectibleHighestListingReturn { order?: Order } export interface ListCollectibleListingsArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -942,6 +1271,7 @@ export interface ListCollectibleListingsReturn { page?: Page } export interface ListCollectibleOffersArgs { + chainId: string contractAddress: string tokenId: string filter?: OrderFilter @@ -953,6 +1283,7 @@ export interface ListCollectibleOffersReturn { page?: Page } export interface GenerateBuyTransactionArgs { + chainId: string collectionAddress: string buyer: string marketplace: MarketplaceKind @@ -965,6 +1296,7 @@ export interface GenerateBuyTransactionReturn { steps: Array } export interface GenerateSellTransactionArgs { + chainId: string collectionAddress: string seller: string marketplace: MarketplaceKind @@ -977,11 +1309,13 @@ export interface GenerateSellTransactionReturn { steps: Array } export interface GenerateListingTransactionArgs { + chainId: string collectionAddress: string owner: string contractType: ContractType orderbook: OrderbookKind listing: CreateReq + additionalFees: Array walletType?: WalletKind } @@ -989,18 +1323,22 @@ export interface GenerateListingTransactionReturn { steps: Array } export interface GenerateOfferTransactionArgs { + chainId: string collectionAddress: string maker: string contractType: ContractType orderbook: OrderbookKind offer: CreateReq + additionalFees: Array walletType?: WalletKind + offerType: OfferType } export interface GenerateOfferTransactionReturn { steps: Array } export interface GenerateCancelTransactionArgs { + chainId: string collectionAddress: string maker: string marketplace: MarketplaceKind @@ -1011,17 +1349,20 @@ export interface GenerateCancelTransactionReturn { steps: Array } export interface ExecuteArgs { - signature: string - method: string - endpoint: string - executeType: ExecuteType - body: any + params: ExecuteInput + chainId?: string + signature?: string + method?: string + endpoint?: string + executeType?: ExecuteType + body?: any } export interface ExecuteReturn { orderId: string } export interface ListCollectiblesArgs { + chainId: string side: OrderSide contractAddress: string filter?: CollectiblesFilter @@ -1033,6 +1374,7 @@ export interface ListCollectiblesReturn { page?: Page } export interface GetCountOfAllCollectiblesArgs { + chainId: string contractAddress: string } @@ -1040,6 +1382,7 @@ export interface GetCountOfAllCollectiblesReturn { count: number } export interface GetCountOfFilteredCollectiblesArgs { + chainId: string side: OrderSide contractAddress: string filter?: CollectiblesFilter @@ -1049,6 +1392,7 @@ export interface GetCountOfFilteredCollectiblesReturn { count: number } export interface GetFloorOrderArgs { + chainId: string contractAddress: string filter?: CollectiblesFilter } @@ -1057,6 +1401,7 @@ export interface GetFloorOrderReturn { collectible: CollectibleOrder } export interface ListCollectionActivitiesArgs { + chainId: string contractAddress: string page?: Page } @@ -1066,6 +1411,7 @@ export interface ListCollectionActivitiesReturn { page?: Page } export interface ListCollectibleActivitiesArgs { + chainId: string contractAddress: string tokenId: string page?: Page @@ -1076,6 +1422,7 @@ export interface ListCollectibleActivitiesReturn { page?: Page } export interface ListCollectiblesWithLowestListingArgs { + chainId: string contractAddress: string filter?: CollectiblesFilter page?: Page @@ -1086,6 +1433,7 @@ export interface ListCollectiblesWithLowestListingReturn { page?: Page } export interface ListCollectiblesWithHighestOfferArgs { + chainId: string contractAddress: string filter?: CollectiblesFilter page?: Page @@ -1096,16 +1444,19 @@ export interface ListCollectiblesWithHighestOfferReturn { page?: Page } export interface SyncOrderArgs { + chainId: string order: Order } export interface SyncOrderReturn {} export interface SyncOrdersArgs { + chainId: string orders: Array } export interface SyncOrdersReturn {} export interface GetOrdersArgs { + chainId: string input: Array page?: Page } @@ -1115,6 +1466,7 @@ export interface GetOrdersReturn { page?: Page } export interface CheckoutOptionsMarketplaceArgs { + chainId: string wallet: string orders: Array additionalFee: number @@ -1124,6 +1476,7 @@ export interface CheckoutOptionsMarketplaceReturn { options: CheckoutOptions } export interface CheckoutOptionsSalesContractArgs { + chainId: string wallet: string contractAddress: string collectionAddress: string @@ -1133,6 +1486,42 @@ export interface CheckoutOptionsSalesContractArgs { export interface CheckoutOptionsSalesContractReturn { options: CheckoutOptions } +export interface SupportedMarketplacesArgs { + chainId: string +} + +export interface SupportedMarketplacesReturn { + marketplaces: Array +} +export interface GetPrimarySaleItemArgs { + chainId: string + primarySaleContractAddress: string + tokenId: string +} + +export interface GetPrimarySaleItemReturn { + item: CollectiblePrimarySaleItem +} +export interface ListPrimarySaleItemsArgs { + chainId: string + primarySaleContractAddress: string + filter?: PrimarySaleItemsFilter + page?: Page +} + +export interface ListPrimarySaleItemsReturn { + primarySaleItems: Array + page?: Page +} +export interface GetCountOfPrimarySaleItemsArgs { + chainId: string + primarySaleContractAddress: string + filter?: PrimarySaleItemsFilter +} + +export interface GetCountOfPrimarySaleItemsReturn { + count: number +} // // Client @@ -1165,7 +1554,9 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1180,7 +1571,9 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1199,7 +1592,9 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1219,7 +1614,9 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1238,7 +1635,9 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1249,15 +1648,55 @@ export class Admin implements Admin { signal?: AbortSignal, ): Promise => { return this.fetch(this.url('SyncCollection'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return {} + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + createPrimarySaleContract = ( + args: CreatePrimarySaleContractArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CreatePrimarySaleContract'), createHTTPRequest(args, headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return { - collection: _data.collection, + primarySaleContract: _data.primarySaleContract, } }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deletePrimarySaleContract = ( + args: DeletePrimarySaleContractArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('DeletePrimarySaleContract'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return {} + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1276,7 +1715,9 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1295,7 +1736,9 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1314,13 +1757,19 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } - listCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('ListCurrencies'), createHTTPRequest({}, headers, signal)).then( + listCurrencies = ( + args: ListCurrenciesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListCurrencies'), createHTTPRequest(args, headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return { @@ -1329,7 +1778,9 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1348,7 +1799,28 @@ export class Admin implements Admin { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + addCollectibles = ( + args: AddCollectiblesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddCollectibles'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return {} + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1367,8 +1839,12 @@ export class Marketplace implements Marketplace { return this.hostname + this.path + name } - listCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('ListCurrencies'), createHTTPRequest({}, headers, signal)).then( + listCurrencies = ( + args: ListCurrenciesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListCurrencies'), createHTTPRequest(args, headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return { @@ -1377,7 +1853,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1396,7 +1874,51 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + getCollectionActiveListingsCurrencies = ( + args: GetCollectionActiveListingsCurrenciesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCollectionActiveListingsCurrencies'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencies: >_data.currencies, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + getCollectionActiveOffersCurrencies = ( + args: GetCollectionActiveOffersCurrenciesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCollectionActiveOffersCurrencies'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencies: >_data.currencies, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1415,7 +1937,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1434,7 +1958,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1453,7 +1979,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1472,7 +2000,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1491,7 +2021,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1511,7 +2043,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1531,7 +2065,109 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listOrdersWithCollectibles = ( + args: ListOrdersWithCollectiblesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListOrdersWithCollectibles'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + collectibles: >_data.collectibles, + page: _data.page, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + getCountOfAllOrders = ( + args: GetCountOfAllOrdersArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCountOfAllOrders'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + count: _data.count, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + getCountOfFilteredOrders = ( + args: GetCountOfFilteredOrdersArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCountOfFilteredOrders'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + count: _data.count, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listListings = (args: ListListingsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ListListings'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + listings: >_data.listings, + page: _data.page, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listOffers = (args: ListOffersArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ListOffers'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + offers: >_data.offers, + page: _data.page, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1550,7 +2186,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1569,7 +2207,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1588,7 +2228,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1607,7 +2249,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1626,7 +2270,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1645,7 +2291,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1665,7 +2313,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1685,7 +2335,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1704,7 +2356,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1723,7 +2377,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1742,7 +2398,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1761,7 +2419,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1780,7 +2440,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1795,7 +2457,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1815,7 +2479,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1834,7 +2500,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1853,7 +2521,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1868,7 +2538,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1888,7 +2560,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1908,7 +2582,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1928,7 +2604,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1948,7 +2626,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1961,7 +2641,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1974,7 +2656,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -1990,7 +2674,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -2009,7 +2695,9 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -2028,7 +2716,94 @@ export class Marketplace implements Marketplace { }) }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + supportedMarketplaces = ( + args: SupportedMarketplacesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SupportedMarketplaces'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + marketplaces: >_data.marketplaces, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + getPrimarySaleItem = ( + args: GetPrimarySaleItemArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetPrimarySaleItem'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + item: _data.item, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listPrimarySaleItems = ( + args: ListPrimarySaleItemsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListPrimarySaleItems'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + primarySaleItems: >_data.primarySaleItems, + page: _data.page, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + getCountOfPrimarySaleItems = ( + args: GetCountOfPrimarySaleItemsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCountOfPrimarySaleItems'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + count: _data.count, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) }, ) } @@ -2052,13 +2827,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) { @@ -2106,7 +2877,7 @@ export class WebrpcEndpointError extends WebrpcError { name: string = 'WebrpcEndpoint', code: number = 0, message: string = `endpoint error`, - status: number = 0, + status: number = 400, cause?: string, ) { super(name, code, message, status, cause) @@ -2119,7 +2890,7 @@ export class WebrpcRequestFailedError extends WebrpcError { name: string = 'WebrpcRequestFailed', code: number = -1, message: string = `request failed`, - status: number = 0, + status: number = 400, cause?: string, ) { super(name, code, message, status, cause) @@ -2132,7 +2903,7 @@ export class WebrpcBadRouteError extends WebrpcError { name: string = 'WebrpcBadRoute', code: number = -2, message: string = `bad route`, - status: number = 0, + status: number = 404, cause?: string, ) { super(name, code, message, status, cause) @@ -2145,7 +2916,7 @@ export class WebrpcBadMethodError extends WebrpcError { name: string = 'WebrpcBadMethod', code: number = -3, message: string = `bad method`, - status: number = 0, + status: number = 405, cause?: string, ) { super(name, code, message, status, cause) @@ -2158,7 +2929,7 @@ export class WebrpcBadRequestError extends WebrpcError { name: string = 'WebrpcBadRequest', code: number = -4, message: string = `bad request`, - status: number = 0, + status: number = 400, cause?: string, ) { super(name, code, message, status, cause) @@ -2171,7 +2942,7 @@ export class WebrpcBadResponseError extends WebrpcError { name: string = 'WebrpcBadResponse', code: number = -5, message: string = `bad response`, - status: number = 0, + status: number = 500, cause?: string, ) { super(name, code, message, status, cause) @@ -2184,7 +2955,7 @@ export class WebrpcServerPanicError extends WebrpcError { name: string = 'WebrpcServerPanic', code: number = -6, message: string = `server panic`, - status: number = 0, + status: number = 500, cause?: string, ) { super(name, code, message, status, cause) @@ -2197,7 +2968,7 @@ export class WebrpcInternalErrorError extends WebrpcError { name: string = 'WebrpcInternalError', code: number = -7, message: string = `internal error`, - status: number = 0, + status: number = 500, cause?: string, ) { super(name, code, message, status, cause) @@ -2205,16 +2976,16 @@ export class WebrpcInternalErrorError extends WebrpcError { } } -export class WebrpcClientDisconnectedError extends WebrpcError { +export class WebrpcClientAbortedError extends WebrpcError { constructor( - name: string = 'WebrpcClientDisconnected', + name: string = 'WebrpcClientAborted', code: number = -8, - message: string = `client disconnected`, - status: number = 0, + message: string = `request aborted by client`, + status: number = 400, cause?: string, ) { super(name, code, message, status, cause) - Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + Object.setPrototypeOf(this, WebrpcClientAbortedError.prototype) } } @@ -2223,7 +2994,7 @@ export class WebrpcStreamLostError extends WebrpcError { name: string = 'WebrpcStreamLost', code: number = -9, message: string = `stream lost`, - status: number = 0, + status: number = 400, cause?: string, ) { super(name, code, message, status, cause) @@ -2236,7 +3007,7 @@ export class WebrpcStreamFinishedError extends WebrpcError { name: string = 'WebrpcStreamFinished', code: number = -10, message: string = `stream finished`, - status: number = 0, + status: number = 200, cause?: string, ) { super(name, code, message, status, cause) @@ -2251,7 +3022,7 @@ export class UnauthorizedError extends WebrpcError { name: string = 'Unauthorized', code: number = 1000, message: string = `Unauthorized access`, - status: number = 0, + status: number = 401, cause?: string, ) { super(name, code, message, status, cause) @@ -2264,7 +3035,7 @@ export class PermissionDeniedError extends WebrpcError { name: string = 'PermissionDenied', code: number = 1001, message: string = `Permission denied`, - status: number = 0, + status: number = 403, cause?: string, ) { super(name, code, message, status, cause) @@ -2277,7 +3048,7 @@ export class SessionExpiredError extends WebrpcError { name: string = 'SessionExpired', code: number = 1002, message: string = `Session expired`, - status: number = 0, + status: number = 403, cause?: string, ) { super(name, code, message, status, cause) @@ -2290,7 +3061,7 @@ export class MethodNotFoundError extends WebrpcError { name: string = 'MethodNotFound', code: number = 1003, message: string = `Method not found`, - status: number = 0, + status: number = 404, cause?: string, ) { super(name, code, message, status, cause) @@ -2298,64 +3069,64 @@ export class MethodNotFoundError extends WebrpcError { } } -export class TimeoutError extends WebrpcError { +export class RequestConflictError extends WebrpcError { constructor( - name: string = 'Timeout', - code: number = 2000, - message: string = `Request timed out`, - status: number = 0, + name: string = 'RequestConflict', + code: number = 1004, + message: string = `Conflict with target resource`, + status: number = 409, cause?: string, ) { super(name, code, message, status, cause) - Object.setPrototypeOf(this, TimeoutError.prototype) + Object.setPrototypeOf(this, RequestConflictError.prototype) } } -export class InvalidArgumentError extends WebrpcError { +export class AbortedError extends WebrpcError { constructor( - name: string = 'InvalidArgument', - code: number = 2001, - message: string = `Invalid argument`, - status: number = 0, + name: string = 'Aborted', + code: number = 1005, + message: string = `Request aborted`, + status: number = 400, cause?: string, ) { super(name, code, message, status, cause) - Object.setPrototypeOf(this, InvalidArgumentError.prototype) + Object.setPrototypeOf(this, AbortedError.prototype) } } -export class NotFoundError extends WebrpcError { +export class GeoblockedError extends WebrpcError { constructor( - name: string = 'NotFound', - code: number = 3000, - message: string = `Resource not found`, - status: number = 0, + name: string = 'Geoblocked', + code: number = 1006, + message: string = `Geoblocked region`, + status: number = 451, cause?: string, ) { super(name, code, message, status, cause) - Object.setPrototypeOf(this, NotFoundError.prototype) + Object.setPrototypeOf(this, GeoblockedError.prototype) } } -export class UserNotFoundError extends WebrpcError { +export class RateLimitedError extends WebrpcError { constructor( - name: string = 'UserNotFound', - code: number = 3001, - message: string = `User not found`, - status: number = 0, + name: string = 'RateLimited', + code: number = 1007, + message: string = `Rate-limited. Please slow down.`, + status: number = 429, cause?: string, ) { super(name, code, message, status, cause) - Object.setPrototypeOf(this, UserNotFoundError.prototype) + Object.setPrototypeOf(this, RateLimitedError.prototype) } } export class ProjectNotFoundError extends WebrpcError { constructor( name: string = 'ProjectNotFound', - code: number = 3002, + code: number = 1008, message: string = `Project not found`, - status: number = 0, + status: number = 401, cause?: string, ) { super(name, code, message, status, cause) @@ -2363,29 +3134,198 @@ export class ProjectNotFoundError extends WebrpcError { } } -export class InvalidTierError extends WebrpcError { +export class SecretKeyCorsDisallowedError extends WebrpcError { + constructor( + name: string = 'SecretKeyCorsDisallowed', + code: number = 1009, + message: string = `CORS disallowed. Admin API Secret Key can't be used from a web app.`, + status: number = 403, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, SecretKeyCorsDisallowedError.prototype) + } +} + +export class AccessKeyNotFoundError extends WebrpcError { + constructor( + name: string = 'AccessKeyNotFound', + code: number = 1101, + message: string = `Access key not found`, + status: number = 401, + 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 = 403, + 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 = 403, + 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 = 403, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidServiceError.prototype) + } +} + +export class UnauthorizedUserError extends WebrpcError { constructor( - name: string = 'InvalidTier', - code: number = 3003, - message: string = `Invalid subscription tier`, - status: number = 0, + name: string = 'UnauthorizedUser', + code: number = 1105, + message: string = `Unauthorized user`, + status: number = 403, cause?: string, ) { super(name, code, message, status, cause) - Object.setPrototypeOf(this, InvalidTierError.prototype) + Object.setPrototypeOf(this, UnauthorizedUserError.prototype) } } -export class ProjectLimitReachedError extends WebrpcError { +export class InvalidChainError extends WebrpcError { constructor( - name: string = 'ProjectLimitReached', - code: number = 3005, - message: string = `Project limit reached`, - status: number = 0, + name: string = 'InvalidChain', + code: number = 1106, + message: string = `Network not enabled for Access key`, + status: number = 403, cause?: string, ) { super(name, code, message, status, cause) - Object.setPrototypeOf(this, ProjectLimitReachedError.prototype) + Object.setPrototypeOf(this, InvalidChainError.prototype) + } +} + +export class QuotaExceededError extends WebrpcError { + constructor( + name: string = 'QuotaExceeded', + code: number = 1200, + message: string = `Quota request exceeded`, + status: number = 429, + 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 = 429, + 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 = 403, + 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 = 403, + 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 = 403, + 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 = 408, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, TimeoutError.prototype) + } +} + +export class NotFoundError extends WebrpcError { + constructor( + name: string = 'NotFound', + code: number = 2000, + message: string = `Resource not found`, + status: number = 400, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NotFoundError.prototype) + } +} + +export class InvalidArgumentError extends WebrpcError { + constructor( + name: string = 'InvalidArgument', + code: number = 2001, + message: string = `Invalid argument`, + status: number = 400, + cause?: string, + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidArgumentError.prototype) } } @@ -2394,7 +3334,7 @@ export class NotImplementedError extends WebrpcError { name: string = 'NotImplemented', code: number = 9999, message: string = `Not Implemented`, - status: number = 0, + status: number = 500, cause?: string, ) { super(name, code, message, status, cause) @@ -2411,20 +3351,33 @@ export enum errors { WebrpcBadResponse = 'WebrpcBadResponse', WebrpcServerPanic = 'WebrpcServerPanic', WebrpcInternalError = 'WebrpcInternalError', - WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcClientAborted = 'WebrpcClientAborted', WebrpcStreamLost = 'WebrpcStreamLost', WebrpcStreamFinished = 'WebrpcStreamFinished', Unauthorized = 'Unauthorized', PermissionDenied = 'PermissionDenied', SessionExpired = 'SessionExpired', MethodNotFound = 'MethodNotFound', + RequestConflict = 'RequestConflict', + Aborted = 'Aborted', + Geoblocked = 'Geoblocked', + RateLimited = 'RateLimited', + ProjectNotFound = 'ProjectNotFound', + SecretKeyCorsDisallowed = 'SecretKeyCorsDisallowed', + AccessKeyNotFound = 'AccessKeyNotFound', + AccessKeyMismatch = 'AccessKeyMismatch', + InvalidOrigin = 'InvalidOrigin', + InvalidService = 'InvalidService', + UnauthorizedUser = 'UnauthorizedUser', + InvalidChain = 'InvalidChain', + QuotaExceeded = 'QuotaExceeded', + QuotaRateLimit = 'QuotaRateLimit', + NoDefaultKey = 'NoDefaultKey', + MaxAccessKeys = 'MaxAccessKeys', + AtLeastOneKey = 'AtLeastOneKey', Timeout = 'Timeout', - InvalidArgument = 'InvalidArgument', NotFound = 'NotFound', - UserNotFound = 'UserNotFound', - ProjectNotFound = 'ProjectNotFound', - InvalidTier = 'InvalidTier', - ProjectLimitReached = 'ProjectLimitReached', + InvalidArgument = 'InvalidArgument', NotImplemented = 'NotImplemented', } @@ -2437,20 +3390,33 @@ export enum WebrpcErrorCodes { WebrpcBadResponse = -5, WebrpcServerPanic = -6, WebrpcInternalError = -7, - WebrpcClientDisconnected = -8, + WebrpcClientAborted = -8, WebrpcStreamLost = -9, WebrpcStreamFinished = -10, Unauthorized = 1000, PermissionDenied = 1001, SessionExpired = 1002, MethodNotFound = 1003, - Timeout = 2000, + RequestConflict = 1004, + Aborted = 1005, + Geoblocked = 1006, + RateLimited = 1007, + ProjectNotFound = 1008, + SecretKeyCorsDisallowed = 1009, + AccessKeyNotFound = 1101, + AccessKeyMismatch = 1102, + InvalidOrigin = 1103, + InvalidService = 1104, + UnauthorizedUser = 1105, + InvalidChain = 1106, + QuotaExceeded = 1200, + QuotaRateLimit = 1201, + NoDefaultKey = 1300, + MaxAccessKeys = 1301, + AtLeastOneKey = 1302, + Timeout = 1900, + NotFound = 2000, InvalidArgument = 2001, - NotFound = 3000, - UserNotFound = 3001, - ProjectNotFound = 3002, - InvalidTier = 3003, - ProjectLimitReached = 3005, NotImplemented = 9999, } @@ -2463,20 +3429,33 @@ export const webrpcErrorByCode: { [code: number]: any } = { [-5]: WebrpcBadResponseError, [-6]: WebrpcServerPanicError, [-7]: WebrpcInternalErrorError, - [-8]: WebrpcClientDisconnectedError, + [-8]: WebrpcClientAbortedError, [-9]: WebrpcStreamLostError, [-10]: WebrpcStreamFinishedError, [1000]: UnauthorizedError, [1001]: PermissionDeniedError, [1002]: SessionExpiredError, [1003]: MethodNotFoundError, - [2000]: TimeoutError, + [1004]: RequestConflictError, + [1005]: AbortedError, + [1006]: GeoblockedError, + [1007]: RateLimitedError, + [1008]: ProjectNotFoundError, + [1009]: SecretKeyCorsDisallowedError, + [1101]: AccessKeyNotFoundError, + [1102]: AccessKeyMismatchError, + [1103]: InvalidOriginError, + [1104]: InvalidServiceError, + [1105]: UnauthorizedUserError, + [1106]: InvalidChainError, + [1200]: QuotaExceededError, + [1201]: QuotaRateLimitError, + [1300]: NoDefaultKeyError, + [1301]: MaxAccessKeysError, + [1302]: AtLeastOneKeyError, + [1900]: TimeoutError, + [2000]: NotFoundError, [2001]: InvalidArgumentError, - [3000]: NotFoundError, - [3001]: UserNotFoundError, - [3002]: ProjectNotFoundError, - [3003]: InvalidTierError, - [3005]: ProjectLimitReachedError, [9999]: NotImplementedError, } From 5245434fe5561c5160815af2df6952ff6118db9a Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 21:56:51 +0100 Subject: [PATCH 076/177] Update guard.gen.ts From 762371fdd508c3c87f25aa044407db9c2135ea45 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 16 Sep 2025 15:26:43 +1200 Subject: [PATCH 077/177] 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 3cd40ef00..12917553b 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 973da2b09..4e74c3a0f 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 8cf44257f..4bcc5bb77 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 ddbeb5ade..0622a2db9 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 098d7e9c6..330e941b7 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 790aeee00..bef0e8fa2 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 3d343d1ab..4217c8418 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 d65563c04..c8583916c 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 8b9306d7f..84ea3123b 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 7d092c15c..d7bce1ec7 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 887ca6b04..0e1eff066 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 c47bf47cb..a46d5e44a 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 078/177] 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 c193ce358..d662d39a0 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 a46d5e44a..203eaf598 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 1e8ac963a..9592c6887 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 079/177] 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 d7bce1ec7..caba743b1 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 080/177] 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 c8583916c..0e11c8d19 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 081/177] 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 0e11c8d19..fb6dd21fe 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 082/177] 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 330e941b7..cf1915036 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 083/177] 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 fb6dd21fe..8d61113a4 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 caba743b1..15e178f8c 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 203eaf598..8a6bc2d8a 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 9592c6887..a859ca797 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 084/177] 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 8a6bc2d8a..a11500559 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 085/177] 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 84ea3123b..bdde4b857 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 086/177] 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 12917553b..99d189131 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 bef0e8fa2..29c5e1118 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 4217c8418..28453121c 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 bdde4b857..6f92fa5be 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 0e1eff066..a9b193d79 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 087/177] 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 cf1915036..bde3b1299 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 7d6b0db99..ed66a50af 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 088/177] 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 a42d143d6..967fad8fe 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 79ca49296..a9e6b4440 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 1bc32aed4..d84206d67 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 000000000..6bf1086d4 --- /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 bde3b1299..aa154df91 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 76b62a3f3..623fc1faa 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 4bff6bdb4..dcc7d81ce 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 c920a0ac5..3770dd880 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 ad251cab4..a488c98b7 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 a554f86fe..c65bc0ffc 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 773a176e5..c2909696d 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 a11500559..bd6a15e38 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 000000000..1efef2490 --- /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 bd1500e5d..f6d8a144b 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 450d5be82..f06089e93 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 089/177] 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 623fc1faa..14fbdc329 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 090/177] 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 967fad8fe..a42d143d6 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 a9e6b4440..79ca49296 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 091/177] 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 dcc7d81ce..6d2b42a6d 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 a488c98b7..62ca16df0 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 092/177] 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 6d2b42a6d..584b146b7 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 093/177] 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 e18bf7d94..23f175d2f 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 094/177] 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 db4733e2b..05a02da09 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 095/177] 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 99d189131..316f9a9ad 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 28453121c..2672721c6 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 8d61113a4..46e3d9f52 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 6f92fa5be..a9f5144a1 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 15e178f8c..149b17565 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 a9b193d79..b8efe28c2 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 096/177] 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 46e3d9f52..67180acea 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 097/177] 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 67180acea..f4e94568d 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 149b17565..6e20d5597 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 098/177] 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 f4e94568d..38ba2056c 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 099/177] 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 79ca49296..0638fbe94 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 db28608fc..d7c0cb617 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 e1a2bd174..66e7c4c4c 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 0e4f30732..274af44eb 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 d680f67f7..a8e850af4 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 23f175d2f..f64a8f005 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 a9e6b4440..0638fbe94 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 d99cd41ce..d95bf19dd 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 100/177] 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 14fbdc329..8689cddb8 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 584b146b7..3f3614888 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 62ca16df0..88146cd8a 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 101/177] 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 8689cddb8..c29bd0881 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 3f3614888..c6e384486 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 3770dd880..791c37cd5 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 102/177] 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 316f9a9ad..c991f955e 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 aa154df91..6a0bd156b 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 c29bd0881..c1048b9e9 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 103/177] 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 c1048b9e9..7d1f8e669 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 c6e384486..5b4818bf1 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 104/177] 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 f63417f9e..25f62ba2a 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 105/177] 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 7d1f8e669..afe0095d9 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 5b4818bf1..d92936fa2 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 c65bc0ffc..2fa2eaac4 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 106/177] 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 0a4106482..28bacf399 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 a42d143d6..967fad8fe 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 63fd273bc..73a079116 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 6b1ea35be..29f042bf6 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 b51ee450c..fa04faa2d 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 c35614659..2a3c09e46 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 55bf3f7f2..be043ee98 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 4859839b5..1ff39166f 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 d7c0cb617..952b80f8f 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 6e10f600b..21a2f827b 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 66e7c4c4c..05c2b21bf 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 12260aef4..d04527fa0 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 274af44eb..f9edc19c4 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 a8e850af4..c43cdbab4 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 d95bf19dd..2412059e3 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 af067e95b..e4975daaf 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 d0f4cba93..adbadd236 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 aa0333e53..15772c27d 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 4468f086d..baa473b81 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 11ae0dd64..e2d95ec33 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 5fb0b6724..53c531a9b 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 d84206d67..b36e917ca 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 f64a8f005..000000000 --- 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 0638fbe94..000000000 --- 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 c991f955e..ef3d81b3a 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 cf5b3df46..bc565e1cc 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 b10524e42..be30ad342 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 afe0095d9..ae012f442 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 d92936fa2..4b8a182c9 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 791c37cd5..9ffb334d9 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 88146cd8a..a6ea2ef9b 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 c1eec3cef..3e1355558 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 05e0a9171..b47e0b40f 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 c46f67090..c85054794 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 c9a0a7b70..0afb52a87 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 0dbe84ef8..442136904 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 e16a4bee4..bc39ba16b 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 289bf5b64..51160a049 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 f06089e93..ad45d777b 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 107/177] 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 fd760378b..000000000 --- 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 1ff39166f..dc28bfc77 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 29850be34..000000000 --- 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 85e9257f2..000000000 --- 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 952b80f8f..000000000 --- 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 000000000..52362d5c9 --- /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 000000000..3ed5a6962 --- /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 21a2f827b..0768490c9 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 05c2b21bf..996c1baee 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 f9edc19c4..01c928906 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 c43cdbab4..37b2e5a08 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 2412059e3..b41e97806 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 ae012f442..6a7b3572e 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 4b8a182c9..088407359 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 a6ea2ef9b..72e3dbe11 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 442136904..2405e6f2d 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 bc39ba16b..824cb00f6 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 108/177] 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 25f62ba2a..b0ef2bbde 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 109/177] 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 6b372552c..bfd12d278 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 110/177] 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 088407359..6e6a182d8 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 111/177] 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 6e6a182d8..2c38fc18b 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 9ffb334d9..d16662c37 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 2fa2eaac4..0995a6701 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 112/177] 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 a859ca797..e05d81ae1 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 113/177] 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 0afb52a87..c4217064b 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 e24a32900..dd8b27b80 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 c6cb53aa8..cd950a5d1 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 2405e6f2d..1d6d39c01 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 136a072e4..6169a361a 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 114/177] 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 3a654edb4..d6316ddf0 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 c4217064b..1ff7a19e4 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 dd8b27b80..143edc0cd 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 cd950a5d1..f037189cb 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 115/177] 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 ec0af4487..4eea436ee 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 d6316ddf0..6ee2f2130 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 1ff7a19e4..4274bedff 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 116/177] 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 001b9a5f1..a83f23487 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 3d7582cbc..fca976a6e 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 1d6d39c01..be7624cc0 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 117/177] 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 77e15da6c..cd6542245 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 140b3f1ca..a394d8a7f 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 6a0bd156b..58ef96dcb 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 6a7b3572e..6785c18cd 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 b418f1406..c21eaa800 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 c53ada141..0abced190 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 f6d8a144b..9f2add500 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 118/177] 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 e373b0469..e20f3a5b7 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 4e74c3a0f..481b91c27 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 a9f5144a1..c8ef19213 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 b8efe28c2..733604da0 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 119/177] 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 e20f3a5b7..cd72b2256 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 481b91c27..71b112865 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 58ef96dcb..bfbc28b17 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 c8f05ee8d..1359abdbe 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 c8ef19213..c3f67ca24 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 733604da0..a1fd0fe23 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 9f2add500..67e081fb0 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 120/177] 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 a83f23487..527d7c3e7 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 121/177] 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 3e1355558..7d382d41c 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 122/177] 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 a394d8a7f..e9e821d4b 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 123/177] 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 be7624cc0..6a2d8b128 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 124/177] 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 6785c18cd..c3738969d 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 2c38fc18b..3c5a29cba 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 a01494695..463c2874a 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 0995a6701..8928d354e 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 125/177] 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 d662d39a0..27bb7f032 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 46185a49d..fc2173ebf 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 7df3a5807..4dbaa0f84 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 c85054794..a005a1619 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 6a2d8b128..f77c94943 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 bd6a15e38..9496ce969 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 df254a648..014a97ae6 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 e05d81ae1..2cc7afc1d 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 6169a361a..44e7e2cb5 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 45db67613..ec3265b50 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 126/177] 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 f77c94943..8951a9867 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 127/177] 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 3d2c2e9d4..0fbeffd97 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 1d6147825..2963459c4 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 d88f6aab1..f6ff9108b 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 3d2c2e9d4..0fbeffd97 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 1d6147825..2963459c4 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 8a0ffdf21..06e2f9340 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 bba908e69..3a381a275 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 e5668967a..4eb401739 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 a7ec3a3d4..7b596d782 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 0eec0d29d..6e90f3503 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 106c486da..5b98c40e9 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 af9069cd6..54e9faea7 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 be043ee98..3ddc0e968 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 738e1398c..e6ad8804e 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 19170f88e..cecf89b03 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 19170f88e..cecf89b03 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 b01f2eb98..722d94e4c 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 19170f88e..cecf89b03 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 ad45d777b..c814fa1ae 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 51af743ed..d11de66b7 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 128/177] 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 a6c2a13f7..74f83154b 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 42b8cbb3b..d5985a862 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 0768490c9..04db6aa40 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 0638fbe94..ca5dbe9c8 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 996c1baee..9d4861363 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 01c928906..14d697aa2 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 b41e97806..5c0bd1663 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 f67a016fa..88d442510 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 36fe6e5f5..7fdc008ad 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 fdb1807aea639fce083692b39120d7f8a566f1bb Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 24 Nov 2025 12:39:52 +0100 Subject: [PATCH 129/177] Update relayer.gen.ts and TransactionPrecondition interface (#920) --- .../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 a6c2a13f7..74f83154b 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 42b8cbb3b..d5985a862 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 0768490c9..04db6aa40 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 0638fbe94..ca5dbe9c8 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 996c1baee..9d4861363 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 01c928906..14d697aa2 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 b41e97806..5c0bd1663 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 f67a016fa..88d442510 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 36fe6e5f5..7fdc008ad 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 6d5de25a341de6a23a9f582c298040fdfad4283c Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 24 Nov 2025 13:02:41 +0100 Subject: [PATCH 130/177] 3.0.0-beta.1 --- .changeset/pre.json | 25 +++++++++++++++++++ .changeset/wild-feet-carry.md | 17 +++++++++++++ packages/services/api/CHANGELOG.md | 6 +++++ packages/services/api/package.json | 2 +- packages/services/builder/CHANGELOG.md | 6 +++++ packages/services/builder/package.json | 2 +- packages/services/guard/CHANGELOG.md | 6 +++++ packages/services/guard/package.json | 2 +- .../services/identity-instrument/CHANGELOG.md | 7 ++++++ .../services/identity-instrument/package.json | 2 +- packages/services/indexer/CHANGELOG.md | 6 +++++ packages/services/indexer/package.json | 2 +- packages/services/marketplace/CHANGELOG.md | 6 +++++ packages/services/marketplace/package.json | 2 +- packages/services/metadata/CHANGELOG.md | 6 +++++ packages/services/metadata/package.json | 2 +- packages/services/relayer/CHANGELOG.md | 8 ++++++ packages/services/relayer/package.json | 2 +- packages/utils/abi/CHANGELOG.md | 6 +++++ packages/utils/abi/package.json | 2 +- packages/wallet/core/CHANGELOG.md | 11 ++++++++ packages/wallet/core/package.json | 2 +- packages/wallet/dapp-client/CHANGELOG.md | 12 +++++++++ packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives/CHANGELOG.md | 7 ++++++ packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/CHANGELOG.md | 13 ++++++++++ packages/wallet/wdk/package.json | 2 +- 28 files changed, 155 insertions(+), 13 deletions(-) create mode 100644 .changeset/pre.json create mode 100644 .changeset/wild-feet-carry.md create mode 100644 packages/services/identity-instrument/CHANGELOG.md create mode 100644 packages/wallet/core/CHANGELOG.md create mode 100644 packages/wallet/dapp-client/CHANGELOG.md create mode 100644 packages/wallet/primitives/CHANGELOG.md create mode 100644 packages/wallet/wdk/CHANGELOG.md diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 000000000..773d94c71 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,25 @@ +{ + "mode": "pre", + "tag": "beta", + "initialVersions": { + "docs": "0.1.0", + "web": "0.1.0", + "@0xsequence/api": "3.0.0", + "@0xsequence/builder": "3.0.0", + "@0xsequence/guard": "3.0.0", + "@0xsequence/identity-instrument": "0.0.0", + "@0xsequence/indexer": "3.0.0", + "@0xsequence/marketplace": "3.0.0", + "@0xsequence/metadata": "3.0.0", + "@0xsequence/relayer": "3.0.0", + "@0xsequence/abi": "3.0.0", + "@0xsequence/wallet-core": "0.0.0", + "@0xsequence/dapp-client": "0.0.0", + "@0xsequence/wallet-primitives": "0.0.0", + "@0xsequence/wallet-wdk": "0.0.0", + "@repo/eslint-config": "0.0.0", + "@repo/typescript-config": "0.0.0", + "@repo/ui": "0.0.0" + }, + "changesets": ["wild-feet-carry"] +} diff --git a/.changeset/wild-feet-carry.md b/.changeset/wild-feet-carry.md new file mode 100644 index 000000000..962942831 --- /dev/null +++ b/.changeset/wild-feet-carry.md @@ -0,0 +1,17 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +3.0.0-beta.1 diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 28bacf399..f33ac226f 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 + ## 2.3.8 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 3a381a275..239d6dbb8 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.0", + "version": "3.0.0-beta.1", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 0a86b4aa5..4b2ff79f0 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 + ## 2.3.8 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 4eb401739..96d481c43 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.0", + "version": "3.0.0-beta.1", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 73a079116..da4404c7a 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 + ## 2.3.8 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 7b596d782..aeb02b4ea 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.0", + "version": "3.0.0-beta.1", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md new file mode 100644 index 000000000..f2818a430 --- /dev/null +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -0,0 +1,7 @@ +# @0xsequence/identity-instrument + +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 3accab80e..060a334c9 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/identity-instrument", - "version": "0.0.0", + "version": "3.0.0-beta.1", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 29f042bf6..0c10b49e1 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 + ## 2.3.8 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 6e90f3503..723e98d95 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.0", + "version": "3.0.0-beta.1", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 6295f3498..ad58b75b7 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 + ## 2.3.8 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 5b98c40e9..9de39e22c 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.0", + "version": "3.0.0-beta.1", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index fa04faa2d..4526baa19 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 + ## 2.3.8 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 54e9faea7..7982d8318 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.0", + "version": "3.0.0-beta.1", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 2a3c09e46..2cbead205 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.1 + ## 2.3.8 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 3ddc0e968..3cef46d0f 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.0", + "version": "3.0.0-beta.1", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 15772c27d..d1c7a9184 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 + ## 2.3.8 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index e6ad8804e..4166e00b1 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.0", + "version": "3.0.0-beta.1", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md new file mode 100644 index 000000000..a41863f87 --- /dev/null +++ b/packages/wallet/core/CHANGELOG.md @@ -0,0 +1,11 @@ +# @0xsequence/wallet-core + +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.1 + - @0xsequence/relayer@3.0.0-beta.1 + - @0xsequence/wallet-primitives@3.0.0-beta.1 diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 00fbbf56e..54a3948f5 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "0.0.0", + "version": "3.0.0-beta.1", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md new file mode 100644 index 000000000..5c85da4df --- /dev/null +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -0,0 +1,12 @@ +# @0xsequence/dapp-client + +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.1 + - @0xsequence/relayer@3.0.0-beta.1 + - @0xsequence/wallet-core@3.0.0-beta.1 + - @0xsequence/wallet-primitives@3.0.0-beta.1 diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 8f57d8aae..91cfc0a70 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.1", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md new file mode 100644 index 000000000..d132ad839 --- /dev/null +++ b/packages/wallet/primitives/CHANGELOG.md @@ -0,0 +1,7 @@ +# @0xsequence/wallet-primitives + +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index ead0a7823..1e3710191 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "0.0.0", + "version": "3.0.0-beta.1", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md new file mode 100644 index 000000000..1c34bb679 --- /dev/null +++ b/packages/wallet/wdk/CHANGELOG.md @@ -0,0 +1,13 @@ +# @0xsequence/wallet-wdk + +## 3.0.0-beta.1 + +### Patch Changes + +- 3.0.0-beta.1 +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.1 + - @0xsequence/identity-instrument@3.0.0-beta.1 + - @0xsequence/relayer@3.0.0-beta.1 + - @0xsequence/wallet-core@3.0.0-beta.1 + - @0xsequence/wallet-primitives@3.0.0-beta.1 diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 9bbf85a4c..9e45b5f36 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.1", "license": "Apache-2.0", "type": "module", "publishConfig": { From 2de6df4a062ea56ec18a89afc416a3cf562bb7db Mon Sep 17 00:00:00 2001 From: Patryk Kalinowski Date: Mon, 24 Nov 2025 13:13:44 +0100 Subject: [PATCH 131/177] identity-instrument: generate nonce from current time (#921) --- 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 12eb0f0ff..f7b477b6c 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.random(16), + nonce: Hex.fromNumber(Date.now()), } const res = await this.rpc.sign({ params, From c574526ba6552af74fc2cc834e45bcc961300f2d Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Mon, 24 Nov 2025 10:04:22 -0500 Subject: [PATCH 132/177] Remove publish-dists.yml github action (#923) --- .github/workflows/publish-dists.yml | 88 ----------------------------- 1 file changed, 88 deletions(-) delete mode 100644 .github/workflows/publish-dists.yml diff --git a/.github/workflows/publish-dists.yml b/.github/workflows/publish-dists.yml deleted file mode 100644 index fd4bb7905..000000000 --- a/.github/workflows/publish-dists.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: Publish Dists for Packages - -on: - workflow_dispatch: - push: - branches: - - master - -jobs: - build-and-push: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - uses: ./.github/actions/install-dependencies - - - name: Build package - run: pnpm run build - - - name: Prepare dist branch - run: | - PACKAGES=("services/guard" "services/identity-instrument" "services/relayer" "wallet/core" "wallet/primitives" "wallet/wdk" "wallet/dapp-client") - - for PACKAGE in "${PACKAGES[@]}"; do - BRANCH="dists/$PACKAGE" - PKG_DIR="packages/$PACKAGE" - - echo "📦 Publishing $PACKAGE to $BRANCH" - - mkdir -p /tmp/$PACKAGE - shopt -s dotglob - cp -r $PKG_DIR/* /tmp/$PACKAGE || true - - cd /tmp/$PACKAGE - git init - git checkout -b $BRANCH - - git config user.name "github-actions" - git config user.email "actions@github.com" - - echo "🔧 Rewriting workspace: deps in package.json..." - node -e ' - const fs = require("fs"); - const path = require("path"); - const pkgPath = path.resolve("package.json"); - const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8")); - const repo = "github:0xsequence/sequence.js"; - - const versions = { - "@0xsequence/guard": `${repo}#dists/services/guard`, - "@0xsequence/identity-instrument": `${repo}#dists/services/identity-instrument`, - "@0xsequence/relayer": `${repo}#dists/services/relayer`, - "@0xsequence/wallet-core": `${repo}#dists/wallet/core`, - "@0xsequence/wallet-primitives": `${repo}#dists/wallet/primitives`, - "@0xsequence/wallet-wdk": `${repo}#dists/wallet/wdk`, - }; - - const rewrite = (deps = {}) => { - for (const k in deps) { - if (deps[k].startsWith("workspace:")) { - const version = versions[k]; - - if (!version) { - console.warn(`No version found for ${k}, skipping...`); - continue; - } - - deps[k] = version; - console.log(`→ ${k} → ${deps[k]}`); - } - } - }; - - rewrite(pkg.dependencies); - fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2)); - ' - - git add . - git commit -m "Build: publish $PACKAGE dist" - - git remote add origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git - git push -f origin HEAD:$BRANCH - - cd - - done From 98ce38bac53d6527bfb7df0cd84254cf0ef38f29 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 24 Nov 2025 17:59:18 +0100 Subject: [PATCH 133/177] 3.0.0-beta.2 --- .changeset/plain-feet-stare.md | 17 +++++++++++ .changeset/pre.json | 28 +++++++++---------- packages/services/api/CHANGELOG.md | 6 ++++ packages/services/api/package.json | 2 +- packages/services/builder/CHANGELOG.md | 6 ++++ packages/services/builder/package.json | 2 +- packages/services/guard/CHANGELOG.md | 6 ++++ packages/services/guard/package.json | 2 +- .../services/identity-instrument/CHANGELOG.md | 6 ++++ .../services/identity-instrument/package.json | 2 +- packages/services/indexer/CHANGELOG.md | 6 ++++ packages/services/indexer/package.json | 2 +- packages/services/marketplace/CHANGELOG.md | 6 ++++ packages/services/marketplace/package.json | 2 +- packages/services/metadata/CHANGELOG.md | 6 ++++ packages/services/metadata/package.json | 2 +- packages/services/relayer/CHANGELOG.md | 8 ++++++ packages/services/relayer/package.json | 2 +- packages/utils/abi/CHANGELOG.md | 6 ++++ packages/utils/abi/package.json | 2 +- packages/wallet/core/CHANGELOG.md | 10 +++++++ packages/wallet/core/package.json | 2 +- packages/wallet/dapp-client/CHANGELOG.md | 11 ++++++++ packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives/CHANGELOG.md | 6 ++++ packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/CHANGELOG.md | 12 ++++++++ packages/wallet/wdk/package.json | 2 +- 28 files changed, 139 insertions(+), 27 deletions(-) create mode 100644 .changeset/plain-feet-stare.md diff --git a/.changeset/plain-feet-stare.md b/.changeset/plain-feet-stare.md new file mode 100644 index 000000000..c99c82026 --- /dev/null +++ b/.changeset/plain-feet-stare.md @@ -0,0 +1,17 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +3.0.0-beta.2 with identity instrument updates diff --git a/.changeset/pre.json b/.changeset/pre.json index 773d94c71..c799a5c9d 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,22 +4,22 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0", - "@0xsequence/builder": "3.0.0", - "@0xsequence/guard": "3.0.0", - "@0xsequence/identity-instrument": "0.0.0", - "@0xsequence/indexer": "3.0.0", - "@0xsequence/marketplace": "3.0.0", - "@0xsequence/metadata": "3.0.0", - "@0xsequence/relayer": "3.0.0", - "@0xsequence/abi": "3.0.0", - "@0xsequence/wallet-core": "0.0.0", - "@0xsequence/dapp-client": "0.0.0", - "@0xsequence/wallet-primitives": "0.0.0", - "@0xsequence/wallet-wdk": "0.0.0", + "@0xsequence/api": "3.0.0-beta.1", + "@0xsequence/builder": "3.0.0-beta.1", + "@0xsequence/guard": "3.0.0-beta.1", + "@0xsequence/identity-instrument": "3.0.0-beta.1", + "@0xsequence/indexer": "3.0.0-beta.1", + "@0xsequence/marketplace": "3.0.0-beta.1", + "@0xsequence/metadata": "3.0.0-beta.1", + "@0xsequence/relayer": "3.0.0-beta.1", + "@0xsequence/abi": "3.0.0-beta.1", + "@0xsequence/wallet-core": "3.0.0-beta.1", + "@0xsequence/dapp-client": "3.0.0-beta.1", + "@0xsequence/wallet-primitives": "3.0.0-beta.1", + "@0xsequence/wallet-wdk": "3.0.0-beta.1", "@repo/eslint-config": "0.0.0", "@repo/typescript-config": "0.0.0", "@repo/ui": "0.0.0" }, - "changesets": ["wild-feet-carry"] + "changesets": ["plain-feet-stare", "wild-feet-carry"] } diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index f33ac226f..a1292632d 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 239d6dbb8..f70e3e5ce 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 4b2ff79f0..9ed18ebb8 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 96d481c43..b8c2dce8e 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index da4404c7a..aa28d0cf3 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index aeb02b4ea..842baa4f7 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index f2818a430..f5152b63e 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 060a334c9..bace871da 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/identity-instrument", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 0c10b49e1..5562e6af5 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 723e98d95..c755c855f 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index ad58b75b7..edb21a8ae 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 9de39e22c..571933dbd 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 4526baa19..383f9239d 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 7982d8318..d9fb6a0f6 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 2cbead205..6142ae25d 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.2 + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 3cef46d0f..6e632f07c 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index d1c7a9184..0fb5dadef 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 4166e00b1..5ae8cee01 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index a41863f87..27e00ea84 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.2 + - @0xsequence/relayer@3.0.0-beta.2 + - @0xsequence/wallet-primitives@3.0.0-beta.2 + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 54a3948f5..13b03f4cc 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 5c85da4df..95434f790 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.2 + - @0xsequence/relayer@3.0.0-beta.2 + - @0xsequence/wallet-core@3.0.0-beta.2 + - @0xsequence/wallet-primitives@3.0.0-beta.2 + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 91cfc0a70..b7f38708b 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/dapp-client", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index d132ad839..da421d105 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 1e3710191..18b656bff 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 1c34bb679..64c096d30 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.2 + +### Patch Changes + +- 3.0.0-beta.2 with identity instrument updates +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.2 + - @0xsequence/identity-instrument@3.0.0-beta.2 + - @0xsequence/relayer@3.0.0-beta.2 + - @0xsequence/wallet-core@3.0.0-beta.2 + - @0xsequence/wallet-primitives@3.0.0-beta.2 + ## 3.0.0-beta.1 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 9e45b5f36..60beea6d3 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.0-beta.1", + "version": "3.0.0-beta.2", "license": "Apache-2.0", "type": "module", "publishConfig": { From 83a0201b4a75d1d61f3b5352270576b3ec051e4c Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 24 Nov 2025 18:08:21 +0100 Subject: [PATCH 134/177] Clean up changeset config --- .changeset/config.json | 2 +- .changeset/pre.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/config.json b/.changeset/config.json index bfd12d278..155655938 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,5 +7,5 @@ "access": "restricted", "baseBranch": "master", "updateInternalDependencies": "patch", - "ignore": [] + "ignore": ["@0xsequence/wallet-primitives-cli", "docs", "web", "eslint-config", "typescript-config", "ui"] } diff --git a/.changeset/pre.json b/.changeset/pre.json index c799a5c9d..f6a21ebb3 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "pre", + "mode": "exit", "tag": "beta", "initialVersions": { "docs": "0.1.0", From c6fd0907b915cbb46a8ceb9c9a30d7b440b5980a Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Wed, 26 Nov 2025 14:35:25 +1300 Subject: [PATCH 135/177] Improve test stability by removing race conditions --- packages/wallet/core/test/constants.ts | 2 - .../wallet/core/test/session-manager.test.ts | 27 ++- packages/wallet/core/vitest.config.ts | 9 - packages/wallet/wdk/.env.test | 5 - packages/wallet/wdk/test/constants.ts | 2 - packages/wallet/wdk/test/sessions.test.ts | 188 +++++------------- packages/wallet/wdk/vitest.config.ts | 1 - 7 files changed, 68 insertions(+), 166 deletions(-) delete mode 100644 packages/wallet/core/vitest.config.ts delete mode 100644 packages/wallet/wdk/.env.test diff --git a/packages/wallet/core/test/constants.ts b/packages/wallet/core/test/constants.ts index 0622a2db9..493bf6bf2 100644 --- a/packages/wallet/core/test/constants.ts +++ b/packages/wallet/core/test/constants.ts @@ -17,5 +17,3 @@ export const USDC_ADDRESS: Address.Address = '0xaf88d065e77c8cc2239327c5edb3a432 // Environment variables export const LOCAL_RPC_URL = process.env.LOCAL_RPC_URL || 'http://localhost:8545' -export const { RPC_URL, PRIVATE_KEY } = process.env -export const CAN_RUN_LIVE = !!RPC_URL && !!PRIVATE_KEY diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index bfbc28b17..9e524fd13 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -1,20 +1,17 @@ +import { Extensions } from '@0xsequence/wallet-primitives' import { AbiEvent, AbiFunction, Address, Bytes, Hex, Provider, RpcTransport, Secp256k1 } from 'ox' 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 { ExplicitSessionConfig } from '../src/utils/session/types.js' import { - EMITTER_FUNCTIONS, EMITTER_ADDRESS1, EMITTER_ADDRESS2, EMITTER_EVENT_TOPICS, + EMITTER_FUNCTIONS, LOCAL_RPC_URL, USDC_ADDRESS, } from './constants' -import { Extensions } from '@0xsequence/wallet-primitives' -import { ExplicitSessionConfig } from '../src/utils/session/types.js' - const { PermissionBuilder, ERC20PermissionBuilder } = Utils function randomAddress(): Address.Address { @@ -605,10 +602,26 @@ for (const extension of ALL_EXTENSIONS) { transaction: { to: Address.Address; data: Hex.Hex }, expectedEventTopic?: Hex.Hex, ) => { + // Generate and use a random sender address to prevent race conditions + const senderAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: Secp256k1.randomPrivateKey() })) + await provider.request({ + method: 'anvil_setBalance', + params: [senderAddress, Hex.fromNumber(1000000000000000000n)], + }) + await provider.request({ + method: 'anvil_impersonateAccount', + params: [senderAddress], + }) + console.log('Simulating transaction', transaction) const txHash = await provider.request({ method: 'eth_sendTransaction', - params: [transaction], + params: [ + { + ...transaction, + from: senderAddress, + }, + ], }) console.log('Transaction hash:', txHash) diff --git a/packages/wallet/core/vitest.config.ts b/packages/wallet/core/vitest.config.ts deleted file mode 100644 index 0b2f7c6c7..000000000 --- a/packages/wallet/core/vitest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - test: { - poolOptions: { - singleThread: true, - }, - }, -}) diff --git a/packages/wallet/wdk/.env.test b/packages/wallet/wdk/.env.test deleted file mode 100644 index 84a53e8c0..000000000 --- a/packages/wallet/wdk/.env.test +++ /dev/null @@ -1,5 +0,0 @@ -PRIVATE_KEY= -# When using an RPC, use cors-anywhere. docker run -d -p 8080:8080 redocly/cors-anywhere. http://localhost:8080/https... -RPC_URL= -RELAYER_PK= - diff --git a/packages/wallet/wdk/test/constants.ts b/packages/wallet/wdk/test/constants.ts index 4ace92092..14b099614 100644 --- a/packages/wallet/wdk/test/constants.ts +++ b/packages/wallet/wdk/test/constants.ts @@ -13,8 +13,6 @@ export const EMITTER_ADDRESS: Address.Address = '0xb7bE532959236170064cf099e1a33 export const EMITTER_ABI = Abi.from(['function explicitEmit()', 'function implicitEmit()']) // Environment variables -export const { RPC_URL, PRIVATE_KEY } = process.env -export const CAN_RUN_LIVE = !!RPC_URL && !!PRIVATE_KEY export const LOCAL_RPC_URL = process.env.LOCAL_RPC_URL || 'http://localhost:8545' let testIdCounter = 0 diff --git a/packages/wallet/wdk/test/sessions.test.ts b/packages/wallet/wdk/test/sessions.test.ts index 67e081fb0..e942f7479 100644 --- a/packages/wallet/wdk/test/sessions.test.ts +++ b/packages/wallet/wdk/test/sessions.test.ts @@ -1,10 +1,10 @@ -import { AbiFunction, Address, Bytes, Hex, Mnemonic, Provider, RpcTransport } from 'ox' -import { beforeEach, describe, expect, it, vi } from 'vitest' +import { AbiFunction, Address, Bytes, Hex, Mnemonic, Provider, RpcTransport, Secp256k1 } from 'ox' +import { beforeEach, describe, expect, it } from 'vitest' 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 '../../core/src/utils/session/types.js' +import { Extensions, Network, Payload, Permission } from '../../primitives/src/index.js' +import { Sequence } from '../src/index.js' +import { EMITTER_ABI, EMITTER_ADDRESS, LOCAL_RPC_URL } from './constants' const ALL_EXTENSIONS = [ { @@ -67,26 +67,17 @@ for (const extension of ALL_EXTENSIONS) { } beforeEach(async () => { - // Create provider or use arbitrum sepolia - if (RPC_URL) { - provider = Provider.from( - RpcTransport.fromHttp(RPC_URL, { - fetchOptions: { - headers: { - 'x-requested-with': 'XMLHttpRequest', - }, + // Create provider using LOCAL_RPC_URL + provider = Provider.from( + RpcTransport.fromHttp(LOCAL_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 - } + }, + }), + ) + chainId = Number(await provider.request({ method: 'eth_chainId' })) // Create state provider stateProvider = new State.Local.Provider() @@ -99,7 +90,7 @@ for (const extension of ALL_EXTENSIONS) { { chainId, type: Network.NetworkType.MAINNET, - rpcUrl: RPC_URL ?? 'XXX', + rpcUrl: LOCAL_RPC_URL, name: 'XXX', blockExplorer: { url: 'XXX' }, nativeCurrency: { @@ -185,18 +176,32 @@ for (const extension of ALL_EXTENSIONS) { const transaction = await dapp.wallet.buildTransaction(provider, signedEnvelope) console.log('tx', transaction) + // Generate and use a random sender address to prevent race conditions + const senderAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: Secp256k1.randomPrivateKey() })) + await provider.request({ + method: 'anvil_setBalance', + params: [senderAddress, Hex.fromNumber(1000000000000000000n)], + }) + await provider.request({ + method: 'anvil_impersonateAccount', + params: [senderAddress], + }) + // 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 - } + const txHash = await provider.request({ + method: 'eth_sendTransaction', + params: [ + { + ...transaction, + from: senderAddress, + }, + ], + }) + console.log('Transaction sent', txHash) + await new Promise((resolve) => setTimeout(resolve, 3000)) + const receipt = await provider.request({ method: 'eth_getTransactionReceipt', params: [txHash] }) + console.log('Transaction receipt', receipt) + return txHash } it( @@ -243,6 +248,7 @@ for (const extension of ALL_EXTENSIONS) { throw new Error('Failed to create pk store') } const explicitSession: ExplicitSession = { + type: 'explicit', sessionAddress: e.address, chainId, valueLimit: 0n, @@ -271,34 +277,10 @@ for (const extension of ALL_EXTENSIONS) { 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, + { timeout: 60000 }, ) it( @@ -311,6 +293,7 @@ for (const extension of ALL_EXTENSIONS) { throw new Error('Failed to create pk store') } const explicitSession: ExplicitSession = { + type: 'explicit', sessionAddress: e.address, chainId, valueLimit: 0n, @@ -348,34 +331,10 @@ for (const extension of ALL_EXTENSIONS) { 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, + { timeout: 60000 }, ) it( @@ -389,6 +348,7 @@ for (const extension of ALL_EXTENSIONS) { } // Create the initial permissions let explicitSession: ExplicitSession = { + type: 'explicit', sessionAddress: e.address, chainId, valueLimit: 0n, @@ -426,30 +386,6 @@ for (const extension of ALL_EXTENSIONS) { 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) @@ -463,7 +399,7 @@ for (const extension of ALL_EXTENSIONS) { // 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, + { timeout: 60000 }, ) it( @@ -516,38 +452,10 @@ for (const extension of ALL_EXTENSIONS) { 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, + { timeout: 60000 }, ) }) } diff --git a/packages/wallet/wdk/vitest.config.ts b/packages/wallet/wdk/vitest.config.ts index 813dc499d..9c2092c0c 100644 --- a/packages/wallet/wdk/vitest.config.ts +++ b/packages/wallet/wdk/vitest.config.ts @@ -1,4 +1,3 @@ -import { BrowserNavigationCrossOriginPolicyEnum } from 'happy-dom' import { defineConfig } from 'vitest/config' export default defineConfig({ From 3f7b18b8de8613bb93bcdaba6bcdd9d9f0a3e5df Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Wed, 26 Nov 2025 15:02:22 +1300 Subject: [PATCH 136/177] Ensure build before test --- .github/workflows/tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1babc7378..3003e531e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -33,6 +33,7 @@ jobs: version: nightly - name: Start Anvil in background run: anvil --fork-url https://nodes.sequence.app/arbitrum & + - run: pnpm build - run: pnpm test # NOTE: if you'd like to see example of how to run From 38289e41bbc54e51dad220c443981d78fb40f8d3 Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Wed, 26 Nov 2025 07:37:11 -0500 Subject: [PATCH 137/177] Updating happy-dom to 20.0.10 (#926) --- packages/wallet/dapp-client/package.json | 2 +- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 58 ++++++++++++------------ 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index b7f38708b..9693eb065 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.10", "typescript": "^5.8.3", "vitest": "^3.2.1" }, diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 503740e3d..92091d8d6 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -28,7 +28,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.10", "typescript": "^5.8.3", "vitest": "^3.2.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c814fa1ae..6610a8a0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -142,7 +142,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) packages/services/identity-instrument: dependencies: @@ -167,7 +167,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) packages/services/indexer: devDependencies: @@ -231,7 +231,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) packages/utils/abi: devDependencies: @@ -274,7 +274,7 @@ importers: version: 22.18.10 '@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)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@20.0.10)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -286,7 +286,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) packages/wallet/dapp-client: dependencies: @@ -314,7 +314,7 @@ importers: version: 22.18.10 '@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)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@20.0.10)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -322,14 +322,14 @@ importers: specifier: ^6.0.1 version: 6.2.3 happy-dom: - specifier: ^17.2.2 - version: 17.6.3 + specifier: ^20.0.10 + version: 20.0.10 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) packages/wallet/primitives: dependencies: @@ -342,13 +342,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.10)(happy-dom@17.6.3)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@20.0.10)) typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) packages/wallet/primitives-cli: dependencies: @@ -428,7 +428,7 @@ importers: version: 22.18.10 '@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)) + version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@20.0.10)) dotenv: specifier: ^16.5.0 version: 16.6.1 @@ -436,14 +436,14 @@ importers: specifier: ^6.0.1 version: 6.2.3 happy-dom: - specifier: ^17.2.2 - version: 17.6.3 + specifier: ^20.0.10 + version: 20.0.10 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@17.6.3) + version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) repo/eslint-config: devDependencies: @@ -1280,6 +1280,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==} @@ -2145,8 +2148,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@17.6.3: - resolution: {integrity: sha512-UVIHeVhxmxedbWPCfgS55Jg2rDfwf2BCKeylcPSqazLz5w3Kri7Q4xdBJubsr/+VUzFLh0VjIvh13RaDA2/Xug==} + happy-dom@20.0.10: + resolution: {integrity: sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -3592,10 +3595,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'} @@ -4395,6 +4394,8 @@ snapshots: '@types/tinycolor2@1.4.6': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -4494,7 +4495,7 @@ 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@3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@20.0.10))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -4509,7 +4510,7 @@ snapshots: 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) + vitest: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) transitivePeerDependencies: - supports-color @@ -5519,9 +5520,10 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@17.6.3: + happy-dom@20.0.10: dependencies: - webidl-conversions: 7.0.0 + '@types/node': 20.19.21 + '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 has-bigints@1.1.0: {} @@ -7048,7 +7050,7 @@ snapshots: '@types/node': 22.18.10 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.18.10)(happy-dom@17.6.3): + vitest@3.2.4(@types/node@22.18.10)(happy-dom@20.0.10): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -7075,7 +7077,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.18.10 - happy-dom: 17.6.3 + happy-dom: 20.0.10 transitivePeerDependencies: - jiti - less @@ -7094,8 +7096,6 @@ snapshots: dependencies: defaults: 1.0.4 - webidl-conversions@7.0.0: {} - whatwg-mimetype@3.0.0: {} which-boxed-primitive@1.1.1: From 8f871993ed6d8e293b74462baa51c609723a8c0b Mon Sep 17 00:00:00 2001 From: Patryk Kalinowski Date: Wed, 26 Nov 2025 17:55:16 +0100 Subject: [PATCH 138/177] Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests --- .../wallet/wdk/src/dbs/auth-commitments.ts | 2 +- .../src/sequence/handlers/authcode-pkce.ts | 8 +-- .../wdk/src/sequence/handlers/authcode.ts | 19 ++---- packages/wallet/wdk/src/sequence/manager.ts | 49 +++++++++++++++ packages/wallet/wdk/src/sequence/signers.ts | 6 +- .../wallet/wdk/src/sequence/types/signer.ts | 2 +- packages/wallet/wdk/src/sequence/wallets.ts | 29 +++++++-- .../wallet/wdk/test/authcode-pkce.test.ts | 14 ++--- packages/wallet/wdk/test/authcode.test.ts | 62 ++++--------------- 9 files changed, 106 insertions(+), 85 deletions(-) diff --git a/packages/wallet/wdk/src/dbs/auth-commitments.ts b/packages/wallet/wdk/src/dbs/auth-commitments.ts index dcb97e566..a3f360639 100644 --- a/packages/wallet/wdk/src/dbs/auth-commitments.ts +++ b/packages/wallet/wdk/src/dbs/auth-commitments.ts @@ -5,7 +5,7 @@ const TABLE_NAME = 'auth-commitments' export type AuthCommitment = { id: string - kind: 'google-pkce' | 'apple' + kind: 'google-pkce' | 'apple' | `custom-${string}` metadata: { [key: string]: string } verifier?: string challenge?: string diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts index 6029f4114..0b4706c0e 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts @@ -8,15 +8,16 @@ import { AuthCodeHandler } from './authcode.js' export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { constructor( - signupKind: 'google-pkce', + signupKind: 'google-pkce' | `custom-${string}`, issuer: string, + oauthUrl: string, audience: string, nitro: Identity.IdentityInstrument, signatures: Signatures, commitments: Db.AuthCommitments, authKeys: Db.AuthKeys, ) { - super(signupKind, issuer, audience, nitro, signatures, commitments, authKeys) + super(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys) } public async commitAuth(target: string, isSignUp: boolean, state?: string, signer?: string) { @@ -50,8 +51,7 @@ export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { state, }) - const oauthUrl = this.oauthUrl() - return `${oauthUrl}?${searchParams.toString()}` + return `${this.oauthUrl}?${searchParams.toString()}` } public async completeAuth( diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode.ts b/packages/wallet/wdk/src/sequence/handlers/authcode.ts index bb8a1b315..f73f9ec5d 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode.ts @@ -11,8 +11,9 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { protected redirectUri: string = '' constructor( - public readonly signupKind: 'apple' | 'google-pkce', + public readonly signupKind: 'apple' | 'google-pkce' | `custom-${string}`, public readonly issuer: string, + protected readonly oauthUrl: string, public readonly audience: string, nitro: Identity.IdentityInstrument, signatures: Signatures, @@ -48,12 +49,11 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { client_id: this.audience, redirect_uri: this.redirectUri, response_type: 'code', - scope: 'openid', + scope: 'openid profile email', state, }) - const oauthUrl = this.oauthUrl() - return `${oauthUrl}?${searchParams.toString()}` + return `${this.oauthUrl}?${searchParams.toString()}` } public async completeAuth( @@ -100,15 +100,4 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { }, } } - - protected oauthUrl() { - switch (this.issuer) { - case 'https://accounts.google.com': - return 'https://accounts.google.com/o/oauth2/v2/auth' - case 'https://appleid.apple.com': - return 'https://appleid.apple.com/auth/authorize' - default: - throw new Error('unsupported-issuer') - } - } } diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 8951a9867..94f878047 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -82,6 +82,13 @@ export type ManagerOptions = { enabled: boolean clientId: string } + customProviders?: { + kind: `custom-${string}` + authMethod: 'id-token' | 'authcode' | 'authcode-pkce' + issuer: string + oauthUrl: string + clientId: string + }[] } } @@ -484,6 +491,7 @@ export class Manager { new AuthCodePkceHandler( 'google-pkce', 'https://accounts.google.com', + 'https://accounts.google.com/o/oauth2/v2/auth', ops.identity.google.clientId, identityInstrument, modules.signatures, @@ -498,6 +506,7 @@ export class Manager { new AuthCodeHandler( 'apple', 'https://appleid.apple.com', + 'https://appleid.apple.com/auth/authorize', ops.identity.apple.clientId, identityInstrument, modules.signatures, @@ -506,6 +515,46 @@ export class Manager { ), ) } + if (ops.identity.customProviders?.length) { + for (const provider of ops.identity.customProviders) { + switch (provider.authMethod) { + case 'id-token': + throw new Error('id-token is not supported yet') + case 'authcode': + shared.handlers.set( + provider.kind, + new AuthCodeHandler( + provider.kind, + provider.issuer, + provider.oauthUrl, + provider.clientId, + identityInstrument, + modules.signatures, + shared.databases.authCommitments, + shared.databases.authKeys, + ), + ) + break + case 'authcode-pkce': + shared.handlers.set( + provider.kind, + new AuthCodePkceHandler( + provider.kind, + provider.issuer, + provider.oauthUrl, + provider.clientId, + identityInstrument, + modules.signatures, + shared.databases.authCommitments, + shared.databases.authKeys, + ), + ) + break + default: + throw new Error('unsupported auth method') + } + } + } shared.modules = modules this.shared = shared diff --git a/packages/wallet/wdk/src/sequence/signers.ts b/packages/wallet/wdk/src/sequence/signers.ts index 051e03270..cf79c43c7 100644 --- a/packages/wallet/wdk/src/sequence/signers.ts +++ b/packages/wallet/wdk/src/sequence/signers.ts @@ -8,7 +8,11 @@ export function isWitnessExtraSignerKind(extra: any): extra is WitnessExtraSigne } function toKnownKind(kind: string): Kind { - if (Object.values(Kinds).includes(kind as Kind)) { + if (kind.startsWith('custom-')) { + return kind as Kind + } + + if (Object.values(Kinds).includes(kind as (typeof Kinds)[keyof typeof Kinds])) { return kind as Kind } diff --git a/packages/wallet/wdk/src/sequence/types/signer.ts b/packages/wallet/wdk/src/sequence/types/signer.ts index ac4b5b51f..30a2a5073 100644 --- a/packages/wallet/wdk/src/sequence/types/signer.ts +++ b/packages/wallet/wdk/src/sequence/types/signer.ts @@ -12,7 +12,7 @@ export const Kinds = { Unknown: 'unknown', } as const -export type Kind = (typeof Kinds)[keyof typeof Kinds] +export type Kind = (typeof Kinds)[keyof typeof Kinds] | `custom-${string}` export type WitnessExtraSignerKind = { signerKind: string diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index 2cc7afc1d..fd0320cc4 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -14,7 +14,7 @@ import { PasskeysHandler } from './handlers/passkeys.js' import { GuardRole } from './guards.js' export type StartSignUpWithRedirectArgs = { - kind: 'google-pkce' | 'apple' + kind: 'google-pkce' | 'apple' | `custom-${string}` target: string metadata: { [key: string]: string } } @@ -55,7 +55,7 @@ export type CompleteRedirectArgs = CommonSignupArgs & { } export type AuthCodeSignupArgs = CommonSignupArgs & { - kind: 'google-pkce' | 'apple' + kind: 'google-pkce' | 'apple' | `custom-${string}` commitment: AuthCommitment code: string target: string @@ -692,10 +692,30 @@ export class Wallets implements WalletsInterface { } } } + + if (args.kind.startsWith('custom-')) { + // TODO: support other custom auth methods (e.g. id-token) + const handler = this.shared.handlers.get(args.kind) as AuthCodeHandler + if (!handler) { + throw new Error('handler-not-registered') + } + + const [signer, metadata] = await handler.completeAuth(args.commitment, args.code) + return { + signer, + extra: { + signerKind: args.kind, + }, + loginEmail: metadata.email, + } + } + + throw new Error('invalid-signup-kind') } async startSignUpWithRedirect(args: StartSignUpWithRedirectArgs) { - const handler = this.shared.handlers.get('login-' + args.kind) as AuthCodeHandler + const kind = args.kind.startsWith('custom-') ? args.kind : 'login-' + args.kind + const handler = this.shared.handlers.get(kind) as AuthCodeHandler if (!handler) { throw new Error('handler-not-registered') } @@ -720,7 +740,8 @@ export class Wallets implements WalletsInterface { use4337: args.use4337, }) } else { - const handler = this.shared.handlers.get('login-' + commitment.kind) as AuthCodeHandler + const kind = commitment.kind.startsWith('custom-') ? commitment.kind : 'login-' + commitment.kind + const handler = this.shared.handlers.get(kind) as AuthCodeHandler if (!handler) { throw new Error('handler-not-registered') } diff --git a/packages/wallet/wdk/test/authcode-pkce.test.ts b/packages/wallet/wdk/test/authcode-pkce.test.ts index dc6ecfc73..2e62b8afd 100644 --- a/packages/wallet/wdk/test/authcode-pkce.test.ts +++ b/packages/wallet/wdk/test/authcode-pkce.test.ts @@ -56,6 +56,7 @@ describe('AuthCodePkceHandler', () => { handler = new AuthCodePkceHandler( 'google-pkce', 'https://accounts.google.com', + 'https://accounts.google.com/o/oauth2/v2/auth', 'test-google-client-id', mockNitroInstrument, mockSignatures, @@ -81,8 +82,6 @@ describe('AuthCodePkceHandler', () => { email: 'user@example.com', } }) - - vi.spyOn(handler as any, 'oauthUrl').mockReturnValue('https://accounts.google.com/oauth/authorize') }) afterEach(() => { @@ -116,7 +115,7 @@ describe('AuthCodePkceHandler', () => { }) // Verify OAuth URL is constructed correctly - expect(result).toMatch(/^https:\/\/accounts\.google\.com\/oauth\/authorize\?/) + expect(result).toMatch(/^https:\/\/accounts\.google\.com\/o\/oauth2\/v2\/auth\?/) expect(result).toContain('code_challenge=mock-challenge-hash') expect(result).toContain('code_challenge_method=S256') expect(result).toContain('client_id=test-google-client-id') @@ -335,10 +334,6 @@ describe('AuthCodePkceHandler', () => { const newRedirectUri = 'https://newdomain.com/callback' handler.setRedirectUri(newRedirectUri) - // Verify redirect URI is used in OAuth URL construction - const mockUrl = 'https://accounts.google.com/oauth/authorize' - vi.spyOn(handler as any, 'oauthUrl').mockReturnValue(mockUrl) - return handler.commitAuth('https://example.com/success', true).then((result) => { expect(result).toContain(`redirect_uri=${encodeURIComponent(newRedirectUri)}`) }) @@ -346,8 +341,9 @@ describe('AuthCodePkceHandler', () => { it('Should work with different issuer and audience configurations', () => { const customHandler = new AuthCodePkceHandler( - 'google-pkce', + 'custom-provider', 'https://custom-issuer.com', + 'https://custom-issuer.com/o/oauth2/v2/auth', 'custom-client-id', mockNitroInstrument, mockSignatures, @@ -357,7 +353,7 @@ describe('AuthCodePkceHandler', () => { expect(customHandler['issuer']).toBe('https://custom-issuer.com') expect(customHandler['audience']).toBe('custom-client-id') - expect(customHandler.signupKind).toBe('google-pkce') + expect(customHandler.signupKind).toBe('custom-provider') }) }) }) diff --git a/packages/wallet/wdk/test/authcode.test.ts b/packages/wallet/wdk/test/authcode.test.ts index 06e4372af..121a03348 100644 --- a/packages/wallet/wdk/test/authcode.test.ts +++ b/packages/wallet/wdk/test/authcode.test.ts @@ -129,6 +129,7 @@ describe('AuthCodeHandler', () => { authCodeHandler = new AuthCodeHandler( 'google-pkce', 'https://accounts.google.com', + 'https://accounts.google.com/o/oauth2/v2/auth', 'test-audience', mockIdentityInstrument, mockSignatures, @@ -148,6 +149,7 @@ describe('AuthCodeHandler', () => { const handler = new AuthCodeHandler( 'google-pkce', 'https://accounts.google.com', + 'https://accounts.google.com/o/oauth2/v2/auth', 'google-client-id', mockIdentityInstrument, mockSignatures, @@ -165,6 +167,7 @@ describe('AuthCodeHandler', () => { const handler = new AuthCodeHandler( 'apple', 'https://appleid.apple.com', + 'https://appleid.apple.com/auth/authorize', 'apple-client-id', mockIdentityInstrument, mockSignatures, @@ -189,6 +192,7 @@ describe('AuthCodeHandler', () => { const googleHandler = new AuthCodeHandler( 'google-pkce', 'https://accounts.google.com', + 'https://accounts.google.com/o/oauth2/v2/auth', 'test-audience', mockIdentityInstrument, mockSignatures, @@ -203,6 +207,7 @@ describe('AuthCodeHandler', () => { const appleHandler = new AuthCodeHandler( 'apple', 'https://appleid.apple.com', + 'https://appleid.apple.com/auth/authorize', 'test-audience', mockIdentityInstrument, mockSignatures, @@ -293,6 +298,7 @@ describe('AuthCodeHandler', () => { const appleHandler = new AuthCodeHandler( 'apple', 'https://appleid.apple.com', + 'https://appleid.apple.com/auth/authorize', 'apple-client-id', mockIdentityInstrument, mockSignatures, @@ -491,13 +497,14 @@ describe('AuthCodeHandler', () => { }) }) - // === OAUTH URL METHOD === + // === OAUTH URL PROPERTY === - describe('oauthUrl()', () => { + describe('oauthUrl', () => { it('Should return Google OAuth URL for Google issuer', () => { const googleHandler = new AuthCodeHandler( 'google-pkce', 'https://accounts.google.com', + 'https://accounts.google.com/o/oauth2/v2/auth', 'test-audience', mockIdentityInstrument, mockSignatures, @@ -505,7 +512,7 @@ describe('AuthCodeHandler', () => { mockAuthKeys, ) - const url = googleHandler['oauthUrl']() + const url = googleHandler['oauthUrl'] expect(url).toBe('https://accounts.google.com/o/oauth2/v2/auth') }) @@ -513,6 +520,7 @@ describe('AuthCodeHandler', () => { const appleHandler = new AuthCodeHandler( 'apple', 'https://appleid.apple.com', + 'https://appleid.apple.com/auth/authorize', 'test-audience', mockIdentityInstrument, mockSignatures, @@ -520,23 +528,9 @@ describe('AuthCodeHandler', () => { mockAuthKeys, ) - const url = appleHandler['oauthUrl']() + const url = appleHandler['oauthUrl'] expect(url).toBe('https://appleid.apple.com/auth/authorize') }) - - it('Should throw error for unsupported issuer', () => { - const unsupportedHandler = new AuthCodeHandler( - 'google-pkce', - 'https://unsupported.provider.com', - 'test-audience', - mockIdentityInstrument, - mockSignatures, - mockAuthCommitments, - mockAuthKeys, - ) - - expect(() => unsupportedHandler['oauthUrl']()).toThrow('unsupported-issuer') - }) }) // === INHERITED METHODS FROM IDENTITYHANDLER === @@ -711,38 +705,6 @@ describe('AuthCodeHandler', () => { expect(metadata.email).toBe('test@example.com') }) - it('Should handle different OAuth providers correctly', async () => { - const providers = [ - { - signupKind: 'google-pkce' as const, - issuer: 'https://accounts.google.com', - expectedUrl: 'https://accounts.google.com/o/oauth2/v2/auth', - }, - { - signupKind: 'apple' as const, - issuer: 'https://appleid.apple.com', - expectedUrl: 'https://appleid.apple.com/auth/authorize', - }, - ] - - for (const provider of providers) { - const handler = new AuthCodeHandler( - provider.signupKind, - provider.issuer, - 'test-audience', - mockIdentityInstrument, - mockSignatures, - mockAuthCommitments, - mockAuthKeys, - ) - handler.setRedirectUri('https://example.com/callback') - - const url = await handler.commitAuth('/target', false) - expect(url).toContain(provider.expectedUrl) - expect(handler.kind).toBe(`login-${provider.signupKind}`) - } - }) - it('Should handle signup vs login flows correctly', async () => { authCodeHandler.setRedirectUri('https://example.com/callback') From 6bd75c97a58a4d80d1c24760accb78074ebf5673 Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Wed, 26 Nov 2025 13:29:34 -0500 Subject: [PATCH 139/177] 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. --- extras/docs/package.json | 2 +- extras/web/package.json | 2 +- lefthook.yml | 5 + package.json | 31 +- packages/services/api/package.json | 2 +- packages/services/builder/package.json | 2 +- packages/services/guard/package.json | 4 +- .../services/identity-instrument/package.json | 4 +- packages/services/indexer/package.json | 2 +- packages/services/marketplace/package.json | 2 +- packages/services/metadata/package.json | 2 +- packages/services/relayer/package.json | 4 +- packages/utils/abi/package.json | 2 +- packages/wallet/core/package.json | 12 +- packages/wallet/dapp-client/package.json | 10 +- packages/wallet/primitives-cli/package.json | 12 +- packages/wallet/primitives/package.json | 4 +- packages/wallet/wdk/package.json | 14 +- packages/wallet/wdk/test/sessions.test.ts | 490 +++--- pnpm-lock.yaml | 1533 +++++++++++------ repo/ui/package.json | 2 +- 21 files changed, 1292 insertions(+), 849 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index 906e68e02..bc0712569 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -24,6 +24,6 @@ "@types/react": "^19.2.6", "@types/react-dom": "^19.2.3", "eslint": "^9.28.0", - "typescript": "5.5.4" + "typescript": "^5.8.3" } } diff --git a/extras/web/package.json b/extras/web/package.json index 83ba97735..e92d9e08b 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -24,6 +24,6 @@ "@types/react": "^19.2.6", "@types/react-dom": "^19.2.3", "eslint": "^9.28.0", - "typescript": "5.5.4" + "typescript": "^5.8.3" } } diff --git a/lefthook.yml b/lefthook.yml index c66bba8e9..7b9926c50 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -3,6 +3,11 @@ pre-commit: prettier: glob: '**/*.{js,jsx,ts,tsx,json,md,yml,yaml}' run: pnpm prettier --write {staged_files} && git add {staged_files} + syncpack: + glob: + - "package.json" + - "packages/**/package.json" + run: pnpm deps:lint pre-push: commands: diff --git a/package.json b/package.json index 023823b95..e39f37a21 100644 --- a/package.json +++ b/package.json @@ -15,18 +15,39 @@ "dev:server": "node packages/wallet/primitives-cli/dist/index.js server", "reinstall": "rimraf -g ./**/node_modules && pnpm install", "test:anvil": "anvil --fork-url https://nodes.sequence.app/arbitrum", - "clean": "turbo clean" + "clean": "turbo clean", + "deps:lint": "syncpack list-mismatches", + "deps:fix": "syncpack fix-mismatches" }, "devDependencies": { "@changesets/cli": "^2.29.4", - "lefthook": "^1.11.13", + "lefthook": "^2.0.4", "prettier": "^3.5.3", - "rimraf": "^6.0.1", - "turbo": "^2.5.4", - "typescript": "5.8.3" + "rimraf": "^6.1.2", + "syncpack": "^13.0.4", + "turbo": "^2.6.1", + "typescript": "^5.8.3" }, "packageManager": "pnpm@10.14.0", "engines": { "node": ">=18" + }, + "syncpack": { + "source": [ + "package.json", + "packages/**/package.json" + ], + "versionGroups": [ + { + "label": "Use workspace protocol when developing local packages", + "dependencyTypes": [ + "!local" + ], + "dependencies": [ + "$LOCAL" + ], + "pinVersion": "workspace:^" + } + ] } } diff --git a/packages/services/api/package.json b/packages/services/api/package.json index f70e3e5ce..325876c47 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", + "@types/node": "^24.10.1", "typescript": "^5.8.3" } } diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index b8c2dce8e..753b84b1c 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", + "@types/node": "^24.10.1", "typescript": "^5.8.3" } } diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 842baa4f7..6c343e2bc 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -25,9 +25,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", + "@types/node": "^24.10.1", "typescript": "^5.8.3", - "vitest": "^3.2.1" + "vitest": "^4.0.14" }, "dependencies": { "ox": "^0.7.2" diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index bace871da..03c528153 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -20,9 +20,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", + "@types/node": "^24.10.1", "typescript": "^5.8.3", - "vitest": "^3.2.1" + "vitest": "^4.0.14" }, "dependencies": { "json-canonicalize": "^2.0.0", diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index c755c855f..bde7365a2 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", + "@types/node": "^24.10.1", "typescript": "^5.8.3" } } diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 571933dbd..d7399922e 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", + "@types/node": "^24.10.1", "typescript": "^5.8.3" } } diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index d9fb6a0f6..bc5e87016 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", + "@types/node": "^24.10.1", "typescript": "^5.8.3" } } diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 6e632f07c..2c5b46901 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -27,9 +27,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", + "@types/node": "^24.10.1", "typescript": "^5.8.3", - "vitest": "^3.2.4" + "vitest": "^4.0.14" }, "dependencies": { "@0xsequence/wallet-primitives": "workspace:^", diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 5ae8cee01..c45ff7193 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", + "@types/node": "^24.10.1", "typescript": "^5.8.3" } } diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 13b03f4cc..7d3b61a1f 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -23,12 +23,12 @@ }, "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", + "@types/node": "^24.10.1", + "@vitest/coverage-v8": "^4.0.14", + "dotenv": "^17.2.3", + "fake-indexeddb": "^6.2.5", "typescript": "^5.8.3", - "vitest": "^3.2.1" + "vitest": "^4.0.14" }, "dependencies": { "@0xsequence/guard": "workspace:^", @@ -36,6 +36,6 @@ "@0xsequence/wallet-primitives": "workspace:^", "mipd": "^0.0.7", "ox": "^0.7.2", - "viem": "^2.30.6" + "viem": "^2.37.8" } } diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 9693eb065..f33eaf230 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -21,13 +21,13 @@ }, "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", + "@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.8.3", - "vitest": "^3.2.1" + "vitest": "^4.0.14" }, "dependencies": { "@0xsequence/guard": "workspace:^", diff --git a/packages/wallet/primitives-cli/package.json b/packages/wallet/primitives-cli/package.json index 722d94e4c..574c0ae28 100644 --- a/packages/wallet/primitives-cli/package.json +++ b/packages/wallet/primitives-cli/package.json @@ -22,16 +22,16 @@ "devDependencies": { "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:^", - "@types/node": "^22.15.29", - "@types/yargs": "^17.0.33", - "concurrently": "^8.2.2", - "esbuild": "^0.25.5", - "nodemon": "^3.1.10", + "@types/node": "^24.10.1", + "@types/yargs": "^17.0.35", + "concurrently": "^9.2.1", + "esbuild": "^0.27.0", + "nodemon": "^3.1.11", "typescript": "^5.8.3" }, "dependencies": { "@0xsequence/wallet-primitives": "workspace:^", "ox": "^0.7.2", - "yargs": "^17.7.2" + "yargs": "^18.0.0" } } diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 18b656bff..8a20932e2 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -23,9 +23,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@vitest/coverage-v8": "^3.2.4", + "@vitest/coverage-v8": "^4.0.14", "typescript": "^5.8.3", - "vitest": "^3.2.1" + "vitest": "^4.0.14" }, "dependencies": { "ox": "^0.7.2" diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 92091d8d6..c4e80fe2f 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -24,13 +24,13 @@ }, "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", + "@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.8.3", - "vitest": "^3.2.1" + "vitest": "^4.0.14" }, "dependencies": { "@0xsequence/guard": "workspace:^", @@ -39,9 +39,9 @@ "@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" + "uuid": "^13.0.0" } } diff --git a/packages/wallet/wdk/test/sessions.test.ts b/packages/wallet/wdk/test/sessions.test.ts index e942f7479..b459470f0 100644 --- a/packages/wallet/wdk/test/sessions.test.ts +++ b/packages/wallet/wdk/test/sessions.test.ts @@ -204,258 +204,242 @@ for (const extension of ALL_EXTENSIONS) { return txHash } - 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, - }) - if (!walletAddress) { - throw new Error('Failed to create wallet') - } - - // Initialize the wdk components - wdk.identitySignerAddress = identitySignerAddress - wdk.manager.registerMnemonicUI(async (respond) => { - await respond(identitySignerMnemonic) - }) - - // Create wallet in core - const coreWallet = new CoreWallet(walletAddress, { - 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 = { - type: 'explicit', - 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', - } - - // Sign and send the transaction - await signAndSend(call) - }, - { timeout: 60000 }, - ) - - 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 = { - type: 'explicit', - 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', - } - - // Sign and send the transaction - await signAndSend(call) - }, - { timeout: 60000 }, - ) - - 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 = { - type: 'explicit', - 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', - } - - // 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') - }, - { timeout: 60000 }, - ) - - 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 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', - } - - // Sign and send the transaction - await signAndSend(call) - }, - { timeout: 60000 }, - ) + it('should add the session manager leaf when not present', { timeout: 60000 }, 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, + }) + if (!walletAddress) { + throw new Error('Failed to create wallet') + } + + // Initialize the wdk components + wdk.identitySignerAddress = identitySignerAddress + wdk.manager.registerMnemonicUI(async (respond) => { + await respond(identitySignerMnemonic) + }) + + // Create wallet in core + const coreWallet = new CoreWallet(walletAddress, { + 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 = { + type: 'explicit', + 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', + } + + // Sign and send the transaction + await signAndSend(call) + }) + + it('should create and sign with an explicit session', { timeout: 60000 }, 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 = { + type: 'explicit', + 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', + } + + // Sign and send the transaction + await signAndSend(call) + }) + + it('should modify an explicit session permission', { timeout: 60000 }, 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 = { + type: 'explicit', + 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', + } + + // 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') + }) + + it('should create and sign with an implicit session', { timeout: 60000 }, 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 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', + } + + // Sign and send the transaction + await signAndSend(call) + }) }) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6610a8a0b..9160e9e33 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,21 +10,24 @@ 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.1) lefthook: - specifier: ^1.11.13 - version: 1.13.6 + 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.8.3) turbo: - specifier: ^2.5.4 - version: 2.5.8 + specifier: ^2.6.1 + version: 2.6.1 typescript: - specifier: 5.8.3 + specifier: ^5.8.3 version: 5.8.3 extras/docs: @@ -61,8 +64,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.8.3 extras/web: dependencies: @@ -98,8 +101,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.8.3 packages/services/api: devDependencies: @@ -107,8 +110,8 @@ 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.1 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -119,8 +122,8 @@ 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.1 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -135,14 +138,14 @@ 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.1 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/services/identity-instrument: dependencies: @@ -160,14 +163,14 @@ 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.1 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/services/indexer: devDependencies: @@ -175,8 +178,8 @@ 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.1 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -187,8 +190,8 @@ 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.1 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -199,8 +202,8 @@ 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.1 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -224,14 +227,14 @@ 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.1 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@20.0.10) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/utils/abi: devDependencies: @@ -239,8 +242,8 @@ 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.1 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -263,30 +266,30 @@ importers: specifier: ^0.7.2 version: 0.7.2(typescript@5.8.3) viem: - specifier: ^2.30.6 + 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.10 + 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.18.10)(happy-dom@20.0.10)) + 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.2.3 + specifier: ^6.2.5 + version: 6.2.5 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/wallet/dapp-client: dependencies: @@ -310,17 +313,17 @@ 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.1 '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@20.0.10)) + 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.2.3 + specifier: ^6.2.5 + version: 6.2.5 happy-dom: specifier: ^20.0.10 version: 20.0.10 @@ -328,8 +331,8 @@ importers: specifier: ^5.8.3 version: 5.8.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/wallet/primitives: dependencies: @@ -341,14 +344,14 @@ importers: 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@20.0.10)) + 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 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) packages/wallet/primitives-cli: dependencies: @@ -359,8 +362,8 @@ importers: specifier: ^0.7.2 version: 0.7.2(typescript@5.8.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,20 +372,20 @@ 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.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.11 + 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 @@ -408,8 +411,8 @@ 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 @@ -417,24 +420,24 @@ importers: specifier: ^0.7.2 version: 0.7.2(typescript@5.8.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.1 '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.18.10)(happy-dom@20.0.10)) + 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.2.3 + specifier: ^6.2.5 + version: 6.2.5 happy-dom: specifier: ^20.0.10 version: 20.0.10 @@ -442,8 +445,8 @@ importers: specifier: ^5.8.3 version: 5.8.3 vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.18.10)(happy-dom@20.0.10) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) repo/eslint-config: devDependencies: @@ -470,7 +473,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.1) globals: specifier: ^15.15.0 version: 15.15.0 @@ -500,7 +503,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.8.3) '@types/node': specifier: ^20.17.57 version: 20.19.21 @@ -511,8 +514,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.8.3 packages: @@ -522,20 +525,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 +550,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': @@ -623,156 +626,312 @@ packages: cpu: [ppc64] os: [aix] + '@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.11': resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@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.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.11': resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@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.11': resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@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.11': resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@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.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.11': resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@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.11': resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@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.11': resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@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.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.11': resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@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.11': resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@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.11': resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@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.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.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -970,17 +1129,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'} @@ -1086,10 +1234,6 @@ 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==} cpu: [arm] @@ -1209,6 +1353,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==} @@ -1263,8 +1414,8 @@ 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@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} @@ -1286,8 +1437,8 @@ 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.46.1': resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==} @@ -1348,43 +1499,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.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.1.0: resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} @@ -1510,16 +1661,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.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==} @@ -1567,10 +1714,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'} @@ -1597,10 +1740,14 @@ packages: 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'} @@ -1613,6 +1760,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==} @@ -1622,10 +1773,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'} @@ -1642,6 +1789,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'} @@ -1657,6 +1808,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'} @@ -1678,12 +1833,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: @@ -1692,6 +1851,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==} @@ -1718,10 +1886,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'} @@ -1731,10 +1895,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'} @@ -1788,27 +1948,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'} @@ -1849,6 +2016,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1962,10 +2134,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==} @@ -2026,10 +2202,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'} @@ -2068,6 +2240,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'} @@ -2096,14 +2272,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==} @@ -2129,6 +2300,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'} @@ -2186,6 +2361,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==} @@ -2213,8 +2392,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==} @@ -2272,6 +2451,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'} @@ -2328,6 +2510,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==} @@ -2391,6 +2577,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==} @@ -2445,13 +2639,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==} @@ -2472,12 +2659,18 @@ packages: 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==} @@ -2495,64 +2688,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.4: + resolution: {integrity: sha512-AR63/O5UkM7Sc6x5PhP4vTuztTYRBeBroXApeWGM/8e5uZyoQug/7KTh7xhbCMDf8WJv6vdFeXAQCPSmDyPU3Q==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@1.13.6: - resolution: {integrity: sha512-CoRpdzanu9RK3oXR1vbEJA5LN7iB+c7hP+sONeQJzoOXuq4PNKVtEaN84Gl1BrVtCNLHWFAvCQaZPPiiXSy8qg==} + lefthook-darwin-x64@2.0.4: + resolution: {integrity: sha512-618DVUttSzV9egQiqTQoxGfnR240JoPWYmqRVHhiegnQKZ2lp5XJ+7NMxeRk/ih93VVOLzFO5ky3PbpxTmJgjQ==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@1.13.6: - resolution: {integrity: sha512-X4A7yfvAJ68CoHTqP+XvQzdKbyd935sYy0bQT6Ajz7FL1g7hFiro8dqHSdPdkwei9hs8hXeV7feyTXbYmfjKQQ==} + lefthook-freebsd-arm64@2.0.4: + resolution: {integrity: sha512-mTAQym1BK38fKglHBQ/0GXPznVC4LoStHO5lAI3ZxaEC0FQetqGHYFzhWbIH5sde9JhztE2rL/aBzMHDoAtzSw==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@1.13.6: - resolution: {integrity: sha512-ai2m+Sj2kGdY46USfBrCqLKe9GYhzeq01nuyDYCrdGISePeZ6udOlD1k3lQKJGQCHb0bRz4St0r5nKDSh1x/2A==} + lefthook-freebsd-x64@2.0.4: + resolution: {integrity: sha512-sy02aSxd8UMd6XmiPFVl/Em0b78jdZcDSsLwg+bweJQQk0l+vJhOfqFiG11mbnpo+EBIZmRe6OH5LkxeSU36+w==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@1.13.6: - resolution: {integrity: sha512-cbo4Wtdq81GTABvikLORJsAWPKAJXE8Q5RXsICFUVznh5PHigS9dFW/4NXywo0+jfFPCT6SYds2zz4tCx6DA0Q==} + lefthook-linux-arm64@2.0.4: + resolution: {integrity: sha512-W0Nlr/Cz2QTH9n4k5zNrk3LSsg1C4wHiJi8hrAiQVTaAV/N1XrKqd0DevqQuouuapG6pw/6B1xCgiNPebv9oyw==} 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.4: + resolution: {integrity: sha512-N6ySVCtB/DrOZ1ZgPL8WBZTgtoVHvcPKI+LV5wbcGrvA/dzDZFvniadrbDWZg7Tm705efiQzyENjwhhqNkwiww==} cpu: [x64] os: [linux] - lefthook-openbsd-arm64@1.13.6: - resolution: {integrity: sha512-7r153dxrNRQ9ytRs2PmGKKkYdvZYFPre7My7XToSTiRu5jNCq++++eAKVkoyWPduk97dGIA+YWiEr5Noe0TK2A==} + lefthook-openbsd-arm64@2.0.4: + resolution: {integrity: sha512-VmOhJO3pYzZ/1C2WFXtL/n5pq4/eYOroqJJpwTJfmCHyw4ceLACu8MDyU5AMJhGMkbL8mPxGInJKxg5xhYgGRw==} cpu: [arm64] os: [openbsd] - lefthook-openbsd-x64@1.13.6: - resolution: {integrity: sha512-Z+UhLlcg1xrXOidK3aLLpgH7KrwNyWYE3yb7ITYnzJSEV8qXnePtVu8lvMBHs/myzemjBzeIr/U/+ipjclR06g==} + lefthook-openbsd-x64@2.0.4: + resolution: {integrity: sha512-U8MZz1xlHUdflkQQ2hkMQsei6fSZbs8tuE4EjCIHWnNdnAF4V8sZ6n1KbxsJcoZXPyBZqxZSMu1o/Ye8IAMVKg==} cpu: [x64] os: [openbsd] - lefthook-windows-arm64@1.13.6: - resolution: {integrity: sha512-Uxef6qoDxCmUNQwk8eBvddYJKSBFglfwAY9Y9+NnnmiHpWTjjYiObE9gT2mvGVpEgZRJVAatBXc+Ha5oDD/OgQ==} + lefthook-windows-arm64@2.0.4: + resolution: {integrity: sha512-543H3y2JAwNdvwUQ6nlNBG7rdKgoOUgzAa6pYcl6EoqicCRrjRmGhkJu7vUudkkrD2Wjm7tr9hU9poP2g5fRFQ==} cpu: [arm64] os: [win32] - lefthook-windows-x64@1.13.6: - resolution: {integrity: sha512-mOZoM3FQh3o08M8PQ/b3IYuL5oo36D9ehczIw1dAgp1Ly+Tr4fJ96A+4SEJrQuYeRD4mex9bR7Ps56I73sBSZA==} + lefthook-windows-x64@2.0.4: + resolution: {integrity: sha512-UDEPK9RWKm60xsNOdS/DQOdFba0SFa4w3tpFMXK1AJzmRHhosoKrorXGhtTr6kcM0MGKOtYi8GHsm++ArZ9wvQ==} cpu: [x64] os: [win32] - lefthook@1.13.6: - resolution: {integrity: sha512-ojj4/4IJ29Xn4drd5emqVgilegAPN3Kf0FQM2p/9+lwSTpU+SZ1v4Ig++NF+9MOa99UKY8bElmVrLhnUUNFh5g==} + 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'} @@ -2582,13 +2782,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==} @@ -2606,11 +2807,11 @@ packages: 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==} @@ -2638,8 +2839,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: @@ -2721,8 +2926,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 @@ -2730,6 +2935,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'} @@ -2762,6 +2971,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==} @@ -2769,6 +2981,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'} @@ -2781,6 +2997,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'} @@ -2861,6 +3081,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==} @@ -2882,10 +3106,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} @@ -2894,13 +3114,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==} @@ -2946,6 +3166,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==} @@ -2963,6 +3191,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==} @@ -2996,6 +3227,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'} @@ -3044,6 +3279,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'} @@ -3053,8 +3292,8 @@ 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 @@ -3168,10 +3407,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'} @@ -3195,9 +3441,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==} @@ -3210,6 +3453,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'} @@ -3218,9 +3465,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==} @@ -3256,6 +3503,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'} @@ -3268,9 +3519,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'} @@ -3303,17 +3551,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==} @@ -3330,16 +3583,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: @@ -3381,44 +3626,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.1: + resolution: {integrity: sha512-Dm0HwhyZF4J0uLqkhUyCVJvKM9Rw7M03v3J9A7drHDQW0qAbIGBrUijQ8g4Q9Cciw/BXRRd8Uzkc3oue+qn+ZQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.8: - resolution: {integrity: sha512-f1H/tQC9px7+hmXn6Kx/w8Jd/FneIUnvLlcI/7RGHunxfOkKJKvsoiNzySkoHQ8uq1pJnhJ0xNGTlYM48ZaJOQ==} + turbo-darwin-arm64@2.6.1: + resolution: {integrity: sha512-U0PIPTPyxdLsrC3jN7jaJUwgzX5sVUBsKLO7+6AL+OASaa1NbT1pPdiZoTkblBAALLP76FM0LlnsVQOnmjYhyw==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.8: - resolution: {integrity: sha512-hMyvc7w7yadBlZBGl/bnR6O+dJTx3XkTeyTTH4zEjERO6ChEs0SrN8jTFj1lueNXKIHh1SnALmy6VctKMGnWfw==} + turbo-linux-64@2.6.1: + resolution: {integrity: sha512-eM1uLWgzv89bxlK29qwQEr9xYWBhmO/EGiH22UGfq+uXr+QW1OvNKKMogSN65Ry8lElMH4LZh0aX2DEc7eC0Mw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.8: - resolution: {integrity: sha512-LQELGa7bAqV2f+3rTMRPnj5G/OHAe2U+0N9BwsZvfMvHSUbsQ3bBMWdSQaYNicok7wOZcHjz2TkESn1hYK6xIQ==} + turbo-linux-arm64@2.6.1: + resolution: {integrity: sha512-MFFh7AxAQAycXKuZDrbeutfWM5Ep0CEZ9u7zs4Hn2FvOViTCzIfEhmuJou3/a5+q5VX1zTxQrKGy+4Lf5cdpsA==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.8: - resolution: {integrity: sha512-3YdcaW34TrN1AWwqgYL9gUqmZsMT4T7g8Y5Azz+uwwEJW+4sgcJkIi9pYFyU4ZBSjBvkfuPZkGgfStir5BBDJQ==} + turbo-windows-64@2.6.1: + resolution: {integrity: sha512-buq7/VAN7KOjMYi4tSZT5m+jpqyhbRU2EUTTvp6V0Ii8dAkY2tAAjQN1q5q2ByflYWKecbQNTqxmVploE0LVwQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.8: - resolution: {integrity: sha512-eFC5XzLmgXJfnAK3UMTmVECCwuBcORrWdewoiXBnUm934DY6QN8YowC/srhNnROMpaKaqNeRpoB5FxCww3eteQ==} + turbo-windows-arm64@2.6.1: + resolution: {integrity: sha512-7w+AD5vJp3R+FB0YOj1YJcNcOOvBior7bcHTodqp90S3x3bLgpr7tE6xOea1e8JkP7GK6ciKVUpQvV7psiwU5Q==} cpu: [arm64] os: [win32] - turbo@2.5.8: - resolution: {integrity: sha512-5c9Fdsr9qfpT3hA0EyYSFRZj1dVVsb6KIWubA9JBYZ/9ZEAijgUEae0BBR/Xl/wekt4w65/lYLTFaP3JmwSO8w==} + turbo@2.6.1: + resolution: {integrity: sha512-qBwXXuDT3rA53kbNafGbT5r++BrhRgx3sAo0cHoDAeG9g1ItTmUMgltz3Hy7Hazy1ODqNpR+C7QwqL6DYB52yA==} hasBin: true type-check@0.4.0: @@ -3452,11 +3700,6 @@ 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==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -3477,6 +3720,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'} @@ -3500,8 +3750,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: @@ -3511,6 +3761,10 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@6.0.2: + resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} + engines: {node: ^18.17.0 || >=20.5.0} + viem@2.38.2: resolution: {integrity: sha512-MJDiTDD9gfOT7lPQRimdmw+g46hU/aWJ3loqb+tN6UBOO00XEd0O4LJx+Kp5/uCRnMlJr8zJ1bNzCK7eG6gMjg==} peerDependencies: @@ -3519,11 +3773,6 @@ packages: 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==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3564,26 +3813,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 @@ -3640,9 +3895,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==} @@ -3667,10 +3922,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'} @@ -3688,18 +3951,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: @@ -3707,10 +3971,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': {} @@ -3743,7 +4007,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.1)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -3759,7 +4023,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.1) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -3870,81 +4134,159 @@ snapshots: '@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 + '@esbuild/linux-arm@0.25.11': optional: true + '@esbuild/linux-arm@0.27.0': + optional: true + '@esbuild/linux-ia32@0.25.11': optional: true + '@esbuild/linux-ia32@0.27.0': + optional: true + '@esbuild/linux-loong64@0.25.11': optional: true + '@esbuild/linux-loong64@0.27.0': + optional: true + '@esbuild/linux-mips64el@0.25.11': optional: true + '@esbuild/linux-mips64el@0.27.0': + optional: true + '@esbuild/linux-ppc64@0.25.11': optional: true + '@esbuild/linux-ppc64@0.27.0': + optional: true + '@esbuild/linux-riscv64@0.25.11': optional: true + '@esbuild/linux-riscv64@0.27.0': + optional: true + '@esbuild/linux-s390x@0.25.11': optional: true + '@esbuild/linux-s390x@0.27.0': + optional: true + '@esbuild/linux-x64@0.25.11': optional: true + '@esbuild/linux-x64@0.27.0': + optional: true + '@esbuild/netbsd-arm64@0.25.11': optional: true + '@esbuild/netbsd-arm64@0.27.0': + optional: true + '@esbuild/netbsd-x64@0.25.11': optional: true + '@esbuild/netbsd-x64@0.27.0': + optional: true + '@esbuild/openbsd-arm64@0.25.11': optional: true + '@esbuild/openbsd-arm64@0.27.0': + optional: true + '@esbuild/openbsd-x64@0.25.11': optional: true + '@esbuild/openbsd-x64@0.27.0': + optional: true + '@esbuild/openharmony-arm64@0.25.11': optional: true + '@esbuild/openharmony-arm64@0.27.0': + optional: true + '@esbuild/sunos-x64@0.25.11': optional: true + '@esbuild/sunos-x64@0.27.0': + optional: true + '@esbuild/win32-arm64@0.25.11': optional: true + '@esbuild/win32-arm64@0.27.0': + optional: true + '@esbuild/win32-ia32@0.25.11': optional: true + '@esbuild/win32-ia32@0.27.0': + optional: true + '@esbuild/win32-x64@0.25.11': optional: true + '@esbuild/win32-x64@0.27.0': + optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0)': dependencies: eslint: 9.37.0 @@ -4098,12 +4440,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.1)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 22.18.10 + '@types/node': 24.10.1 '@isaacs/balanced-match@4.0.1': {} @@ -4111,22 +4453,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': {} @@ -4213,9 +4539,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@pkgjs/parseargs@0.11.0': - optional: true - '@rollup/rollup-android-arm-eabi@4.52.4': optional: true @@ -4286,7 +4609,7 @@ snapshots: '@scure/bip32@1.7.0': dependencies: - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 @@ -4295,6 +4618,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 @@ -4309,7 +4636,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.8.3)': dependencies: '@turbo/workspaces': 1.13.4(@types/node@20.19.21) chalk: 2.4.2 @@ -4319,7 +4646,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.8.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -4357,7 +4684,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 20.19.21 + '@types/node': 24.10.1 '@types/inquirer@6.5.0': dependencies: @@ -4368,7 +4695,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.0.3 + minimatch: 10.1.1 '@types/node@12.20.55': {} @@ -4376,9 +4703,9 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@22.18.10': + '@types/node@24.10.1': dependencies: - undici-types: 6.21.0 + undici-types: 7.16.0 '@types/react-dom@19.2.3(@types/react@19.2.6)': dependencies: @@ -4390,7 +4717,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 20.19.21 + '@types/node': 24.10.1 '@types/tinycolor2@1.4.6': {} @@ -4398,7 +4725,7 @@ snapshots: '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.33': + '@types/yargs@17.0.35': dependencies: '@types/yargs-parser': 21.0.3 @@ -4495,66 +4822,61 @@ 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@20.0.10))': + '@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.6 - debug: 4.4.3(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.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@20.0.10) + 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.3.3 - 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.1.10(@types/node@22.18.10))': + '@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.19 + magic-string: 0.30.21 optionalDependencies: - vite: 7.1.10(@types/node@22.18.10) + 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.1.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.0.14': dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.19 + '@vitest/pretty-format': 4.0.14 + magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.4 + '@vitest/spy@4.0.14': {} - '@vitest/utils@3.2.4': + '@vitest/utils@4.0.14': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.0.14 + tinyrainbow: 3.0.3 abitype@1.1.0(typescript@5.8.3): optionalDependencies: @@ -4686,13 +5008,11 @@ 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.6: + ast-v8-to-istanbul@0.3.8: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -4742,8 +5062,6 @@ snapshots: bytestreamjs@2.0.1: {} - cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4772,13 +5090,11 @@ snapshots: 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: @@ -4796,6 +5112,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 @@ -4821,8 +5139,6 @@ snapshots: chardet@2.1.0: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -4843,6 +5159,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: {} @@ -4855,6 +5175,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: @@ -4871,16 +5197,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 @@ -4892,6 +5217,15 @@ snapshots: core-js-pure@3.46.0: {} + cosmiconfig@9.0.0(typescript@5.8.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.8.3 + create-require@1.1.1: {} cross-spawn@7.0.6: @@ -4922,18 +5256,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: {} @@ -4992,7 +5320,7 @@ snapshots: dotenv@16.0.3: {} - dotenv@16.6.1: {} + dotenv@17.2.3: {} dunder-proto@1.0.1: dependencies: @@ -5000,17 +5328,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@8.0.0: {} + emoji-regex@10.6.0: {} - emoji-regex@9.2.2: {} + emoji-regex@8.0.0: {} 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 @@ -5143,6 +5480,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.11 '@esbuild/win32-x64': 0.25.11 + esbuild@0.27.0: + optionalDependencies: + '@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: {} escape-string-regexp@1.0.5: {} @@ -5189,11 +5555,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.1): dependencies: dotenv: 16.0.3 eslint: 9.37.0 - turbo: 2.5.8 + turbo: 2.6.1 eslint-scope@8.4.0: dependencies: @@ -5292,7 +5658,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: {} @@ -5357,11 +5727,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 @@ -5402,6 +5767,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 @@ -5444,22 +5811,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 + minimatch: 10.1.1 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 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 path-scurry: 2.0.0 glob@7.2.3: @@ -5500,6 +5855,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: {} @@ -5555,6 +5919,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: @@ -5583,7 +5951,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - idb@7.1.1: {} + idb@8.0.3: {} ieee754@1.2.1: {} @@ -5661,6 +6029,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 @@ -5721,6 +6091,8 @@ snapshots: is-interactive@1.0.0: {} + is-interactive@2.0.0: {} + is-lower-case@1.1.3: dependencies: lower-case: 1.1.4 @@ -5776,6 +6148,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 @@ -5833,16 +6209,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: {} @@ -5860,10 +6226,14 @@ snapshots: 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 @@ -5887,54 +6257,58 @@ snapshots: dependencies: json-buffer: 3.0.1 - lefthook-darwin-arm64@1.13.6: + kleur@3.0.3: {} + + lefthook-darwin-arm64@2.0.4: optional: true - lefthook-darwin-x64@1.13.6: + lefthook-darwin-x64@2.0.4: optional: true - lefthook-freebsd-arm64@1.13.6: + lefthook-freebsd-arm64@2.0.4: optional: true - lefthook-freebsd-x64@1.13.6: + lefthook-freebsd-x64@2.0.4: optional: true - lefthook-linux-arm64@1.13.6: + lefthook-linux-arm64@2.0.4: optional: true - lefthook-linux-x64@1.13.6: + lefthook-linux-x64@2.0.4: optional: true - lefthook-openbsd-arm64@1.13.6: + lefthook-openbsd-arm64@2.0.4: optional: true - lefthook-openbsd-x64@1.13.6: + lefthook-openbsd-x64@2.0.4: optional: true - lefthook-windows-arm64@1.13.6: + lefthook-windows-arm64@2.0.4: optional: true - lefthook-windows-x64@1.13.6: + lefthook-windows-x64@2.0.4: optional: true - lefthook@1.13.6: + lefthook@2.0.4: 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.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 @@ -5960,12 +6334,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 @@ -5978,14 +6355,14 @@ snapshots: 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: @@ -6007,7 +6384,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 @@ -6086,7 +6465,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) @@ -6101,6 +6480,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 @@ -6141,6 +6527,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 @@ -6149,6 +6537,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 @@ -6181,6 +6573,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: {} @@ -6214,7 +6618,7 @@ 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.1.1(typescript@5.8.3) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 @@ -6281,6 +6685,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 @@ -6298,11 +6709,6 @@ 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.2.2 @@ -6310,9 +6716,9 @@ snapshots: 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: {} @@ -6351,6 +6757,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 @@ -6376,6 +6789,8 @@ snapshots: punycode@2.3.1: {} + pure-rand@6.1.0: {} + pvtsutils@1.3.6: dependencies: tslib: 2.8.1 @@ -6409,6 +6824,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 @@ -6471,15 +6891,20 @@ 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: @@ -6656,8 +7081,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: @@ -6681,8 +7110,6 @@ snapshots: source-map@0.6.1: {} - spawn-command@0.0.2: {} - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -6694,6 +7121,8 @@ snapshots: std-env@3.10.0: {} + stdin-discarder@0.2.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -6705,10 +7134,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: @@ -6769,16 +7198,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 @@ -6803,16 +7230,34 @@ 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.8.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.8.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: {} @@ -6829,11 +7274,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: @@ -6856,7 +7297,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.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -6870,40 +7311,42 @@ snapshots: 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.8: + turbo-darwin-64@2.6.1: optional: true - turbo-darwin-arm64@2.5.8: + turbo-darwin-arm64@2.6.1: optional: true - turbo-linux-64@2.5.8: + turbo-linux-64@2.6.1: optional: true - turbo-linux-arm64@2.5.8: + turbo-linux-arm64@2.6.1: optional: true - turbo-windows-64@2.5.8: + turbo-windows-64@2.6.1: optional: true - turbo-windows-arm64@2.5.8: + turbo-windows-arm64@2.6.1: optional: true - turbo@2.5.8: + turbo@2.6.1: 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.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 type-check@0.4.0: dependencies: @@ -6955,8 +7398,6 @@ snapshots: transitivePeerDependencies: - supports-color - typescript@5.5.4: {} - typescript@5.8.3: {} uglify-js@3.19.3: @@ -6973,6 +7414,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: {} @@ -6994,12 +7439,14 @@ 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: {} + validate-npm-package-name@6.0.2: {} + viem@2.38.2(typescript@5.8.3): dependencies: '@noble/curves': 1.9.1 @@ -7017,28 +7464,7 @@ snapshots: - 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.1.10(@types/node@24.10.1): dependencies: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) @@ -7047,36 +7473,33 @@ snapshots: rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.10 + '@types/node': 24.10.1 fsevents: 2.3.3 - vitest@3.2.4(@types/node@22.18.10)(happy-dom@20.0.10): + 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.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) + '@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.19 + 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 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.1.10(@types/node@24.10.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.18.10 + '@types/node': 24.10.1 happy-dom: 20.0.10 transitivePeerDependencies: - jiti @@ -7087,7 +7510,6 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml @@ -7164,10 +7586,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 +7600,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -7188,6 +7612,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: {} diff --git a/repo/ui/package.json b/repo/ui/package.json index d11de66b7..1d700b09d 100644 --- a/repo/ui/package.json +++ b/repo/ui/package.json @@ -19,7 +19,7 @@ "@types/node": "^20.17.57", "@types/react": "^19.2.6", "@types/react-dom": "^19.2.3", - "typescript": "5.5.4" + "typescript": "^5.8.3" }, "dependencies": { "react": "^19.1.0", From 21d2fcdc15bba3ba7896f89c619b0a90b4c2ab2e Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Wed, 26 Nov 2025 13:58:23 -0500 Subject: [PATCH 140/177] 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 --- package.json | 5 ++ packages/services/guard/package.json | 2 +- .../services/identity-instrument/package.json | 2 +- packages/services/relayer/package.json | 4 +- packages/wallet/core/package.json | 4 +- .../wallet/core/src/state/sequence/index.ts | 18 +++-- packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives-cli/package.json | 2 +- packages/wallet/primitives/package.json | 2 +- packages/wallet/primitives/src/erc-6492.ts | 14 ++-- .../wallet/primitives/test/erc-6492.test.ts | 14 ++-- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 80 +++++++------------ 13 files changed, 70 insertions(+), 81 deletions(-) diff --git a/package.json b/package.json index e39f37a21..50a8cbc5f 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,11 @@ "turbo": "^2.6.1", "typescript": "^5.8.3" }, + "pnpm": { + "overrides": { + "ox": "^0.9.17" + } + }, "packageManager": "pnpm@10.14.0", "engines": { "node": ">=18" diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 6c343e2bc..34cc84bd1 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -30,6 +30,6 @@ "vitest": "^4.0.14" }, "dependencies": { - "ox": "^0.7.2" + "ox": "^0.9.17" } } diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 03c528153..316b9a612 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -27,6 +27,6 @@ "dependencies": { "json-canonicalize": "^2.0.0", "jwt-decode": "^4.0.0", - "ox": "^0.7.2" + "ox": "^0.9.17" } } diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 2c5b46901..c7feb8813 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -34,7 +34,7 @@ "dependencies": { "@0xsequence/wallet-primitives": "workspace:^", "mipd": "^0.0.7", - "ox": "^0.7.2", - "viem": "^2.37.8" + "ox": "^0.9.17", + "viem": "^2.40.3" } } diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 7d3b61a1f..521dbcb36 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -35,7 +35,7 @@ "@0xsequence/relayer": "workspace:^", "@0xsequence/wallet-primitives": "workspace:^", "mipd": "^0.0.7", - "ox": "^0.7.2", - "viem": "^2.37.8" + "ox": "^0.9.17", + "viem": "^2.40.3" } } diff --git a/packages/wallet/core/src/state/sequence/index.ts b/packages/wallet/core/src/state/sequence/index.ts index e9e821d4b..38aeba6c2 100644 --- a/packages/wallet/core/src/state/sequence/index.ts +++ b/packages/wallet/core/src/state/sequence/index.ts @@ -377,10 +377,14 @@ const recoverSapientSignatureCompactSignature = const recoverSapientSignatureCompactFunction = AbiFunction.from(recoverSapientSignatureCompactSignature) class PasskeySignatureValidator implements oxProvider.Provider { - request: oxProvider.Provider['request'] = (({ method, params }: { method: string; params: unknown }) => { - switch (method) { + request: oxProvider.Provider['request'] = (async (request) => { + switch (request.method) { case 'eth_call': - const transaction: TransactionRequest.Rpc = (params as any)[0] + if (!request.params || !Array.isArray(request.params) || request.params.length === 0) { + throw new Error('eth_call requires transaction parameters') + } + + const transaction: TransactionRequest.Rpc = request.params[0] if (!transaction.data?.startsWith(AbiFunction.getSelector(recoverSapientSignatureCompactFunction))) { throw new Error( @@ -403,15 +407,15 @@ class PasskeySignatureValidator implements oxProvider.Provider { } default: - throw new Error(`method ${method} not implemented`) + throw new Error(`method ${request.method} not implemented`) } - }) as any + }) as oxProvider.Provider['request'] - on(event: string) { + on: oxProvider.Provider['on'] = (event: string) => { throw new Error(`unable to listen for ${event}: not implemented`) } - removeListener(event: string) { + removeListener: oxProvider.Provider['removeListener'] = (event: string) => { throw new Error(`unable to remove listener for ${event}: not implemented`) } } diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index f33eaf230..b1148ffd7 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -34,6 +34,6 @@ "@0xsequence/relayer": "workspace:^", "@0xsequence/wallet-core": "workspace:^", "@0xsequence/wallet-primitives": "workspace:^", - "ox": "^0.7.2" + "ox": "^0.9.17" } } diff --git a/packages/wallet/primitives-cli/package.json b/packages/wallet/primitives-cli/package.json index 574c0ae28..e2693cc76 100644 --- a/packages/wallet/primitives-cli/package.json +++ b/packages/wallet/primitives-cli/package.json @@ -31,7 +31,7 @@ }, "dependencies": { "@0xsequence/wallet-primitives": "workspace:^", - "ox": "^0.7.2", + "ox": "^0.9.17", "yargs": "^18.0.0" } } diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 8a20932e2..6aa09b273 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -28,6 +28,6 @@ "vitest": "^4.0.14" }, "dependencies": { - "ox": "^0.7.2" + "ox": "^0.9.17" } } diff --git a/packages/wallet/primitives/src/erc-6492.ts b/packages/wallet/primitives/src/erc-6492.ts index a07de019c..868350edf 100644 --- a/packages/wallet/primitives/src/erc-6492.ts +++ b/packages/wallet/primitives/src/erc-6492.ts @@ -1,5 +1,5 @@ import { AbiFunction, AbiParameters, Address, Bytes, Hex, Provider } from 'ox' -import { WrappedSignature } from 'ox/erc6492' +import { SignatureErc6492 } from 'ox/erc6492' import { DEPLOY } from './constants.js' import { Context } from './context.js' @@ -29,7 +29,7 @@ export function wrap( [{ type: 'address' }, { type: 'bytes' }, { type: 'bytes' }], [to, Hex.from(data), Hex.from(signature)], ), - WrappedSignature.magicBytes, + SignatureErc6492.magicBytes, ) switch (typeof signature) { @@ -46,12 +46,12 @@ export function decode( switch (typeof signature) { case 'object': if ( - Bytes.toHex(signature.subarray(-WrappedSignature.magicBytes.slice(2).length / 2)) === - WrappedSignature.magicBytes + Bytes.toHex(signature.subarray(-SignatureErc6492.magicBytes.slice(2).length / 2)) === + SignatureErc6492.magicBytes ) { const [to, data, decoded] = AbiParameters.decode( [{ type: 'address' }, { type: 'bytes' }, { type: 'bytes' }], - signature.subarray(0, -WrappedSignature.magicBytes.slice(2).length / 2), + signature.subarray(0, -SignatureErc6492.magicBytes.slice(2).length / 2), ) return { signature: Hex.toBytes(decoded) as T, erc6492: { to, data: Hex.toBytes(data) as T } } } else { @@ -59,11 +59,11 @@ export function decode( } case 'string': - if (signature.endsWith(WrappedSignature.magicBytes.slice(2))) { + if (signature.endsWith(SignatureErc6492.magicBytes.slice(2))) { try { const [to, data, decoded] = AbiParameters.decode( [{ type: 'address' }, { type: 'bytes' }, { type: 'bytes' }], - signature.slice(0, -WrappedSignature.magicBytes.slice(2).length) as Hex.Hex, + signature.slice(0, -SignatureErc6492.magicBytes.slice(2).length) as Hex.Hex, ) return { signature: decoded as T, erc6492: { to, data: data as T } } } catch { diff --git a/packages/wallet/primitives/test/erc-6492.test.ts b/packages/wallet/primitives/test/erc-6492.test.ts index dcb7688ee..7398f58db 100644 --- a/packages/wallet/primitives/test/erc-6492.test.ts +++ b/packages/wallet/primitives/test/erc-6492.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it, vi } from 'vitest' import { Address, Bytes, Hex, Provider } from 'ox' -import { WrappedSignature } from 'ox/erc6492' +import { SignatureErc6492 } from 'ox/erc6492' import { deploy, wrap, decode, isValid } from '../src/erc-6492.js' import { Context } from '../src/context.js' @@ -82,7 +82,7 @@ describe('ERC-6492', () => { expect(result.startsWith('0x')).toBe(true) // Should end with the magic bytes - expect(result.endsWith(WrappedSignature.magicBytes.slice(2))).toBe(true) + expect(result.endsWith(SignatureErc6492.magicBytes.slice(2))).toBe(true) // Should contain the original signature data somewhere expect(result.length).toBeGreaterThan(testSignature.length) @@ -96,7 +96,7 @@ describe('ERC-6492', () => { // Convert to hex to check magic bytes const resultHex = Bytes.toHex(result) - expect(resultHex.endsWith(WrappedSignature.magicBytes.slice(2))).toBe(true) + expect(resultHex.endsWith(SignatureErc6492.magicBytes.slice(2))).toBe(true) }) it('should return same type as input signature', () => { @@ -133,7 +133,7 @@ describe('ERC-6492', () => { // The wrapped signature should contain encoded: address, bytes (data), bytes (signature) expect(result.length).toBeGreaterThan(testSignature.length + deployData.data.length) expect(result).toContain(testAddress.slice(2)) // Address without 0x - expect(result.endsWith(WrappedSignature.magicBytes.slice(2))).toBe(true) + expect(result.endsWith(SignatureErc6492.magicBytes.slice(2))).toBe(true) }) }) @@ -209,7 +209,7 @@ describe('ERC-6492', () => { it('should handle malformed wrapped signature gracefully', () => { // Create a signature that ends with magic bytes but has invalid encoding - const malformedSig = ('0x1234' + WrappedSignature.magicBytes.slice(2)) as Hex.Hex + const malformedSig = ('0x1234' + SignatureErc6492.magicBytes.slice(2)) as Hex.Hex const result = decode(malformedSig) // Should return original signature when decoding fails @@ -391,7 +391,7 @@ describe('ERC-6492', () => { // 2. Wrap signature with deploy data const wrappedSig = wrap(testSignature, deployCall) - expect(wrappedSig.endsWith(WrappedSignature.magicBytes.slice(2))).toBe(true) + expect(wrappedSig.endsWith(SignatureErc6492.magicBytes.slice(2))).toBe(true) // 3. Decode wrapped signature const decoded = decode(wrappedSig) @@ -457,7 +457,7 @@ describe('ERC-6492', () => { it('should handle signatures that accidentally contain magic bytes', () => { // Create a signature that contains the magic bytes but isn't wrapped - const magicInSignature = (testSignature + WrappedSignature.magicBytes.slice(2) + '1234') as Hex.Hex + const magicInSignature = (testSignature + SignatureErc6492.magicBytes.slice(2) + '1234') as Hex.Hex const result = decode(magicInSignature) // Should try to decode, but if it fails, should return original diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index c4e80fe2f..927e4bb3b 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -41,7 +41,7 @@ "@0xsequence/wallet-primitives": "workspace:^", "idb": "^8.0.3", "jwt-decode": "^4.0.0", - "ox": "^0.7.2", + "ox": "^0.9.17", "uuid": "^13.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9160e9e33..dd2c1d4ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + ox: ^0.9.17 + importers: .: @@ -131,8 +134,8 @@ importers: 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.8.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -156,8 +159,8 @@ 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.8.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -217,11 +220,11 @@ importers: 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) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.8.3) viem: - specifier: ^2.37.8 - version: 2.38.2(typescript@5.8.3) + specifier: ^2.40.3 + version: 2.40.3(typescript@5.8.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -263,11 +266,11 @@ importers: 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) + specifier: ^0.9.17 + version: 0.9.17(typescript@5.8.3) viem: - specifier: ^2.37.8 - version: 2.38.2(typescript@5.8.3) + specifier: ^2.40.3 + version: 2.40.3(typescript@5.8.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -306,8 +309,8 @@ 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.8.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -337,8 +340,8 @@ importers: 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.8.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -359,8 +362,8 @@ 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.8.3) yargs: specifier: ^18.0.0 version: 18.0.0 @@ -417,8 +420,8 @@ 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.8.3) uuid: specifier: ^13.0.0 version: 13.0.0 @@ -3012,16 +3015,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: @@ -3765,8 +3760,8 @@ packages: resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} engines: {node: ^18.17.0 || >=20.5.0} - viem@2.38.2: - resolution: {integrity: sha512-MJDiTDD9gfOT7lPQRimdmw+g46hU/aWJ3loqb+tN6UBOO00XEd0O4LJx+Kp5/uCRnMlJr8zJ1bNzCK7eG6gMjg==} + viem@2.40.3: + resolution: {integrity: sha512-feYfEpbgjRkZYQpwcgxqkWzjxHI5LSDAjcGetHHwDRuX9BRQHUdV8ohrCosCYpdEhus/RknD3/bOd4qLYVPPuA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -6595,22 +6590,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.8.3): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -7447,7 +7427,7 @@ snapshots: validate-npm-package-name@6.0.2: {} - viem@2.38.2(typescript@5.8.3): + viem@2.40.3(typescript@5.8.3): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -7455,7 +7435,7 @@ snapshots: '@scure/bip39': 1.6.0 abitype: 1.1.0(typescript@5.8.3) isows: 1.0.7(ws@8.18.3) - ox: 0.9.6(typescript@5.8.3) + ox: 0.9.17(typescript@5.8.3) ws: 8.18.3 optionalDependencies: typescript: 5.8.3 From 05ff518cf2e2f00be23404b64b36397295edbe58 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Thu, 27 Nov 2025 16:03:52 +0300 Subject: [PATCH 141/177] Fix explicitSessionRequested check 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 c3738969d..eefdd2234 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -538,7 +538,7 @@ export class ChainSessionManager { const { userEmail, loginMethod, guard } = connectResponse const savedRequest = await this.sequenceStorage.peekPendingRequest() const savedPayload = savedRequest?.payload as CreateNewSessionPayload | undefined - const explicitSessionRequested = !!savedPayload?.session + const explicitSessionRequested = (savedPayload?.session?.permissions?.length ?? 0) > 0 const implicitSessionRequested = savedPayload?.includeImplicitSession ?? false const needsTempPk = explicitSessionRequested || implicitSessionRequested const tempPk = needsTempPk ? await this.sequenceStorage.getAndClearTempSessionPk() : null From bfbe7b9949372b536379b5cf847a2472c639bdfd Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Fri, 28 Nov 2025 06:43:34 -0500 Subject: [PATCH 142/177] 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. --- package.json | 2 +- packages/services/api/package.json | 2 +- packages/services/builder/package.json | 2 +- packages/services/guard/package.json | 2 +- .../services/identity-instrument/package.json | 2 +- packages/services/indexer/package.json | 2 +- packages/services/marketplace/package.json | 2 +- packages/services/metadata/package.json | 2 +- packages/services/relayer/package.json | 2 +- packages/utils/abi/package.json | 2 +- packages/wallet/core/package.json | 2 +- .../wallet/core/src/signers/pk/encrypted.ts | 4 +- .../src/utils/session/permission-builder.ts | 4 +- packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives-cli/package.json | 2 +- packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/package.json | 2 +- packages/wallet/wdk/src/identity/signer.ts | 2 +- pnpm-lock.yaml | 127 +++++++++--------- 19 files changed, 87 insertions(+), 80 deletions(-) diff --git a/package.json b/package.json index 50a8cbc5f..ec01a281f 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "rimraf": "^6.1.2", "syncpack": "^13.0.4", "turbo": "^2.6.1", - "typescript": "^5.8.3" + "typescript": "^5.9.3" }, "pnpm": { "overrides": { diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 325876c47..ffda8e98c 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^24.10.1", - "typescript": "^5.8.3" + "typescript": "^5.9.3" } } diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 753b84b1c..fea7d5417 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^24.10.1", - "typescript": "^5.8.3" + "typescript": "^5.9.3" } } diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 34cc84bd1..65597dd6a 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -26,7 +26,7 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^24.10.1", - "typescript": "^5.8.3", + "typescript": "^5.9.3", "vitest": "^4.0.14" }, "dependencies": { diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 316b9a612..8b86ef2bf 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -21,7 +21,7 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^24.10.1", - "typescript": "^5.8.3", + "typescript": "^5.9.3", "vitest": "^4.0.14" }, "dependencies": { diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index bde7365a2..05ded0455 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^24.10.1", - "typescript": "^5.8.3" + "typescript": "^5.9.3" } } diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index d7399922e..6ba0f6e43 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^24.10.1", - "typescript": "^5.8.3" + "typescript": "^5.9.3" } } diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index bc5e87016..5090bad13 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^24.10.1", - "typescript": "^5.8.3" + "typescript": "^5.9.3" } } diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index c7feb8813..f1b5413fb 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -28,7 +28,7 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^24.10.1", - "typescript": "^5.8.3", + "typescript": "^5.9.3", "vitest": "^4.0.14" }, "dependencies": { diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index c45ff7193..3de0d9a88 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -23,6 +23,6 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^24.10.1", - "typescript": "^5.8.3" + "typescript": "^5.9.3" } } diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 521dbcb36..0181abdf1 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -27,7 +27,7 @@ "@vitest/coverage-v8": "^4.0.14", "dotenv": "^17.2.3", "fake-indexeddb": "^6.2.5", - "typescript": "^5.8.3", + "typescript": "^5.9.3", "vitest": "^4.0.14" }, "dependencies": { diff --git a/packages/wallet/core/src/signers/pk/encrypted.ts b/packages/wallet/core/src/signers/pk/encrypted.ts index becc2b41a..c75bc57f9 100644 --- a/packages/wallet/core/src/signers/pk/encrypted.ts +++ b/packages/wallet/core/src/signers/pk/encrypted.ts @@ -2,8 +2,8 @@ import { Hex, Address, PublicKey, Secp256k1, Bytes } from 'ox' import { PkStore } from './index.js' export interface EncryptedData { - iv: Uint8Array - data: ArrayBuffer + iv: BufferSource + data: BufferSource keyPointer: string address: Address.Address publicKey: PublicKey.PublicKey diff --git a/packages/wallet/core/src/utils/session/permission-builder.ts b/packages/wallet/core/src/utils/session/permission-builder.ts index 08b279509..c77580a18 100644 --- a/packages/wallet/core/src/utils/session/permission-builder.ts +++ b/packages/wallet/core/src/utils/session/permission-builder.ts @@ -59,8 +59,8 @@ export class PermissionBuilder { throw new Error(`cannot call exactCalldata() after calling allowAll() or adding rules`) } for (let offset = 0; offset < calldata.length; offset += 32) { - let value = calldata.slice(offset, offset + 32) - let mask = Permission.MASK.BYTES32 + let value: Bytes.Bytes = calldata.slice(offset, offset + 32) + let mask: Bytes.Bytes = Permission.MASK.BYTES32 if (value.length < 32) { mask = Bytes.fromHex(`0x${'ff'.repeat(value.length)}${'00'.repeat(32 - value.length)}`) value = Bytes.padRight(value, 32) diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index b1148ffd7..0cdf383b9 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -26,7 +26,7 @@ "dotenv": "^17.2.3", "fake-indexeddb": "^6.2.5", "happy-dom": "^20.0.10", - "typescript": "^5.8.3", + "typescript": "^5.9.3", "vitest": "^4.0.14" }, "dependencies": { diff --git a/packages/wallet/primitives-cli/package.json b/packages/wallet/primitives-cli/package.json index e2693cc76..0e8d9e90b 100644 --- a/packages/wallet/primitives-cli/package.json +++ b/packages/wallet/primitives-cli/package.json @@ -27,7 +27,7 @@ "concurrently": "^9.2.1", "esbuild": "^0.27.0", "nodemon": "^3.1.11", - "typescript": "^5.8.3" + "typescript": "^5.9.3" }, "dependencies": { "@0xsequence/wallet-primitives": "workspace:^", diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 6aa09b273..0a29f99bf 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@vitest/coverage-v8": "^4.0.14", - "typescript": "^5.8.3", + "typescript": "^5.9.3", "vitest": "^4.0.14" }, "dependencies": { diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 927e4bb3b..1d6c7449a 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -29,7 +29,7 @@ "dotenv": "^17.2.3", "fake-indexeddb": "^6.2.5", "happy-dom": "^20.0.10", - "typescript": "^5.8.3", + "typescript": "^5.9.3", "vitest": "^4.0.14" }, "dependencies": { diff --git a/packages/wallet/wdk/src/identity/signer.ts b/packages/wallet/wdk/src/identity/signer.ts index 6204f1285..fdc53ca41 100644 --- a/packages/wallet/wdk/src/identity/signer.ts +++ b/packages/wallet/wdk/src/identity/signer.ts @@ -17,7 +17,7 @@ export function toIdentityAuthKey(authKey: AuthKey): Identity.AuthKey { hash: 'SHA-256', }, authKey.privateKey, - digest, + new Uint8Array(digest), ) return Hex.fromBytes(new Uint8Array(authKeySignature)) }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd2c1d4ae..326b12585 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,13 +25,13 @@ importers: version: 6.1.2 syncpack: specifier: ^13.0.4 - version: 13.0.4(typescript@5.8.3) + version: 13.0.4(typescript@5.9.3) turbo: 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: @@ -116,8 +116,8 @@ importers: 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: @@ -128,14 +128,14 @@ importers: 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.9.17 - version: 0.9.17(typescript@5.8.3) + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -144,8 +144,8 @@ importers: 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) @@ -160,7 +160,7 @@ importers: version: 4.0.0 ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.8.3) + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -169,8 +169,8 @@ importers: 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) @@ -184,8 +184,8 @@ importers: 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: @@ -196,8 +196,8 @@ importers: 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: @@ -208,8 +208,8 @@ importers: 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: @@ -218,13 +218,13 @@ 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.9.17 - version: 0.9.17(typescript@5.8.3) + version: 0.9.17(typescript@5.9.3) viem: specifier: ^2.40.3 - version: 2.40.3(typescript@5.8.3) + version: 2.40.3(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -233,8 +233,8 @@ importers: 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) @@ -248,8 +248,8 @@ importers: 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: @@ -264,13 +264,13 @@ 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.9.17 - version: 0.9.17(typescript@5.8.3) + version: 0.9.17(typescript@5.9.3) viem: specifier: ^2.40.3 - version: 2.40.3(typescript@5.8.3) + version: 2.40.3(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -288,8 +288,8 @@ importers: 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: ^4.0.14 version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) @@ -310,7 +310,7 @@ importers: version: link:../primitives ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.8.3) + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -331,8 +331,8 @@ importers: 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: ^4.0.14 version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) @@ -341,7 +341,7 @@ importers: dependencies: ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.8.3) + version: 0.9.17(typescript@5.9.3) devDependencies: '@repo/typescript-config': specifier: workspace:^ @@ -350,8 +350,8 @@ importers: 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: ^4.0.14 version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) @@ -363,7 +363,7 @@ importers: version: link:../primitives ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.8.3) + version: 0.9.17(typescript@5.9.3) yargs: specifier: ^18.0.0 version: 18.0.0 @@ -390,8 +390,8 @@ importers: 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: @@ -421,7 +421,7 @@ importers: version: 4.0.0 ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.8.3) + version: 0.9.17(typescript@5.9.3) uuid: specifier: ^13.0.0 version: 13.0.0 @@ -445,8 +445,8 @@ importers: 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: ^4.0.14 version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10) @@ -3700,6 +3700,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -4873,13 +4878,13 @@ snapshots: '@vitest/pretty-format': 4.0.14 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.1.1(typescript@5.9.3): optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -5212,14 +5217,14 @@ snapshots: core-js-pure@3.46.0: {} - cosmiconfig@9.0.0(typescript@5.8.3): + 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.8.3 + typescript: 5.9.3 create-require@1.1.1: {} @@ -6397,9 +6402,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: @@ -6590,7 +6595,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.9.17(typescript@5.8.3): + ox@0.9.17(typescript@5.9.3): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -6598,10 +6603,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.1(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 @@ -7210,12 +7215,12 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.3 - syncpack@13.0.4(typescript@5.8.3): + syncpack@13.0.4(typescript@5.9.3): dependencies: chalk: 5.6.2 chalk-template: 1.1.2 commander: 13.1.0 - cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig: 9.0.0(typescript@5.9.3) effect: 3.19.6 enquirer: 2.4.1 fast-check: 3.23.2 @@ -7380,6 +7385,8 @@ snapshots: typescript@5.8.3: {} + typescript@5.9.3: {} + uglify-js@3.19.3: optional: true @@ -7427,18 +7434,18 @@ snapshots: validate-npm-package-name@6.0.2: {} - viem@2.40.3(typescript@5.8.3): + viem@2.40.3(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.17(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 From d3f0089b3b8d0184d7dddfca751e98273d89a9b8 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Fri, 28 Nov 2025 14:30:00 -0500 Subject: [PATCH 143/177] Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) --- packages/wallet/wdk/src/sequence/handlers/guard.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/wallet/wdk/src/sequence/handlers/guard.ts b/packages/wallet/wdk/src/sequence/handlers/guard.ts index 4274bedff..bbe8c2698 100644 --- a/packages/wallet/wdk/src/sequence/handlers/guard.ts +++ b/packages/wallet/wdk/src/sequence/handlers/guard.ts @@ -96,13 +96,9 @@ export class GuardHandler implements Handler { } catch (e) { if (e instanceof Guard.AuthRequiredError) { const respond: RespondFn = async (token) => { - try { - const signature = await guard.signEnvelope(request.envelope, token) - await this.signatures.addSignature(request.id, signature) - resolve(true) - } catch (e) { - reject(e) - } + const signature = await guard.signEnvelope(request.envelope, token) + await this.signatures.addSignature(request.id, signature) + resolve(true) } await onPromptCode(request, e.id, respond) From 24539dec7b27af9b30afbacd296366c4564f3116 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 28 Nov 2025 21:50:43 +0100 Subject: [PATCH 144/177] Update pnpm --- .changeset/config.json | 2 +- .changeset/pre.json | 26 +++++++++++++------------- package.json | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.changeset/config.json b/.changeset/config.json index 155655938..4f8345f46 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,5 +7,5 @@ "access": "restricted", "baseBranch": "master", "updateInternalDependencies": "patch", - "ignore": ["@0xsequence/wallet-primitives-cli", "docs", "web", "eslint-config", "typescript-config", "ui"] + "ignore": ["@0xsequence/wallet-primitives-cli", "docs", "web"] } diff --git a/.changeset/pre.json b/.changeset/pre.json index f6a21ebb3..b99137555 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,19 +4,19 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.1", - "@0xsequence/builder": "3.0.0-beta.1", - "@0xsequence/guard": "3.0.0-beta.1", - "@0xsequence/identity-instrument": "3.0.0-beta.1", - "@0xsequence/indexer": "3.0.0-beta.1", - "@0xsequence/marketplace": "3.0.0-beta.1", - "@0xsequence/metadata": "3.0.0-beta.1", - "@0xsequence/relayer": "3.0.0-beta.1", - "@0xsequence/abi": "3.0.0-beta.1", - "@0xsequence/wallet-core": "3.0.0-beta.1", - "@0xsequence/dapp-client": "3.0.0-beta.1", - "@0xsequence/wallet-primitives": "3.0.0-beta.1", - "@0xsequence/wallet-wdk": "3.0.0-beta.1", + "@0xsequence/api": "3.0.0-beta.2", + "@0xsequence/builder": "3.0.0-beta.2", + "@0xsequence/guard": "3.0.0-beta.2", + "@0xsequence/identity-instrument": "3.0.0-beta.2", + "@0xsequence/indexer": "3.0.0-beta.2", + "@0xsequence/marketplace": "3.0.0-beta.2", + "@0xsequence/metadata": "3.0.0-beta.2", + "@0xsequence/relayer": "3.0.0-beta.2", + "@0xsequence/abi": "3.0.0-beta.2", + "@0xsequence/wallet-core": "3.0.0-beta.2", + "@0xsequence/dapp-client": "3.0.0-beta.2", + "@0xsequence/wallet-primitives": "3.0.0-beta.2", + "@0xsequence/wallet-wdk": "3.0.0-beta.2", "@repo/eslint-config": "0.0.0", "@repo/typescript-config": "0.0.0", "@repo/ui": "0.0.0" diff --git a/package.json b/package.json index ec01a281f..483cd0936 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "ox": "^0.9.17" } }, - "packageManager": "pnpm@10.14.0", + "packageManager": "pnpm@10.24.0", "engines": { "node": ">=18" }, From 91bf9322d730a6ea2797104d670981c06a0beae2 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 28 Nov 2025 21:55:20 +0100 Subject: [PATCH 145/177] Mark @0xsequence/wallet-primitives-cli as private --- packages/wallet/primitives-cli/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/wallet/primitives-cli/package.json b/packages/wallet/primitives-cli/package.json index 0e8d9e90b..ee00f2a2a 100644 --- a/packages/wallet/primitives-cli/package.json +++ b/packages/wallet/primitives-cli/package.json @@ -2,6 +2,7 @@ "name": "@0xsequence/wallet-primitives-cli", "type": "module", "bin": "./dist/index.js", + "private": true, "scripts": { "build": "tsc", "build:esbuild": "esbuild src/index.ts --bundle --platform=node --target=node16 --outfile=dist/index.js", From 7c6c811b7cd7379c9a23fd59a25c26ded9bce7e7 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 28 Nov 2025 22:04:40 +0100 Subject: [PATCH 146/177] 3.0.0-beta.3 --- .changeset/open-toes-marry.md | 20 +++++++++++++++++++ .changeset/pre.json | 4 ++-- packages/services/api/CHANGELOG.md | 6 ++++++ packages/services/api/package.json | 2 +- packages/services/builder/CHANGELOG.md | 6 ++++++ packages/services/builder/package.json | 2 +- packages/services/guard/CHANGELOG.md | 6 ++++++ packages/services/guard/package.json | 2 +- .../services/identity-instrument/CHANGELOG.md | 6 ++++++ .../services/identity-instrument/package.json | 2 +- packages/services/indexer/CHANGELOG.md | 6 ++++++ packages/services/indexer/package.json | 2 +- packages/services/marketplace/CHANGELOG.md | 6 ++++++ packages/services/marketplace/package.json | 2 +- packages/services/metadata/CHANGELOG.md | 6 ++++++ packages/services/metadata/package.json | 2 +- packages/services/relayer/CHANGELOG.md | 8 ++++++++ packages/services/relayer/package.json | 2 +- packages/utils/abi/CHANGELOG.md | 6 ++++++ packages/utils/abi/package.json | 2 +- packages/wallet/core/CHANGELOG.md | 10 ++++++++++ packages/wallet/core/package.json | 2 +- packages/wallet/dapp-client/CHANGELOG.md | 11 ++++++++++ packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives/CHANGELOG.md | 6 ++++++ packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/CHANGELOG.md | 12 +++++++++++ packages/wallet/wdk/package.json | 2 +- repo/eslint-config/CHANGELOG.md | 7 +++++++ repo/eslint-config/package.json | 2 +- repo/typescript-config/CHANGELOG.md | 7 +++++++ repo/typescript-config/package.json | 2 +- repo/ui/CHANGELOG.md | 7 +++++++ repo/ui/package.json | 2 +- 34 files changed, 154 insertions(+), 18 deletions(-) create mode 100644 .changeset/open-toes-marry.md create mode 100644 repo/eslint-config/CHANGELOG.md create mode 100644 repo/typescript-config/CHANGELOG.md create mode 100644 repo/ui/CHANGELOG.md diff --git a/.changeset/open-toes-marry.md b/.changeset/open-toes-marry.md new file mode 100644 index 000000000..ec5bf3217 --- /dev/null +++ b/.changeset/open-toes-marry.md @@ -0,0 +1,20 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +'@repo/eslint-config': patch +'@repo/typescript-config': patch +'@repo/ui': patch +--- + +3.0.0-beta.3 with fixes diff --git a/.changeset/pre.json b/.changeset/pre.json index b99137555..5e47609a4 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "exit", + "mode": "pre", "tag": "beta", "initialVersions": { "docs": "0.1.0", @@ -21,5 +21,5 @@ "@repo/typescript-config": "0.0.0", "@repo/ui": "0.0.0" }, - "changesets": ["plain-feet-stare", "wild-feet-carry"] + "changesets": ["open-toes-marry", "plain-feet-stare", "wild-feet-carry"] } diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index a1292632d..1448ab955 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index ffda8e98c..d412db129 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 9ed18ebb8..ab3be638a 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index fea7d5417..a1bdc153f 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index aa28d0cf3..5b28362b8 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 65597dd6a..c988afd25 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index f5152b63e..3f81c6107 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 8b86ef2bf..36b5a9912 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/identity-instrument", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 5562e6af5..255bc7528 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 05ded0455..39a6d7a2d 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index edb21a8ae..962ecc11a 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 6ba0f6e43..ca5a8ffd4 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 383f9239d..f4ce01587 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 5090bad13..30d927c55 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 6142ae25d..ee3b6eebb 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.3 + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index f1b5413fb..a9b07bb53 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 0fb5dadef..d20e03ffb 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 3de0d9a88..bf32672b9 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 27e00ea84..58d6a3738 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.3 + - @0xsequence/relayer@3.0.0-beta.3 + - @0xsequence/wallet-primitives@3.0.0-beta.3 + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 0181abdf1..96fb2727d 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 95434f790..7ca368bde 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.3 + - @0xsequence/relayer@3.0.0-beta.3 + - @0xsequence/wallet-core@3.0.0-beta.3 + - @0xsequence/wallet-primitives@3.0.0-beta.3 + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 0cdf383b9..80d080613 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/dapp-client", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index da421d105..3ba4c869e 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 0a29f99bf..53f583d05 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 64c096d30..9b700a132 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.3 + +### Patch Changes + +- 3.0.0-beta.3 with fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.3 + - @0xsequence/identity-instrument@3.0.0-beta.3 + - @0xsequence/relayer@3.0.0-beta.3 + - @0xsequence/wallet-core@3.0.0-beta.3 + - @0xsequence/wallet-primitives@3.0.0-beta.3 + ## 3.0.0-beta.2 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 1d6c7449a..27a08e267 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.0-beta.2", + "version": "3.0.0-beta.3", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/repo/eslint-config/CHANGELOG.md b/repo/eslint-config/CHANGELOG.md new file mode 100644 index 000000000..731374d7c --- /dev/null +++ b/repo/eslint-config/CHANGELOG.md @@ -0,0 +1,7 @@ +# @repo/eslint-config + +## 0.0.1-beta.0 + +### Patch Changes + +- 3.0.0-beta.3 with fixes diff --git a/repo/eslint-config/package.json b/repo/eslint-config/package.json index 8e609c8f5..cf0fc8c91 100644 --- a/repo/eslint-config/package.json +++ b/repo/eslint-config/package.json @@ -1,6 +1,6 @@ { "name": "@repo/eslint-config", - "version": "0.0.0", + "version": "0.0.1-beta.0", "type": "module", "private": true, "exports": { diff --git a/repo/typescript-config/CHANGELOG.md b/repo/typescript-config/CHANGELOG.md new file mode 100644 index 000000000..f986c7b4d --- /dev/null +++ b/repo/typescript-config/CHANGELOG.md @@ -0,0 +1,7 @@ +# @repo/typescript-config + +## 0.0.1-beta.0 + +### Patch Changes + +- 3.0.0-beta.3 with fixes diff --git a/repo/typescript-config/package.json b/repo/typescript-config/package.json index 27c0e6043..d29b78054 100644 --- a/repo/typescript-config/package.json +++ b/repo/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@repo/typescript-config", - "version": "0.0.0", + "version": "0.0.1-beta.0", "private": true, "license": "MIT", "publishConfig": { diff --git a/repo/ui/CHANGELOG.md b/repo/ui/CHANGELOG.md new file mode 100644 index 000000000..d5187f118 --- /dev/null +++ b/repo/ui/CHANGELOG.md @@ -0,0 +1,7 @@ +# @repo/ui + +## 0.0.1-beta.0 + +### Patch Changes + +- 3.0.0-beta.3 with fixes diff --git a/repo/ui/package.json b/repo/ui/package.json index 1d700b09d..1100c4c0c 100644 --- a/repo/ui/package.json +++ b/repo/ui/package.json @@ -1,6 +1,6 @@ { "name": "@repo/ui", - "version": "0.0.0", + "version": "0.0.1-beta.0", "private": true, "exports": { "./button": "./src/button.tsx", From a56b15120f0d39d78f48f619d4b29faa891817fc Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 28 Nov 2025 22:05:27 +0100 Subject: [PATCH 147/177] changeset cleanup --- .changeset/pre.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 5e47609a4..fa2724d6e 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "pre", + "mode": "exit", "tag": "beta", "initialVersions": { "docs": "0.1.0", From 4c3659e5da8712ef4b8e89d05f4dac7a321f457e Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Tue, 2 Dec 2025 15:30:12 +0100 Subject: [PATCH 148/177] Fix rc4 4337 factory (#933) --- 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 527d7c3e7..a83f23487 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: '0x00000000000003c0C955C8AE06FB13cDd19a7ac6', + factory: '0x00000000000018A77519fcCCa060c2537c9D6d3F', stage1: '0x0000000000003add039FF84b064B7347Fc23C444', stage2: '0x4B3E5735665057A0A15eE448A7293bC01e3b4De9', creationCode: '0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3', From 12658df6945f814dba07b3aea839db52450f0179 Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Tue, 2 Dec 2025 16:10:39 +0100 Subject: [PATCH 149/177] Add rc5 and set it as default (#934) --- packages/wallet/core/src/state/local/index.ts | 2 +- .../wallet/core/src/state/sequence/index.ts | 1 + .../wallet/core/test/session-manager.test.ts | 4 ++ .../dapp-client/src/ChainSessionManager.ts | 4 +- .../primitives-cli/src/subcommands/address.ts | 2 +- packages/wallet/primitives/src/constants.ts | 2 +- packages/wallet/primitives/src/context.ts | 21 +++++++++++ .../wallet/primitives/src/extensions/index.ts | 6 +++ .../wallet/primitives/test/address.test.ts | 15 +++++++- packages/wallet/wdk/src/sequence/manager.ts | 6 +-- packages/wallet/wdk/test/sessions.test.ts | 37 +++++++++++++++---- 11 files changed, 83 insertions(+), 17 deletions(-) diff --git a/packages/wallet/core/src/state/local/index.ts b/packages/wallet/core/src/state/local/index.ts index cd6542245..b3200c844 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.Rc4, + public readonly extensions: Extensions.Extensions = Extensions.Rc5, ) {} 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 38aeba6c2..3712f2aa5 100644 --- a/packages/wallet/core/src/state/sequence/index.ts +++ b/packages/wallet/core/src/state/sequence/index.ts @@ -369,6 +369,7 @@ const passkeySigners = [ Extensions.Dev2.passkeys, Extensions.Rc3.passkeys, Extensions.Rc4.passkeys, + Extensions.Rc5.passkeys, ].map(Address.checksum) const recoverSapientSignatureCompactSignature = diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index 9e524fd13..93a69ed89 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -35,6 +35,10 @@ const ALL_EXTENSIONS = [ name: 'Rc4', ...Extensions.Rc4, }, + { + name: 'Rc5', + ...Extensions.Rc5, + }, ] // 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 eefdd2234..cd67c6b60 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -222,7 +222,7 @@ export class ChainSessionManager { stateProvider: this.stateProvider, }) this.sessionManager = new Signers.SessionManager(this.wallet, { - sessionManagerAddress: Extensions.Rc4.sessions, + sessionManagerAddress: Extensions.Rc5.sessions, provider: this.provider!, }) this.isInitialized = true @@ -731,7 +731,7 @@ export class ChainSessionManager { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { const tempManager = new Signers.SessionManager(this.wallet, { - sessionManagerAddress: Extensions.Rc4.sessions, + sessionManagerAddress: Extensions.Rc5.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 c21eaa800..062349efc 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.Rc4.creationCode, + default: Context.Rc5.creationCode, }) }, async (argv) => { diff --git a/packages/wallet/primitives/src/constants.ts b/packages/wallet/primitives/src/constants.ts index fc2173ebf..763f94389 100644 --- a/packages/wallet/primitives/src/constants.ts +++ b/packages/wallet/primitives/src/constants.ts @@ -3,7 +3,7 @@ import { Abi } from 'ox' export const ZeroAddress = '0x0000000000000000000000000000000000000000' as const export const PlaceholderAddress = '0xffff0000ffff0000ffff0000ffff0000ffff0000' as const -export const DefaultGuestAddress = '0x0000000000601fcA38f0cCA649453F6739436d6C' as const +export const DefaultGuestAddress = '0x0000000000006Ac72ed1d192fa28f0058D3F8806' as const // ERC1271 export const IS_VALID_SIGNATURE = Abi.from([ diff --git a/packages/wallet/primitives/src/context.ts b/packages/wallet/primitives/src/context.ts index a83f23487..fa70f8e3a 100644 --- a/packages/wallet/primitives/src/context.ts +++ b/packages/wallet/primitives/src/context.ts @@ -78,6 +78,25 @@ export const Rc4_4337: Context = { }, } +export const Rc5: Context = { + factory: '0x00000000000018A77519fcCCa060c2537c9D6d3F', + stage1: '0x0000000000001f3C39d61698ab21131a12134454', + stage2: '0xD0ae8eF93b7DA4eabb32Ec4d81b7a501DCa04D4C', + creationCode: '0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3', +} + +export const Rc5_4337: Context = { + factory: '0x00000000000018A77519fcCCa060c2537c9D6d3F', + stage1: '0x0000000000009caFdeDb6f64Bf5F31a22124B2a8', + stage2: '0xcBca3328a731deffE6Ce4c2fb51b585c3c37FB92', + creationCode: '0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3', + capabilities: { + erc4337: { + entrypoint: '0x0000000071727De22E5E9d8BAf0edAc6f37da032', + }, + }, +} + export type KnownContext = Context & { name: string development: boolean @@ -91,6 +110,8 @@ export const KnownContexts: KnownContext[] = [ { name: 'Rc3_4337', development: true, ...Rc3_4337 }, { name: 'Rc4', development: false, ...Rc4 }, { name: 'Rc4_4337', development: false, ...Rc4_4337 }, + { name: 'Rc5', development: false, ...Rc5 }, + { name: 'Rc5_4337', development: false, ...Rc5_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 fca976a6e..2ff8ac16b 100644 --- a/packages/wallet/primitives/src/extensions/index.ts +++ b/packages/wallet/primitives/src/extensions/index.ts @@ -30,5 +30,11 @@ export const Rc4: Extensions = { sessions: '0x00000000000030Bcc832F7d657f50D6Be35C92b3', } +export const Rc5: Extensions = { + passkeys: '0x0000000000005204F3711851EAD52CC9c241499a', + recovery: '0x000000000000AB36D17eB1150116371520565205', + sessions: '0x00000000000030Bcc832F7d657f50D6Be35C92b3', +} + export * as Passkeys from './passkeys.js' export * as Recovery from './recovery.js' diff --git a/packages/wallet/primitives/test/address.test.ts b/packages/wallet/primitives/test/address.test.ts index 0abced190..38ac16ccc 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, Rc4 } from '../src/context.js' +import { Context, Dev1, Dev2, Rc3, Rc4, Rc5 } from '../src/context.js' import { Config, hashConfiguration } from '../src/config.js' describe('Address', () => { @@ -134,6 +134,19 @@ describe('Address', () => { expect(address).not.toBe(dev2Address) }) + it('should work with Rc5 context', () => { + const { stage2, ...rc5Context } = Rc5 + const address = from(sampleConfig, rc5Context) + + 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/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 94f878047..9fe04d13c 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -95,9 +95,9 @@ export type ManagerOptions = { export const ManagerOptionsDefaults = { verbose: false, - extensions: Extensions.Rc4, - context: Context.Rc4, - context4337: Context.Rc4_4337, + extensions: Extensions.Rc5, + context: Context.Rc5, + context4337: Context.Rc5_4337, guest: Constants.DefaultGuestAddress, encryptedPksDb: new CoreSigners.Pk.Encrypted.EncryptedPksDb(), diff --git a/packages/wallet/wdk/test/sessions.test.ts b/packages/wallet/wdk/test/sessions.test.ts index b459470f0..4e3c9a2ca 100644 --- a/packages/wallet/wdk/test/sessions.test.ts +++ b/packages/wallet/wdk/test/sessions.test.ts @@ -2,26 +2,44 @@ import { AbiFunction, Address, Bytes, Hex, Mnemonic, Provider, RpcTransport, Sec import { beforeEach, describe, expect, it } from 'vitest' import { Signers as CoreSigners, Wallet as CoreWallet, Envelope, State } from '../../core/src/index.js' import { ExplicitSession } from '../../core/src/utils/session/types.js' -import { Extensions, Network, Payload, Permission } from '../../primitives/src/index.js' +import { Context, Extensions, Network, Payload, Permission } from '../../primitives/src/index.js' import { Sequence } from '../src/index.js' import { EMITTER_ABI, EMITTER_ADDRESS, LOCAL_RPC_URL } from './constants' -const ALL_EXTENSIONS = [ +const ALL_EXTENSIONS: { + name: string + extensions: Extensions.Extensions + context: Context.Context + context4337?: Context.Context +}[] = [ { name: 'Dev1', - ...Extensions.Dev1, + extensions: Extensions.Dev1, + context: Context.Dev1, }, { name: 'Dev2', - ...Extensions.Dev2, + extensions: Extensions.Dev2, + context: Context.Dev2, + context4337: Context.Dev2_4337, }, { name: 'Rc3', - ...Extensions.Rc3, + extensions: Extensions.Rc3, + context: Context.Rc3, + context4337: Context.Rc3_4337, }, { name: 'Rc4', - ...Extensions.Rc4, + extensions: Extensions.Rc4, + context: Context.Rc4, + context4337: Context.Rc4_4337, + }, + { + name: 'Rc5', + extensions: Extensions.Rc5, + context: Context.Rc5, + context4337: Context.Rc5_4337, }, ] @@ -85,6 +103,9 @@ for (const extension of ALL_EXTENSIONS) { // Create manager const opts = Sequence.applyManagerOptionsDefaults({ stateProvider, + extensions: extension.extensions, + context: extension.context, + context4337: extension.context4337 ?? extension.context, relayers: [], // No relayers needed for testing networks: [ { @@ -143,7 +164,7 @@ for (const extension of ALL_EXTENSIONS) { wallet: coreWallet, sessionManager: new CoreSigners.SessionManager(coreWallet, { provider, - sessionManagerAddress: Extensions.Rc4.sessions, + sessionManagerAddress: extension.extensions.sessions, }), } }) @@ -233,7 +254,7 @@ for (const extension of ALL_EXTENSIONS) { dapp.wallet = coreWallet dapp.sessionManager = new CoreSigners.SessionManager(coreWallet, { provider, - sessionManagerAddress: Extensions.Rc4.sessions, + sessionManagerAddress: extension.extensions.sessions, }) // At this point the wallet should NOT have a session topology From 934acd10bb525f0ff181aa417a55cbb0415edc0a Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 2 Dec 2025 16:57:37 +0100 Subject: [PATCH 150/177] 3.0.0-beta.4 --- .changeset/pre.json | 34 +++++++++---------- .changeset/wise-heads-buy.md | 17 ++++++++++ packages/services/api/CHANGELOG.md | 6 ++++ packages/services/api/package.json | 2 +- packages/services/builder/CHANGELOG.md | 6 ++++ packages/services/builder/package.json | 2 +- packages/services/guard/CHANGELOG.md | 6 ++++ packages/services/guard/package.json | 2 +- .../services/identity-instrument/CHANGELOG.md | 6 ++++ .../services/identity-instrument/package.json | 2 +- packages/services/indexer/CHANGELOG.md | 6 ++++ packages/services/indexer/package.json | 2 +- packages/services/marketplace/CHANGELOG.md | 6 ++++ packages/services/marketplace/package.json | 2 +- packages/services/metadata/CHANGELOG.md | 6 ++++ packages/services/metadata/package.json | 2 +- packages/services/relayer/CHANGELOG.md | 8 +++++ packages/services/relayer/package.json | 2 +- packages/utils/abi/CHANGELOG.md | 6 ++++ packages/utils/abi/package.json | 2 +- packages/wallet/core/CHANGELOG.md | 10 ++++++ packages/wallet/core/package.json | 2 +- packages/wallet/dapp-client/CHANGELOG.md | 11 ++++++ packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives/CHANGELOG.md | 6 ++++ packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/CHANGELOG.md | 12 +++++++ packages/wallet/wdk/package.json | 2 +- 28 files changed, 142 insertions(+), 30 deletions(-) create mode 100644 .changeset/wise-heads-buy.md diff --git a/.changeset/pre.json b/.changeset/pre.json index fa2724d6e..f55106015 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,22 +4,22 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.2", - "@0xsequence/builder": "3.0.0-beta.2", - "@0xsequence/guard": "3.0.0-beta.2", - "@0xsequence/identity-instrument": "3.0.0-beta.2", - "@0xsequence/indexer": "3.0.0-beta.2", - "@0xsequence/marketplace": "3.0.0-beta.2", - "@0xsequence/metadata": "3.0.0-beta.2", - "@0xsequence/relayer": "3.0.0-beta.2", - "@0xsequence/abi": "3.0.0-beta.2", - "@0xsequence/wallet-core": "3.0.0-beta.2", - "@0xsequence/dapp-client": "3.0.0-beta.2", - "@0xsequence/wallet-primitives": "3.0.0-beta.2", - "@0xsequence/wallet-wdk": "3.0.0-beta.2", - "@repo/eslint-config": "0.0.0", - "@repo/typescript-config": "0.0.0", - "@repo/ui": "0.0.0" + "@0xsequence/api": "3.0.0-beta.3", + "@0xsequence/builder": "3.0.0-beta.3", + "@0xsequence/guard": "3.0.0-beta.3", + "@0xsequence/identity-instrument": "3.0.0-beta.3", + "@0xsequence/indexer": "3.0.0-beta.3", + "@0xsequence/marketplace": "3.0.0-beta.3", + "@0xsequence/metadata": "3.0.0-beta.3", + "@0xsequence/relayer": "3.0.0-beta.3", + "@0xsequence/abi": "3.0.0-beta.3", + "@0xsequence/wallet-core": "3.0.0-beta.3", + "@0xsequence/dapp-client": "3.0.0-beta.3", + "@0xsequence/wallet-primitives": "3.0.0-beta.3", + "@0xsequence/wallet-wdk": "3.0.0-beta.3", + "@repo/eslint-config": "0.0.1-beta.0", + "@repo/typescript-config": "0.0.1-beta.0", + "@repo/ui": "0.0.1-beta.0" }, - "changesets": ["open-toes-marry", "plain-feet-stare", "wild-feet-carry"] + "changesets": ["open-toes-marry", "plain-feet-stare", "wild-feet-carry", "wise-heads-buy"] } diff --git a/.changeset/wise-heads-buy.md b/.changeset/wise-heads-buy.md new file mode 100644 index 000000000..1c35a4d35 --- /dev/null +++ b/.changeset/wise-heads-buy.md @@ -0,0 +1,17 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +RC5 upgrade diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 1448ab955..3fe0bd004 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index d412db129..7d1e14e1f 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index ab3be638a..5b8be8f5e 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index a1bdc153f..a52fbaf62 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 5b28362b8..f9bbd0221 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index c988afd25..4213b9c6b 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 3f81c6107..9d6927356 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 36b5a9912..c2223e5ec 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/identity-instrument", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 255bc7528..2f7d2965c 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 39a6d7a2d..7f5e55b87 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 962ecc11a..c022e666d 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index ca5a8ffd4..6c3d16f9a 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index f4ce01587..534489253 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 30d927c55..f857e98fd 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index ee3b6eebb..80a2e8e84 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.4 + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index a9b07bb53..ea532573e 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index d20e03ffb..a5da76a67 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index bf32672b9..f2daad532 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 58d6a3738..df6cdca62 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.4 + - @0xsequence/relayer@3.0.0-beta.4 + - @0xsequence/wallet-primitives@3.0.0-beta.4 + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 96fb2727d..d589d77d3 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 7ca368bde..b8e29c92b 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.4 + - @0xsequence/relayer@3.0.0-beta.4 + - @0xsequence/wallet-core@3.0.0-beta.4 + - @0xsequence/wallet-primitives@3.0.0-beta.4 + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 80d080613..ca91b6bfa 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/dapp-client", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 3ba4c869e..4e61caf97 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 53f583d05..8edaea3f7 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 9b700a132..e62bd6d4e 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.4 + +### Patch Changes + +- RC5 upgrade +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.4 + - @0xsequence/identity-instrument@3.0.0-beta.4 + - @0xsequence/relayer@3.0.0-beta.4 + - @0xsequence/wallet-core@3.0.0-beta.4 + - @0xsequence/wallet-primitives@3.0.0-beta.4 + ## 3.0.0-beta.3 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 27a08e267..b3e11398f 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "license": "Apache-2.0", "type": "module", "publishConfig": { 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 151/177] 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 0d8ac2906..6112730aa 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 152/177] 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 759987dd1..fa28e5b70 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 153/177] 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 fa28e5b70..fb48d8e6a 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 b53f7343de4114550dbfc376bf952cf4914d203b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 11:54:34 +0100 Subject: [PATCH 154/177] 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> --- extras/docs/package.json | 2 +- extras/web/package.json | 2 +- pnpm-lock.yaml | 392 +++++++++++++++++++++++---------------- 3 files changed, 239 insertions(+), 157 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index bc0712569..f761f0b2d 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.5.7", "react": "^19.1.0", "react-dom": "^19.1.0" }, diff --git a/extras/web/package.json b/extras/web/package.json index e92d9e08b..b5b121c87 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.5.7", "react": "^19.1.0", "react-dom": "^19.1.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 326b12585..6573a1edc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,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.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.2.0 @@ -76,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.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.2.0 @@ -476,7 +476,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.1) + version: 2.5.8(eslint@9.37.0)(turbo@2.6.2) globals: specifier: ^15.15.0 version: 15.15.0 @@ -620,8 +620,8 @@ 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.11': resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} @@ -993,124 +993,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] @@ -1151,56 +1162,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.7': + resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} '@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] @@ -1736,8 +1747,8 @@ 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.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} @@ -2901,8 +2912,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.7: + resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3356,8 +3367,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: @@ -3635,35 +3646,69 @@ packages: 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.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.6.1: resolution: {integrity: sha512-eM1uLWgzv89bxlK29qwQEr9xYWBhmO/EGiH22UGfq+uXr+QW1OvNKKMogSN65Ry8lElMH4LZh0aX2DEc7eC0Mw==} cpu: [x64] os: [linux] + 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-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.6.1: resolution: {integrity: sha512-7w+AD5vJp3R+FB0YOj1YJcNcOOvBior7bcHTodqp90S3x3bLgpr7tE6xOea1e8JkP7GK6ciKVUpQvV7psiwU5Q==} cpu: [arm64] os: [win32] + 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: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -4126,7 +4171,7 @@ 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 @@ -4347,90 +4392,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.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.3': + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.2.3': + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.2.3': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.2.3': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.3': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.2.3': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.2.3': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.3': + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true - '@img/sharp-linux-arm64@0.34.4': + '@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)': @@ -4483,34 +4536,34 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.5.5': {} + '@next/env@15.5.7': {} '@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': {} @@ -5086,7 +5139,7 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001751: {} + caniuse-lite@1.0.30001759: {} cbor2@1.12.0: {} @@ -5555,11 +5608,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.1): + eslint-plugin-turbo@2.5.8(eslint@9.37.0)(turbo@2.6.2): dependencies: dotenv: 16.0.3 eslint: 9.37.0 - turbo: 2.6.1 + turbo: 2.6.2 eslint-scope@8.4.0: dependencies: @@ -6424,25 +6477,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.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@next/env': 15.5.5 + '@next/env': 15.5.7 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001751 + caniuse-lite: 1.0.30001759 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 @@ -6990,34 +7043,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: @@ -7309,21 +7364,39 @@ snapshots: 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-linux-arm64@2.6.2: + optional: true + turbo-windows-64@2.6.1: optional: true + turbo-windows-64@2.6.2: + optional: true + turbo-windows-arm64@2.6.1: optional: true + turbo-windows-arm64@2.6.2: + optional: true + turbo@2.6.1: optionalDependencies: turbo-darwin-64: 2.6.1 @@ -7333,6 +7406,15 @@ snapshots: turbo-windows-64: 2.6.1 turbo-windows-arm64: 2.6.1 + turbo@2.6.2: + 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 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 From 393fc21e3c654f9b4d37e4a2e27e2b874263cf3a Mon Sep 17 00:00:00 2001 From: Patryk Kalinowski Date: Wed, 10 Dec 2025 12:01:04 +0100 Subject: [PATCH 155/177] add userdata service client (#940) --- packages/services/userdata/CHANGELOG.md | 1 + packages/services/userdata/README.md | 3 + packages/services/userdata/package.json | 28 + packages/services/userdata/src/index.ts | 36 + .../services/userdata/src/userdata.gen.ts | 686 ++++++++++++++++++ packages/services/userdata/tsconfig.json | 10 + pnpm-lock.yaml | 12 + 7 files changed, 776 insertions(+) create mode 100644 packages/services/userdata/CHANGELOG.md create mode 100644 packages/services/userdata/README.md create mode 100644 packages/services/userdata/package.json create mode 100644 packages/services/userdata/src/index.ts create mode 100644 packages/services/userdata/src/userdata.gen.ts create mode 100644 packages/services/userdata/tsconfig.json diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md new file mode 100644 index 000000000..0e290b2db --- /dev/null +++ b/packages/services/userdata/CHANGELOG.md @@ -0,0 +1 @@ +# @0xsequence/userdata diff --git a/packages/services/userdata/README.md b/packages/services/userdata/README.md new file mode 100644 index 000000000..2387b56e2 --- /dev/null +++ b/packages/services/userdata/README.md @@ -0,0 +1,3 @@ +# @0xsequence/userdata + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json new file mode 100644 index 000000000..3911235c0 --- /dev/null +++ b/packages/services/userdata/package.json @@ -0,0 +1,28 @@ +{ + "name": "@0xsequence/userdata", + "version": "3.0.0-beta.4", + "description": "userdata sub-package for Sequence", + "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", + "author": "Sequence Platforms Inc.", + "license": "Apache-2.0", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "test": "echo", + "typecheck": "tsc --noEmit" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "devDependencies": { + "@repo/typescript-config": "workspace:^", + "@types/node": "^24.10.1", + "typescript": "^5.9.3" + } +} diff --git a/packages/services/userdata/src/index.ts b/packages/services/userdata/src/index.ts new file mode 100644 index 000000000..af76930fc --- /dev/null +++ b/packages/services/userdata/src/index.ts @@ -0,0 +1,36 @@ +export * from './userdata.gen' + +import { UserData as UserdataRpc } from './userdata.gen' + +export class SequenceUserdataClient extends UserdataRpc { + constructor( + hostname: string, + public projectAccessKey?: string, + public jwtAuth?: string, + ) { + super(hostname.endsWith('/') ? hostname.slice(0, -1) : hostname, fetch) + this.fetch = this._fetch + } + + _fetch = (input: RequestInfo, init?: RequestInit): Promise => { + // automatically include jwt and access key auth header to requests + // if its been set on the api client + const headers: { [key: string]: any } = {} + + const jwtAuth = this.jwtAuth + const projectAccessKey = this.projectAccessKey + + if (jwtAuth && jwtAuth.length > 0) { + headers['Authorization'] = `BEARER ${jwtAuth}` + } + + if (projectAccessKey && projectAccessKey.length > 0) { + headers['X-Access-Key'] = projectAccessKey + } + + // before the request is made + init!.headers = { ...init!.headers, ...headers } + + return fetch(input, init) + } +} diff --git a/packages/services/userdata/src/userdata.gen.ts b/packages/services/userdata/src/userdata.gen.ts new file mode 100644 index 000000000..a26fdb995 --- /dev/null +++ b/packages/services/userdata/src/userdata.gen.ts @@ -0,0 +1,686 @@ +/* eslint-disable */ +// userdata v0.1.0 99a19ff0218eda6f5e544642d0fd72f66736bdaf +// -- +// Code generated by Webrpc-gen@v0.30.2 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=userdata.ridl -target=typescript -client -out=./clients/userdata.gen.ts + +// Webrpc description and code-gen version +export const WebrpcVersion = 'v1' + +// Schema version of your RIDL schema +export const WebrpcSchemaVersion = 'v0.1.0' + +// Schema hash generated from your RIDL schema +export const WebrpcSchemaHash = '99a19ff0218eda6f5e544642d0fd72f66736bdaf' + +// +// Client interface +// + +export interface UserDataClient { + getCapabilities(headers?: object, signal?: AbortSignal): Promise + + getAccessToken(req: GetAccessTokenRequest, headers?: object, signal?: AbortSignal): Promise + + getIdentityToken( + req: GetIdentityTokenRequest, + headers?: object, + signal?: AbortSignal, + ): Promise +} + +// +// Schema types +// + +export interface Wallet { + address: string + ecosystem: number +} + +export interface Signer { + address: string + kind: string + email?: string +} + +export interface WalletSigner { + walletAddress: string + signerAddress: string +} + +export interface Session { + walletAddress: string + sessionAddress: string + ipAddress: string + userAgent: string + originUrl: string + appUrl: string + createdAt: string +} + +export interface SessionProps { + address: string + appUrl: string +} + +export interface GetCapabilitiesRequest {} + +export interface GetCapabilitiesResponse { + supportedMethods: Array +} + +export interface GetAccessTokenRequest { + ethauthProof: string + chainId: string +} + +export interface GetAccessTokenResponse { + accessToken: string + refreshToken: string + expiresIn: number +} + +export interface GetIdentityTokenRequest { + claims: { [key: string]: any } +} + +export interface GetIdentityTokenResponse { + idToken: string +} + +// +// Client +// + +export class UserData implements UserDataClient { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/UserData/' + + 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 + } + + queryKey = { + getCapabilities: () => ['UserData', 'getCapabilities'] as const, + getAccessToken: (req: GetAccessTokenRequest) => ['UserData', 'getAccessToken', req] as const, + getIdentityToken: (req: GetIdentityTokenRequest) => ['UserData', 'getIdentityToken', req] as const, + } + + getCapabilities = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetCapabilities'), createHttpRequest('{}', headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'GetCapabilitiesResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + getAccessToken = ( + req: GetAccessTokenRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('GetAccessToken'), + createHttpRequest(JsonEncode(req, 'GetAccessTokenRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'GetAccessTokenResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + getIdentityToken = ( + req: GetIdentityTokenRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('GetIdentityToken'), + createHttpRequest(JsonEncode(req, 'GetIdentityTokenRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'GetIdentityTokenResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } +} + +const createHttpRequest = (body: string = '{}', headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } + return { method: 'POST', headers: reqHeaders, body, signal } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then((text) => { + let data + try { + data = JSON.parse(text) + } catch (error) { + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}`, + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + +export const JsonEncode = (obj: T, _typ: string = ''): string => { + return JSON.stringify(obj) +} + +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 parsed as T +} + +// +// Errors +// + +type WebrpcErrorParams = { name?: string; code?: number; message?: string; status?: number; cause?: string } + +export class WebrpcError extends Error { + code: number + status: number + + 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({ message: payload.message, code: payload.code, status: payload.status, cause: payload.cause }) + } +} + +export class WebrpcEndpointError extends WebrpcError { + 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(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(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(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(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(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(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(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 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(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(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(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(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(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(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(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(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(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(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(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 InvalidArgumentError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InvalidArgument' + this.code = typeof error.code === 'number' ? error.code : 2000 + 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(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(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(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 UnsupportedNetworkError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'UnsupportedNetwork' + this.code = typeof error.code === 'number' ? error.code : 3008 + this.message = error.message || `Unsupported network` + this.status = typeof error.status === 'number' ? error.status : 422 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, UnsupportedNetworkError.prototype) + } +} + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientAborted = 'WebrpcClientAborted', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Unauthorized = 'Unauthorized', + PermissionDenied = 'PermissionDenied', + SessionExpired = 'SessionExpired', + MethodNotFound = 'MethodNotFound', + RequestConflict = 'RequestConflict', + Aborted = 'Aborted', + Geoblocked = 'Geoblocked', + RateLimited = 'RateLimited', + ProjectNotFound = 'ProjectNotFound', + InvalidArgument = 'InvalidArgument', + Unavailable = 'Unavailable', + QueryFailed = 'QueryFailed', + NotFound = 'NotFound', + UnsupportedNetwork = 'UnsupportedNetwork', +} + +export enum WebrpcErrorCodes { + WebrpcEndpoint = 0, + WebrpcRequestFailed = -1, + WebrpcBadRoute = -2, + WebrpcBadMethod = -3, + WebrpcBadRequest = -4, + WebrpcBadResponse = -5, + WebrpcServerPanic = -6, + WebrpcInternalError = -7, + WebrpcClientAborted = -8, + WebrpcStreamLost = -9, + WebrpcStreamFinished = -10, + Unauthorized = 1000, + PermissionDenied = 1001, + SessionExpired = 1002, + MethodNotFound = 1003, + RequestConflict = 1004, + Aborted = 1005, + Geoblocked = 1006, + RateLimited = 1007, + ProjectNotFound = 1008, + InvalidArgument = 2000, + Unavailable = 2002, + QueryFailed = 2003, + NotFound = 3000, + UnsupportedNetwork = 3008, +} + +export const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientAbortedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError, + [1000]: UnauthorizedError, + [1001]: PermissionDeniedError, + [1002]: SessionExpiredError, + [1003]: MethodNotFoundError, + [1004]: RequestConflictError, + [1005]: AbortedError, + [1006]: GeoblockedError, + [1007]: RateLimitedError, + [1008]: ProjectNotFoundError, + [2000]: InvalidArgumentError, + [2002]: UnavailableError, + [2003]: QueryFailedError, + [3000]: NotFoundError, + [3008]: UnsupportedNetworkError, +} + +// +// Webrpc +// + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.30.2;gen-typescript@v0.22.2;userdata@v0.1.0' + +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/userdata/tsconfig.json b/packages/services/userdata/tsconfig.json new file mode 100644 index 000000000..fed9c77b4 --- /dev/null +++ b/packages/services/userdata/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@repo/typescript-config/base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "types": ["node"] + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6573a1edc..a81600c51 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -239,6 +239,18 @@ importers: 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: '@repo/typescript-config': From dea43c240109c42b240a0bcf29dff6cfbd41ecc8 Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Fri, 12 Dec 2025 15:23:16 +0300 Subject: [PATCH 156/177] Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log --- packages/wallet/wdk/src/sequence/sessions.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/wallet/wdk/src/sequence/sessions.ts b/packages/wallet/wdk/src/sequence/sessions.ts index 9496ce969..70c2d85ed 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -336,11 +336,20 @@ export class Sessions implements SessionsInterface { continue } const iHandler = this.shared.handlers.get(identityKind) - if (iHandler) { - handler = iHandler - identitySignerAddress = identitySigner - break + if (!iHandler) { + continue + } + if (identityKind === Kinds.LocalDevice) { + const hasLocalDevice = await this.shared.modules.devices.has(identitySigner) + if (!hasLocalDevice) { + console.warn('Identity signer not on this device, skipping', identitySigner) + continue + } } + + handler = iHandler + identitySignerAddress = identitySigner + break } if (!handler || !identitySignerAddress) { From d5017e86971f861c34dc28bb114539366a76f641 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 12 Dec 2025 13:35:54 +0100 Subject: [PATCH 157/177] 3.0.0-beta.5 --- .changeset/goofy-laws-serve.md | 21 ++++++++++++++ .changeset/pre.json | 29 ++++++++++--------- packages/services/api/CHANGELOG.md | 6 ++++ packages/services/api/package.json | 2 +- packages/services/builder/CHANGELOG.md | 6 ++++ packages/services/builder/package.json | 2 +- packages/services/guard/CHANGELOG.md | 6 ++++ packages/services/guard/package.json | 2 +- .../services/identity-instrument/CHANGELOG.md | 6 ++++ .../services/identity-instrument/package.json | 2 +- packages/services/indexer/CHANGELOG.md | 6 ++++ packages/services/indexer/package.json | 2 +- packages/services/marketplace/CHANGELOG.md | 6 ++++ packages/services/marketplace/package.json | 2 +- packages/services/metadata/CHANGELOG.md | 6 ++++ packages/services/metadata/package.json | 2 +- packages/services/relayer/CHANGELOG.md | 8 +++++ packages/services/relayer/package.json | 2 +- packages/services/userdata/CHANGELOG.md | 6 ++++ packages/services/userdata/package.json | 2 +- packages/utils/abi/CHANGELOG.md | 6 ++++ packages/utils/abi/package.json | 2 +- packages/wallet/core/CHANGELOG.md | 10 +++++++ packages/wallet/core/package.json | 2 +- packages/wallet/dapp-client/CHANGELOG.md | 11 +++++++ packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives/CHANGELOG.md | 6 ++++ packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/CHANGELOG.md | 12 ++++++++ packages/wallet/wdk/package.json | 2 +- repo/eslint-config/CHANGELOG.md | 6 ++++ repo/eslint-config/package.json | 2 +- repo/typescript-config/CHANGELOG.md | 6 ++++ repo/typescript-config/package.json | 2 +- repo/ui/CHANGELOG.md | 6 ++++ repo/ui/package.json | 2 +- 36 files changed, 172 insertions(+), 31 deletions(-) create mode 100644 .changeset/goofy-laws-serve.md diff --git a/.changeset/goofy-laws-serve.md b/.changeset/goofy-laws-serve.md new file mode 100644 index 000000000..690a5f76b --- /dev/null +++ b/.changeset/goofy-laws-serve.md @@ -0,0 +1,21 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +'@repo/eslint-config': patch +'@repo/typescript-config': patch +'@repo/ui': patch +--- + +Beta release for v3 diff --git a/.changeset/pre.json b/.changeset/pre.json index f55106015..a92fc72b5 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,22 +4,23 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.3", - "@0xsequence/builder": "3.0.0-beta.3", - "@0xsequence/guard": "3.0.0-beta.3", - "@0xsequence/identity-instrument": "3.0.0-beta.3", - "@0xsequence/indexer": "3.0.0-beta.3", - "@0xsequence/marketplace": "3.0.0-beta.3", - "@0xsequence/metadata": "3.0.0-beta.3", - "@0xsequence/relayer": "3.0.0-beta.3", - "@0xsequence/abi": "3.0.0-beta.3", - "@0xsequence/wallet-core": "3.0.0-beta.3", - "@0xsequence/dapp-client": "3.0.0-beta.3", - "@0xsequence/wallet-primitives": "3.0.0-beta.3", - "@0xsequence/wallet-wdk": "3.0.0-beta.3", + "@0xsequence/api": "3.0.0-beta.4", + "@0xsequence/builder": "3.0.0-beta.4", + "@0xsequence/guard": "3.0.0-beta.4", + "@0xsequence/identity-instrument": "3.0.0-beta.4", + "@0xsequence/indexer": "3.0.0-beta.4", + "@0xsequence/marketplace": "3.0.0-beta.4", + "@0xsequence/metadata": "3.0.0-beta.4", + "@0xsequence/relayer": "3.0.0-beta.4", + "@0xsequence/userdata": "3.0.0-beta.4", + "@0xsequence/abi": "3.0.0-beta.4", + "@0xsequence/wallet-core": "3.0.0-beta.4", + "@0xsequence/dapp-client": "3.0.0-beta.4", + "@0xsequence/wallet-primitives": "3.0.0-beta.4", + "@0xsequence/wallet-wdk": "3.0.0-beta.4", "@repo/eslint-config": "0.0.1-beta.0", "@repo/typescript-config": "0.0.1-beta.0", "@repo/ui": "0.0.1-beta.0" }, - "changesets": ["open-toes-marry", "plain-feet-stare", "wild-feet-carry", "wise-heads-buy"] + "changesets": ["goofy-laws-serve", "open-toes-marry", "plain-feet-stare", "wild-feet-carry", "wise-heads-buy"] } diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 3fe0bd004..610642b4c 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 7d1e14e1f..20fc284b0 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 5b8be8f5e..9dda5364d 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index a52fbaf62..5f20f458b 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index f9bbd0221..9ba2ad5f4 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 4213b9c6b..225211817 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 9d6927356..3ecd8814c 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index c2223e5ec..b025b75c8 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/identity-instrument", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 2f7d2965c..3978b95ac 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 7f5e55b87..03ec99a79 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index c022e666d..2b450ab82 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 6c3d16f9a..b454b44ae 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 534489253..f783d7ba3 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index f857e98fd..b31905d3a 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 80a2e8e84..c4e639bfd 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.5 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index ea532573e..9778d1e8e 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 0e290b2db..0079ca325 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1 +1,7 @@ # @0xsequence/userdata + +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 3911235c0..dedb4e953 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms Inc.", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index a5da76a67..447d70ed1 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index f2daad532..ac07e0f0a 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index df6cdca62..940b7e413 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.5 + - @0xsequence/relayer@3.0.0-beta.5 + - @0xsequence/wallet-primitives@3.0.0-beta.5 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index d589d77d3..682ed0d06 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index b8e29c92b..3c4d46618 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.5 + - @0xsequence/relayer@3.0.0-beta.5 + - @0xsequence/wallet-core@3.0.0-beta.5 + - @0xsequence/wallet-primitives@3.0.0-beta.5 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index ca91b6bfa..d67d1ea7d 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/dapp-client", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 4e61caf97..5e9e2c183 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 8edaea3f7..83f97b33c 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index e62bd6d4e..ea802f9c4 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.5 + +### Patch Changes + +- Beta release for v3 +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.5 + - @0xsequence/identity-instrument@3.0.0-beta.5 + - @0xsequence/relayer@3.0.0-beta.5 + - @0xsequence/wallet-core@3.0.0-beta.5 + - @0xsequence/wallet-primitives@3.0.0-beta.5 + ## 3.0.0-beta.4 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index b3e11398f..87d1a45a5 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/repo/eslint-config/CHANGELOG.md b/repo/eslint-config/CHANGELOG.md index 731374d7c..ddc6085a8 100644 --- a/repo/eslint-config/CHANGELOG.md +++ b/repo/eslint-config/CHANGELOG.md @@ -1,5 +1,11 @@ # @repo/eslint-config +## 0.0.1-beta.1 + +### Patch Changes + +- Beta release for v3 + ## 0.0.1-beta.0 ### Patch Changes diff --git a/repo/eslint-config/package.json b/repo/eslint-config/package.json index cf0fc8c91..7fa53be38 100644 --- a/repo/eslint-config/package.json +++ b/repo/eslint-config/package.json @@ -1,6 +1,6 @@ { "name": "@repo/eslint-config", - "version": "0.0.1-beta.0", + "version": "0.0.1-beta.1", "type": "module", "private": true, "exports": { diff --git a/repo/typescript-config/CHANGELOG.md b/repo/typescript-config/CHANGELOG.md index f986c7b4d..611dc70b2 100644 --- a/repo/typescript-config/CHANGELOG.md +++ b/repo/typescript-config/CHANGELOG.md @@ -1,5 +1,11 @@ # @repo/typescript-config +## 0.0.1-beta.1 + +### Patch Changes + +- Beta release for v3 + ## 0.0.1-beta.0 ### Patch Changes diff --git a/repo/typescript-config/package.json b/repo/typescript-config/package.json index d29b78054..cb34e9260 100644 --- a/repo/typescript-config/package.json +++ b/repo/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@repo/typescript-config", - "version": "0.0.1-beta.0", + "version": "0.0.1-beta.1", "private": true, "license": "MIT", "publishConfig": { diff --git a/repo/ui/CHANGELOG.md b/repo/ui/CHANGELOG.md index d5187f118..8994e0294 100644 --- a/repo/ui/CHANGELOG.md +++ b/repo/ui/CHANGELOG.md @@ -1,5 +1,11 @@ # @repo/ui +## 0.0.1-beta.1 + +### Patch Changes + +- Beta release for v3 + ## 0.0.1-beta.0 ### Patch Changes diff --git a/repo/ui/package.json b/repo/ui/package.json index 1100c4c0c..226eed0d9 100644 --- a/repo/ui/package.json +++ b/repo/ui/package.json @@ -1,6 +1,6 @@ { "name": "@repo/ui", - "version": "0.0.1-beta.0", + "version": "0.0.1-beta.1", "private": true, "exports": { "./button": "./src/button.tsx", 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 158/177] 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 68b7dfb9f..4a0d25921 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 159/177] 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 4a0d25921..426889c40 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 160/177] 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 8a0ffdf21..a3ed7f34b 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 161/177] 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 d88f6aab1..9873267da 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 162/177] 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 0d6a359ce..4a4e205f8 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 163/177] 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 b10524e42..d67d1ea7d 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 05e0a9171..87d1a45a5 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 17a890312..a81600c51 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 164/177] 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 b5b121c87..cdc7e2adb 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 165/177] 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 f761f0b2d..abadc74fd 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 166/177] 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 cdc7e2adb..3b57fed2b 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 a81600c51..a5a389f7d 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 167/177] 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 ff1a25baf..000000000 --- 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 168/177] 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 169/177] 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 c814fa1ae..af179055b 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 2adc7c5feb25e0e36a6a1dafc9add95167d39667 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Dec 2025 21:30:43 +0100 Subject: [PATCH 170/177] 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> --- extras/docs/package.json | 2 +- extras/web/package.json | 2 +- pnpm-lock.yaml | 90 ++++++++++++++++++++-------------------- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index f761f0b2d..abadc74fd 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" }, diff --git a/extras/web/package.json b/extras/web/package.json index b5b121c87..3b57fed2b 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.5.9", "react": "^19.1.0", "react-dom": "^19.1.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a81600c51..a5a389f7d 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 ccdafe66ac8f86c79868765a15000f92a5a435fc Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 16 Dec 2025 08:38:33 +0100 Subject: [PATCH 171/177] Pin foundry to v1.5.0 instead of nightly (#947) --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3003e531e..20d477729 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -30,7 +30,7 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: nightly + version: v1.5.0 - name: Start Anvil in background run: anvil --fork-url https://nodes.sequence.app/arbitrum & - run: pnpm build From ee064420adbc3bee6f191df64f427f8036c7983d Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Tue, 16 Dec 2025 09:51:33 -0500 Subject: [PATCH 172/177] 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 --- extras/docs/package.json | 18 +- extras/web/package.json | 18 +- package.json | 12 +- packages/services/api/package.json | 2 +- packages/services/builder/package.json | 2 +- packages/services/guard/package.json | 4 +- .../services/identity-instrument/package.json | 4 +- packages/services/indexer/package.json | 2 +- packages/services/marketplace/package.json | 2 +- packages/services/metadata/package.json | 2 +- packages/services/relayer/package.json | 4 +- packages/services/userdata/package.json | 2 +- packages/utils/abi/package.json | 2 +- packages/wallet/core/package.json | 6 +- packages/wallet/dapp-client/package.json | 8 +- packages/wallet/primitives-cli/package.json | 6 +- packages/wallet/primitives/package.json | 4 +- packages/wallet/wdk/package.json | 8 +- packages/wallet/wdk/src/sequence/manager.ts | 1 + .../wallet/wdk/test/authcode-pkce.test.ts | 8 +- packages/wallet/wdk/test/authcode.test.ts | 28 +- packages/wallet/wdk/test/constants.ts | 15 +- packages/wallet/wdk/test/guard.test.ts | 16 +- .../wallet/wdk/test/identity-auth-dbs.test.ts | 8 +- .../wallet/wdk/test/identity-signer.test.ts | 32 +- packages/wallet/wdk/test/messages.test.ts | 30 +- packages/wallet/wdk/test/otp.test.ts | 16 +- packages/wallet/wdk/test/passkeys.test.ts | 8 +- packages/wallet/wdk/test/recovery.test.ts | 12 +- packages/wallet/wdk/test/sessions.test.ts | 4 +- packages/wallet/wdk/test/setup.ts | 2 +- packages/wallet/wdk/test/transactions.test.ts | 78 +- packages/wallet/wdk/test/wallets.test.ts | 80 +- pnpm-lock.yaml | 2168 ++++++++--------- repo/eslint-config/package.json | 18 +- repo/ui/package.json | 14 +- 36 files changed, 1284 insertions(+), 1360 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index abadc74fd..29fbc4bc7 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -12,18 +12,18 @@ "clean": "rimraf .next" }, "dependencies": { - "@repo/ui": "workspace:*", + "@repo/ui": "workspace:^", "next": "^15.5.9", - "react": "^19.1.0", - "react-dom": "^19.1.0" + "react": "^19.2.3", + "react-dom": "^19.2.3" }, "devDependencies": { - "@repo/eslint-config": "workspace:*", - "@repo/typescript-config": "workspace:*", - "@types/node": "^20.17.57", - "@types/react": "^19.2.6", + "@repo/eslint-config": "workspace:^", + "@repo/typescript-config": "workspace:^", + "@types/node": "^25.0.2", + "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", - "eslint": "^9.28.0", - "typescript": "^5.8.3" + "eslint": "^9.39.2", + "typescript": "^5.9.3" } } diff --git a/extras/web/package.json b/extras/web/package.json index 3b57fed2b..b0b621e95 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -12,18 +12,18 @@ "clean": "rimraf .next" }, "dependencies": { - "@repo/ui": "workspace:*", + "@repo/ui": "workspace:^", "next": "^15.5.9", - "react": "^19.1.0", - "react-dom": "^19.1.0" + "react": "^19.2.3", + "react-dom": "^19.2.3" }, "devDependencies": { - "@repo/eslint-config": "workspace:*", - "@repo/typescript-config": "workspace:*", - "@types/node": "^20.17.57", - "@types/react": "^19.2.6", + "@repo/eslint-config": "workspace:^", + "@repo/typescript-config": "workspace:^", + "@types/node": "^25.0.2", + "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", - "eslint": "^9.28.0", - "typescript": "^5.8.3" + "eslint": "^9.39.2", + "typescript": "^5.9.3" } } diff --git a/package.json b/package.json index 483cd0936..53a8caae3 100644 --- a/package.json +++ b/package.json @@ -20,12 +20,12 @@ "deps:fix": "syncpack fix-mismatches" }, "devDependencies": { - "@changesets/cli": "^2.29.4", - "lefthook": "^2.0.4", - "prettier": "^3.5.3", + "@changesets/cli": "^2.29.8", + "lefthook": "^2.0.12", + "prettier": "^3.7.4", "rimraf": "^6.1.2", "syncpack": "^13.0.4", - "turbo": "^2.6.1", + "turbo": "^2.6.3", "typescript": "^5.9.3" }, "pnpm": { @@ -40,7 +40,9 @@ "syncpack": { "source": [ "package.json", - "packages/**/package.json" + "packages/**/package.json", + "extras/**/package.json", + "repo/**/package.json" ], "versionGroups": [ { diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 20fc284b0..dda4d0fd7 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3" } } diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 5f20f458b..a6da87826 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3" } } diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 225211817..542b9ee55 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -25,9 +25,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3", - "vitest": "^4.0.14" + "vitest": "^4.0.15" }, "dependencies": { "ox": "^0.9.17" diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index b025b75c8..dfdd56b3e 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -20,9 +20,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3", - "vitest": "^4.0.14" + "vitest": "^4.0.15" }, "dependencies": { "json-canonicalize": "^2.0.0", diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 03ec99a79..bb4ea0b6f 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3" } } diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index b454b44ae..47905f591 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3" } } diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index b31905d3a..5f30c7600 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3" } } diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 9778d1e8e..e87885932 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -27,9 +27,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3", - "vitest": "^4.0.14" + "vitest": "^4.0.15" }, "dependencies": { "@0xsequence/wallet-primitives": "workspace:^", diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index dedb4e953..36237bc95 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3" } } diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index ac07e0f0a..d2df92de1 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "typescript": "^5.9.3" } } diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 682ed0d06..8e58e5641 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -23,12 +23,12 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", - "@vitest/coverage-v8": "^4.0.14", + "@types/node": "^25.0.2", + "@vitest/coverage-v8": "^4.0.15", "dotenv": "^17.2.3", "fake-indexeddb": "^6.2.5", "typescript": "^5.9.3", - "vitest": "^4.0.14" + "vitest": "^4.0.15" }, "dependencies": { "@0xsequence/guard": "workspace:^", diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index d67d1ea7d..7ce4dae81 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -21,13 +21,13 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", - "@vitest/coverage-v8": "^4.0.14", + "@types/node": "^25.0.2", + "@vitest/coverage-v8": "^4.0.15", "dotenv": "^17.2.3", "fake-indexeddb": "^6.2.5", - "happy-dom": "^20.0.10", + "happy-dom": "^20.0.11", "typescript": "^5.9.3", - "vitest": "^4.0.14" + "vitest": "^4.0.15" }, "dependencies": { "@0xsequence/guard": "workspace:^", diff --git a/packages/wallet/primitives-cli/package.json b/packages/wallet/primitives-cli/package.json index ee00f2a2a..0a8c978d4 100644 --- a/packages/wallet/primitives-cli/package.json +++ b/packages/wallet/primitives-cli/package.json @@ -21,12 +21,12 @@ } }, "devDependencies": { - "@repo/eslint-config": "workspace:*", + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", + "@types/node": "^25.0.2", "@types/yargs": "^17.0.35", "concurrently": "^9.2.1", - "esbuild": "^0.27.0", + "esbuild": "^0.27.1", "nodemon": "^3.1.11", "typescript": "^5.9.3" }, diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 83f97b33c..3b1ffdbec 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -23,9 +23,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@vitest/coverage-v8": "^4.0.14", + "@vitest/coverage-v8": "^4.0.15", "typescript": "^5.9.3", - "vitest": "^4.0.14" + "vitest": "^4.0.15" }, "dependencies": { "ox": "^0.9.17" diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 87d1a45a5..2c0dc66e3 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -24,13 +24,13 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^24.10.1", - "@vitest/coverage-v8": "^4.0.14", + "@types/node": "^25.0.2", + "@vitest/coverage-v8": "^4.0.15", "dotenv": "^17.2.3", "fake-indexeddb": "^6.2.5", - "happy-dom": "^20.0.10", + "happy-dom": "^20.0.11", "typescript": "^5.9.3", - "vitest": "^4.0.14" + "vitest": "^4.0.15" }, "dependencies": { "@0xsequence/guard": "workspace:^", diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 9fe04d13c..a55059cbf 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -37,6 +37,7 @@ export type ManagerOptions = { extensions?: Extensions.Extensions context?: Context.Context + context4337?: Context.Context guest?: Address.Address encryptedPksDb?: CoreSigners.Pk.Encrypted.EncryptedPksDb diff --git a/packages/wallet/wdk/test/authcode-pkce.test.ts b/packages/wallet/wdk/test/authcode-pkce.test.ts index 2e62b8afd..c69e66d71 100644 --- a/packages/wallet/wdk/test/authcode-pkce.test.ts +++ b/packages/wallet/wdk/test/authcode-pkce.test.ts @@ -1,10 +1,10 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { Address, Hex, Bytes } from 'ox' import * as Identity from '@0xsequence/identity-instrument' -import { AuthCodePkceHandler } from '../src/sequence/handlers/authcode-pkce' -import { Signatures } from '../src/sequence/signatures' -import * as Db from '../src/dbs' -import { IdentitySigner } from '../src/identity/signer' +import { AuthCodePkceHandler } from '../src/sequence/handlers/authcode-pkce.js' +import { Signatures } from '../src/sequence/signatures.js' +import * as Db from '../src/dbs/index.js' +import { IdentitySigner } from '../src/identity/signer.js' describe('AuthCodePkceHandler', () => { let handler: AuthCodePkceHandler diff --git a/packages/wallet/wdk/test/authcode.test.ts b/packages/wallet/wdk/test/authcode.test.ts index 121a03348..4874e475b 100644 --- a/packages/wallet/wdk/test/authcode.test.ts +++ b/packages/wallet/wdk/test/authcode.test.ts @@ -2,11 +2,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { Address, Hex, Bytes } from 'ox' import { Network, Payload } from '@0xsequence/wallet-primitives' import { IdentityInstrument, IdentityType, KeyType, AuthCodeChallenge } from '@0xsequence/identity-instrument' -import { AuthCodeHandler } from '../src/sequence/handlers/authcode' -import { Signatures } from '../src/sequence/signatures' -import * as Db from '../src/dbs' -import { IdentitySigner } from '../src/identity/signer' -import { BaseSignatureRequest } from '../src/sequence/types/signature-request' +import { AuthCodeHandler } from '../src/sequence/handlers/authcode.js' +import { Signatures } from '../src/sequence/signatures.js' +import * as Db from '../src/dbs/index.js' +import { IdentitySigner } from '../src/identity/signer.js' +import { BaseSignatureRequest } from '../src/sequence/types/signature-request.js' // Mock the global crypto API const mockCryptoSubtle = { @@ -254,7 +254,7 @@ describe('AuthCodeHandler', () => { // Verify commitment was saved expect(mockAuthCommitmentsSet).toHaveBeenCalledOnce() - const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0] + const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.kind).toBe('google-pkce') expect(commitmentCall.signer).toBe(signer) @@ -279,7 +279,7 @@ describe('AuthCodeHandler', () => { const result = await authCodeHandler.commitAuth('/target', false, customState) // Verify commitment uses custom state - const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0] + const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.id).toBe(customState) expect(result).toContain(`state=${customState}`) }) @@ -287,7 +287,7 @@ describe('AuthCodeHandler', () => { it('Should generate random state when not provided', async () => { const result = await authCodeHandler.commitAuth('/target', false) - const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0] + const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.id).toBeDefined() expect(typeof commitmentCall.id).toBe('string') expect(commitmentCall.id.startsWith('0x')).toBe(true) @@ -316,7 +316,7 @@ describe('AuthCodeHandler', () => { it('Should create commitment without signer', async () => { const result = await authCodeHandler.commitAuth('/target', true) - const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0] + const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.signer).toBeUndefined() expect(commitmentCall.isSignUp).toBe(true) }) @@ -348,12 +348,12 @@ describe('AuthCodeHandler', () => { // Verify commitVerifier was called expect(mockCommitVerifier).toHaveBeenCalledOnce() - const commitVerifierCall = mockCommitVerifier.mock.calls[0] + const commitVerifierCall = mockCommitVerifier.mock.calls[0]! expect(commitVerifierCall[1]).toBeInstanceOf(AuthCodeChallenge) // Verify completeAuth was called expect(mockCompleteAuth).toHaveBeenCalledOnce() - const completeAuthCall = mockCompleteAuth.mock.calls[0] + const completeAuthCall = mockCompleteAuth.mock.calls[0]! expect(completeAuthCall[1]).toBeInstanceOf(AuthCodeChallenge) // Verify results @@ -490,7 +490,7 @@ describe('AuthCodeHandler', () => { expect(window.location.href).toContain('https://accounts.google.com/o/oauth2/v2/auth') expect(mockAuthCommitmentsSet).toHaveBeenCalledOnce() - const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0] + const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.target).toBe(window.location.pathname) expect(commitmentCall.isSignUp).toBe(false) expect(commitmentCall.signer).toBe(testWallet) @@ -711,14 +711,14 @@ describe('AuthCodeHandler', () => { // Test signup flow await authCodeHandler.commitAuth('/signup-target', true, 'signup-state') - const signupCall = mockAuthCommitmentsSet.mock.calls[0][0] + const signupCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(signupCall.isSignUp).toBe(true) expect(signupCall.target).toBe('/signup-target') // Test login flow await authCodeHandler.commitAuth('/login-target', false, 'login-state') - const loginCall = mockAuthCommitmentsSet.mock.calls[1][0] + const loginCall = mockAuthCommitmentsSet.mock.calls[1]![0]! expect(loginCall.isSignUp).toBe(false) expect(loginCall.target).toBe('/login-target') }) diff --git a/packages/wallet/wdk/test/constants.ts b/packages/wallet/wdk/test/constants.ts index 14b099614..01dff3b50 100644 --- a/packages/wallet/wdk/test/constants.ts +++ b/packages/wallet/wdk/test/constants.ts @@ -1,9 +1,10 @@ import { config as dotenvConfig } from 'dotenv' import { Abi, Address, Provider, RpcTransport } from 'ox' -import { Manager, ManagerOptions, ManagerOptionsDefaults } from '../src/sequence' -import { mockEthereum } from './setup' -import { Signers as CoreSigners, State, Relayer } from '@0xsequence/wallet-core' -import * as Db from '../src/dbs' +import { Manager, ManagerOptions, ManagerOptionsDefaults } from '../src/sequence/index.js' +import { mockEthereum } from './setup.js' +import { Signers as CoreSigners, State, Bundler } from '@0xsequence/wallet-core' +import { Relayer } from '@0xsequence/relayer' +import * as Db from '../src/dbs/index.js' import { Network } from '@0xsequence/wallet-primitives' const envFile = process.env.CI ? '.env.test' : '.env.test.local' @@ -81,16 +82,16 @@ export function newRemoteManager( : `_testrun_${testIdCounter}` let relayers: Relayer.Relayer[] = [] - let bundlers: Relayer.Bundler[] = [] + let bundlers: Bundler.Bundler[] = [] if (remoteManagerOptions.network.relayerPk) { const provider = Provider.from(RpcTransport.fromHttp(remoteManagerOptions.network.rpcUrl)) - relayers.push(new Relayer.Standard.PkRelayer(remoteManagerOptions.network.relayerPk as `0x${string}`, provider)) + relayers.push(new Relayer.PkRelayer(remoteManagerOptions.network.relayerPk as `0x${string}`, provider)) } if (remoteManagerOptions.network.bundlerUrl) { bundlers.push( - new Relayer.Bundlers.PimlicoBundler( + new Bundler.Bundlers.PimlicoBundler( remoteManagerOptions.network.bundlerUrl, Provider.from(RpcTransport.fromHttp(remoteManagerOptions.network.rpcUrl)), ), diff --git a/packages/wallet/wdk/test/guard.test.ts b/packages/wallet/wdk/test/guard.test.ts index 44e7e2cb5..8614de6c2 100644 --- a/packages/wallet/wdk/test/guard.test.ts +++ b/packages/wallet/wdk/test/guard.test.ts @@ -1,11 +1,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { Manager } from '../src/sequence' -import { GuardHandler } from '../src/sequence/handlers/guard' +import { Manager } from '../src/sequence/index.js' +import { GuardHandler } from '../src/sequence/handlers/guard.js' import { Address, Bytes, Hex, TypedData } from 'ox' 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' +import { Kinds } from '../src/sequence/types/signer.js' +import { newManager } from './constants.js' +import { GuardRole, Guards } from '../src/sequence/guards.js' // Mock fetch globally for guard API calls const mockFetch = vi.fn() @@ -163,7 +163,7 @@ describe('GuardHandler', () => { expect(result).toBe(true) expect(mockAddSignature).toHaveBeenCalledOnce() - const [requestId, signatureData] = mockAddSignature.mock.calls[0] + const [requestId, signatureData] = mockAddSignature.mock.calls[0]! expect(requestId).toBe('test-request-id') expect(signatureData.address).toBe(guards.getByRole('wallet').address) expect(signatureData.signature).toBeDefined() @@ -247,7 +247,7 @@ describe('GuardHandler', () => { expect(mockCallback).toHaveBeenCalledOnce() expect(mockAddSignature).toHaveBeenCalledOnce() - const [requestId, signatureData] = mockAddSignature.mock.calls[0] + const [requestId, signatureData] = mockAddSignature.mock.calls[0]! expect(requestId).toBe('test-request-id') expect(signatureData.address).toBe(guards.getByRole('wallet').address) expect(signatureData.signature).toBeDefined() @@ -300,7 +300,7 @@ describe('GuardHandler', () => { signatures: [], }) - expect(mockFetch.mock.calls[0][0]).toContain(customGuardUrl) + expect(mockFetch.mock.calls[0]![0]).toContain(customGuardUrl) await customManager.stop() }) diff --git a/packages/wallet/wdk/test/identity-auth-dbs.test.ts b/packages/wallet/wdk/test/identity-auth-dbs.test.ts index 43f6e0b5b..eccc8b885 100644 --- a/packages/wallet/wdk/test/identity-auth-dbs.test.ts +++ b/packages/wallet/wdk/test/identity-auth-dbs.test.ts @@ -1,9 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { Manager } from '../src/sequence' -import { Address, Hex, Bytes } from 'ox' -import { IdentityInstrument } from '@0xsequence/identity-instrument' -import * as Db from '../src/dbs' -import { LOCAL_RPC_URL } from './constants' +import { Manager } from '../src/sequence/index.js' +import * as Db from '../src/dbs/index.js' +import { LOCAL_RPC_URL } from './constants.js' import { State } from '@0xsequence/wallet-core' import { Network } from '@0xsequence/wallet-primitives' diff --git a/packages/wallet/wdk/test/identity-signer.test.ts b/packages/wallet/wdk/test/identity-signer.test.ts index 5eb9c42b4..9d62f5719 100644 --- a/packages/wallet/wdk/test/identity-signer.test.ts +++ b/packages/wallet/wdk/test/identity-signer.test.ts @@ -1,10 +1,10 @@ -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { Address, Hex, Bytes } from 'ox' +import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest' +import { Address, Bytes, Hex } from 'ox' import { Network, Payload } from '@0xsequence/wallet-primitives' import { IdentityInstrument, KeyType } from '@0xsequence/identity-instrument' import { State } from '@0xsequence/wallet-core' -import { IdentitySigner, toIdentityAuthKey } from '../src/identity/signer' -import { AuthKey } from '../src/dbs/auth-keys' +import { IdentitySigner, toIdentityAuthKey } from '../src/identity/signer.js' +import { AuthKey } from '../src/dbs/auth-keys.js' // Mock the global crypto API const mockCryptoSubtle = { @@ -31,7 +31,7 @@ describe('Identity Signer', () => { let testAuthKey: AuthKey let testWallet: Address.Address let mockStateWriter: State.Writer - let mockSignFn: ReturnType + let mockSignFn: Mock beforeEach(() => { vi.clearAllMocks() @@ -179,7 +179,7 @@ describe('Identity Signer', () => { // Verify that identityInstrument.sign was called with correct parameters expect(mockSignFn).toHaveBeenCalledOnce() - const [authKeyArg, digestArg] = mockSignFn.mock.calls[0] + const [authKeyArg, digestArg] = mockSignFn.mock.calls[0]! expect(authKeyArg.address).toBe(testAuthKey.address) expect(authKeyArg.signer).toBe(testAuthKey.identitySigner) expect(digestArg).toBeDefined() @@ -196,7 +196,7 @@ describe('Identity Signer', () => { expect(mockSignFn).toHaveBeenCalledOnce() // The digest should be different for different chainIds - const [, digestArg] = mockSignFn.mock.calls[0] + const [, digestArg] = mockSignFn.mock.calls[0]! expect(digestArg).toBeDefined() }) @@ -255,7 +255,7 @@ describe('Identity Signer', () => { } expect(mockSignFn).toHaveBeenCalledOnce() - const [authKeyArg, digestArg] = mockSignFn.mock.calls[0] + const [authKeyArg, digestArg] = mockSignFn.mock.calls[0]! expect(authKeyArg.address).toBe(testAuthKey.address) expect(digestArg).toBe(digest) }) @@ -295,7 +295,7 @@ describe('Identity Signer', () => { it('Should handle malformed signature from identity instrument', async () => { const digest = Hex.toBytes('0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef') - mockSignFn.mockResolvedValueOnce('invalid-signature') + mockSignFn.mockResolvedValueOnce('invalid-signature' as any) await expect(identitySigner.signDigest(digest)).rejects.toThrow() // Should throw when Signature.fromHex fails }) @@ -317,7 +317,7 @@ describe('Identity Signer', () => { // Verify witness was saved expect(mockSaveWitnesses).toHaveBeenCalledOnce() - const [wallet, chainId, payload, witness] = mockSaveWitnesses.mock.calls[0] + const [wallet, chainId, payload, witness] = mockSaveWitnesses.mock.calls[0]! expect(wallet).toBe(testWallet) expect(chainId).toBe(0) // Witness signatures use chainId 0 @@ -338,7 +338,7 @@ describe('Identity Signer', () => { await identitySigner.witness(mockStateWriter, testWallet) // Extract the payload that was signed - const [, , payload] = mockSaveWitnesses.mock.calls[0] + const [, , payload] = mockSaveWitnesses.mock.calls[0]! // Parse the message content to verify consent structure const messageHex = payload.message @@ -367,7 +367,7 @@ describe('Identity Signer', () => { await identitySigner.witness(mockStateWriter, testWallet, extraData) // Extract and verify extra data was included - const [, , payload] = mockSaveWitnesses.mock.calls[0] + const [, , payload] = mockSaveWitnesses.mock.calls[0]! const messageString = Hex.toString(payload.message) const consentData = JSON.parse(messageString) @@ -435,7 +435,7 @@ describe('Identity Signer', () => { expect(mockSaveWitnesses).toHaveBeenCalledOnce() // Verify witness payload includes extra context - const [, , witnessPayload] = mockSaveWitnesses.mock.calls[0] + const [, , witnessPayload] = mockSaveWitnesses.mock.calls[0]! const witnessMessage = JSON.parse(Hex.toString(witnessPayload.message)) expect(witnessMessage.signatureId).toBe('sig-123') expect(witnessMessage.purpose).toBe('authentication') @@ -469,8 +469,8 @@ describe('Identity Signer', () => { expect(mockSignFn).toHaveBeenCalledTimes(2) // Verify different payloads produce different hashes - const [, messageDigest] = mockSignFn.mock.calls[0] - const [, transactionDigest] = mockSignFn.mock.calls[1] + const [, messageDigest] = mockSignFn.mock.calls[0]! + const [, transactionDigest] = mockSignFn.mock.calls[1]! expect(messageDigest).not.toEqual(transactionDigest) }) }) @@ -500,7 +500,7 @@ describe('Identity Signer', () => { it('Should handle malformed hex signatures', async () => { const digest = Hex.toBytes('0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef') - mockSignFn.mockResolvedValueOnce('not-a-hex-string') + mockSignFn.mockResolvedValueOnce('not-a-hex-string' as any) await expect(identitySigner.signDigest(digest)).rejects.toThrow() }) diff --git a/packages/wallet/wdk/test/messages.test.ts b/packages/wallet/wdk/test/messages.test.ts index 9420ca000..32d68ffe5 100644 --- a/packages/wallet/wdk/test/messages.test.ts +++ b/packages/wallet/wdk/test/messages.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest' -import { Manager, SignerActionable } from '../src/sequence' +import { Manager, SignerActionable } from '../src/sequence/index.js' import { Mnemonic } from 'ox' -import { newManager } from './constants' +import { newManager } from './constants.js' import { Network } from '@0xsequence/wallet-primitives' describe('Messages', () => { @@ -41,12 +41,13 @@ describe('Messages', () => { // Verify message appears in list const messages = await manager.messages.list() expect(messages.length).toBe(1) - expect(messages[0].wallet).toBe(wallet) - expect(messages[0].message).toBe(testMessage) - expect(messages[0].status).toBe('requested') - expect(messages[0].signatureId).toBe(signatureId) - expect(messages[0].source).toBe('unknown') - expect(messages[0].id).toBeDefined() + const message = messages[0]! + expect(message.wallet).toBe(wallet) + expect(message.message).toBe(testMessage) + expect(message.status).toBe('requested') + expect(message.signatureId).toBe(signatureId) + expect(message.source).toBe('unknown') + expect(message.id).toBeDefined() }) it('Should create message request with custom source', async () => { @@ -63,8 +64,11 @@ describe('Messages', () => { const messages = await manager.messages.list() expect(messages.length).toBe(1) - expect(messages[0].source).toBe(customSource) - expect(messages[0].message).toBe(testMessage) + + const message = messages[0]! + + expect(message.source).toBe(customSource) + expect(message.message).toBe(testMessage) }) it('Should get message by ID', async () => { @@ -79,7 +83,7 @@ describe('Messages', () => { const messages = await manager.messages.list() expect(messages.length).toBe(1) - const messageId = messages[0].id + const messageId = messages[0]!.id // Get by message ID const retrievedMessage = await manager.messages.get(messageId) @@ -269,7 +273,7 @@ describe('Messages', () => { const signatureId = await manager.messages.request(wallet!, testMessage) const messages = await manager.messages.list() - const messageId = messages[0].id + const messageId = messages[0]!.id let updateCallCount = 0 let lastMessage: any @@ -315,7 +319,7 @@ describe('Messages', () => { await manager.messages.request(wallet!, testMessage) const messages = await manager.messages.list() - const messageId = messages[0].id + const messageId = messages[0]!.id let callCount = 0 let receivedMessage: any diff --git a/packages/wallet/wdk/test/otp.test.ts b/packages/wallet/wdk/test/otp.test.ts index 1ad450227..f3ae45209 100644 --- a/packages/wallet/wdk/test/otp.test.ts +++ b/packages/wallet/wdk/test/otp.test.ts @@ -1,13 +1,13 @@ -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest' import { Address, Hex } from 'ox' import { Network, Payload } from '@0xsequence/wallet-primitives' import { IdentityInstrument, IdentityType, KeyType, OtpChallenge } from '@0xsequence/identity-instrument' -import { OtpHandler } from '../src/sequence/handlers/otp' -import { Signatures } from '../src/sequence/signatures' -import * as Db from '../src/dbs' -import { IdentitySigner } from '../src/identity/signer' -import { BaseSignatureRequest } from '../src/sequence/types/signature-request' -import { Kinds } from '../src/sequence/types/signer' +import { OtpHandler, PromptOtpHandler } from '../src/sequence/handlers/otp.js' +import { Signatures } from '../src/sequence/signatures.js' +import * as Db from '../src/dbs/index.js' +import { IdentitySigner } from '../src/identity/signer.js' +import { BaseSignatureRequest } from '../src/sequence/types/signature-request.js' +import { Kinds } from '../src/sequence/types/signer.js' // Mock the global crypto API const mockCryptoSubtle = { @@ -69,7 +69,7 @@ describe('OtpHandler', () => { let otpHandler: OtpHandler let testWallet: Address.Address let testRequest: BaseSignatureRequest - let mockPromptOtp: ReturnType + let mockPromptOtp: Mock beforeEach(() => { vi.clearAllMocks() diff --git a/packages/wallet/wdk/test/passkeys.test.ts b/packages/wallet/wdk/test/passkeys.test.ts index 857258c23..199265822 100644 --- a/packages/wallet/wdk/test/passkeys.test.ts +++ b/packages/wallet/wdk/test/passkeys.test.ts @@ -3,10 +3,10 @@ import { Address, Hex } from 'ox' import { Network, Payload } from '@0xsequence/wallet-primitives' import { Signers, State } from '@0xsequence/wallet-core' import { Extensions } from '@0xsequence/wallet-primitives' -import { PasskeysHandler } from '../src/sequence/handlers/passkeys' -import { Signatures } from '../src/sequence/signatures' -import { BaseSignatureRequest } from '../src/sequence/types/signature-request' -import { Kinds } from '../src/sequence/types/signer' +import { PasskeysHandler } from '../src/sequence/handlers/passkeys.js' +import { Signatures } from '../src/sequence/signatures.js' +import { BaseSignatureRequest } from '../src/sequence/types/signature-request.js' +import { Kinds } from '../src/sequence/types/signer.js' // Mock dependencies with proper vi.fn() types const mockAddSignature = vi.fn() diff --git a/packages/wallet/wdk/test/recovery.test.ts b/packages/wallet/wdk/test/recovery.test.ts index 9401260ab..3ca6da075 100644 --- a/packages/wallet/wdk/test/recovery.test.ts +++ b/packages/wallet/wdk/test/recovery.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from 'vitest' -import { Manager, QueuedRecoveryPayload, SignerReady, TransactionDefined } from '../src/sequence' +import { QueuedRecoveryPayload, SignerReady, TransactionDefined } from '../src/sequence/index.js' import { Bytes, Hex, Mnemonic, Provider, RpcTransport } from 'ox' import { Network, Payload } from '@0xsequence/wallet-primitives' -import { LOCAL_RPC_URL, newManager } from './constants' +import { LOCAL_RPC_URL, newManager } from './constants.js' describe('Recovery', () => { it('Should execute a recovery', async () => { @@ -159,7 +159,7 @@ describe('Recovery', () => { expect(tx.status).toBe('defined') expect((tx as TransactionDefined).relayerOptions.length).toBe(1) - const localRelayer = (tx as TransactionDefined).relayerOptions[0] + const localRelayer = (tx as TransactionDefined).relayerOptions[0]! expect(localRelayer).toBeDefined() expect(localRelayer.relayerId).toBe('local') @@ -332,7 +332,7 @@ describe('Recovery', () => { expect(Array.isArray(fetchedPayloads)).toBeTruthy() expect(fetchedPayloads.length).toBe(1) - const fetchedPayload = fetchedPayloads[0] + const fetchedPayload = fetchedPayloads[0]! expect(fetchedPayload).toBeDefined() expect(fetchedPayload.wallet).toBe(wallet) expect(fetchedPayload.chainId).toBe(Network.ChainId.ARBITRUM) @@ -390,8 +390,8 @@ describe('Recovery', () => { expect(updatedPayloads.length).toBe(fetchedPayloads2.length) if (updatedPayloads.length > 0 && fetchedPayloads.length > 0) { - const updated = updatedPayloads[0] - const fetched = fetchedPayloads[0] + const updated = updatedPayloads[0]! + const fetched = fetchedPayloads[0]! expect(updated.id).toBe(fetched.id) expect(updated.wallet).toBe(fetched.wallet) diff --git a/packages/wallet/wdk/test/sessions.test.ts b/packages/wallet/wdk/test/sessions.test.ts index 4e3c9a2ca..98a762d3e 100644 --- a/packages/wallet/wdk/test/sessions.test.ts +++ b/packages/wallet/wdk/test/sessions.test.ts @@ -4,7 +4,7 @@ import { Signers as CoreSigners, Wallet as CoreWallet, Envelope, State } from '. import { ExplicitSession } from '../../core/src/utils/session/types.js' import { Context, Extensions, Network, Payload, Permission } from '../../primitives/src/index.js' import { Sequence } from '../src/index.js' -import { EMITTER_ABI, EMITTER_ADDRESS, LOCAL_RPC_URL } from './constants' +import { EMITTER_ABI, EMITTER_ADDRESS, LOCAL_RPC_URL } from './constants.js' const ALL_EXTENSIONS: { name: string @@ -402,7 +402,7 @@ for (const extension of ALL_EXTENSIONS) { // 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' + explicitSession.permissions[0]!.target = '0x0000000000000000000000000000000000000000' await setupExplicitSession(explicitSession, true) diff --git a/packages/wallet/wdk/test/setup.ts b/packages/wallet/wdk/test/setup.ts index 70482040c..4aa336a55 100644 --- a/packages/wallet/wdk/test/setup.ts +++ b/packages/wallet/wdk/test/setup.ts @@ -14,7 +14,7 @@ import { } from 'fake-indexeddb' import { Provider, RpcTransport } from 'ox' import { vi } from 'vitest' -import { LOCAL_RPC_URL } from './constants' +import { LOCAL_RPC_URL } from './constants.js' // Add IndexedDB support to the test environment using fake-indexeddb global.indexedDB = indexedDB diff --git a/packages/wallet/wdk/test/transactions.test.ts b/packages/wallet/wdk/test/transactions.test.ts index 91bffa56a..910511e7a 100644 --- a/packages/wallet/wdk/test/transactions.test.ts +++ b/packages/wallet/wdk/test/transactions.test.ts @@ -1,7 +1,13 @@ import { afterEach, describe, expect, it, vi } from 'vitest' -import { Manager, SignerActionable, Transaction, TransactionDefined, TransactionRelayed } from '../src/sequence' +import { + Manager, + SignerActionable, + Transaction, + TransactionDefined, + TransactionRelayed, +} from '../src/sequence/index.js' import { Address, Hex, Mnemonic, Provider, RpcTransport } from 'ox' -import { LOCAL_RPC_URL, newManager } from './constants' +import { LOCAL_RPC_URL, newManager } from './constants.js' import { Payload, Network } from '@0xsequence/wallet-primitives' describe('Transactions', () => { @@ -48,9 +54,9 @@ describe('Transactions', () => { } expect(tx.relayerOptions.length).toBe(1) - expect(tx.relayerOptions[0].id).toBeDefined() + expect(tx.relayerOptions[0]!.id).toBeDefined() - const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0].id) + const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0]!.id) expect(sigId).toBeDefined() tx = await manager.transactions.get(txId!) @@ -161,9 +167,9 @@ describe('Transactions', () => { } expect(tx.relayerOptions.length).toBe(1) - expect(tx.relayerOptions[0].id).toBeDefined() + expect(tx.relayerOptions[0]!.id).toBeDefined() - const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0].id) + const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0]!.id) expect(sigId).toBeDefined() tx = await manager.transactions.get(txId!) @@ -230,11 +236,12 @@ describe('Transactions', () => { expect(calledTimes).toBe(1) expect(transactions.length).toBe(1) - expect(transactions[0].status).toBe('requested') - expect(transactions[0].wallet).toBe(wallet!) - expect(transactions[0].requests.length).toBe(1) - expect(transactions[0].requests[0].to).toEqual(to) - expect(transactions[0].requests[0].value).toEqual(9n) + const tx = transactions[0]! + expect(tx.status).toBe('requested') + expect(tx.wallet).toBe(wallet!) + expect(tx.requests.length).toBe(1) + expect(tx.requests[0]!.to).toEqual(to) + expect(tx.requests[0]!.value).toEqual(9n) }) it('Should call onTransactionUpdate when a transaction is defined, relayer selected and relayed', async () => { @@ -273,12 +280,12 @@ describe('Transactions', () => { expect(tx!.status).toBe('defined') expect(tx!.wallet).toBe(wallet!) expect(tx!.requests.length).toBe(1) - expect(tx!.requests[0].to).toEqual(to) - expect(tx!.requests[0].value).toBeUndefined() - expect(tx!.requests[0].gasLimit).toBeUndefined() - expect(tx!.requests[0].data).toBeUndefined() + expect(tx!.requests[0]!.to).toEqual(to) + expect(tx!.requests[0]!.value).toBeUndefined() + expect(tx!.requests[0]!.gasLimit).toBeUndefined() + expect(tx!.requests[0]!.data).toBeUndefined() - const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0].id) + const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0]!.id) expect(sigId).toBeDefined() while (calledTimes < 2) { @@ -374,7 +381,7 @@ describe('Transactions', () => { expect(tx).toBeDefined() expect(tx!.status).toBe('defined') - const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0].id) + const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0]!.id) expect(sigId).toBeDefined() await manager.transactions.delete(txId!) @@ -433,12 +440,12 @@ describe('Transactions', () => { // The first call should be to the random address // and the second one should be a call to self - const call1 = (tx.envelope.payload as Payload.Calls).calls[0] - const call2 = (tx.envelope.payload as Payload.Calls).calls[1] + const call1 = (tx.envelope.payload as Payload.Calls).calls[0]! + const call2 = (tx.envelope.payload as Payload.Calls).calls[1]! expect(call1.to).toEqual(randomAddress) expect(call2.to).toEqual(wallet) - const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0].id) + const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0]!.id) expect(sigId).toBeDefined() tx = await manager.transactions.get(txId!) @@ -540,9 +547,10 @@ describe('Transactions', () => { // Should now have one transaction expect(transactionsList.length).toBe(1) - expect(transactionsList[0].id).toBe(txId) - expect(transactionsList[0].status).toBe('requested') - expect(transactionsList[0].wallet).toBe(wallet) + const tx = transactionsList[0]! + expect(tx.id).toBe(txId) + expect(tx.status).toBe('requested') + expect(tx.wallet).toBe(wallet) unsubscribe() }) @@ -577,7 +585,7 @@ describe('Transactions', () => { expect(callCount).toBe(1) expect(receivedTransactions.length).toBe(1) - expect(receivedTransactions[0].id).toBe(txId) + expect(receivedTransactions[0]!.id).toBe(txId) unsubscribe() }) @@ -697,8 +705,8 @@ describe('Transactions', () => { const tx = await manager.transactions.get(txId) expect(tx.status).toBe('defined') - expect(tx.envelope.payload.calls[0].gasLimit).toBe(50000n) - expect(tx.envelope.payload.calls[1].gasLimit).toBe(75000n) + expect(tx.envelope.payload.calls[0]!.gasLimit).toBe(50000n) + expect(tx.envelope.payload.calls[1]!.gasLimit).toBe(75000n) }) it('Should throw error when defining transaction not in requested state', async () => { @@ -780,8 +788,8 @@ describe('Transactions', () => { expect(tx.status).toBe('requested') expect(tx.source).toBe('test-dapp') expect(tx.envelope.payload.space).toBe(customSpace) - expect(tx.requests[0].data).toBe('0x1234') - expect(tx.requests[0].gasLimit).toBe(21000n) + expect(tx.requests[0]!.data).toBe('0x1234') + expect(tx.requests[0]!.gasLimit).toBe(21000n) }) it('Should throw error for unknown network', async () => { @@ -820,12 +828,12 @@ describe('Transactions', () => { const tx = await manager.transactions.get(txId) expect(tx.status).toBe('requested') - expect(tx.envelope.payload.calls[0].value).toBe(0n) - expect(tx.envelope.payload.calls[0].data).toBe('0x') - expect(tx.envelope.payload.calls[0].gasLimit).toBe(0n) - expect(tx.envelope.payload.calls[0].delegateCall).toBe(false) - expect(tx.envelope.payload.calls[0].onlyFallback).toBe(false) - expect(tx.envelope.payload.calls[0].behaviorOnError).toBe('revert') + expect(tx.envelope.payload.calls[0]!.value).toBe(0n) + expect(tx.envelope.payload.calls[0]!.data).toBe('0x') + expect(tx.envelope.payload.calls[0]!.gasLimit).toBe(0n) + expect(tx.envelope.payload.calls[0]!.delegateCall).toBe(false) + expect(tx.envelope.payload.calls[0]!.onlyFallback).toBe(false) + expect(tx.envelope.payload.calls[0]!.behaviorOnError).toBe('revert') }) it('Should handle relay with signature ID instead of transaction ID', async () => { @@ -856,7 +864,7 @@ describe('Transactions', () => { throw new Error('Transaction not defined') } - const sigId = await manager.transactions.selectRelayer(txId, tx.relayerOptions[0].id) + const sigId = await manager.transactions.selectRelayer(txId, tx.relayerOptions[0]!.id) // Sign the transaction const sigRequest = await manager.signatures.get(sigId) diff --git a/packages/wallet/wdk/test/wallets.test.ts b/packages/wallet/wdk/test/wallets.test.ts index ec3265b50..99e71d73d 100644 --- a/packages/wallet/wdk/test/wallets.test.ts +++ b/packages/wallet/wdk/test/wallets.test.ts @@ -1,7 +1,7 @@ import { afterEach, describe, expect, it } from 'vitest' -import { Manager, SignerActionable, SignerReady } from '../src/sequence' +import { Manager, SignerActionable, SignerReady } from '../src/sequence/index.js' import { Mnemonic, Address } from 'ox' -import { newManager } from './constants' +import { newManager } from './constants.js' import { Config, Constants, Network } from '@0xsequence/wallet-primitives' describe('Wallets', () => { @@ -65,7 +65,7 @@ describe('Wallets', () => { const walletsAfterFirst = await manager.wallets.list() expect(walletsAfterFirst.length).toBe(1) - expect(walletsAfterFirst[0].address).toBe(wallet1) + expect(walletsAfterFirst[0]!.address).toBe(wallet1) }) // === WALLET SELECTOR REGISTRATION === @@ -283,14 +283,14 @@ describe('Wallets', () => { expect(config.devices).toBeDefined() expect(config.devices.length).toBe(1) - expect(config.devices[0].kind).toBe('local-device') - expect(config.devices[0].address).toBeDefined() + expect(config.devices[0]!.kind).toBe('local-device') + expect(config.devices[0]!.address).toBeDefined() expect(config.login).toBeDefined() expect(config.login.length).toBe(1) - expect(config.login[0].kind).toBe('login-mnemonic') + expect(config.login[0]!.kind).toBe('login-mnemonic') - expect(config.guard).not.toBeDefined() // No guard for noGuard: true + expect(config.walletGuard).not.toBeDefined() // No guard for noGuard: true expect(config.raw).toBeDefined() expect(config.raw.loginTopology).toBeDefined() @@ -319,7 +319,9 @@ describe('Wallets', () => { Config.findSignerLeaf(config.raw.guardTopology!, Constants.PlaceholderAddress as Address.Address), ).toBeUndefined() - const sessionsModule = config.raw.modules.find((m) => Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress)) + const sessionsModule = config.raw.modules.find((m: any) => + Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress), + ) expect(sessionsModule?.guardLeaf).toBeDefined() expect(Config.findSignerLeaf(sessionsModule!.guardLeaf!, sessionsGuardAddress)).toBeDefined() expect( @@ -360,7 +362,9 @@ describe('Wallets', () => { ).toBeUndefined() const sessionsModuleAddress = (manager as any).shared.sequence.extensions.sessions - const sessionsModule = config.raw.modules.find((m) => Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress)) + const sessionsModule = config.raw.modules.find((m: any) => + Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress), + ) expect(sessionsModule?.guardLeaf).toBeDefined() expect(Config.findSignerLeaf(sessionsModule!.guardLeaf!, sessionsGuardAddress)).toBeDefined() }) @@ -406,7 +410,7 @@ describe('Wallets', () => { const mnemonic = Mnemonic.random(Mnemonic.english) await manager.wallets.signUp({ mnemonic, kind: 'mnemonic', noGuard: true }) - await manager.wallets.logout(await manager.wallets.list().then((w) => w[0].address), { skipRemoveDevice: true }) + await manager.wallets.logout(await manager.wallets.list().then((w) => w[0]!.address), { skipRemoveDevice: true }) const invalidSelector = async () => 'invalid-result' as any manager.wallets.registerWalletSelector(invalidSelector) @@ -426,7 +430,7 @@ describe('Wallets', () => { const wallets = await manager.wallets.list() expect(wallets.length).toBe(1) - expect(wallets[0].address).toBe(wallet!) + expect(wallets[0]!.address).toBe(wallet!) const requestId = await manager.wallets.logout(wallet!) expect(requestId).toBeDefined() @@ -466,16 +470,16 @@ describe('Wallets', () => { const wallets = await manager.wallets.list() expect(wallets.length).toBe(1) - expect(wallets[0].address).toBe(wallet!) - expect(wallets[0].status).toBe('ready') + expect(wallets[0]!.address).toBe(wallet!) + expect(wallets[0]!.status).toBe('ready') const requestId = await manager.wallets.logout(wallet!) expect(requestId).toBeDefined() const wallets2 = await manager.wallets.list() expect(wallets2.length).toBe(1) - expect(wallets2[0].address).toBe(wallet!) - expect(wallets2[0].status).toBe('logging-out') + expect(wallets2[0]!.address).toBe(wallet!) + expect(wallets2[0]!.status).toBe('logging-out') const request = await manager.signatures.get(requestId) expect(request).toBeDefined() @@ -511,8 +515,8 @@ describe('Wallets', () => { const wallets = await manager.wallets.list() expect(wallets.length).toBe(1) - expect(wallets[0].address).toBe(wallet!) - expect(wallets[0].status).toBe('logging-in') + expect(wallets[0]!.address).toBe(wallet!) + expect(wallets[0]!.status).toBe('logging-in') let signRequests = 0 const unregistedUI = manager.registerMnemonicUI(async (respond) => { @@ -539,8 +543,8 @@ describe('Wallets', () => { expect((await manager.signatures.get(requestId1!))?.status).toBe('completed') const wallets2 = await manager.wallets.list() expect(wallets2.length).toBe(1) - expect(wallets2[0].address).toBe(wallet!) - expect(wallets2[0].status).toBe('ready') + expect(wallets2[0]!.address).toBe(wallet!) + expect(wallets2[0]!.status).toBe('ready') // The wallet should have 2 device keys and 2 recovery keys const config = await manager.wallets.getConfiguration(wallet!) @@ -560,7 +564,7 @@ describe('Wallets', () => { const wallets = await manager.wallets.list() expect(wallets.length).toBe(1) - expect(wallets[0].address).toBe(wallet!) + expect(wallets[0]!.address).toBe(wallet!) const requestId = await manager.wallets.logout(wallet!) expect(requestId).toBeDefined() @@ -609,7 +613,7 @@ describe('Wallets', () => { expect((await manager.signatures.get(requestId2!))?.status).toBe('completed') const wallets3 = await manager.wallets.list() expect(wallets3.length).toBe(1) - expect(wallets3[0].address).toBe(wallet!) + expect(wallets3[0]!.address).toBe(wallet!) // The wallet should have a single device key and a single recovery key const config = await manager.wallets.getConfiguration(wallet!) @@ -618,10 +622,10 @@ describe('Wallets', () => { expect(recovery?.length).toBe(1) // The kind of the device key should be 'local-device' - expect(config.devices[0].kind).toBe('local-device') + expect(config.devices[0]!.kind).toBe('local-device') // The kind of the recovery key should be 'local-recovery' - expect(recovery?.[0].kind).toBe('local-device') + expect(recovery?.[0]!.kind).toBe('local-device') }) it('Should fail to logout from a non-existent wallet', async () => { @@ -672,8 +676,8 @@ describe('Wallets', () => { const wallets = await manager.wallets.list() expect(wallets.length).toBe(1) - expect(wallets[0].address).toBe(wallet!) - expect(wallets[0].status).toBe('logging-in') + expect(wallets[0]!.address).toBe(wallet!) + expect(wallets[0]!.status).toBe('logging-in') const request = await manager.signatures.get(requestId!) expect(request).toBeDefined() @@ -695,8 +699,8 @@ describe('Wallets', () => { expect((await manager.signatures.get(requestId!))?.status).toBe('completed') const wallets2 = await manager.wallets.list() expect(wallets2.length).toBe(1) - expect(wallets2[0].address).toBe(wallet!) - expect(wallets2[0].status).toBe('ready') + expect(wallets2[0]!.address).toBe(wallet!) + expect(wallets2[0]!.status).toBe('ready') }) it('Should trigger an update when a wallet is logged in', async () => { @@ -711,8 +715,8 @@ describe('Wallets', () => { unregisterCallback = manager.wallets.onWalletsUpdate((wallets) => { callbackCalls++ expect(wallets.length).toBe(1) - expect(wallets[0].address).toBe(wallet!) - expect(wallets[0].status).toBe('ready') + expect(wallets[0]!.address).toBe(wallet!) + expect(wallets[0]!.status).toBe('ready') resolve() }) }) @@ -773,8 +777,8 @@ describe('Wallets', () => { unregisterCallback = manager.wallets.onWalletsUpdate((wallets) => { callbackCalls++ expect(wallets.length).toBe(1) - expect(wallets[0].address).toBe(wallet!) - expect(wallets[0].status).toBe('logging-out') + expect(wallets[0]!.address).toBe(wallet!) + expect(wallets[0]!.status).toBe('logging-out') resolve() }) }) @@ -796,9 +800,9 @@ describe('Wallets', () => { const devices = await manager.wallets.listDevices(wallet!) expect(devices.length).toBe(1) - expect(devices[0].address).not.toBe(wallet) - expect(devices[0].isLocal).toBe(true) expect(devices[0]).toBeDefined() + expect(devices[0]!.address).not.toBe(wallet) + expect(devices[0]!.isLocal).toBe(true) }) it('Should list all active devices for a wallet, including a new remote device', async () => { @@ -816,8 +820,8 @@ describe('Wallets', () => { // Verify initial state from Device 1's perspective const devices1 = await managerDevice1.wallets.listDevices(wallet!) expect(devices1.length).toBe(1) - expect(devices1[0].isLocal).toBe(true) - const device1Address = devices1[0].address + expect(devices1[0]!.isLocal).toBe(true) + const device1Address = devices1[0]!.address // Wallet logs in on device 2 const managerDevice2 = newManager(undefined, undefined, 'device-2') @@ -934,8 +938,8 @@ describe('Wallets', () => { const finalDevices = await managerDevice1.wallets.listDevices(wallet!) console.log('Final devices', finalDevices) expect(finalDevices.length).toBe(1) - expect(finalDevices[0].isLocal).toBe(true) - expect(finalDevices[0].address).not.toBe(device2Address) + expect(finalDevices[0]!.isLocal).toBe(true) + expect(finalDevices[0]!.address).not.toBe(device2Address) await managerDevice1.stop() await managerDevice2.stop() @@ -952,7 +956,7 @@ describe('Wallets', () => { const devices = await manager.wallets.listDevices(wallet!) expect(devices.length).toBe(1) - const localDeviceAddress = devices[0].address + const localDeviceAddress = devices[0]!.address const remoteLogoutPromise = manager.wallets.remoteLogout(wallet!, localDeviceAddress) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5a389f7d..fdbb822b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,14 +12,14 @@ importers: .: devDependencies: '@changesets/cli': - specifier: ^2.29.4 - version: 2.29.7(@types/node@24.10.1) + specifier: ^2.29.8 + version: 2.29.8(@types/node@25.0.2) lefthook: - specifier: ^2.0.4 - version: 2.0.4 + specifier: ^2.0.12 + version: 2.0.12 prettier: - specifier: ^3.5.3 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 rimraf: specifier: ^6.1.2 version: 6.1.2 @@ -27,8 +27,8 @@ importers: specifier: ^13.0.4 version: 13.0.4(typescript@5.9.3) turbo: - specifier: ^2.6.1 - version: 2.6.1 + specifier: ^2.6.3 + version: 2.6.3 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -36,76 +36,76 @@ importers: extras/docs: dependencies: '@repo/ui': - specifier: workspace:* + specifier: workspace:^ version: link:../../repo/ui next: specifier: ^15.5.9 - version: 15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 15.5.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: - specifier: ^19.1.0 - version: 19.2.0 + specifier: ^19.2.3 + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.2.0(react@19.2.0) + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) devDependencies: '@repo/eslint-config': - specifier: workspace:* + specifier: workspace:^ version: link:../../repo/eslint-config '@repo/typescript-config': - specifier: workspace:* + specifier: workspace:^ version: link:../../repo/typescript-config '@types/node': - specifier: ^20.17.57 - version: 20.19.21 + specifier: ^25.0.2 + version: 25.0.2 '@types/react': - specifier: ^19.2.6 - version: 19.2.6 + specifier: ^19.2.7 + version: 19.2.7 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.6) + version: 19.2.3(@types/react@19.2.7) eslint: - specifier: ^9.28.0 - version: 9.37.0 + specifier: ^9.39.2 + version: 9.39.2 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 extras/web: dependencies: '@repo/ui': - specifier: workspace:* + specifier: workspace:^ version: link:../../repo/ui next: specifier: ^15.5.9 - version: 15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 15.5.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: - specifier: ^19.1.0 - version: 19.2.0 + specifier: ^19.2.3 + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.2.0(react@19.2.0) + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) devDependencies: '@repo/eslint-config': - specifier: workspace:* + specifier: workspace:^ version: link:../../repo/eslint-config '@repo/typescript-config': - specifier: workspace:* + specifier: workspace:^ version: link:../../repo/typescript-config '@types/node': - specifier: ^20.17.57 - version: 20.19.21 + specifier: ^25.0.2 + version: 25.0.2 '@types/react': - specifier: ^19.2.6 - version: 19.2.6 + specifier: ^19.2.7 + version: 19.2.7 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.6) + version: 19.2.3(@types/react@19.2.7) eslint: - specifier: ^9.28.0 - version: 9.37.0 + specifier: ^9.39.2 + version: 9.39.2 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages/services/api: devDependencies: @@ -113,8 +113,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -125,8 +125,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -135,20 +135,20 @@ importers: dependencies: ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3) + version: 0.9.17(typescript@5.9.3)(zod@4.2.0) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: 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) + specifier: ^4.0.15 + version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) packages/services/identity-instrument: dependencies: @@ -160,20 +160,20 @@ importers: version: 4.0.0 ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3) + version: 0.9.17(typescript@5.9.3)(zod@4.2.0) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: 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) + specifier: ^4.0.15 + version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) packages/services/indexer: devDependencies: @@ -181,8 +181,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -193,8 +193,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -205,8 +205,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -221,23 +221,23 @@ importers: version: 0.0.7(typescript@5.9.3) ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3) + version: 0.9.17(typescript@5.9.3)(zod@4.2.0) viem: specifier: ^2.40.3 - version: 2.40.3(typescript@5.9.3) + version: 2.42.1(typescript@5.9.3)(zod@4.2.0) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: 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) + specifier: ^4.0.15 + version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) packages/services/userdata: devDependencies: @@ -245,8 +245,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -257,8 +257,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -279,20 +279,20 @@ importers: version: 0.0.7(typescript@5.9.3) ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3) + version: 0.9.17(typescript@5.9.3)(zod@4.2.0) viem: specifier: ^2.40.3 - version: 2.40.3(typescript@5.9.3) + version: 2.42.1(typescript@5.9.3)(zod@4.2.0) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 '@vitest/coverage-v8': - specifier: ^4.0.14 - version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)) + specifier: ^4.0.15 + version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -303,8 +303,8 @@ importers: 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) + specifier: ^4.0.15 + version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) packages/wallet/dapp-client: dependencies: @@ -322,17 +322,17 @@ importers: version: link:../primitives ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3) + version: 0.9.17(typescript@5.9.3)(zod@4.2.0) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 '@vitest/coverage-v8': - specifier: ^4.0.14 - version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)) + specifier: ^4.0.15 + version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -340,33 +340,33 @@ importers: specifier: ^6.2.5 version: 6.2.5 happy-dom: - specifier: ^20.0.10 - version: 20.0.10 + specifier: ^20.0.11 + version: 20.0.11 typescript: 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) + specifier: ^4.0.15 + version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) packages/wallet/primitives: dependencies: ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3) + version: 0.9.17(typescript@5.9.3)(zod@4.2.0) devDependencies: '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@vitest/coverage-v8': - specifier: ^4.0.14 - version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)) + specifier: ^4.0.15 + version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)) typescript: 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) + specifier: ^4.0.15 + version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) packages/wallet/primitives-cli: dependencies: @@ -375,20 +375,20 @@ importers: version: link:../primitives ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3) + version: 0.9.17(typescript@5.9.3)(zod@4.2.0) yargs: specifier: ^18.0.0 version: 18.0.0 devDependencies: '@repo/eslint-config': - specifier: workspace:* + specifier: workspace:^ version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 '@types/yargs': specifier: ^17.0.35 version: 17.0.35 @@ -396,8 +396,8 @@ importers: specifier: ^9.2.1 version: 9.2.1 esbuild: - specifier: ^0.27.0 - version: 0.27.0 + specifier: ^0.27.1 + version: 0.27.1 nodemon: specifier: ^3.1.11 version: 3.1.11 @@ -433,7 +433,7 @@ importers: version: 4.0.0 ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3) + version: 0.9.17(typescript@5.9.3)(zod@4.2.0) uuid: specifier: ^13.0.0 version: 13.0.0 @@ -442,11 +442,11 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.0.2 + version: 25.0.2 '@vitest/coverage-v8': - specifier: ^4.0.14 - version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)) + specifier: ^4.0.15 + version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -454,83 +454,83 @@ importers: specifier: ^6.2.5 version: 6.2.5 happy-dom: - specifier: ^20.0.10 - version: 20.0.10 + specifier: ^20.0.11 + version: 20.0.11 typescript: 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) + specifier: ^4.0.15 + version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) repo/eslint-config: devDependencies: '@eslint/js': - specifier: ^9.28.0 - version: 9.37.0 + specifier: ^9.39.2 + version: 9.39.2 '@next/eslint-plugin-next': - specifier: ^15.3.3 - version: 15.5.5 + specifier: ^15.5.9 + version: 15.5.9 eslint: - specifier: ^9.28.0 - version: 9.37.0 + specifier: ^9.39.2 + version: 9.39.2 eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.2(eslint@9.37.0) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2) 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.37.0) + version: 7.37.5(eslint@9.39.2) eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.37.0) + specifier: ^7.0.1 + version: 7.0.1(eslint@9.39.2) eslint-plugin-turbo: - specifier: ^2.5.4 - version: 2.5.8(eslint@9.37.0)(turbo@2.6.3) + specifier: ^2.6.3 + version: 2.6.3(eslint@9.39.2)(turbo@2.6.3) globals: - specifier: ^15.15.0 - version: 15.15.0 + specifier: ^16.5.0 + version: 16.5.0 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 typescript-eslint: - specifier: ^8.33.1 - version: 8.46.1(eslint@9.37.0)(typescript@5.8.3) + specifier: ^8.49.0 + version: 8.50.0(eslint@9.39.2)(typescript@5.9.3) repo/typescript-config: {} repo/ui: dependencies: react: - specifier: ^19.1.0 - version: 19.2.0 + specifier: ^19.2.3 + version: 19.2.3 react-dom: - specifier: ^19.1.0 - version: 19.2.0(react@19.2.0) + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) devDependencies: '@repo/eslint-config': - specifier: workspace:* + specifier: workspace:^ version: link:../eslint-config '@repo/typescript-config': - specifier: workspace:* + specifier: workspace:^ version: link:../typescript-config '@turbo/gen': specifier: ^1.13.4 - version: 1.13.4(@types/node@20.19.21)(typescript@5.8.3) + version: 1.13.4(@types/node@25.0.2)(typescript@5.9.3) '@types/node': - specifier: ^20.17.57 - version: 20.19.21 + specifier: ^25.0.2 + version: 25.0.2 '@types/react': - specifier: ^19.2.6 - version: 19.2.6 + specifier: ^19.2.7 + version: 19.2.7 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.6) + version: 19.2.3(@types/react@19.2.7) typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.3 + version: 5.9.3 packages: @@ -544,6 +544,36 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -552,6 +582,14 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} @@ -565,6 +603,14 @@ packages: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} @@ -573,8 +619,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@changesets/apply-release-plan@7.0.13': - resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} + '@changesets/apply-release-plan@7.0.14': + resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} '@changesets/assemble-release-plan@6.0.9': resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} @@ -582,12 +628,12 @@ packages: '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.7': - resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} + '@changesets/cli@2.29.8': + resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==} hasBin: true - '@changesets/config@3.1.1': - resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + '@changesets/config@3.1.2': + resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} @@ -595,8 +641,8 @@ packages: '@changesets/get-dependents-graph@2.1.3': resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.13': - resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} + '@changesets/get-release-plan@4.0.14': + resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -607,14 +653,14 @@ packages: '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.1': - resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + '@changesets/parse@0.4.2': + resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} '@changesets/pre@2.0.2': resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.5': - resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + '@changesets/read@0.6.6': + resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} '@changesets/should-skip-package@0.1.2': resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} @@ -635,314 +681,158 @@ packages: '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@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/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==} + '@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.11': - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + '@esbuild/android-arm@0.27.1': + resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@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==} + '@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.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==} + '@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.27.1': + resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@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==} + '@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==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.27.0': - resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + '@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.11': - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + '@esbuild/linux-arm64@0.27.1': + resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} 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.11': - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.27.0': - resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + '@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.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==} + '@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.11': - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + '@esbuild/linux-loong64@0.27.1': + resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} 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.11': - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.27.0': - resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + '@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.27.1': + resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} 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.11': - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + '@esbuild/linux-riscv64@0.27.1': + resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@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==} + '@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-s390x@0.27.0': - resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.11': - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.27.0': - resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + '@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.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==} + '@esbuild/netbsd-arm64@0.27.1': + resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + '@esbuild/netbsd-x64@0.27.1': + resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} 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.11': - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.27.0': - resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + '@esbuild/openbsd-arm64@0.27.1': + resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} 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==} + '@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==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/openharmony-arm64@0.27.0': - resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + '@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==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.27.0': - resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + '@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==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.27.0': - resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + '@esbuild/win32-arm64@0.27.1': + resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.11': - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + '@esbuild/win32-ia32@0.27.1': + resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} 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.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==} + '@esbuild/win32-x64@0.27.1': + resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -953,36 +843,36 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.4.0': - resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.16.0': - resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.37.0': - resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.4.0': - resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -1138,8 +1028,8 @@ packages: cpu: [x64] os: [win32] - '@inquirer/external-editor@1.0.2': - resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1155,6 +1045,12 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1177,8 +1073,8 @@ packages: '@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/eslint-plugin-next@15.5.9': + resolution: {integrity: sha512-kUzXx0iFiXw27cQAViE1yKWnz/nF8JzRmwgMRTMh8qMY90crNsdXJRh2e+R0vBpFR3kk1yvAR7wev7+fCCb79Q==} '@next/swc-darwin-arm64@15.5.7': resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} @@ -1236,10 +1132,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'} @@ -1260,113 +1152,113 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@rollup/rollup-android-arm-eabi@4.52.4': - resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + '@rollup/rollup-android-arm-eabi@4.53.4': + resolution: {integrity: sha512-PWU3Y92H4DD0bOqorEPp1Y0tbzwAurFmIYpjcObv5axGVOtcTlB0b2UKMd2echo08MgN7jO8WQZSSysvfisFSQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.4': - resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + '@rollup/rollup-android-arm64@4.53.4': + resolution: {integrity: sha512-Gw0/DuVm3rGsqhMGYkSOXXIx20cC3kTlivZeuaGt4gEgILivykNyBWxeUV5Cf2tDA2nPLah26vq3emlRrWVbng==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.4': - resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} + '@rollup/rollup-darwin-arm64@4.53.4': + resolution: {integrity: sha512-+w06QvXsgzKwdVg5qRLZpTHh1bigHZIqoIUPtiqh05ZiJVUQ6ymOxaPkXTvRPRLH88575ZCRSRM3PwIoNma01Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.4': - resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} + '@rollup/rollup-darwin-x64@4.53.4': + resolution: {integrity: sha512-EB4Na9G2GsrRNRNFPuxfwvDRDUwQEzJPpiK1vo2zMVhEeufZ1k7J1bKnT0JYDfnPC7RNZ2H5YNQhW6/p2QKATw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.4': - resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + '@rollup/rollup-freebsd-arm64@4.53.4': + resolution: {integrity: sha512-bldA8XEqPcs6OYdknoTMaGhjytnwQ0NClSPpWpmufOuGPN5dDmvIa32FygC2gneKK4A1oSx86V1l55hyUWUYFQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.4': - resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + '@rollup/rollup-freebsd-x64@4.53.4': + resolution: {integrity: sha512-3T8GPjH6mixCd0YPn0bXtcuSXi1Lj+15Ujw2CEb7dd24j9thcKscCf88IV7n76WaAdorOzAgSSbuVRg4C8V8Qw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': - resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.4': + resolution: {integrity: sha512-UPMMNeC4LXW7ZSHxeP3Edv09aLsFUMaD1TSVW6n1CWMECnUIJMFFB7+XC2lZTdPtvB36tYC0cJWc86mzSsaviw==} 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.4': + resolution: {integrity: sha512-H8uwlV0otHs5Q7WAMSoyvjV9DJPiy5nJ/xnHolY0QptLPjaSsuX7tw+SPIfiYH6cnVx3fe4EWFafo6gH6ekZKA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.4': - resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} + '@rollup/rollup-linux-arm64-gnu@4.53.4': + resolution: {integrity: sha512-BLRwSRwICXz0TXkbIbqJ1ibK+/dSBpTJqDClF61GWIrxTXZWQE78ROeIhgl5MjVs4B4gSLPCFeD4xML9vbzvCQ==} 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.4': + resolution: {integrity: sha512-6bySEjOTbmVcPJAywjpGLckK793A0TJWSbIa0sVwtVGfe/Nz6gOWHOwkshUIAp9j7wg2WKcA4Snu7Y1nUZyQew==} 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.4': + resolution: {integrity: sha512-U0ow3bXYJZ5MIbchVusxEycBw7bO6C2u5UvD31i5IMTrnt2p4Fh4ZbHSdc/31TScIJQYHwxbj05BpevB3201ug==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.4': - resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + '@rollup/rollup-linux-ppc64-gnu@4.53.4': + resolution: {integrity: sha512-iujDk07ZNwGLVn0YIWM80SFN039bHZHCdCCuX9nyx3Jsa2d9V/0Y32F+YadzwbvDxhSeVo9zefkoPnXEImnM5w==} 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.4': + resolution: {integrity: sha512-MUtAktiOUSu+AXBpx1fkuG/Bi5rhlorGs3lw5QeJ2X3ziEGAq7vFNdWVde6XGaVqi0LGSvugwjoxSNJfHFTC0g==} 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.4': + resolution: {integrity: sha512-btm35eAbDfPtcFEgaXCI5l3c2WXyzwiE8pArhd66SDtoLWmgK5/M7CUxmUglkwtniPzwvWioBKKl6IXLbPf2sQ==} 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.4': + resolution: {integrity: sha512-uJlhKE9ccUTCUlK+HUz/80cVtx2RayadC5ldDrrDUFaJK0SNb8/cCmC9RhBhIWuZ71Nqj4Uoa9+xljKWRogdhA==} 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.4': + resolution: {integrity: sha512-jjEMkzvASQBbzzlzf4os7nzSBd/cvPrpqXCUOqoeCh1dQ4BP3RZCJk8XBeik4MUln3m+8LeTJcY54C/u8wb3DQ==} 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.4': + resolution: {integrity: sha512-lu90KG06NNH19shC5rBPkrh6mrTpq5kviFylPBXQVpdEu0yzb0mDgyxLr6XdcGdBIQTH/UAhDJnL+APZTBu1aQ==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.4': - resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + '@rollup/rollup-openharmony-arm64@4.53.4': + resolution: {integrity: sha512-dFDcmLwsUzhAm/dn0+dMOQZoONVYBtgik0VuY/d5IJUUb787L3Ko/ibvTvddqhb3RaB7vFEozYevHN4ox22R/w==} 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.4': + resolution: {integrity: sha512-WvUpUAWmUxZKtRnQWpRKnLW2DEO8HB/l8z6oFFMNuHndMzFTJEXzaYJ5ZAmzNw0L21QQJZsUQFt2oPf3ykAD/w==} 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.4': + resolution: {integrity: sha512-JGbeF2/FDU0x2OLySw/jgvkwWUo05BSiJK0dtuI4LyuXbz3wKiC1xHhLB1Tqm5VU6ZZDmAorj45r/IgWNWku5g==} 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.4': + resolution: {integrity: sha512-zuuC7AyxLWLubP+mlUwEyR8M1ixW1ERNPHJfXm8x7eQNP4Pzkd7hS3qBuKBR70VRiQ04Kw8FNfRMF5TNxuZq2g==} 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.4': + resolution: {integrity: sha512-Sbx45u/Lbb5RyptSbX7/3deP+/lzEmZ0BTSHxwxN/IMOZDZf8S0AGo0hJD5n/LQssxb5Z3B4og4P2X6Dd8acCA==} cpu: [x64] os: [win32] @@ -1392,8 +1284,8 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -1412,8 +1304,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==} @@ -1437,19 +1329,19 @@ 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.27': + resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} - '@types/node@24.10.1': - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + '@types/node@25.0.2': + resolution: {integrity: sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.6': - resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -1466,79 +1358,79 @@ packages: '@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==} + '@typescript-eslint/eslint-plugin@8.50.0': + resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.1 + '@typescript-eslint/parser': ^8.50.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.1': - resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==} + '@typescript-eslint/parser@8.50.0': + resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==} 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.46.1': - resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} + '@typescript-eslint/project-service@8.50.0': + resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.1': - resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} + '@typescript-eslint/scope-manager@8.50.0': + resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.1': - resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} + '@typescript-eslint/tsconfig-utils@8.50.0': + resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.1': - resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==} + '@typescript-eslint/type-utils@8.50.0': + resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==} 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.46.1': - resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} + '@typescript-eslint/types@8.50.0': + resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.46.1': - resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} + '@typescript-eslint/typescript-estree@8.50.0': + resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.1': - resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} + '@typescript-eslint/utils@8.50.0': + resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==} 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.46.1': - resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} + '@typescript-eslint/visitor-keys@8.50.0': + resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@4.0.14': - resolution: {integrity: sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==} + '@vitest/coverage-v8@4.0.15': + resolution: {integrity: sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==} peerDependencies: - '@vitest/browser': 4.0.14 - vitest: 4.0.14 + '@vitest/browser': 4.0.15 + vitest: 4.0.15 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.14': - resolution: {integrity: sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==} + '@vitest/expect@4.0.15': + resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} - '@vitest/mocker@4.0.14': - resolution: {integrity: sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==} + '@vitest/mocker@4.0.15': + resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -1548,20 +1440,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.14': - resolution: {integrity: sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==} + '@vitest/pretty-format@4.0.15': + resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} - '@vitest/runner@4.0.14': - resolution: {integrity: sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==} + '@vitest/runner@4.0.15': + resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} - '@vitest/snapshot@4.0.14': - resolution: {integrity: sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==} + '@vitest/snapshot@4.0.15': + resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} - '@vitest/spy@4.0.14': - resolution: {integrity: sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==} + '@vitest/spy@4.0.15': + resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} - '@vitest/utils@4.0.14': - resolution: {integrity: sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==} + '@vitest/utils@4.0.15': + resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} abitype@1.1.0: resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} @@ -1574,8 +1466,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 @@ -1683,10 +1575,14 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - asn1js@3.0.6: - resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + asn1js@3.0.7: + resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==} 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'} @@ -1708,6 +1604,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.9.7: + resolution: {integrity: sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==} + hasBin: true + basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} @@ -1733,6 +1633,11 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1796,8 +1701,8 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - chardet@2.1.0: - resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -1874,8 +1779,11 @@ packages: constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} - core-js-pure@3.46.0: - resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-js-pure@3.47.0: + resolution: {integrity: sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==} cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} @@ -1982,8 +1890,11 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - effect@3.19.6: - resolution: {integrity: sha512-Eh1E/CI+xCAcMSDC5DtyE29yWJINC0zwBbwHappQPorjKyS69rCA8qzpsHpfhKnPDYgxdg8zkknii8mZ+6YMQA==} + effect@3.19.12: + resolution: {integrity: sha512-7F9RGTrCTC3D7nh9Zw+3VlJWwZgo5k33KA+476BAaD0rKIXKZsY/jQ+ipyhR/Avo239Fi6GqAVFs1mqM1IJ7yg==} + + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2002,8 +1913,8 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -2014,8 +1925,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + es-iterator-helpers@1.2.2: + resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} engines: {node: '>= 0.4'} es-module-lexer@1.7.0: @@ -2037,13 +1948,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - 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==} + esbuild@0.27.1: + resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} engines: {node: '>=18'} hasBin: true @@ -2064,8 +1970,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@9.1.2: - resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -2074,9 +1980,9 @@ packages: resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} engines: {node: '>=6'} - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -2086,8 +1992,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.5.8: - resolution: {integrity: sha512-bVjx4vTH0oTKIyQ7EGFAXnuhZMrKIfu17qlex/dps7eScPnGQLJ3r1/nFq80l8xA+8oYjsSirSQ2tXOKbz3kEw==} + eslint-plugin-turbo@2.6.3: + resolution: {integrity: sha512-91WZ+suhT/pk+qNS0/rqT43xLUlUblsa3a8jKmAStGhkJCmR2uX0oWo/e0Edb+It8MdnteXuYpCkvsK4Vw8FtA==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -2104,8 +2010,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.37.0: - resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2149,8 +2055,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: @@ -2262,6 +2168,10 @@ packages: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2310,8 +2220,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2341,16 +2251,13 @@ packages: resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} engines: {node: '>=10'} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.0.10: - resolution: {integrity: sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==} + happy-dom@20.0.11: + resolution: {integrity: sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -2387,6 +2294,12 @@ packages: header-case@1.0.1: resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hosted-git-info@8.1.0: resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} engines: {node: ^18.17.0 || >=20.5.0} @@ -2402,8 +2315,8 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-id@4.1.2: - resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} hasBin: true human-signals@2.1.0: @@ -2414,8 +2327,8 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + iconv-lite@0.7.1: + resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} engines: {node: '>=0.10.0'} idb@8.0.3: @@ -2469,8 +2382,8 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - ip-address@10.0.1: - resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} is-array-buffer@3.0.5: @@ -2671,12 +2584,17 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: @@ -2694,6 +2612,11 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} @@ -2718,58 +2641,58 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - lefthook-darwin-arm64@2.0.4: - resolution: {integrity: sha512-AR63/O5UkM7Sc6x5PhP4vTuztTYRBeBroXApeWGM/8e5uZyoQug/7KTh7xhbCMDf8WJv6vdFeXAQCPSmDyPU3Q==} + lefthook-darwin-arm64@2.0.12: + resolution: {integrity: sha512-tuBz1sNLien+nKKb8BDopKjS6EnbXU8rQzhMVBY+bnVfsTiYDfbBr4wo/IzA5TcwoTL/b5somCJhljEw6DvSyg==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@2.0.4: - resolution: {integrity: sha512-618DVUttSzV9egQiqTQoxGfnR240JoPWYmqRVHhiegnQKZ2lp5XJ+7NMxeRk/ih93VVOLzFO5ky3PbpxTmJgjQ==} + lefthook-darwin-x64@2.0.12: + resolution: {integrity: sha512-FnuUMPPRMJyTEPXg6PotSrFJ8qf8FDLhhD1zLh74D+9Cye5j9n3lcrCQEjXubPT8du/GZLxMBjjffRbcZ8eYDA==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@2.0.4: - resolution: {integrity: sha512-mTAQym1BK38fKglHBQ/0GXPznVC4LoStHO5lAI3ZxaEC0FQetqGHYFzhWbIH5sde9JhztE2rL/aBzMHDoAtzSw==} + lefthook-freebsd-arm64@2.0.12: + resolution: {integrity: sha512-DXElB0qR5e6a8cXkFNYakhwCieypbfh6Y4QG39pzMnLsG03g/nhe093o6owfiUZ4mUFyDM6+0xmy0steOooF2g==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@2.0.4: - resolution: {integrity: sha512-sy02aSxd8UMd6XmiPFVl/Em0b78jdZcDSsLwg+bweJQQk0l+vJhOfqFiG11mbnpo+EBIZmRe6OH5LkxeSU36+w==} + lefthook-freebsd-x64@2.0.12: + resolution: {integrity: sha512-iJN1ZxFeaDi4Fi3b9jcW9wgyNl19LOv2NaVOaAi/tG6mlIn196cmSdXkOA3+943ZbqbdfV9I+bBcIKwneXDA3Q==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@2.0.4: - resolution: {integrity: sha512-W0Nlr/Cz2QTH9n4k5zNrk3LSsg1C4wHiJi8hrAiQVTaAV/N1XrKqd0DevqQuouuapG6pw/6B1xCgiNPebv9oyw==} + lefthook-linux-arm64@2.0.12: + resolution: {integrity: sha512-byvmO4Iri6P0COwM8c3lGgeCV3Q0hh1XJpRfrcZDr4Wslq9O63t6J3T6i87oOtY+UjC9pXLl6xGk6hlUcHZ3BQ==} cpu: [arm64] os: [linux] - lefthook-linux-x64@2.0.4: - resolution: {integrity: sha512-N6ySVCtB/DrOZ1ZgPL8WBZTgtoVHvcPKI+LV5wbcGrvA/dzDZFvniadrbDWZg7Tm705efiQzyENjwhhqNkwiww==} + lefthook-linux-x64@2.0.12: + resolution: {integrity: sha512-KBaiinmf336rA+/dmYs7H7TTeAOByB0CyLA7k8IecTCuaiuKr6ez7ktSjht19poa5G+V0mts4GgEGcx6HViR0w==} cpu: [x64] os: [linux] - lefthook-openbsd-arm64@2.0.4: - resolution: {integrity: sha512-VmOhJO3pYzZ/1C2WFXtL/n5pq4/eYOroqJJpwTJfmCHyw4ceLACu8MDyU5AMJhGMkbL8mPxGInJKxg5xhYgGRw==} + lefthook-openbsd-arm64@2.0.12: + resolution: {integrity: sha512-1QBMXX1UW5rtgC4TB52OKWB7Rz/kCBRB+bKKLT/gDD79aPzLgJANTitQQzgFNIWoa7aM9UvzvIAJzOo6FcFIbg==} cpu: [arm64] os: [openbsd] - lefthook-openbsd-x64@2.0.4: - resolution: {integrity: sha512-U8MZz1xlHUdflkQQ2hkMQsei6fSZbs8tuE4EjCIHWnNdnAF4V8sZ6n1KbxsJcoZXPyBZqxZSMu1o/Ye8IAMVKg==} + lefthook-openbsd-x64@2.0.12: + resolution: {integrity: sha512-zPcvUzs65GexRA37UHmaZqWuEGSU/zpBaPIY98MybXzzcJfCIf+O0oUQe2riMllwYGvNW0B1y3NOYRziDNe/vA==} cpu: [x64] os: [openbsd] - lefthook-windows-arm64@2.0.4: - resolution: {integrity: sha512-543H3y2JAwNdvwUQ6nlNBG7rdKgoOUgzAa6pYcl6EoqicCRrjRmGhkJu7vUudkkrD2Wjm7tr9hU9poP2g5fRFQ==} + lefthook-windows-arm64@2.0.12: + resolution: {integrity: sha512-kgwxguS2GssoHM4SMTp+ArD/Gjg9q5MinD6iI5vSFpuJygD13ZWiXQQfESMHq9y/v1XkD0BdHTJej49dx8P+Vw==} cpu: [arm64] os: [win32] - lefthook-windows-x64@2.0.4: - resolution: {integrity: sha512-UDEPK9RWKm60xsNOdS/DQOdFba0SFa4w3tpFMXK1AJzmRHhosoKrorXGhtTr6kcM0MGKOtYi8GHsm++ArZ9wvQ==} + lefthook-windows-x64@2.0.12: + resolution: {integrity: sha512-Tf/VtSOtF3rBTc9dzRWROa+HuhqaiIV+Xp+1gzlx5+uCueLM0m87Rz6yd4IN5mL7TrDaNkiRXI3FvjCp0dUE4Q==} cpu: [x64] os: [win32] - lefthook@2.0.4: - resolution: {integrity: sha512-GNCU2vQWM/UWjiEF23601aILi1aMbPke6viortH7wIO/oVGOCW0H6FdLez4XZDyqnHL9XkTnd0BBVrBbYVMLpA==} + lefthook@2.0.12: + resolution: {integrity: sha512-I2FdA9cdnq1icwlNz4RADs7exuqe47q1N9+p2LmcP/WfchWh16mvTB82OAD7w7zK9GxblS9GpF7pASaOSl4c7A==} hasBin: true levn@0.4.1: @@ -2825,10 +2748,13 @@ 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@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -2952,6 +2878,9 @@ packages: resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} engines: {node: '>=8.9.4'} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + nodemon@3.1.11: resolution: {integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==} engines: {node: '>=10'} @@ -3124,8 +3053,8 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - 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: @@ -3154,9 +3083,9 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pkijs@3.3.0: - resolution: {integrity: sha512-SVUpr7uqRNuR6w417k0aM8YrHWWhvMh4P0paIA+wWdOxPOLd7PCDZgt3/nooAyrrO1cjwPP2I1hd3h2P6hUQZQ==} - engines: {node: '>=12.0.0'} + pkijs@3.3.3: + resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==} + engines: {node: '>=16.0.0'} possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} @@ -3179,8 +3108,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} engines: {node: '>=14'} hasBin: true @@ -3215,9 +3144,9 @@ packages: pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} - pvutils@1.1.3: - resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} - engines: {node: '>=6.0.0'} + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -3229,16 +3158,16 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@19.2.0: - resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} peerDependencies: - react: ^19.2.0 + react: ^19.2.3 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react@19.2.0: - resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} read-yaml-file@1.1.0: @@ -3284,8 +3213,8 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true @@ -3315,8 +3244,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.52.4: - resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} + rollup@4.53.4: + resolution: {integrity: sha512-YpXaaArg0MvrnJpvduEDYIp7uGOqKXbH9NsHGQ6SxKCOsNAjZF018MmxefFUulVP2KLtiGw1UvZbr+/ekjvlDg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3591,8 +3520,9 @@ packages: 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==} @@ -3653,70 +3583,36 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.6.1: - resolution: {integrity: sha512-Dm0HwhyZF4J0uLqkhUyCVJvKM9Rw7M03v3J9A7drHDQW0qAbIGBrUijQ8g4Q9Cciw/BXRRd8Uzkc3oue+qn+ZQ==} - cpu: [x64] - os: [darwin] - turbo-darwin-64@2.6.3: resolution: {integrity: sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.6.1: - resolution: {integrity: sha512-U0PIPTPyxdLsrC3jN7jaJUwgzX5sVUBsKLO7+6AL+OASaa1NbT1pPdiZoTkblBAALLP76FM0LlnsVQOnmjYhyw==} - cpu: [arm64] - os: [darwin] - turbo-darwin-arm64@2.6.3: resolution: {integrity: sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.6.1: - resolution: {integrity: sha512-eM1uLWgzv89bxlK29qwQEr9xYWBhmO/EGiH22UGfq+uXr+QW1OvNKKMogSN65Ry8lElMH4LZh0aX2DEc7eC0Mw==} - cpu: [x64] - os: [linux] - turbo-linux-64@2.6.3: resolution: {integrity: sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.6.1: - resolution: {integrity: sha512-MFFh7AxAQAycXKuZDrbeutfWM5Ep0CEZ9u7zs4Hn2FvOViTCzIfEhmuJou3/a5+q5VX1zTxQrKGy+4Lf5cdpsA==} - cpu: [arm64] - os: [linux] - turbo-linux-arm64@2.6.3: resolution: {integrity: sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==} 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.3: resolution: {integrity: sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.6.1: - resolution: {integrity: sha512-7w+AD5vJp3R+FB0YOj1YJcNcOOvBior7bcHTodqp90S3x3bLgpr7tE6xOea1e8JkP7GK6ciKVUpQvV7psiwU5Q==} - cpu: [arm64] - os: [win32] - turbo-windows-arm64@2.6.3: resolution: {integrity: sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==} cpu: [arm64] os: [win32] - turbo@2.6.1: - resolution: {integrity: sha512-qBwXXuDT3rA53kbNafGbT5r++BrhRgx3sAo0cHoDAeG9g1ItTmUMgltz3Hy7Hazy1ODqNpR+C7QwqL6DYB52yA==} - hasBin: true - turbo@2.6.3: resolution: {integrity: sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==} hasBin: true @@ -3745,18 +3641,13 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.46.1: - resolution: {integrity: sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==} + typescript-eslint@8.50.0: + resolution: {integrity: sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==} 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@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -3792,6 +3683,12 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + update-browserslist-db@1.2.2: + resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} @@ -3822,16 +3719,16 @@ packages: 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==} + viem@2.42.1: + resolution: {integrity: sha512-NzT/f54jT+b0Um6pYzN/uAGMLg+3twhricAzXS+XH8pVIREzPEh7P25rlhPQnLYiPWzQd9mrFcvnm73Sc8bx+A==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: typescript: optional: true - vite@7.1.10: - resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} + vite@7.3.0: + resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3870,18 +3767,18 @@ packages: yaml: optional: true - vitest@4.0.14: - resolution: {integrity: sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==} + 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': '*' '@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 + '@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: @@ -3975,6 +3872,9 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -3999,12 +3899,21 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.2.0: + resolution: {integrity: sha512-Bd5fw9wlIhtqCCxotZgdTOMwGm1a0u75wARVEY9HMs1X17trvA/lMi4+MGK5EUfYkXVTbX8UDiDKW4OgzHVUZw==} + snapshots: '@0xsequence/tee-verifier@0.1.2': dependencies: cbor2: 1.12.0 - pkijs: 3.3.0 + pkijs: 3.3.3 '@adraffy/ens-normalize@1.11.1': {} @@ -4014,20 +3923,101 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 '@babel/runtime-corejs3@7.28.4': dependencies: - core-js-pure: 3.46.0 + core-js-pure: 3.47.0 '@babel/runtime@7.28.4': {} + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -4035,9 +4025,9 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@changesets/apply-release-plan@7.0.13': + '@changesets/apply-release-plan@7.0.14': dependencies: - '@changesets/config': 3.1.1 + '@changesets/config': 3.1.2 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.4 '@changesets/should-skip-package': 0.1.2 @@ -4064,23 +4054,23 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@24.10.1)': + '@changesets/cli@2.29.8(@types/node@25.0.2)': dependencies: - '@changesets/apply-release-plan': 7.0.13 + '@changesets/apply-release-plan': 7.0.14 '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.1 + '@changesets/config': 3.1.2 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.13 + '@changesets/get-release-plan': 4.0.14 '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 + '@changesets/read': 0.6.6 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@24.10.1) + '@inquirer/external-editor': 1.0.3(@types/node@25.0.2) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -4097,7 +4087,7 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@changesets/config@3.1.1': + '@changesets/config@3.1.2': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 @@ -4118,12 +4108,12 @@ snapshots: picocolors: 1.1.1 semver: 7.7.3 - '@changesets/get-release-plan@4.0.13': + '@changesets/get-release-plan@4.0.14': dependencies: '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.1 + '@changesets/config': 3.1.2 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 + '@changesets/read': 0.6.6 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 @@ -4141,10 +4131,10 @@ snapshots: dependencies: picocolors: 1.1.1 - '@changesets/parse@0.4.1': + '@changesets/parse@0.4.2': dependencies: '@changesets/types': 6.1.0 - js-yaml: 3.14.1 + js-yaml: 4.1.1 '@changesets/pre@2.0.2': dependencies: @@ -4153,11 +4143,11 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.5': + '@changesets/read@0.6.6': dependencies: '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.1 + '@changesets/parse': 0.4.2 '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 @@ -4176,7 +4166,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 4.1.2 + human-id: 4.1.3 prettier: 2.8.8 '@cspotcode/source-map-support@0.8.1': @@ -4188,186 +4178,108 @@ snapshots: 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 - - '@esbuild/linux-arm@0.25.11': - optional: true - - '@esbuild/linux-arm@0.27.0': - optional: true - - '@esbuild/linux-ia32@0.25.11': - optional: true - - '@esbuild/linux-ia32@0.27.0': + '@esbuild/aix-ppc64@0.27.1': optional: true - '@esbuild/linux-loong64@0.25.11': + '@esbuild/android-arm64@0.27.1': optional: true - '@esbuild/linux-loong64@0.27.0': + '@esbuild/android-arm@0.27.1': optional: true - '@esbuild/linux-mips64el@0.25.11': + '@esbuild/android-x64@0.27.1': optional: true - '@esbuild/linux-mips64el@0.27.0': + '@esbuild/darwin-arm64@0.27.1': optional: true - '@esbuild/linux-ppc64@0.25.11': + '@esbuild/darwin-x64@0.27.1': optional: true - '@esbuild/linux-ppc64@0.27.0': + '@esbuild/freebsd-arm64@0.27.1': optional: true - '@esbuild/linux-riscv64@0.25.11': + '@esbuild/freebsd-x64@0.27.1': optional: true - '@esbuild/linux-riscv64@0.27.0': + '@esbuild/linux-arm64@0.27.1': optional: true - '@esbuild/linux-s390x@0.25.11': + '@esbuild/linux-arm@0.27.1': optional: true - '@esbuild/linux-s390x@0.27.0': + '@esbuild/linux-ia32@0.27.1': optional: true - '@esbuild/linux-x64@0.25.11': + '@esbuild/linux-loong64@0.27.1': optional: true - '@esbuild/linux-x64@0.27.0': + '@esbuild/linux-mips64el@0.27.1': optional: true - '@esbuild/netbsd-arm64@0.25.11': + '@esbuild/linux-ppc64@0.27.1': optional: true - '@esbuild/netbsd-arm64@0.27.0': + '@esbuild/linux-riscv64@0.27.1': optional: true - '@esbuild/netbsd-x64@0.25.11': + '@esbuild/linux-s390x@0.27.1': optional: true - '@esbuild/netbsd-x64@0.27.0': + '@esbuild/linux-x64@0.27.1': optional: true - '@esbuild/openbsd-arm64@0.25.11': + '@esbuild/netbsd-arm64@0.27.1': optional: true - '@esbuild/openbsd-arm64@0.27.0': + '@esbuild/netbsd-x64@0.27.1': optional: true - '@esbuild/openbsd-x64@0.25.11': + '@esbuild/openbsd-arm64@0.27.1': optional: true - '@esbuild/openbsd-x64@0.27.0': + '@esbuild/openbsd-x64@0.27.1': optional: true - '@esbuild/openharmony-arm64@0.25.11': + '@esbuild/openharmony-arm64@0.27.1': optional: true - '@esbuild/openharmony-arm64@0.27.0': + '@esbuild/sunos-x64@0.27.1': optional: true - '@esbuild/sunos-x64@0.25.11': + '@esbuild/win32-arm64@0.27.1': optional: true - '@esbuild/sunos-x64@0.27.0': + '@esbuild/win32-ia32@0.27.1': optional: true - '@esbuild/win32-arm64@0.25.11': + '@esbuild/win32-x64@0.27.1': optional: true - '@esbuild/win32-arm64@0.27.0': - optional: true - - '@esbuild/win32-ia32@0.25.11': - optional: true - - '@esbuild/win32-ia32@0.27.0': - optional: true - - '@esbuild/win32-x64@0.25.11': - optional: true - - '@esbuild/win32-x64@0.27.0': - optional: true - - '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)': dependencies: - eslint: 9.37.0 + eslint: 9.39.2 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.21.1': dependencies: - '@eslint/object-schema': 2.1.6 + '@eslint/object-schema': 2.1.7 debug: 4.4.3(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.0': + '@eslint/config-helpers@0.4.2': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 - '@eslint/core@0.16.0': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/eslintrc@3.3.3': dependencies: ajv: 6.12.6 debug: 4.4.3(supports-color@5.5.0) @@ -4375,19 +4287,19 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.37.0': {} + '@eslint/js@9.39.2': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.4.0': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -4498,19 +4410,12 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/external-editor@1.0.2(@types/node@20.19.21)': + '@inquirer/external-editor@1.0.3(@types/node@25.0.2)': dependencies: - chardet: 2.1.0 - iconv-lite: 0.7.0 + chardet: 2.1.1 + iconv-lite: 0.7.1 optionalDependencies: - '@types/node': 20.19.21 - - '@inquirer/external-editor@1.0.2(@types/node@24.10.1)': - dependencies: - chardet: 2.1.0 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.2 '@isaacs/balanced-match@4.0.1': {} @@ -4518,6 +4423,16 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -4550,7 +4465,7 @@ snapshots: '@next/env@15.5.9': {} - '@next/eslint-plugin-next@15.5.5': + '@next/eslint-plugin-next@15.5.9': dependencies: fast-glob: 3.3.1 @@ -4584,10 +4499,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': {} @@ -4604,77 +4515,77 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@rollup/rollup-android-arm-eabi@4.52.4': + '@rollup/rollup-android-arm-eabi@4.53.4': optional: true - '@rollup/rollup-android-arm64@4.52.4': + '@rollup/rollup-android-arm64@4.53.4': optional: true - '@rollup/rollup-darwin-arm64@4.52.4': + '@rollup/rollup-darwin-arm64@4.53.4': optional: true - '@rollup/rollup-darwin-x64@4.52.4': + '@rollup/rollup-darwin-x64@4.53.4': optional: true - '@rollup/rollup-freebsd-arm64@4.52.4': + '@rollup/rollup-freebsd-arm64@4.53.4': optional: true - '@rollup/rollup-freebsd-x64@4.52.4': + '@rollup/rollup-freebsd-x64@4.53.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + '@rollup/rollup-linux-arm-gnueabihf@4.53.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.4': + '@rollup/rollup-linux-arm-musleabihf@4.53.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.4': + '@rollup/rollup-linux-arm64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.4': + '@rollup/rollup-linux-arm64-musl@4.53.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.4': + '@rollup/rollup-linux-loong64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.4': + '@rollup/rollup-linux-ppc64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.4': + '@rollup/rollup-linux-riscv64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.4': + '@rollup/rollup-linux-riscv64-musl@4.53.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.4': + '@rollup/rollup-linux-s390x-gnu@4.53.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.4': + '@rollup/rollup-linux-x64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-x64-musl@4.52.4': + '@rollup/rollup-linux-x64-musl@4.53.4': optional: true - '@rollup/rollup-openharmony-arm64@4.52.4': + '@rollup/rollup-openharmony-arm64@4.53.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.4': + '@rollup/rollup-win32-arm64-msvc@4.53.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.4': + '@rollup/rollup-win32-ia32-msvc@4.53.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.4': + '@rollup/rollup-win32-x64-gnu@4.53.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.4': + '@rollup/rollup-win32-x64-msvc@4.53.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 @@ -4693,7 +4604,7 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} @@ -4701,17 +4612,17 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@1.13.4(@types/node@20.19.21)(typescript@5.8.3)': + '@turbo/gen@1.13.4(@types/node@25.0.2)(typescript@5.9.3)': dependencies: - '@turbo/workspaces': 1.13.4(@types/node@20.19.21) + '@turbo/workspaces': 1.13.4(@types/node@25.0.2) chalk: 2.4.2 commander: 10.0.1 fs-extra: 10.1.0 - inquirer: 8.2.7(@types/node@20.19.21) + inquirer: 8.2.7(@types/node@25.0.2) 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.8.3) + ts-node: 10.9.2(@types/node@25.0.2)(typescript@5.9.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -4721,7 +4632,7 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@1.13.4(@types/node@20.19.21)': + '@turbo/workspaces@1.13.4(@types/node@25.0.2)': dependencies: chalk: 2.4.2 commander: 10.0.1 @@ -4729,8 +4640,8 @@ snapshots: fast-glob: 3.3.3 fs-extra: 10.1.0 gradient-string: 2.0.2 - inquirer: 8.2.7(@types/node@20.19.21) - js-yaml: 4.1.0 + inquirer: 8.2.7(@types/node@25.0.2) + js-yaml: 4.1.1 ora: 4.1.1 rimraf: 3.0.2 semver: 7.7.3 @@ -4738,9 +4649,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': {} @@ -4749,7 +4661,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 24.10.1 + '@types/node': 25.0.2 '@types/inquirer@6.5.0': dependencies: @@ -4760,29 +4672,29 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.1.1 + minimatch: 9.0.5 '@types/node@12.20.55': {} - '@types/node@20.19.21': + '@types/node@20.19.27': dependencies: undici-types: 6.21.0 - '@types/node@24.10.1': + '@types/node@25.0.2': dependencies: undici-types: 7.16.0 - '@types/react-dom@19.2.3(@types/react@19.2.6)': + '@types/react-dom@19.2.3(@types/react@19.2.7)': dependencies: - '@types/react': 19.2.6 + '@types/react': 19.2.7 - '@types/react@19.2.6': + '@types/react@19.2.7': dependencies: csstype: 3.2.3 '@types/through@0.0.33': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.2 '@types/tinycolor2@1.4.6': {} @@ -4794,103 +4706,101 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.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)': + '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@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 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.0 + eslint: 9.39.2 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@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 + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.0 debug: 4.4.3(supports-color@5.5.0) - eslint: 9.37.0 - typescript: 5.8.3 + eslint: 9.39.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.1(typescript@5.8.3)': + '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.8.3) - '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/types': 8.50.0 debug: 4.4.3(supports-color@5.5.0) - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.46.1': + '@typescript-eslint/scope-manager@8.50.0': dependencies: - '@typescript-eslint/types': 8.46.1 - '@typescript-eslint/visitor-keys': 8.46.1 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 - '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3)': dependencies: - typescript: 5.8.3 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.1(eslint@9.37.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@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) + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.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 + eslint: 9.39.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.1': {} + '@typescript-eslint/types@8.50.0': {} - '@typescript-eslint/typescript-estree@8.46.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3)': dependencies: - '@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 + '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/visitor-keys': 8.50.0 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.3 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.1(eslint@9.37.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.50.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@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 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) + '@typescript-eslint/scope-manager': 8.50.0 + '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.1': + '@typescript-eslint/visitor-keys@8.50.0': dependencies: - '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/types': 8.50.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11))': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.14 + '@vitest/utils': 4.0.15 ast-v8-to-istanbul: 0.3.8 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -4900,56 +4810,58 @@ snapshots: 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) + vitest: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.14': + '@vitest/expect@4.0.15': dependencies: '@standard-schema/spec': 1.0.0 - '@types/chai': 5.2.2 - '@vitest/spy': 4.0.14 - '@vitest/utils': 4.0.14 + '@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@4.0.14(vite@7.1.10(@types/node@24.10.1))': + '@vitest/mocker@4.0.15(vite@7.3.0(@types/node@25.0.2))': dependencies: - '@vitest/spy': 4.0.14 + '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.10(@types/node@24.10.1) + vite: 7.3.0(@types/node@25.0.2) - '@vitest/pretty-format@4.0.14': + '@vitest/pretty-format@4.0.15': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.14': + '@vitest/runner@4.0.15': dependencies: - '@vitest/utils': 4.0.14 + '@vitest/utils': 4.0.15 pathe: 2.0.3 - '@vitest/snapshot@4.0.14': + '@vitest/snapshot@4.0.15': dependencies: - '@vitest/pretty-format': 4.0.14 + '@vitest/pretty-format': 4.0.15 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.14': {} + '@vitest/spy@4.0.15': {} - '@vitest/utils@4.0.14': + '@vitest/utils@4.0.15': dependencies: - '@vitest/pretty-format': 4.0.14 + '@vitest/pretty-format': 4.0.15 tinyrainbow: 3.0.3 - abitype@1.1.0(typescript@5.9.3): + abitype@1.1.0(typescript@5.9.3)(zod@4.2.0): optionalDependencies: typescript: 5.9.3 + zod: 4.2.0 - abitype@1.1.1(typescript@5.9.3): + abitype@1.2.2(typescript@5.9.3)(zod@4.2.0): optionalDependencies: typescript: 5.9.3 + zod: 4.2.0 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -5018,7 +4930,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -5030,7 +4942,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -5039,21 +4951,21 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -5062,17 +4974,19 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - asn1js@3.0.6: + asn1js@3.0.7: dependencies: pvtsutils: 1.3.6 - pvutils: 1.1.3 + pvutils: 1.1.5 tslib: 2.8.1 + assertion-error@2.0.1: {} + ast-types@0.13.4: dependencies: tslib: 2.8.1 @@ -5093,6 +5007,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.9.7: {} + basic-ftp@5.0.5: {} better-path-resolve@1.0.0: @@ -5120,6 +5036,14 @@ snapshots: dependencies: fill-range: 7.1.1 + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.7 + caniuse-lite: 1.0.30001760 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.2(browserslist@4.28.1) + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -5202,7 +5126,7 @@ snapshots: chardet@0.7.0: {} - chardet@2.1.0: {} + chardet@2.1.1: {} chokidar@3.6.0: dependencies: @@ -5280,13 +5204,15 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 - core-js-pure@3.46.0: {} + convert-source-map@2.0.0: {} + + core-js-pure@3.47.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 + js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: typescript: 5.9.3 @@ -5393,11 +5319,13 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - effect@3.19.6: + effect@3.19.12: dependencies: '@standard-schema/spec': 1.0.0 fast-check: 3.23.2 + electron-to-chromium@1.5.267: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -5413,7 +5341,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.24.0: + es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -5474,12 +5402,12 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.2.1: + es-iterator-helpers@1.2.2: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -5516,63 +5444,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - 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: + esbuild@0.27.1: optionalDependencies: - '@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 + '@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: {} @@ -5588,25 +5487,32 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.2(eslint@9.37.0): + eslint-config-prettier@10.1.8(eslint@9.39.2): dependencies: - eslint: 9.37.0 + eslint: 9.39.2 eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.37.0): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2): dependencies: - eslint: 9.37.0 + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + eslint: 9.39.2 + hermes-parser: 0.25.1 + zod: 4.2.0 + zod-validation-error: 4.0.2(zod@4.2.0) + transitivePeerDependencies: + - supports-color - eslint-plugin-react@7.37.5(eslint@9.37.0): + eslint-plugin-react@7.37.5(eslint@9.39.2): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 9.37.0 + es-iterator-helpers: 1.2.2 + eslint: 9.39.2 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5620,10 +5526,10 @@ 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.3): + eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.6.3): dependencies: dotenv: 16.0.3 - eslint: 9.37.0 + eslint: 9.39.2 turbo: 2.6.3 eslint-scope@8.4.0: @@ -5635,21 +5541,20 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.37.0: + eslint@9.39.2: dependencies: - '@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.4.0 - '@eslint/core': 0.16.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.37.0 - '@eslint/plugin-kit': 0.4.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -5713,7 +5618,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: {} @@ -5830,6 +5735,8 @@ snapshots: generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} get-east-asian-width@1.4.0: {} @@ -5880,7 +5787,7 @@ snapshots: dependencies: minimatch: 10.1.1 minipass: 7.1.2 - path-scurry: 2.0.0 + path-scurry: 2.0.1 glob@7.2.3: dependencies: @@ -5893,7 +5800,7 @@ snapshots: globals@14.0.0: {} - globals@15.15.0: {} + globals@16.5.0: {} globalthis@1.0.4: dependencies: @@ -5938,8 +5845,6 @@ snapshots: chalk: 4.1.2 tinygradient: 1.1.5 - graphemer@1.4.0: {} - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -5949,9 +5854,9 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.0.10: + happy-dom@20.0.11: dependencies: - '@types/node': 20.19.21 + '@types/node': 20.19.27 '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 @@ -5984,6 +5889,12 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + hosted-git-info@8.1.0: dependencies: lru-cache: 10.4.3 @@ -6004,7 +5915,7 @@ snapshots: transitivePeerDependencies: - supports-color - human-id@4.1.2: {} + human-id@4.1.3: {} human-signals@2.1.0: {} @@ -6012,7 +5923,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.0: + iconv-lite@0.7.1: dependencies: safer-buffer: 2.1.2 @@ -6060,9 +5971,9 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - inquirer@8.2.7(@types/node@20.19.21): + inquirer@8.2.7(@types/node@25.0.2): dependencies: - '@inquirer/external-editor': 1.0.2(@types/node@20.19.21) + '@inquirer/external-editor': 1.0.3(@types/node@25.0.2) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -6086,7 +5997,7 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - ip-address@10.0.1: {} + ip-address@10.1.0: {} is-array-buffer@3.0.5: dependencies: @@ -6278,15 +6189,17 @@ snapshots: js-tokens@9.0.1: {} - js-yaml@3.14.1: + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-canonicalize@2.0.0: {} @@ -6297,6 +6210,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + jsonc-parser@3.3.1: {} jsonfile@4.0.0: @@ -6324,48 +6239,48 @@ snapshots: kleur@3.0.3: {} - lefthook-darwin-arm64@2.0.4: + lefthook-darwin-arm64@2.0.12: optional: true - lefthook-darwin-x64@2.0.4: + lefthook-darwin-x64@2.0.12: optional: true - lefthook-freebsd-arm64@2.0.4: + lefthook-freebsd-arm64@2.0.12: optional: true - lefthook-freebsd-x64@2.0.4: + lefthook-freebsd-x64@2.0.12: optional: true - lefthook-linux-arm64@2.0.4: + lefthook-linux-arm64@2.0.12: optional: true - lefthook-linux-x64@2.0.4: + lefthook-linux-x64@2.0.12: optional: true - lefthook-openbsd-arm64@2.0.4: + lefthook-openbsd-arm64@2.0.12: optional: true - lefthook-openbsd-x64@2.0.4: + lefthook-openbsd-x64@2.0.12: optional: true - lefthook-windows-arm64@2.0.4: + lefthook-windows-arm64@2.0.12: optional: true - lefthook-windows-x64@2.0.4: + lefthook-windows-x64@2.0.12: optional: true - lefthook@2.0.4: + lefthook@2.0.12: optionalDependencies: - 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 + lefthook-darwin-arm64: 2.0.12 + lefthook-darwin-x64: 2.0.12 + lefthook-freebsd-arm64: 2.0.12 + lefthook-freebsd-x64: 2.0.12 + lefthook-linux-arm64: 2.0.12 + lefthook-linux-x64: 2.0.12 + lefthook-openbsd-arm64: 2.0.12 + lefthook-openbsd-x64: 2.0.12 + lefthook-windows-arm64: 2.0.12 + lefthook-windows-x64: 2.0.12 levn@0.4.1: dependencies: @@ -6416,7 +6331,11 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.2: {} + lru-cache@11.2.4: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 lru-cache@7.18.3: {} @@ -6489,15 +6408,15 @@ snapshots: netmask@2.0.2: {} - next@15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@15.5.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 15.5.9 '@swc/helpers': 0.5.15 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) + 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.7 '@next/swc-darwin-x64': 15.5.7 @@ -6528,7 +6447,9 @@ snapshots: isbinaryfile: 4.0.10 lodash.get: 4.4.2 mkdirp: 0.5.6 - resolve: 1.22.10 + resolve: 1.22.11 + + node-releases@2.0.27: {} nodemon@3.1.11: dependencies: @@ -6582,7 +6503,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 object.values@1.2.1: @@ -6660,7 +6581,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.9.17(typescript@5.9.3): + ox@0.9.17(typescript@5.9.3)(zod@4.2.0): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -6668,7 +6589,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.1(typescript@5.9.3) + abitype: 1.2.2(typescript@5.9.3)(zod@4.2.0) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.3 @@ -6759,9 +6680,9 @@ snapshots: path-parse@1.0.7: {} - 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: {} @@ -6778,13 +6699,13 @@ snapshots: pify@4.0.1: {} - pkijs@3.3.0: + pkijs@3.3.3: dependencies: '@noble/hashes': 1.4.0 - asn1js: 3.0.6 + asn1js: 3.0.7 bytestreamjs: 2.0.1 pvtsutils: 1.3.6 - pvutils: 1.1.3 + pvutils: 1.1.5 tslib: 2.8.1 possible-typed-array-names@1.1.0: {} @@ -6805,7 +6726,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.6.2: {} + prettier@3.7.4: {} proc-log@5.0.0: {} @@ -6845,7 +6766,7 @@ snapshots: dependencies: tslib: 2.8.1 - pvutils@1.1.3: {} + pvutils@1.1.5: {} quansync@0.2.11: {} @@ -6858,25 +6779,25 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@19.2.0(react@19.2.0): + react-dom@19.2.3(react@19.2.3): dependencies: - react: 19.2.0 + react: 19.2.3 scheduler: 0.27.0 react-is@16.13.1: {} - react@19.2.0: {} + react@19.2.3: {} read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 - js-yaml: 3.14.1 + js-yaml: 3.14.2 pify: 4.0.1 strip-bom: 3.0.0 read-yaml-file@2.1.0: dependencies: - js-yaml: 4.1.0 + js-yaml: 4.1.1 strip-bom: 4.0.0 readable-stream@3.6.2: @@ -6893,7 +6814,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -6924,7 +6845,7 @@ snapshots: resolve-from@5.0.0: {} - resolve@1.22.10: + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 @@ -6957,32 +6878,32 @@ snapshots: glob: 13.0.0 package-json-from-dist: 1.0.1 - rollup@4.52.4: + rollup@4.53.4: 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.4 + '@rollup/rollup-android-arm64': 4.53.4 + '@rollup/rollup-darwin-arm64': 4.53.4 + '@rollup/rollup-darwin-x64': 4.53.4 + '@rollup/rollup-freebsd-arm64': 4.53.4 + '@rollup/rollup-freebsd-x64': 4.53.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.4 + '@rollup/rollup-linux-arm-musleabihf': 4.53.4 + '@rollup/rollup-linux-arm64-gnu': 4.53.4 + '@rollup/rollup-linux-arm64-musl': 4.53.4 + '@rollup/rollup-linux-loong64-gnu': 4.53.4 + '@rollup/rollup-linux-ppc64-gnu': 4.53.4 + '@rollup/rollup-linux-riscv64-gnu': 4.53.4 + '@rollup/rollup-linux-riscv64-musl': 4.53.4 + '@rollup/rollup-linux-s390x-gnu': 4.53.4 + '@rollup/rollup-linux-x64-gnu': 4.53.4 + '@rollup/rollup-linux-x64-musl': 4.53.4 + '@rollup/rollup-openharmony-arm64': 4.53.4 + '@rollup/rollup-win32-arm64-msvc': 4.53.4 + '@rollup/rollup-win32-ia32-msvc': 4.53.4 + '@rollup/rollup-win32-x64-gnu': 4.53.4 + '@rollup/rollup-win32-x64-msvc': 4.53.4 fsevents: 2.3.3 run-async@2.4.1: {} @@ -7155,7 +7076,7 @@ snapshots: socks@2.8.7: dependencies: - ip-address: 10.0.1 + ip-address: 10.1.0 smart-buffer: 4.2.0 source-map-js@1.2.1: {} @@ -7197,7 +7118,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -7211,7 +7132,7 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 string.prototype.trim@1.2.10: dependencies: @@ -7219,7 +7140,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -7258,10 +7179,10 @@ snapshots: strip-json-comments@3.1.1: {} - styled-jsx@5.1.6(react@19.2.0): + styled-jsx@5.1.6(react@19.2.3): dependencies: client-only: 0.0.1 - react: 19.2.0 + react: 19.2.3 supports-color@5.5.0: dependencies: @@ -7288,7 +7209,7 @@ snapshots: chalk-template: 1.1.2 commander: 13.1.0 cosmiconfig: 9.0.0(typescript@5.9.3) - effect: 3.19.6 + effect: 3.19.12 enquirer: 2.4.1 fast-check: 3.23.2 globby: 14.1.0 @@ -7314,7 +7235,7 @@ snapshots: tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: dependencies: @@ -7345,25 +7266,25 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.8.3 + typescript: 5.9.3 - ts-node@10.9.2(@types/node@20.19.21)(typescript@5.8.3): + ts-node@10.9.2(@types/node@25.0.2)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 + '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.21 + '@types/node': 25.0.2 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.8.3 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -7373,51 +7294,24 @@ snapshots: tslib@2.8.1: {} - turbo-darwin-64@2.6.1: - optional: true - turbo-darwin-64@2.6.3: optional: true - turbo-darwin-arm64@2.6.1: - optional: true - turbo-darwin-arm64@2.6.3: optional: true - turbo-linux-64@2.6.1: - optional: true - turbo-linux-64@2.6.3: optional: true - turbo-linux-arm64@2.6.1: - optional: true - turbo-linux-arm64@2.6.3: optional: true - turbo-windows-64@2.6.1: - optional: true - turbo-windows-64@2.6.3: optional: true - turbo-windows-arm64@2.6.1: - optional: true - turbo-windows-arm64@2.6.3: optional: true - 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.3: optionalDependencies: turbo-darwin-64: 2.6.3 @@ -7466,19 +7360,17 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.46.1(eslint@9.37.0)(typescript@5.8.3): + typescript-eslint@8.50.0(eslint@9.39.2)(typescript@5.9.3): dependencies: - '@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 + '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - typescript@5.8.3: {} - typescript@5.9.3: {} uglify-js@3.19.3: @@ -7503,6 +7395,12 @@ snapshots: universalify@2.0.1: {} + update-browserslist-db@1.2.2(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + update-check@1.5.4: dependencies: registry-auth-token: 3.3.2 @@ -7528,15 +7426,15 @@ snapshots: validate-npm-package-name@6.0.2: {} - viem@2.40.3(typescript@5.9.3): + viem@2.42.1(typescript@5.9.3)(zod@4.2.0): 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.9.3) + abitype: 1.1.0(typescript@5.9.3)(zod@4.2.0) isows: 1.0.7(ws@8.18.3) - ox: 0.9.17(typescript@5.9.3) + ox: 0.9.17(typescript@5.9.3)(zod@4.2.0) ws: 8.18.3 optionalDependencies: typescript: 5.9.3 @@ -7545,43 +7443,43 @@ snapshots: - utf-8-validate - zod - vite@7.1.10(@types/node@24.10.1): + vite@7.3.0(@types/node@25.0.2): dependencies: - esbuild: 0.25.11 + esbuild: 0.27.1 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.4 + rollup: 4.53.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.2 fsevents: 2.3.3 - vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10): + vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11): dependencies: - '@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 + '@vitest/expect': 4.0.15 + '@vitest/mocker': 4.0.15(vite@7.3.0(@types/node@25.0.2)) + '@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.2.2 + 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 tinyrainbow: 3.0.3 - vite: 7.1.10(@types/node@24.10.1) + vite: 7.3.0(@types/node@25.0.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.10.1 - happy-dom: 20.0.10 + '@types/node': 25.0.2 + happy-dom: 20.0.11 transitivePeerDependencies: - jiti - less @@ -7679,6 +7577,8 @@ snapshots: y18n@5.0.8: {} + yallist@3.1.1: {} + yargs-parser@21.1.1: {} yargs-parser@22.0.0: {} @@ -7705,3 +7605,9 @@ snapshots: yn@3.1.1: {} yocto-queue@0.1.0: {} + + zod-validation-error@4.0.2(zod@4.2.0): + dependencies: + zod: 4.2.0 + + zod@4.2.0: {} diff --git a/repo/eslint-config/package.json b/repo/eslint-config/package.json index 7fa53be38..5625bc699 100644 --- a/repo/eslint-config/package.json +++ b/repo/eslint-config/package.json @@ -9,16 +9,16 @@ "./react-internal": "./react-internal.js" }, "devDependencies": { - "@eslint/js": "^9.28.0", - "@next/eslint-plugin-next": "^15.3.3", - "eslint": "^9.28.0", - "eslint-config-prettier": "^9.1.0", + "@eslint/js": "^9.39.2", + "@next/eslint-plugin-next": "^15.5.9", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-only-warn": "^1.1.0", "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-turbo": "^2.5.4", - "globals": "^15.15.0", - "typescript": "^5.8.3", - "typescript-eslint": "^8.33.1" + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-turbo": "^2.6.3", + "globals": "^16.5.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.49.0" } } diff --git a/repo/ui/package.json b/repo/ui/package.json index 226eed0d9..6b380862e 100644 --- a/repo/ui/package.json +++ b/repo/ui/package.json @@ -13,16 +13,16 @@ "typecheck": "tsc --noEmit" }, "devDependencies": { - "@repo/eslint-config": "workspace:*", - "@repo/typescript-config": "workspace:*", + "@repo/eslint-config": "workspace:^", + "@repo/typescript-config": "workspace:^", "@turbo/gen": "^1.13.4", - "@types/node": "^20.17.57", - "@types/react": "^19.2.6", + "@types/node": "^25.0.2", + "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", - "typescript": "^5.8.3" + "typescript": "^5.9.3" }, "dependencies": { - "react": "^19.1.0", - "react-dom": "^19.1.0" + "react": "^19.2.3", + "react-dom": "^19.2.3" } } From a7744910e6c182a0023856d14cdd7040fa008a9b Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Thu, 18 Dec 2025 20:27:26 +0100 Subject: [PATCH 173/177] Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test --- packages/wallet/wdk/src/sequence/manager.ts | 42 ++++++++++++++++++- packages/wallet/wdk/src/sequence/signers.ts | 13 ++++++ .../wallet/wdk/test/signers-kindof.test.ts | 40 ++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 packages/wallet/wdk/test/signers-kindof.test.ts diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index a55059cbf..ba27116cf 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -59,6 +59,8 @@ export type ManagerOptions = { guardUrl?: string guardAddresses?: Record + nonWitnessableSigners?: Address.Address[] + // The default guard topology MUST have a placeholder address for the guard address defaultGuardTopology?: Config.Topology defaultRecoverySettings?: RecoverySettings @@ -123,6 +125,8 @@ export const ManagerOptionsDefaults = { }, bundlers: [], + nonWitnessableSigners: [] as Address.Address[], + guardUrl: 'https://guard.sequence.app', guardAddresses: { wallet: '0x26f3D30F41FA897309Ae804A2AFf15CEb1dA5742', @@ -183,11 +187,41 @@ export const CreateWalletOptionsDefaults = { } export function applyManagerOptionsDefaults(options?: ManagerOptions) { - return { + const merged = { ...ManagerOptionsDefaults, ...options, identity: { ...ManagerOptionsDefaults.identity, ...options?.identity }, } + + // Merge and normalize non-witnessable signers. + // We always include the sessions extension address for the active extensions set. + const nonWitnessable = new Set() + for (const address of ManagerOptionsDefaults.nonWitnessableSigners ?? []) { + nonWitnessable.add(address.toLowerCase()) + } + for (const address of options?.nonWitnessableSigners ?? []) { + nonWitnessable.add(address.toLowerCase()) + } + nonWitnessable.add(merged.extensions.sessions.toLowerCase()) + + // Include static signer leaves from the guard topology (e.g. recovery guard signer), + // but ignore the placeholder address that is later replaced per-role. + if (merged.defaultGuardTopology) { + const guardTopologySigners = Config.getSigners(merged.defaultGuardTopology) + for (const signer of guardTopologySigners.signers) { + if (Address.isEqual(signer, Constants.PlaceholderAddress)) { + continue + } + nonWitnessable.add(signer.toLowerCase()) + } + for (const signer of guardTopologySigners.sapientSigners) { + nonWitnessable.add(signer.address.toLowerCase()) + } + } + + merged.nonWitnessableSigners = Array.from(nonWitnessable) as Address.Address[] + + return merged } export type RecoverySettings = { @@ -221,6 +255,8 @@ export type Sequence = { readonly relayers: Relayer.Relayer[] readonly bundlers: Bundler.Bundler[] + readonly nonWitnessableSigners: ReadonlySet + readonly defaultGuardTopology: Config.Topology readonly defaultRecoverySettings: RecoverySettings @@ -408,6 +444,10 @@ export class Manager { relayers, bundlers: ops.bundlers, + nonWitnessableSigners: new Set( + (ops.nonWitnessableSigners ?? []).map((address) => address.toLowerCase() as Address.Address), + ), + defaultGuardTopology: ops.defaultGuardTopology, defaultRecoverySettings: ops.defaultRecoverySettings, diff --git a/packages/wallet/wdk/src/sequence/signers.ts b/packages/wallet/wdk/src/sequence/signers.ts index cf79c43c7..c2002d2d9 100644 --- a/packages/wallet/wdk/src/sequence/signers.ts +++ b/packages/wallet/wdk/src/sequence/signers.ts @@ -48,6 +48,19 @@ export class Signers { return Kinds.Guard } + // Passkeys are a sapient signer module: the address alone identifies the kind. + // Metadata (credential id, public key, etc.) is loaded later by the PasskeysHandler + // via the witness payload, so we can skip the witness probe here. + if (Address.isEqual(this.shared.sequence.extensions.passkeys, address)) { + return Kinds.LoginPasskey + } + + // Some signers are known to never publish a witness record (e.g. module signers). + // Skip probing the Sessions/Witness endpoint for them. + if (this.shared.sequence.nonWitnessableSigners.has(address.toLowerCase() as Address.Address)) { + return undefined + } + // We need to use the state provider (and witness) this will tell us the kind of signer // NOTICE: This looks expensive, but this operation should be cached by the state provider const witness = await (imageHash diff --git a/packages/wallet/wdk/test/signers-kindof.test.ts b/packages/wallet/wdk/test/signers-kindof.test.ts new file mode 100644 index 000000000..4e5f83aad --- /dev/null +++ b/packages/wallet/wdk/test/signers-kindof.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, it, vi } from 'vitest' + +import { Kinds } from '../src/sequence/index.js' +import { newManager } from './constants.js' + +describe('Signers.kindOf', () => { + it('does not probe Sessions/Witness for non-witnessable signers', async () => { + const getWitnessFor = vi.fn().mockResolvedValue(undefined) + const getWitnessForSapient = vi.fn().mockResolvedValue(undefined) + + const manager = newManager({ + stateProvider: { + getWitnessFor, + getWitnessForSapient, + } as any, + }) + + const signers = (manager as any).shared.modules.signers + const extensions = (manager as any).shared.sequence.extensions + + const wallet = '0x1111111111111111111111111111111111111111' + const imageHash = ('0x' + '00'.repeat(32)) as `0x${string}` + + // Sessions extension signer (sapient leaf) never publishes a witness. + await signers.kindOf(wallet, extensions.sessions, imageHash) + + // Passkeys module is a known sapient signer kind. + expect(await signers.kindOf(wallet, extensions.passkeys, imageHash)).toBe(Kinds.LoginPasskey) + + // Sequence dev multisig (default guard topology leaf) never publishes a witness. + await signers.kindOf(wallet, '0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4') + + expect(getWitnessFor).not.toHaveBeenCalled() + expect(getWitnessForSapient).not.toHaveBeenCalled() + + // Unknown signers still rely on a witness probe. + await signers.kindOf(wallet, '0x2222222222222222222222222222222222222222') + expect(getWitnessFor).toHaveBeenCalledTimes(1) + }) +}) From e7de3b1073fcea54a41e65b00b3cdecdd8e60eb0 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 18 Dec 2025 20:37:52 +0100 Subject: [PATCH 174/177] 3.0.0-beta.6 --- .changeset/cyan-radios-relax.md | 18 ++++++++ .changeset/pre.json | 43 +++++++++++-------- packages/services/api/CHANGELOG.md | 6 +++ packages/services/api/package.json | 2 +- packages/services/builder/CHANGELOG.md | 6 +++ packages/services/builder/package.json | 2 +- packages/services/guard/CHANGELOG.md | 6 +++ packages/services/guard/package.json | 2 +- .../services/identity-instrument/CHANGELOG.md | 6 +++ .../services/identity-instrument/package.json | 2 +- packages/services/indexer/CHANGELOG.md | 6 +++ packages/services/indexer/package.json | 2 +- packages/services/marketplace/CHANGELOG.md | 6 +++ packages/services/marketplace/package.json | 2 +- packages/services/metadata/CHANGELOG.md | 6 +++ packages/services/metadata/package.json | 2 +- packages/services/relayer/CHANGELOG.md | 8 ++++ packages/services/relayer/package.json | 2 +- packages/services/userdata/CHANGELOG.md | 6 +++ packages/services/userdata/package.json | 2 +- packages/utils/abi/CHANGELOG.md | 6 +++ packages/utils/abi/package.json | 2 +- packages/wallet/core/CHANGELOG.md | 10 +++++ packages/wallet/core/package.json | 2 +- packages/wallet/dapp-client/CHANGELOG.md | 11 +++++ packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives/CHANGELOG.md | 6 +++ packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/CHANGELOG.md | 12 ++++++ packages/wallet/wdk/package.json | 2 +- 30 files changed, 158 insertions(+), 32 deletions(-) create mode 100644 .changeset/cyan-radios-relax.md diff --git a/.changeset/cyan-radios-relax.md b/.changeset/cyan-radios-relax.md new file mode 100644 index 000000000..ec408d6cd --- /dev/null +++ b/.changeset/cyan-radios-relax.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +Fix signer 404 error, minor fixes diff --git a/.changeset/pre.json b/.changeset/pre.json index a92fc72b5..73184ae44 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,23 +4,30 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.4", - "@0xsequence/builder": "3.0.0-beta.4", - "@0xsequence/guard": "3.0.0-beta.4", - "@0xsequence/identity-instrument": "3.0.0-beta.4", - "@0xsequence/indexer": "3.0.0-beta.4", - "@0xsequence/marketplace": "3.0.0-beta.4", - "@0xsequence/metadata": "3.0.0-beta.4", - "@0xsequence/relayer": "3.0.0-beta.4", - "@0xsequence/userdata": "3.0.0-beta.4", - "@0xsequence/abi": "3.0.0-beta.4", - "@0xsequence/wallet-core": "3.0.0-beta.4", - "@0xsequence/dapp-client": "3.0.0-beta.4", - "@0xsequence/wallet-primitives": "3.0.0-beta.4", - "@0xsequence/wallet-wdk": "3.0.0-beta.4", - "@repo/eslint-config": "0.0.1-beta.0", - "@repo/typescript-config": "0.0.1-beta.0", - "@repo/ui": "0.0.1-beta.0" + "@0xsequence/api": "3.0.0-beta.5", + "@0xsequence/builder": "3.0.0-beta.5", + "@0xsequence/guard": "3.0.0-beta.5", + "@0xsequence/identity-instrument": "3.0.0-beta.5", + "@0xsequence/indexer": "3.0.0-beta.5", + "@0xsequence/marketplace": "3.0.0-beta.5", + "@0xsequence/metadata": "3.0.0-beta.5", + "@0xsequence/relayer": "3.0.0-beta.5", + "@0xsequence/userdata": "3.0.0-beta.5", + "@0xsequence/abi": "3.0.0-beta.5", + "@0xsequence/wallet-core": "3.0.0-beta.5", + "@0xsequence/dapp-client": "3.0.0-beta.5", + "@0xsequence/wallet-primitives": "3.0.0-beta.5", + "@0xsequence/wallet-wdk": "3.0.0-beta.5", + "@repo/eslint-config": "0.0.1-beta.1", + "@repo/typescript-config": "0.0.1-beta.1", + "@repo/ui": "0.0.1-beta.1" }, - "changesets": ["goofy-laws-serve", "open-toes-marry", "plain-feet-stare", "wild-feet-carry", "wise-heads-buy"] + "changesets": [ + "cyan-radios-relax", + "goofy-laws-serve", + "open-toes-marry", + "plain-feet-stare", + "wild-feet-carry", + "wise-heads-buy" + ] } diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 610642b4c..11007faa9 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index dda4d0fd7..6191c7940 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 9dda5364d..2877d5538 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index a6da87826..de33fd730 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 9ba2ad5f4..7adaddd55 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 542b9ee55..5c93bdfc1 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 3ecd8814c..866782714 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index dfdd56b3e..026b8c291 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/identity-instrument", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 3978b95ac..e320c4307 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index bb4ea0b6f..cb91b590c 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 2b450ab82..6e33420f0 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 47905f591..58959af0d 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index f783d7ba3..4fc3e61cc 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 5f30c7600..9218059ef 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index c4e639bfd..00efdf828 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.6 + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index e87885932..9e49fe299 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 0079ca325..b28ab5220 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 36237bc95..3d2fd79e9 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms Inc.", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 447d70ed1..92b0978a1 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index d2df92de1..fdf2e38c2 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 940b7e413..0ff25b21a 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.6 + - @0xsequence/relayer@3.0.0-beta.6 + - @0xsequence/wallet-primitives@3.0.0-beta.6 + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 8e58e5641..b7e7b463f 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 3c4d46618..e7feb8989 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.6 + - @0xsequence/relayer@3.0.0-beta.6 + - @0xsequence/wallet-core@3.0.0-beta.6 + - @0xsequence/wallet-primitives@3.0.0-beta.6 + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 7ce4dae81..40a6659c5 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/dapp-client", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 5e9e2c183..c98111672 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 3b1ffdbec..08e2b41ba 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index ea802f9c4..6f2094f85 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.6 + +### Patch Changes + +- Fix signer 404 error, minor fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.6 + - @0xsequence/identity-instrument@3.0.0-beta.6 + - @0xsequence/relayer@3.0.0-beta.6 + - @0xsequence/wallet-core@3.0.0-beta.6 + - @0xsequence/wallet-primitives@3.0.0-beta.6 + ## 3.0.0-beta.5 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 2c0dc66e3..069ea2491 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.0-beta.5", + "version": "3.0.0-beta.6", "license": "Apache-2.0", "type": "module", "publishConfig": { 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 175/177] 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 176/177] 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 709c9a747..ad53a8e49 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 177/177] 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 f7b477b6c..12eb0f0ff 100644 --- a/packages/services/identity-instrument/src/index.ts +++ b/packages/services/identity-instrument/src/index.ts @@ -65,7 +65,7 @@ export class IdentityInstrument { keyType: KeyType.Ethereum_Secp256k1, }, digest: Hex.fromBytes(digest), - nonce: Hex.fromNumber(Date.now()), + nonce: Hex.random(16), } const res = await this.rpc.sign({ params,