From 9c2f3a12c1d7df69ac7636509e312a7a6fef282c Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Fri, 24 Oct 2025 17:07:21 +0300 Subject: [PATCH 001/144] 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 7bef40ed4728e96f609bbbb697ff0387bc6ec616 Mon Sep 17 00:00:00 2001 From: Corban Brook Date: Mon, 27 Oct 2025 11:20:50 -0400 Subject: [PATCH 002/144] 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 003/144] 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 004/144] 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 005/144] 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 9175b15bc5b9bd54c14c7efeac3f77336df43939 Mon Sep 17 00:00:00 2001 From: Agusx1211 Date: Mon, 17 Nov 2025 17:41:08 +0000 Subject: [PATCH 006/144] 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 007/144] 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 008/144] 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 009/144] 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 010/144] 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 011/144] 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 012/144] 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 013/144] 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 014/144] 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 015/144] 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 016/144] 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 017/144] 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 018/144] 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 019/144] 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 98ce34f92829341fc392ac0807603788529bbe9d Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 20 Nov 2025 21:44:38 +0100 Subject: [PATCH 020/144] 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 021/144] 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 022/144] 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 023/144] Update guard.gen.ts From fdb1807aea639fce083692b39120d7f8a566f1bb Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 24 Nov 2025 12:39:52 +0100 Subject: [PATCH 024/144] 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 025/144] 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 026/144] 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 027/144] 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 028/144] 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 029/144] 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 030/144] 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 031/144] 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 032/144] 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 033/144] 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 034/144] 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 035/144] 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 036/144] 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 037/144] 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 038/144] 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 039/144] 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 040/144] 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 041/144] 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 042/144] 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 043/144] 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 044/144] 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 045/144] 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 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 046/144] 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 047/144] 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 048/144] 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 049/144] 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 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 050/144] 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 051/144] 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 052/144] 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 053/144] 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 054/144] 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 2c49090e8d3aca18854b55dcecbd0fc5e181d419 Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Tue, 6 Jan 2026 15:49:49 +0300 Subject: [PATCH 055/144] Fix apple auth scope (#950) * Fix apple auth scope * Fix Apple auth scope test --- packages/wallet/wdk/src/sequence/handlers/authcode.ts | 3 ++- packages/wallet/wdk/test/authcode.test.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode.ts b/packages/wallet/wdk/src/sequence/handlers/authcode.ts index f73f9ec5d..13c035c0f 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode.ts @@ -45,11 +45,12 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { isSignUp, }) + const scope = this.signupKind === 'apple' ? 'name email' : 'openid profile email' const searchParams = new URLSearchParams({ client_id: this.audience, redirect_uri: this.redirectUri, response_type: 'code', - scope: 'openid profile email', + scope, state, }) diff --git a/packages/wallet/wdk/test/authcode.test.ts b/packages/wallet/wdk/test/authcode.test.ts index 4874e475b..801547b11 100644 --- a/packages/wallet/wdk/test/authcode.test.ts +++ b/packages/wallet/wdk/test/authcode.test.ts @@ -311,6 +311,8 @@ describe('AuthCodeHandler', () => { expect(result).toContain('https://appleid.apple.com/auth/authorize?') expect(result).toContain('client_id=apple-client-id') + const resultUrl = new URL(result) + expect(resultUrl.searchParams.get('scope')).toBe('name email') }) it('Should create commitment without signer', async () => { From 0b631135293f8b1dcf592d03625e623a51313f4d Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 6 Jan 2026 13:53:04 +0100 Subject: [PATCH 056/144] 3.0.0-beta.7 --- .changeset/nice-tips-slide.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/nice-tips-slide.md diff --git a/.changeset/nice-tips-slide.md b/.changeset/nice-tips-slide.md new file mode 100644 index 000000000..1595123e7 --- /dev/null +++ b/.changeset/nice-tips-slide.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 +--- + +Apple auth fix diff --git a/.changeset/pre.json b/.changeset/pre.json index 73184ae44..b5ae4e476 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,20 +4,20 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.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", + "@0xsequence/api": "3.0.0-beta.6", + "@0xsequence/builder": "3.0.0-beta.6", + "@0xsequence/guard": "3.0.0-beta.6", + "@0xsequence/identity-instrument": "3.0.0-beta.6", + "@0xsequence/indexer": "3.0.0-beta.6", + "@0xsequence/marketplace": "3.0.0-beta.6", + "@0xsequence/metadata": "3.0.0-beta.6", + "@0xsequence/relayer": "3.0.0-beta.6", + "@0xsequence/userdata": "3.0.0-beta.6", + "@0xsequence/abi": "3.0.0-beta.6", + "@0xsequence/wallet-core": "3.0.0-beta.6", + "@0xsequence/dapp-client": "3.0.0-beta.6", + "@0xsequence/wallet-primitives": "3.0.0-beta.6", + "@0xsequence/wallet-wdk": "3.0.0-beta.6", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" @@ -25,6 +25,7 @@ "changesets": [ "cyan-radios-relax", "goofy-laws-serve", + "nice-tips-slide", "open-toes-marry", "plain-feet-stare", "wild-feet-carry", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 11007faa9..67e4397fa 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 6191c7940..ebee82a3e 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.6", + "version": "3.0.0-beta.7", "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 2877d5538..db3ac42b4 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index de33fd730..cf96f7c82 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.6", + "version": "3.0.0-beta.7", "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 7adaddd55..da644f2c9 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 5c93bdfc1..d5a45f884 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.6", + "version": "3.0.0-beta.7", "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 866782714..cdc4def2b 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.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 026b8c291..f7b312d34 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.6", + "version": "3.0.0-beta.7", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index e320c4307..a63e9c95f 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index cb91b590c..4505186fe 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.6", + "version": "3.0.0-beta.7", "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 6e33420f0..a87ed3a81 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 58959af0d..c58da41ca 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.6", + "version": "3.0.0-beta.7", "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 4fc3e61cc..0ee3c8f35 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 9218059ef..61f9080a5 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.6", + "version": "3.0.0-beta.7", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 00efdf828..fad56dd06 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.7 + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 9e49fe299..c52074855 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.6", + "version": "3.0.0-beta.7", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index b28ab5220..a15a9e62e 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 3d2fd79e9..2ca0160fd 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.6", + "version": "3.0.0-beta.7", "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 92b0978a1..3740a7bd9 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index fdf2e38c2..162e3352b 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.6", + "version": "3.0.0-beta.7", "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 0ff25b21a..c60afe376 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.7 + - @0xsequence/relayer@3.0.0-beta.7 + - @0xsequence/wallet-primitives@3.0.0-beta.7 + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index b7e7b463f..591b7804c 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.6", + "version": "3.0.0-beta.7", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index e7feb8989..2cefab933 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.7 + +### Patch Changes + +- Apple auth fix +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.7 + - @0xsequence/relayer@3.0.0-beta.7 + - @0xsequence/wallet-core@3.0.0-beta.7 + - @0xsequence/wallet-primitives@3.0.0-beta.7 + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 40a6659c5..713c346c0 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.6", + "version": "3.0.0-beta.7", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index c98111672..17a270ec4 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 08e2b41ba..7638adebe 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.6", + "version": "3.0.0-beta.7", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 6f2094f85..7026b2d08 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.7 + +### Patch Changes + +- Apple auth fix +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.7 + - @0xsequence/identity-instrument@3.0.0-beta.7 + - @0xsequence/relayer@3.0.0-beta.7 + - @0xsequence/wallet-core@3.0.0-beta.7 + - @0xsequence/wallet-primitives@3.0.0-beta.7 + ## 3.0.0-beta.6 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 069ea2491..bf782efa2 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.6", + "version": "3.0.0-beta.7", "license": "Apache-2.0", "type": "module", "publishConfig": { From 15de255018154745b334d893cc14122589ed444e Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Tue, 6 Jan 2026 16:35:09 +0300 Subject: [PATCH 057/144] Update apple auth scope (#951) --- packages/wallet/wdk/src/sequence/handlers/authcode.ts | 3 +-- packages/wallet/wdk/test/authcode.test.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode.ts b/packages/wallet/wdk/src/sequence/handlers/authcode.ts index 13c035c0f..74ad9ee93 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode.ts @@ -45,13 +45,12 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { isSignUp, }) - const scope = this.signupKind === 'apple' ? 'name email' : 'openid profile email' const searchParams = new URLSearchParams({ client_id: this.audience, redirect_uri: this.redirectUri, response_type: 'code', - scope, state, + ...(this.signupKind === 'apple' ? {} : { scope: 'openid profile email' }), }) return `${this.oauthUrl}?${searchParams.toString()}` diff --git a/packages/wallet/wdk/test/authcode.test.ts b/packages/wallet/wdk/test/authcode.test.ts index 801547b11..f5930894d 100644 --- a/packages/wallet/wdk/test/authcode.test.ts +++ b/packages/wallet/wdk/test/authcode.test.ts @@ -312,7 +312,7 @@ describe('AuthCodeHandler', () => { expect(result).toContain('https://appleid.apple.com/auth/authorize?') expect(result).toContain('client_id=apple-client-id') const resultUrl = new URL(result) - expect(resultUrl.searchParams.get('scope')).toBe('name email') + expect(resultUrl.searchParams.has('scope')).toBe(false) }) it('Should create commitment without signer', async () => { From e5e1a0307f2300df74e66009b68802aac42adee2 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 6 Jan 2026 15:55:39 +0100 Subject: [PATCH 058/144] 3.0.0-beta.8 --- .changeset/new-turkeys-double.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/new-turkeys-double.md diff --git a/.changeset/new-turkeys-double.md b/.changeset/new-turkeys-double.md new file mode 100644 index 000000000..72f26beb9 --- /dev/null +++ b/.changeset/new-turkeys-double.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 +--- + +Apple auth fixes diff --git a/.changeset/pre.json b/.changeset/pre.json index b5ae4e476..7b641a2f6 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,20 +4,20 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.6", - "@0xsequence/builder": "3.0.0-beta.6", - "@0xsequence/guard": "3.0.0-beta.6", - "@0xsequence/identity-instrument": "3.0.0-beta.6", - "@0xsequence/indexer": "3.0.0-beta.6", - "@0xsequence/marketplace": "3.0.0-beta.6", - "@0xsequence/metadata": "3.0.0-beta.6", - "@0xsequence/relayer": "3.0.0-beta.6", - "@0xsequence/userdata": "3.0.0-beta.6", - "@0xsequence/abi": "3.0.0-beta.6", - "@0xsequence/wallet-core": "3.0.0-beta.6", - "@0xsequence/dapp-client": "3.0.0-beta.6", - "@0xsequence/wallet-primitives": "3.0.0-beta.6", - "@0xsequence/wallet-wdk": "3.0.0-beta.6", + "@0xsequence/api": "3.0.0-beta.7", + "@0xsequence/builder": "3.0.0-beta.7", + "@0xsequence/guard": "3.0.0-beta.7", + "@0xsequence/identity-instrument": "3.0.0-beta.7", + "@0xsequence/indexer": "3.0.0-beta.7", + "@0xsequence/marketplace": "3.0.0-beta.7", + "@0xsequence/metadata": "3.0.0-beta.7", + "@0xsequence/relayer": "3.0.0-beta.7", + "@0xsequence/userdata": "3.0.0-beta.7", + "@0xsequence/abi": "3.0.0-beta.7", + "@0xsequence/wallet-core": "3.0.0-beta.7", + "@0xsequence/dapp-client": "3.0.0-beta.7", + "@0xsequence/wallet-primitives": "3.0.0-beta.7", + "@0xsequence/wallet-wdk": "3.0.0-beta.7", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" @@ -25,6 +25,7 @@ "changesets": [ "cyan-radios-relax", "goofy-laws-serve", + "new-turkeys-double", "nice-tips-slide", "open-toes-marry", "plain-feet-stare", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 67e4397fa..eb752f763 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index ebee82a3e..a708e47b6 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.7", + "version": "3.0.0-beta.8", "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 db3ac42b4..2e8c05853 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index cf96f7c82..5af46487e 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.7", + "version": "3.0.0-beta.8", "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 da644f2c9..a1fb935b7 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index d5a45f884..c8f5dab29 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.7", + "version": "3.0.0-beta.8", "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 cdc4def2b..13752db89 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.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index f7b312d34..d999bfd8c 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.7", + "version": "3.0.0-beta.8", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index a63e9c95f..ca9c4bd97 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 4505186fe..61722246d 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.7", + "version": "3.0.0-beta.8", "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 a87ed3a81..f6cff132a 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index c58da41ca..2418ebeed 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.7", + "version": "3.0.0-beta.8", "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 0ee3c8f35..596f86db8 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 61f9080a5..5ec735f5d 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.7", + "version": "3.0.0-beta.8", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index fad56dd06..8c46eae3c 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.8 + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index c52074855..375d30454 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.7", + "version": "3.0.0-beta.8", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index a15a9e62e..663be2cc1 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 2ca0160fd..02d742b6b 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.7", + "version": "3.0.0-beta.8", "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 3740a7bd9..33b36f118 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 162e3352b..19a81dad6 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.7", + "version": "3.0.0-beta.8", "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 c60afe376..a93c6d3bb 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.8 + - @0xsequence/relayer@3.0.0-beta.8 + - @0xsequence/wallet-primitives@3.0.0-beta.8 + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 591b7804c..752e44925 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.7", + "version": "3.0.0-beta.8", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 2cefab933..a51a917f7 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.8 + +### Patch Changes + +- Apple auth fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.8 + - @0xsequence/relayer@3.0.0-beta.8 + - @0xsequence/wallet-core@3.0.0-beta.8 + - @0xsequence/wallet-primitives@3.0.0-beta.8 + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 713c346c0..fe0107b98 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.7", + "version": "3.0.0-beta.8", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 17a270ec4..e09abfd9d 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 7638adebe..a85749c3b 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.7", + "version": "3.0.0-beta.8", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 7026b2d08..fdf3ad71c 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.8 + +### Patch Changes + +- Apple auth fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.8 + - @0xsequence/identity-instrument@3.0.0-beta.8 + - @0xsequence/relayer@3.0.0-beta.8 + - @0xsequence/wallet-core@3.0.0-beta.8 + - @0xsequence/wallet-primitives@3.0.0-beta.8 + ## 3.0.0-beta.7 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index bf782efa2..83371b8c2 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.7", + "version": "3.0.0-beta.8", "license": "Apache-2.0", "type": "module", "publishConfig": { From d62fe68de294b0d505ec57eee4f70b4baad9b040 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Wed, 7 Jan 2026 11:33:10 -0500 Subject: [PATCH 059/144] dapp-client: export TransportMessage and MessageType --- packages/wallet/dapp-client/src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/wallet/dapp-client/src/index.ts b/packages/wallet/dapp-client/src/index.ts index d16662c37..e89ab9e95 100644 --- a/packages/wallet/dapp-client/src/index.ts +++ b/packages/wallet/dapp-client/src/index.ts @@ -23,8 +23,9 @@ export type { GetFeeTokensResponse, FeeToken, FeeOption, + TransportMessage, } from './types/index.js' -export { RequestActionType, TransportMode } from './types/index.js' +export { RequestActionType, TransportMode, MessageType } from './types/index.js' export { FeeOptionError, TransactionError, From 9fb48f715989903fff39665ad594253b6e140693 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Fri, 9 Jan 2026 18:35:35 -0500 Subject: [PATCH 060/144] Adding eoa LoginMethod to dapp-client --- packages/wallet/dapp-client/src/types/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/dapp-client/src/types/index.ts b/packages/wallet/dapp-client/src/types/index.ts index 72e3dbe11..6a0eb08da 100644 --- a/packages/wallet/dapp-client/src/types/index.ts +++ b/packages/wallet/dapp-client/src/types/index.ts @@ -21,7 +21,7 @@ export const RequestActionType = { SEND_WALLET_TRANSACTION: 'sendWalletTransaction', } as const -export type LoginMethod = 'google' | 'apple' | 'email' | 'passkey' | 'mnemonic' +export type LoginMethod = 'google' | 'apple' | 'email' | 'passkey' | 'mnemonic' | 'eoa' export interface GuardConfig { url: string From 40c19fff50562740904ef2f55a11c18583356713 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 13 Jan 2026 18:28:32 +0100 Subject: [PATCH 061/144] 3.0.0-beta.9 --- .changeset/pre.json | 29 ++++++++++--------- .changeset/tiny-files-chew.md | 18 ++++++++++++ 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, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/tiny-files-chew.md diff --git a/.changeset/pre.json b/.changeset/pre.json index 7b641a2f6..0284e14c5 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,20 +4,20 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.7", - "@0xsequence/builder": "3.0.0-beta.7", - "@0xsequence/guard": "3.0.0-beta.7", - "@0xsequence/identity-instrument": "3.0.0-beta.7", - "@0xsequence/indexer": "3.0.0-beta.7", - "@0xsequence/marketplace": "3.0.0-beta.7", - "@0xsequence/metadata": "3.0.0-beta.7", - "@0xsequence/relayer": "3.0.0-beta.7", - "@0xsequence/userdata": "3.0.0-beta.7", - "@0xsequence/abi": "3.0.0-beta.7", - "@0xsequence/wallet-core": "3.0.0-beta.7", - "@0xsequence/dapp-client": "3.0.0-beta.7", - "@0xsequence/wallet-primitives": "3.0.0-beta.7", - "@0xsequence/wallet-wdk": "3.0.0-beta.7", + "@0xsequence/api": "3.0.0-beta.8", + "@0xsequence/builder": "3.0.0-beta.8", + "@0xsequence/guard": "3.0.0-beta.8", + "@0xsequence/identity-instrument": "3.0.0-beta.8", + "@0xsequence/indexer": "3.0.0-beta.8", + "@0xsequence/marketplace": "3.0.0-beta.8", + "@0xsequence/metadata": "3.0.0-beta.8", + "@0xsequence/relayer": "3.0.0-beta.8", + "@0xsequence/userdata": "3.0.0-beta.8", + "@0xsequence/abi": "3.0.0-beta.8", + "@0xsequence/wallet-core": "3.0.0-beta.8", + "@0xsequence/dapp-client": "3.0.0-beta.8", + "@0xsequence/wallet-primitives": "3.0.0-beta.8", + "@0xsequence/wallet-wdk": "3.0.0-beta.8", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" @@ -29,6 +29,7 @@ "nice-tips-slide", "open-toes-marry", "plain-feet-stare", + "tiny-files-chew", "wild-feet-carry", "wise-heads-buy" ] diff --git a/.changeset/tiny-files-chew.md b/.changeset/tiny-files-chew.md new file mode 100644 index 000000000..672546fd0 --- /dev/null +++ b/.changeset/tiny-files-chew.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 +--- + +dapp client updates for EOA login diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index eb752f763..d0449f7f8 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index a708e47b6..4e464c681 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.8", + "version": "3.0.0-beta.9", "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 2e8c05853..af8df7f69 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 5af46487e..013a52514 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.8", + "version": "3.0.0-beta.9", "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 a1fb935b7..e4d2c0a2e 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index c8f5dab29..c098ad0a1 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.8", + "version": "3.0.0-beta.9", "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 13752db89..b59c8f017 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.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index d999bfd8c..1243ba84c 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.8", + "version": "3.0.0-beta.9", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index ca9c4bd97..fec6e5947 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 61722246d..164097420 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.8", + "version": "3.0.0-beta.9", "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 f6cff132a..d180788d1 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 2418ebeed..2f7a1aa36 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.8", + "version": "3.0.0-beta.9", "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 596f86db8..c304a5485 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 5ec735f5d..c59c27f41 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.8", + "version": "3.0.0-beta.9", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 8c46eae3c..9fecf4b9c 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.9 + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 375d30454..4f30550c1 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.8", + "version": "3.0.0-beta.9", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 663be2cc1..f9a97c126 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 02d742b6b..6c4427fa7 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.8", + "version": "3.0.0-beta.9", "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 33b36f118..9ddc56462 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 19a81dad6..1eb722f85 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.8", + "version": "3.0.0-beta.9", "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 a93c6d3bb..32e56d238 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.9 + - @0xsequence/relayer@3.0.0-beta.9 + - @0xsequence/wallet-primitives@3.0.0-beta.9 + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 752e44925..e2978f593 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.8", + "version": "3.0.0-beta.9", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index a51a917f7..322d41ff7 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.9 + +### Patch Changes + +- dapp client updates for EOA login +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.9 + - @0xsequence/relayer@3.0.0-beta.9 + - @0xsequence/wallet-core@3.0.0-beta.9 + - @0xsequence/wallet-primitives@3.0.0-beta.9 + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index fe0107b98..4b76c39de 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.8", + "version": "3.0.0-beta.9", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index e09abfd9d..c0880a0d7 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index a85749c3b..b964899e2 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.8", + "version": "3.0.0-beta.9", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index fdf3ad71c..37fc483bb 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.9 + +### Patch Changes + +- dapp client updates for EOA login +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.9 + - @0xsequence/identity-instrument@3.0.0-beta.9 + - @0xsequence/relayer@3.0.0-beta.9 + - @0xsequence/wallet-core@3.0.0-beta.9 + - @0xsequence/wallet-primitives@3.0.0-beta.9 + ## 3.0.0-beta.8 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 83371b8c2..103d9cb7c 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.8", + "version": "3.0.0-beta.9", "license": "Apache-2.0", "type": "module", "publishConfig": { From 110e26c3500d80cce3b7cc47240603116712d575 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Fri, 16 Jan 2026 15:48:29 +0300 Subject: [PATCH 062/144] chore(dapp-client): re-export network/util helpers and add explicit session config helper --- packages/wallet/dapp-client/src/index.ts | 22 +++++++- .../wallet/dapp-client/src/utils/index.ts | 50 ++++++++++++++++++- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/packages/wallet/dapp-client/src/index.ts b/packages/wallet/dapp-client/src/index.ts index e89ab9e95..c2315b138 100644 --- a/packages/wallet/dapp-client/src/index.ts +++ b/packages/wallet/dapp-client/src/index.ts @@ -35,7 +35,17 @@ export { SigningError, ModifyExplicitSessionError, } from './utils/errors.js' -export { getExplorerUrl, jsonReplacers, jsonRevivers } from './utils/index.js' +export { + createExplicitSessionConfig, + getExplorerUrl, + getNetwork, + getRelayerUrl, + getRpcUrl, + jsonReplacers, + jsonRevivers, + VALUE_FORWARDER_ADDRESS, +} from './utils/index.js' +export type { ExplicitSessionParams, NativeTokenSpending, SessionDuration } from './utils/index.js' export type { SequenceStorage, ExplicitSessionData, @@ -46,6 +56,14 @@ export type { } from './utils/storage.js' export { WebStorage } from './utils/storage.js' -export { Attestation, Permission, Extensions, SessionConfig, Constants, Payload } from '@0xsequence/wallet-primitives' +export { + Attestation, + Permission, + Extensions, + SessionConfig, + Constants, + Payload, + Network, +} from '@0xsequence/wallet-primitives' export type { ExplicitSessionConfig, ExplicitSession, ImplicitSession, Session } from '@0xsequence/wallet-core' export { Signers, Wallet, Utils, Envelope, State } from '@0xsequence/wallet-core' diff --git a/packages/wallet/dapp-client/src/utils/index.ts b/packages/wallet/dapp-client/src/utils/index.ts index cdb2c4e69..12bf312c3 100644 --- a/packages/wallet/dapp-client/src/utils/index.ts +++ b/packages/wallet/dapp-client/src/utils/index.ts @@ -1,6 +1,8 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Network } from '@0xsequence/wallet-primitives' -import { Bytes, Hex } from 'ox' +import type { ExplicitSessionConfig } from '@0xsequence/wallet-core' +import { Network, Permission } from '@0xsequence/wallet-primitives' +import { Bytes, Hex, type Address } from 'ox' +export { VALUE_FORWARDER_ADDRESS } from './constants.js' type JsonReplacer = (key: string, value: any) => any type JsonReviver = (key: string, value: any) => any @@ -124,6 +126,50 @@ const uint8ArrayReviver: JsonReviver = (key, value) => { export const jsonRevivers = chainRevivers([mapReviver, bigIntReviver, uint8ArrayReviver]) export const jsonReplacers = chainReplacers([mapReplacer, bigIntReplacer, uint8ArrayReplacer]) +export type SessionDuration = { + days?: number + hours?: number + minutes?: number +} + +export type NativeTokenSpending = { + valueLimit: bigint + allowedRecipients?: Address.Address[] +} + +export type ExplicitSessionParams = { + chainId: number + expiresIn: SessionDuration + permissions: Permission.Permission[] + nativeTokenSpending?: NativeTokenSpending +} + +export const createExplicitSessionConfig = (params: ExplicitSessionParams): ExplicitSessionConfig => { + const nowInSeconds = BigInt(Math.floor(Date.now() / 1000)) + const { days = 0, hours = 0, minutes = 0 } = params.expiresIn + const sessionLifetimeSeconds = days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 + const deadline = nowInSeconds + BigInt(sessionLifetimeSeconds) + + if (params.permissions.length === 0) { + throw new Error('createExplicitSessionConfig: At least one permission is required.') + } + + const nativeTokenSpending = params.nativeTokenSpending + const valueLimit = nativeTokenSpending?.valueLimit ?? 0n + const nativeTokenReceivers = [...(nativeTokenSpending?.allowedRecipients || [])] + const nativeTokenSpendingPermissions = nativeTokenReceivers.map((receiver) => ({ + target: receiver, + rules: [], + })) + + return { + chainId: params.chainId, + valueLimit, + deadline, + permissions: [...params.permissions, ...nativeTokenSpendingPermissions], + } +} + /** * Apply a template to a string. * From f5f6a7a90ddc94ccf35885f8da83c810a485f42e Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 20 Jan 2026 18:22:24 +0100 Subject: [PATCH 063/144] 3.0.0-beta.10 --- .changeset/crisp-zoos-retire.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/crisp-zoos-retire.md diff --git a/.changeset/crisp-zoos-retire.md b/.changeset/crisp-zoos-retire.md new file mode 100644 index 000000000..84fd2a25c --- /dev/null +++ b/.changeset/crisp-zoos-retire.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 +--- + +dapp-client updates diff --git a/.changeset/pre.json b/.changeset/pre.json index 0284e14c5..5483a869a 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,25 +4,26 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.8", - "@0xsequence/builder": "3.0.0-beta.8", - "@0xsequence/guard": "3.0.0-beta.8", - "@0xsequence/identity-instrument": "3.0.0-beta.8", - "@0xsequence/indexer": "3.0.0-beta.8", - "@0xsequence/marketplace": "3.0.0-beta.8", - "@0xsequence/metadata": "3.0.0-beta.8", - "@0xsequence/relayer": "3.0.0-beta.8", - "@0xsequence/userdata": "3.0.0-beta.8", - "@0xsequence/abi": "3.0.0-beta.8", - "@0xsequence/wallet-core": "3.0.0-beta.8", - "@0xsequence/dapp-client": "3.0.0-beta.8", - "@0xsequence/wallet-primitives": "3.0.0-beta.8", - "@0xsequence/wallet-wdk": "3.0.0-beta.8", + "@0xsequence/api": "3.0.0-beta.9", + "@0xsequence/builder": "3.0.0-beta.9", + "@0xsequence/guard": "3.0.0-beta.9", + "@0xsequence/identity-instrument": "3.0.0-beta.9", + "@0xsequence/indexer": "3.0.0-beta.9", + "@0xsequence/marketplace": "3.0.0-beta.9", + "@0xsequence/metadata": "3.0.0-beta.9", + "@0xsequence/relayer": "3.0.0-beta.9", + "@0xsequence/userdata": "3.0.0-beta.9", + "@0xsequence/abi": "3.0.0-beta.9", + "@0xsequence/wallet-core": "3.0.0-beta.9", + "@0xsequence/dapp-client": "3.0.0-beta.9", + "@0xsequence/wallet-primitives": "3.0.0-beta.9", + "@0xsequence/wallet-wdk": "3.0.0-beta.9", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" }, "changesets": [ + "crisp-zoos-retire", "cyan-radios-relax", "goofy-laws-serve", "new-turkeys-double", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index d0449f7f8..8a7997a58 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 4e464c681..1dcb3dae2 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.9", + "version": "3.0.0-beta.10", "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 af8df7f69..76bd0fe59 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 013a52514..f0b0d62b0 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.9", + "version": "3.0.0-beta.10", "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 e4d2c0a2e..d20ea859e 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index c098ad0a1..cacf82ffa 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.9", + "version": "3.0.0-beta.10", "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 b59c8f017..9dca72984 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.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 1243ba84c..a05aff012 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.9", + "version": "3.0.0-beta.10", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index fec6e5947..0898bb564 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 164097420..332d21732 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.9", + "version": "3.0.0-beta.10", "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 d180788d1..9fe90e1d3 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 2f7a1aa36..17cc4cf51 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.9", + "version": "3.0.0-beta.10", "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 c304a5485..f0831c0a5 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index c59c27f41..afed07373 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.9", + "version": "3.0.0-beta.10", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 9fecf4b9c..0e23d886c 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.10 + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 4f30550c1..3c2802d78 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.9", + "version": "3.0.0-beta.10", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index f9a97c126..659989d4c 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 6c4427fa7..3b4086385 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.9", + "version": "3.0.0-beta.10", "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 9ddc56462..e62c45c4b 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 1eb722f85..83978c3d8 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.9", + "version": "3.0.0-beta.10", "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 32e56d238..a8a4c0121 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.10 + - @0xsequence/relayer@3.0.0-beta.10 + - @0xsequence/wallet-primitives@3.0.0-beta.10 + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index e2978f593..2b575325f 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.9", + "version": "3.0.0-beta.10", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 322d41ff7..3a46bc242 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.10 + +### Patch Changes + +- dapp-client updates +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.10 + - @0xsequence/relayer@3.0.0-beta.10 + - @0xsequence/wallet-core@3.0.0-beta.10 + - @0xsequence/wallet-primitives@3.0.0-beta.10 + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 4b76c39de..8ab8875c4 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.9", + "version": "3.0.0-beta.10", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index c0880a0d7..0a422e031 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index b964899e2..7b1aa271f 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.9", + "version": "3.0.0-beta.10", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 37fc483bb..eedb582ce 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.10 + +### Patch Changes + +- dapp-client updates +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.10 + - @0xsequence/identity-instrument@3.0.0-beta.10 + - @0xsequence/relayer@3.0.0-beta.10 + - @0xsequence/wallet-core@3.0.0-beta.10 + - @0xsequence/wallet-primitives@3.0.0-beta.10 + ## 3.0.0-beta.9 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 103d9cb7c..ed1843b76 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.9", + "version": "3.0.0-beta.10", "license": "Apache-2.0", "type": "module", "publishConfig": { From 221699f1b9243ff43c3e6e059ed2f83ee5ea0db8 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Mon, 26 Jan 2026 14:57:29 +0300 Subject: [PATCH 064/144] fix(dapp-client): tighten transport message source validation --- packages/wallet/dapp-client/src/DappTransport.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/wallet/dapp-client/src/DappTransport.ts b/packages/wallet/dapp-client/src/DappTransport.ts index 502c238bd..090b1070b 100644 --- a/packages/wallet/dapp-client/src/DappTransport.ts +++ b/packages/wallet/dapp-client/src/DappTransport.ts @@ -378,10 +378,7 @@ export class DappTransport { return } - const isPotentiallyValidSource = - this.walletWindow && (event.source === this.walletWindow || !this.walletWindow.closed) - - if (!isPotentiallyValidSource && event.data?.type !== MessageType.WALLET_OPENED) { + if (!this.walletWindow || event.source !== this.walletWindow) { return } From 549871ba8054f25539543450b4edd9baa2423424 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Thu, 29 Jan 2026 17:16:56 +0300 Subject: [PATCH 065/144] feat(dapp-client): cache signed calls from fee options --- .../dapp-client/src/ChainSessionManager.ts | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index cd67c6b60..7ad1eaaaa 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -84,6 +84,11 @@ export class ChainSessionManager { public loginMethod: LoginMethod | null = null public userEmail: string | null = null private guard?: GuardConfig + private lastSignedCallCache?: { + fingerprint: string + signedCall: { to: Address.Address; data: Hex.Hex } + createdAtMs: number + } /** * @param chainId The ID of the chain this manager is responsible for. @@ -851,6 +856,11 @@ export class ChainSessionManager { })) try { const signedCall = await this._buildAndSignCalls(callsToSend) + this.lastSignedCallCache = { + fingerprint: this._fingerprintCalls(callsToSend), + signedCall, + createdAtMs: Date.now(), + } const feeOptions = await this.relayer.feeOptions(signedCall.to, this.chainId, callsToSend) return feeOptions.options } catch (err) { @@ -907,7 +917,7 @@ export class ChainSessionManager { callsToSend.unshift(transferCall) } } - const signedCalls = await this._buildAndSignCalls(callsToSend) + const signedCalls = this._getCachedSignedCall(callsToSend) ?? (await this._buildAndSignCalls(callsToSend)) const hash = await this.relayer.relay(signedCalls.to, signedCalls.data, this.chainId) const status = await this._waitForTransactionReceipt(hash.opHash, this.chainId) if (status.status === 'confirmed') { @@ -1101,4 +1111,42 @@ export class ChainSessionManager { await this.sequenceStorage.clearExplicitSessions() await this.sequenceStorage.clearSessionlessConnection() } + + private _getCachedSignedCall(calls: Payload.Call[]): { to: Address.Address; data: Hex.Hex } | null { + if (!this.lastSignedCallCache) { + return null + } + const ttlMs = 30_000 + if (Date.now() - this.lastSignedCallCache.createdAtMs > ttlMs) { + this.lastSignedCallCache = undefined + return null + } + const fingerprint = this._fingerprintCalls(calls) + if (!fingerprint) { + return null + } + if (fingerprint !== this.lastSignedCallCache.fingerprint) { + return null + } + return this.lastSignedCallCache.signedCall + } + + private _fingerprintCalls(calls: Payload.Call[]): string | null { + try { + return JSON.stringify( + calls.map((call) => ({ + to: call.to, + value: call.value?.toString() ?? '0', + data: call.data ?? '0x', + gasLimit: call.gasLimit?.toString() ?? '0', + delegateCall: call.delegateCall ?? false, + onlyFallback: call.onlyFallback ?? false, + behaviorOnError: call.behaviorOnError ?? 'revert', + })), + ) + } catch (error) { + console.warn('ChainSessionManager._fingerprintCalls failed:', error) + return null + } + } } From 11b3bb4594ac48c00cba65364a334d34eba682e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Bu=C4=9Fra=20Yi=C4=9Fiter?= Date: Thu, 29 Jan 2026 17:20:24 +0300 Subject: [PATCH 066/144] Add new userdata client (#954) --- .../services/userdata/src/userdata.gen.ts | 931 +++++++++++++++++- 1 file changed, 924 insertions(+), 7 deletions(-) diff --git a/packages/services/userdata/src/userdata.gen.ts b/packages/services/userdata/src/userdata.gen.ts index a26fdb995..18ba5d847 100644 --- a/packages/services/userdata/src/userdata.gen.ts +++ b/packages/services/userdata/src/userdata.gen.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// userdata v0.1.0 99a19ff0218eda6f5e544642d0fd72f66736bdaf +// userdata v0.1.0 4797326ffeb063c7256cf02523d563066fdaec9b // -- // Code generated by Webrpc-gen@v0.30.2 with typescript generator. DO NOT EDIT. // @@ -12,7 +12,7 @@ export const WebrpcVersion = 'v1' export const WebrpcSchemaVersion = 'v0.1.0' // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = '99a19ff0218eda6f5e544642d0fd72f66736bdaf' +export const WebrpcSchemaHash = '4797326ffeb063c7256cf02523d563066fdaec9b' // // Client interface @@ -28,26 +28,160 @@ export interface UserDataClient { headers?: object, signal?: AbortSignal, ): Promise + + getWalletPreferences( + req: GetWalletPreferencesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + putWalletPreferences( + req: PutWalletPreferencesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + listWalletSigners( + req: ListWalletSignersRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + putWalletSigner(req: PutWalletSignerRequest, headers?: object, signal?: AbortSignal): Promise + + deleteWalletSigner( + req: DeleteWalletSignerRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + listSessions(req: ListSessionsRequest, headers?: object, signal?: AbortSignal): Promise + + putSession(req: PutSessionRequest, headers?: object, signal?: AbortSignal): Promise + + deleteSession(req: DeleteSessionRequest, headers?: object, signal?: AbortSignal): Promise + + listContacts(req: ListContactsRequest, headers?: object, signal?: AbortSignal): Promise + + putContact(req: PutContactRequest, headers?: object, signal?: AbortSignal): Promise + + deleteContact(req: DeleteContactRequest, headers?: object, signal?: AbortSignal): Promise + + listWatchedWallets( + req: ListWatchedWalletsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + putWatchedWallet( + req: PutWatchedWalletRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + deleteWatchedWallet( + req: DeleteWatchedWalletRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + listDiscoverFavorites( + req: ListDiscoverFavoritesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + putDiscoverFavorite( + req: PutDiscoverFavoriteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + deleteDiscoverFavorite( + req: DeleteDiscoverFavoriteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + listDiscoverHistory( + req: ListDiscoverHistoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + putDiscoverHistory( + req: PutDiscoverHistoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + deleteDiscoverHistory( + req: DeleteDiscoverHistoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + listTokenFavorites( + req: ListTokenFavoritesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + putTokenFavorite( + req: PutTokenFavoriteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + deleteTokenFavorite( + req: DeleteTokenFavoriteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise } // // Schema types // +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 +} + export interface Wallet { address: string - ecosystem: number + ecosystem?: number + preferences: WalletPreferences + updatedAt: string + createdAt: string } -export interface Signer { - address: string - kind: string - email?: string +export interface WalletPreferences { + manualSigning?: boolean + hideUnlistedTokens?: boolean + includeTestnets?: boolean + currency?: string } export interface WalletSigner { walletAddress: string signerAddress: string + kind: string + email?: string + updatedAt: string + createdAt: string } export interface Session { @@ -60,11 +194,76 @@ export interface Session { createdAt: string } +export interface Contact { + walletAddress: string + contactAddress: string + nickname: string + updatedAt: string + createdAt: string +} + +export interface WatchedWallet { + walletAddress: string + watchedAddress: string + nickname: string + updatedAt: string + createdAt: string +} + +export interface DiscoverFavorite { + walletAddress: string + id: number + dappId: string + createdAt: string +} + +export interface DiscoverHistory { + walletAddress: string + id: number + dappId: string + accessedAt: string +} + +export interface TokenFavorite { + walletAddress: string + id: number + chainId: string + contractAddress: string + tokenId: string + createdAt: string +} + export interface SessionProps { address: string appUrl: string } +export interface WalletSignerProps { + address: string + kind: string + email?: string +} + +export interface ContactProps { + address: string + nickname?: string +} + +export interface DiscoverProps { + dappId: string +} + +export interface TokenFavoriteProps { + chainId: string + contractAddress: string + tokenId: string +} + +export interface WatchedWalletProps { + watchedAddress: string + nickname?: string +} + export interface GetCapabilitiesRequest {} export interface GetCapabilitiesResponse { @@ -90,6 +289,210 @@ export interface GetIdentityTokenResponse { idToken: string } +export interface GetWalletPreferencesRequest { + wallet: string +} + +export interface GetWalletPreferencesResponse { + preferences: WalletPreferences +} + +export interface PutWalletPreferencesRequest { + wallet: string + preferences: WalletPreferences +} + +export interface PutWalletPreferencesResponse {} + +export interface ListWalletSignersRequest { + wallet: string + pageSize: number + cursor: string +} + +export interface ListWalletSignersResponse { + signers: Array + nextCursor: string +} + +export interface PutWalletSignerRequest { + wallet: string + signer: WalletSignerProps +} + +export interface PutWalletSignerResponse { + signer: WalletSigner +} + +export interface DeleteWalletSignerRequest { + wallet: string + signer: string +} + +export interface DeleteWalletSignerResponse {} + +export interface ListSessionsRequest { + wallet: string + pageSize: number + cursor: string +} + +export interface ListSessionsResponse { + sessions: Array + nextCursor: string +} + +export interface PutSessionRequest { + wallet: string + session: SessionProps +} + +export interface PutSessionResponse { + session: Session +} + +export interface DeleteSessionRequest { + wallet: string + session: string +} + +export interface DeleteSessionResponse {} + +export interface ListContactsRequest { + wallet: string + pageSize: number + cursor: string +} + +export interface ListContactsResponse { + contacts: Array + nextCursor: string +} + +export interface PutContactRequest { + wallet: string + contact: ContactProps +} + +export interface PutContactResponse { + contact: Contact +} + +export interface DeleteContactRequest { + wallet: string + contact: string +} + +export interface DeleteContactResponse {} + +export interface ListWatchedWalletsRequest { + wallet: string + pageSize: number + cursor: string +} + +export interface ListWatchedWalletsResponse { + watchedWallets: Array + nextCursor: string +} + +export interface PutWatchedWalletRequest { + wallet: string + watchedWallet: WatchedWalletProps +} + +export interface PutWatchedWalletResponse { + watchedWallet: WatchedWallet +} + +export interface DeleteWatchedWalletRequest { + wallet: string + watchedWallet: string +} + +export interface DeleteWatchedWalletResponse {} + +export interface ListDiscoverFavoritesRequest { + wallet: string + pageSize: number + cursor: string +} + +export interface ListDiscoverFavoritesResponse { + favorites: Array + nextCursor: string +} + +export interface PutDiscoverFavoriteRequest { + wallet: string + favorite: DiscoverProps +} + +export interface PutDiscoverFavoriteResponse { + favorite: DiscoverFavorite +} + +export interface DeleteDiscoverFavoriteRequest { + wallet: string + id: number +} + +export interface DeleteDiscoverFavoriteResponse {} + +export interface ListDiscoverHistoryRequest { + wallet: string + pageSize: number + cursor: string +} + +export interface ListDiscoverHistoryResponse { + history: Array + nextCursor: string +} + +export interface PutDiscoverHistoryRequest { + wallet: string + history: DiscoverProps +} + +export interface PutDiscoverHistoryResponse { + history: DiscoverHistory +} + +export interface DeleteDiscoverHistoryRequest { + wallet: string + id: number +} + +export interface DeleteDiscoverHistoryResponse {} + +export interface ListTokenFavoritesRequest { + wallet: string + pageSize: number + cursor: string +} + +export interface ListTokenFavoritesResponse { + favorites: Array + nextCursor: string +} + +export interface PutTokenFavoriteRequest { + wallet: string + favorite: TokenFavoriteProps +} + +export interface PutTokenFavoriteResponse { + favorite: TokenFavorite +} + +export interface DeleteTokenFavoriteRequest { + wallet: string + id: number +} + +export interface DeleteTokenFavoriteResponse {} + // // Client // @@ -112,6 +515,30 @@ export class UserData implements UserDataClient { getCapabilities: () => ['UserData', 'getCapabilities'] as const, getAccessToken: (req: GetAccessTokenRequest) => ['UserData', 'getAccessToken', req] as const, getIdentityToken: (req: GetIdentityTokenRequest) => ['UserData', 'getIdentityToken', req] as const, + getWalletPreferences: (req: GetWalletPreferencesRequest) => ['UserData', 'getWalletPreferences', req] as const, + putWalletPreferences: (req: PutWalletPreferencesRequest) => ['UserData', 'putWalletPreferences', req] as const, + listWalletSigners: (req: ListWalletSignersRequest) => ['UserData', 'listWalletSigners', req] as const, + putWalletSigner: (req: PutWalletSignerRequest) => ['UserData', 'putWalletSigner', req] as const, + deleteWalletSigner: (req: DeleteWalletSignerRequest) => ['UserData', 'deleteWalletSigner', req] as const, + listSessions: (req: ListSessionsRequest) => ['UserData', 'listSessions', req] as const, + putSession: (req: PutSessionRequest) => ['UserData', 'putSession', req] as const, + deleteSession: (req: DeleteSessionRequest) => ['UserData', 'deleteSession', req] as const, + listContacts: (req: ListContactsRequest) => ['UserData', 'listContacts', req] as const, + putContact: (req: PutContactRequest) => ['UserData', 'putContact', req] as const, + deleteContact: (req: DeleteContactRequest) => ['UserData', 'deleteContact', req] as const, + listWatchedWallets: (req: ListWatchedWalletsRequest) => ['UserData', 'listWatchedWallets', req] as const, + putWatchedWallet: (req: PutWatchedWalletRequest) => ['UserData', 'putWatchedWallet', req] as const, + deleteWatchedWallet: (req: DeleteWatchedWalletRequest) => ['UserData', 'deleteWatchedWallet', req] as const, + listDiscoverFavorites: (req: ListDiscoverFavoritesRequest) => ['UserData', 'listDiscoverFavorites', req] as const, + putDiscoverFavorite: (req: PutDiscoverFavoriteRequest) => ['UserData', 'putDiscoverFavorite', req] as const, + deleteDiscoverFavorite: (req: DeleteDiscoverFavoriteRequest) => + ['UserData', 'deleteDiscoverFavorite', req] as const, + listDiscoverHistory: (req: ListDiscoverHistoryRequest) => ['UserData', 'listDiscoverHistory', req] as const, + putDiscoverHistory: (req: PutDiscoverHistoryRequest) => ['UserData', 'putDiscoverHistory', req] as const, + deleteDiscoverHistory: (req: DeleteDiscoverHistoryRequest) => ['UserData', 'deleteDiscoverHistory', req] as const, + listTokenFavorites: (req: ListTokenFavoritesRequest) => ['UserData', 'listTokenFavorites', req] as const, + putTokenFavorite: (req: PutTokenFavoriteRequest) => ['UserData', 'putTokenFavorite', req] as const, + deleteTokenFavorite: (req: DeleteTokenFavoriteRequest) => ['UserData', 'deleteTokenFavorite', req] as const, } getCapabilities = (headers?: object, signal?: AbortSignal): Promise => { @@ -172,6 +599,496 @@ export class UserData implements UserDataClient { }, ) } + + getWalletPreferences = ( + req: GetWalletPreferencesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('GetWalletPreferences'), + createHttpRequest(JsonEncode(req, 'GetWalletPreferencesRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'GetWalletPreferencesResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putWalletPreferences = ( + req: PutWalletPreferencesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('PutWalletPreferences'), + createHttpRequest(JsonEncode(req, 'PutWalletPreferencesRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutWalletPreferencesResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listWalletSigners = ( + req: ListWalletSignersRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('ListWalletSigners'), + createHttpRequest(JsonEncode(req, 'ListWalletSignersRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListWalletSignersResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putWalletSigner = ( + req: PutWalletSignerRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('PutWalletSigner'), + createHttpRequest(JsonEncode(req, 'PutWalletSignerRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutWalletSignerResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deleteWalletSigner = ( + req: DeleteWalletSignerRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('DeleteWalletSigner'), + createHttpRequest(JsonEncode(req, 'DeleteWalletSignerRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'DeleteWalletSignerResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listSessions = (req: ListSessionsRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ListSessions'), + createHttpRequest(JsonEncode(req, 'ListSessionsRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListSessionsResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putSession = (req: PutSessionRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('PutSession'), + createHttpRequest(JsonEncode(req, 'PutSessionRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutSessionResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deleteSession = ( + req: DeleteSessionRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('DeleteSession'), + createHttpRequest(JsonEncode(req, 'DeleteSessionRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'DeleteSessionResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listContacts = (req: ListContactsRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('ListContacts'), + createHttpRequest(JsonEncode(req, 'ListContactsRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListContactsResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putContact = (req: PutContactRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch( + this.url('PutContact'), + createHttpRequest(JsonEncode(req, 'PutContactRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutContactResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deleteContact = ( + req: DeleteContactRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('DeleteContact'), + createHttpRequest(JsonEncode(req, 'DeleteContactRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'DeleteContactResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listWatchedWallets = ( + req: ListWatchedWalletsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('ListWatchedWallets'), + createHttpRequest(JsonEncode(req, 'ListWatchedWalletsRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListWatchedWalletsResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putWatchedWallet = ( + req: PutWatchedWalletRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('PutWatchedWallet'), + createHttpRequest(JsonEncode(req, 'PutWatchedWalletRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutWatchedWalletResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deleteWatchedWallet = ( + req: DeleteWatchedWalletRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('DeleteWatchedWallet'), + createHttpRequest(JsonEncode(req, 'DeleteWatchedWalletRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'DeleteWatchedWalletResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listDiscoverFavorites = ( + req: ListDiscoverFavoritesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('ListDiscoverFavorites'), + createHttpRequest(JsonEncode(req, 'ListDiscoverFavoritesRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListDiscoverFavoritesResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putDiscoverFavorite = ( + req: PutDiscoverFavoriteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('PutDiscoverFavorite'), + createHttpRequest(JsonEncode(req, 'PutDiscoverFavoriteRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutDiscoverFavoriteResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deleteDiscoverFavorite = ( + req: DeleteDiscoverFavoriteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('DeleteDiscoverFavorite'), + createHttpRequest(JsonEncode(req, 'DeleteDiscoverFavoriteRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'DeleteDiscoverFavoriteResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listDiscoverHistory = ( + req: ListDiscoverHistoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('ListDiscoverHistory'), + createHttpRequest(JsonEncode(req, 'ListDiscoverHistoryRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListDiscoverHistoryResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putDiscoverHistory = ( + req: PutDiscoverHistoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('PutDiscoverHistory'), + createHttpRequest(JsonEncode(req, 'PutDiscoverHistoryRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutDiscoverHistoryResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deleteDiscoverHistory = ( + req: DeleteDiscoverHistoryRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('DeleteDiscoverHistory'), + createHttpRequest(JsonEncode(req, 'DeleteDiscoverHistoryRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'DeleteDiscoverHistoryResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + listTokenFavorites = ( + req: ListTokenFavoritesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('ListTokenFavorites'), + createHttpRequest(JsonEncode(req, 'ListTokenFavoritesRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListTokenFavoritesResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putTokenFavorite = ( + req: PutTokenFavoriteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('PutTokenFavorite'), + createHttpRequest(JsonEncode(req, 'PutTokenFavoriteRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutTokenFavoriteResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deleteTokenFavorite = ( + req: DeleteTokenFavoriteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('DeleteTokenFavorite'), + createHttpRequest(JsonEncode(req, 'DeleteTokenFavoriteRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'DeleteTokenFavoriteResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } } const createHttpRequest = (body: string = '{}', headers: object = {}, signal: AbortSignal | null = null): object => { From 1a060ea7a08e65a9c8795dbc8fadb9afe65916bb Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Thu, 29 Jan 2026 17:23:03 +0300 Subject: [PATCH 067/144] Fix build error --- .../wallet/dapp-client/src/ChainSessionManager.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 7ad1eaaaa..86c465cfb 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -856,10 +856,13 @@ export class ChainSessionManager { })) try { const signedCall = await this._buildAndSignCalls(callsToSend) - this.lastSignedCallCache = { - fingerprint: this._fingerprintCalls(callsToSend), - signedCall, - createdAtMs: Date.now(), + const fingerprint = this._fingerprintCalls(callsToSend) + if (fingerprint) { + this.lastSignedCallCache = { + fingerprint, + signedCall, + createdAtMs: Date.now(), + } } const feeOptions = await this.relayer.feeOptions(signedCall.to, this.chainId, callsToSend) return feeOptions.options From 30e1f1a81f6374f95feab76ee3503050b20014b5 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 29 Jan 2026 16:27:22 +0100 Subject: [PATCH 068/144] 3.0.0-beta.10 --- .changeset/free-tips-switch.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/free-tips-switch.md diff --git a/.changeset/free-tips-switch.md b/.changeset/free-tips-switch.md new file mode 100644 index 000000000..0921b6d35 --- /dev/null +++ b/.changeset/free-tips-switch.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 +--- + +3.0.0 beta diff --git a/.changeset/pre.json b/.changeset/pre.json index 5483a869a..a7db5a29f 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,20 +4,20 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.9", - "@0xsequence/builder": "3.0.0-beta.9", - "@0xsequence/guard": "3.0.0-beta.9", - "@0xsequence/identity-instrument": "3.0.0-beta.9", - "@0xsequence/indexer": "3.0.0-beta.9", - "@0xsequence/marketplace": "3.0.0-beta.9", - "@0xsequence/metadata": "3.0.0-beta.9", - "@0xsequence/relayer": "3.0.0-beta.9", - "@0xsequence/userdata": "3.0.0-beta.9", - "@0xsequence/abi": "3.0.0-beta.9", - "@0xsequence/wallet-core": "3.0.0-beta.9", - "@0xsequence/dapp-client": "3.0.0-beta.9", - "@0xsequence/wallet-primitives": "3.0.0-beta.9", - "@0xsequence/wallet-wdk": "3.0.0-beta.9", + "@0xsequence/api": "3.0.0-beta.10", + "@0xsequence/builder": "3.0.0-beta.10", + "@0xsequence/guard": "3.0.0-beta.10", + "@0xsequence/identity-instrument": "3.0.0-beta.10", + "@0xsequence/indexer": "3.0.0-beta.10", + "@0xsequence/marketplace": "3.0.0-beta.10", + "@0xsequence/metadata": "3.0.0-beta.10", + "@0xsequence/relayer": "3.0.0-beta.10", + "@0xsequence/userdata": "3.0.0-beta.10", + "@0xsequence/abi": "3.0.0-beta.10", + "@0xsequence/wallet-core": "3.0.0-beta.10", + "@0xsequence/dapp-client": "3.0.0-beta.10", + "@0xsequence/wallet-primitives": "3.0.0-beta.10", + "@0xsequence/wallet-wdk": "3.0.0-beta.10", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" @@ -25,6 +25,7 @@ "changesets": [ "crisp-zoos-retire", "cyan-radios-relax", + "free-tips-switch", "goofy-laws-serve", "new-turkeys-double", "nice-tips-slide", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 8a7997a58..67128bf0e 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 1dcb3dae2..191b8b892 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.10", + "version": "3.0.0-beta.11", "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 76bd0fe59..723eaa34d 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index f0b0d62b0..d8b772311 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.10", + "version": "3.0.0-beta.11", "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 d20ea859e..216a0c0d7 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index cacf82ffa..ee93b2be8 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.10", + "version": "3.0.0-beta.11", "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 9dca72984..42366b758 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.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index a05aff012..0705bbf1d 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.10", + "version": "3.0.0-beta.11", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 0898bb564..af32fca67 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 332d21732..b8c1b49a2 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.10", + "version": "3.0.0-beta.11", "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 9fe90e1d3..2f56b9022 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 17cc4cf51..28a004ce6 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.10", + "version": "3.0.0-beta.11", "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 f0831c0a5..629d2ec17 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index afed07373..fe3a3e9c7 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.10", + "version": "3.0.0-beta.11", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 0e23d886c..b6586c251 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.11 + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 3c2802d78..10d9ebb54 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.10", + "version": "3.0.0-beta.11", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 659989d4c..aecd173ea 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 3b4086385..002d868b5 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.10", + "version": "3.0.0-beta.11", "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 e62c45c4b..ed13b27fd 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 83978c3d8..5007bd2e0 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.10", + "version": "3.0.0-beta.11", "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 a8a4c0121..d98c69118 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.11 + - @0xsequence/relayer@3.0.0-beta.11 + - @0xsequence/wallet-primitives@3.0.0-beta.11 + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 2b575325f..1960d4a92 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.10", + "version": "3.0.0-beta.11", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 3a46bc242..31bb54b40 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.11 + +### Patch Changes + +- 3.0.0 beta +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.11 + - @0xsequence/relayer@3.0.0-beta.11 + - @0xsequence/wallet-core@3.0.0-beta.11 + - @0xsequence/wallet-primitives@3.0.0-beta.11 + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 8ab8875c4..83c84cd9d 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.10", + "version": "3.0.0-beta.11", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 0a422e031..7d98937fd 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 7b1aa271f..351baa181 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.10", + "version": "3.0.0-beta.11", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index eedb582ce..6cbf4d133 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.11 + +### Patch Changes + +- 3.0.0 beta +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.11 + - @0xsequence/identity-instrument@3.0.0-beta.11 + - @0xsequence/relayer@3.0.0-beta.11 + - @0xsequence/wallet-core@3.0.0-beta.11 + - @0xsequence/wallet-primitives@3.0.0-beta.11 + ## 3.0.0-beta.10 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index ed1843b76..04827f064 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.10", + "version": "3.0.0-beta.11", "license": "Apache-2.0", "type": "module", "publishConfig": { From fc6d552935c21f6f0c3bb90d17486645a0a31c85 Mon Sep 17 00:00:00 2001 From: Tolgahan Arikan Date: Fri, 30 Jan 2026 14:35:57 +0300 Subject: [PATCH 069/144] fix(dapp-client): remove _refreshExplicitSession use that causes blocked pop up --- .../wallet/dapp-client/src/ChainSessionManager.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 86c465cfb..324843ba4 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -816,19 +816,6 @@ 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 341123207ec636749305e1fefa8b498a753cdeeb Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 30 Jan 2026 12:41:39 +0100 Subject: [PATCH 070/144] 3.0.0-beta.12 --- .changeset/bright-pots-hope.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/bright-pots-hope.md diff --git a/.changeset/bright-pots-hope.md b/.changeset/bright-pots-hope.md new file mode 100644 index 000000000..6bd9a887c --- /dev/null +++ b/.changeset/bright-pots-hope.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 +--- + +Beta release with dapp connector fixes diff --git a/.changeset/pre.json b/.changeset/pre.json index a7db5a29f..3b0804872 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,25 +4,26 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.10", - "@0xsequence/builder": "3.0.0-beta.10", - "@0xsequence/guard": "3.0.0-beta.10", - "@0xsequence/identity-instrument": "3.0.0-beta.10", - "@0xsequence/indexer": "3.0.0-beta.10", - "@0xsequence/marketplace": "3.0.0-beta.10", - "@0xsequence/metadata": "3.0.0-beta.10", - "@0xsequence/relayer": "3.0.0-beta.10", - "@0xsequence/userdata": "3.0.0-beta.10", - "@0xsequence/abi": "3.0.0-beta.10", - "@0xsequence/wallet-core": "3.0.0-beta.10", - "@0xsequence/dapp-client": "3.0.0-beta.10", - "@0xsequence/wallet-primitives": "3.0.0-beta.10", - "@0xsequence/wallet-wdk": "3.0.0-beta.10", + "@0xsequence/api": "3.0.0-beta.11", + "@0xsequence/builder": "3.0.0-beta.11", + "@0xsequence/guard": "3.0.0-beta.11", + "@0xsequence/identity-instrument": "3.0.0-beta.11", + "@0xsequence/indexer": "3.0.0-beta.11", + "@0xsequence/marketplace": "3.0.0-beta.11", + "@0xsequence/metadata": "3.0.0-beta.11", + "@0xsequence/relayer": "3.0.0-beta.11", + "@0xsequence/userdata": "3.0.0-beta.11", + "@0xsequence/abi": "3.0.0-beta.11", + "@0xsequence/wallet-core": "3.0.0-beta.11", + "@0xsequence/dapp-client": "3.0.0-beta.11", + "@0xsequence/wallet-primitives": "3.0.0-beta.11", + "@0xsequence/wallet-wdk": "3.0.0-beta.11", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" }, "changesets": [ + "bright-pots-hope", "crisp-zoos-retire", "cyan-radios-relax", "free-tips-switch", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 67128bf0e..369f5a0c6 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 191b8b892..36714de7e 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.11", + "version": "3.0.0-beta.12", "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 723eaa34d..1faea9afa 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index d8b772311..7dbaf13d7 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.11", + "version": "3.0.0-beta.12", "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 216a0c0d7..5588185ac 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index ee93b2be8..727a5049e 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.11", + "version": "3.0.0-beta.12", "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 42366b758..9215b7596 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.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 0705bbf1d..d1adaba0c 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.11", + "version": "3.0.0-beta.12", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index af32fca67..a92bbe45d 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index b8c1b49a2..db6986b7b 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.11", + "version": "3.0.0-beta.12", "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 2f56b9022..0744e1ebd 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 28a004ce6..81c7cea93 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.11", + "version": "3.0.0-beta.12", "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 629d2ec17..a44a72ff7 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index fe3a3e9c7..202346f94 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.11", + "version": "3.0.0-beta.12", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index b6586c251..6a4eacc87 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.12 + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 10d9ebb54..10bceb82b 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.11", + "version": "3.0.0-beta.12", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index aecd173ea..f66f7dec2 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 002d868b5..22956ef66 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.11", + "version": "3.0.0-beta.12", "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 ed13b27fd..fc61642ed 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 5007bd2e0..a98f343bb 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.11", + "version": "3.0.0-beta.12", "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 d98c69118..496ed0657 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.12 + - @0xsequence/relayer@3.0.0-beta.12 + - @0xsequence/wallet-primitives@3.0.0-beta.12 + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 1960d4a92..c99a354cc 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.11", + "version": "3.0.0-beta.12", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 31bb54b40..a4df68552 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.12 + +### Patch Changes + +- Beta release with dapp connector fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.12 + - @0xsequence/relayer@3.0.0-beta.12 + - @0xsequence/wallet-core@3.0.0-beta.12 + - @0xsequence/wallet-primitives@3.0.0-beta.12 + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 83c84cd9d..784422dc0 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.11", + "version": "3.0.0-beta.12", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 7d98937fd..9163a5f15 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 351baa181..b4ffa58da 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.11", + "version": "3.0.0-beta.12", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 6cbf4d133..eb4758767 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.12 + +### Patch Changes + +- Beta release with dapp connector fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.12 + - @0xsequence/identity-instrument@3.0.0-beta.12 + - @0xsequence/relayer@3.0.0-beta.12 + - @0xsequence/wallet-core@3.0.0-beta.12 + - @0xsequence/wallet-primitives@3.0.0-beta.12 + ## 3.0.0-beta.11 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 04827f064..7cca52e6e 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.11", + "version": "3.0.0-beta.12", "license": "Apache-2.0", "type": "module", "publishConfig": { From 0db3f8084d738e071f2ef1747cbc4fdbf7e889fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Bu=C4=9Fra=20Yi=C4=9Fiter?= Date: Mon, 9 Feb 2026 18:05:29 +0300 Subject: [PATCH 071/144] Update user data client (#960) --- .../services/userdata/src/userdata.gen.ts | 130 +++++++++++++++++- 1 file changed, 128 insertions(+), 2 deletions(-) diff --git a/packages/services/userdata/src/userdata.gen.ts b/packages/services/userdata/src/userdata.gen.ts index 18ba5d847..d671010be 100644 --- a/packages/services/userdata/src/userdata.gen.ts +++ b/packages/services/userdata/src/userdata.gen.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// userdata v0.1.0 4797326ffeb063c7256cf02523d563066fdaec9b +// userdata v0.1.0 88764bb5f99353e11d849a1aa8f8a998501ffedb // -- // Code generated by Webrpc-gen@v0.30.2 with typescript generator. DO NOT EDIT. // @@ -12,7 +12,7 @@ export const WebrpcVersion = 'v1' export const WebrpcSchemaVersion = 'v0.1.0' // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = '4797326ffeb063c7256cf02523d563066fdaec9b' +export const WebrpcSchemaHash = '88764bb5f99353e11d849a1aa8f8a998501ffedb' // // Client interface @@ -138,6 +138,20 @@ export interface UserDataClient { headers?: object, signal?: AbortSignal, ): Promise + + listHiddenTokens( + req: ListHiddenTokensRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + putHiddenToken(req: PutHiddenTokenRequest, headers?: object, signal?: AbortSignal): Promise + + deleteHiddenToken( + req: DeleteHiddenTokenRequest, + headers?: object, + signal?: AbortSignal, + ): Promise } // @@ -171,6 +185,7 @@ export interface Wallet { export interface WalletPreferences { manualSigning?: boolean hideUnlistedTokens?: boolean + hideCollectibles?: boolean includeTestnets?: boolean currency?: string } @@ -233,6 +248,15 @@ export interface TokenFavorite { createdAt: string } +export interface HiddenToken { + walletAddress: string + id: number + chainId: string + contractAddress: string + tokenId?: string + createdAt: string +} + export interface SessionProps { address: string appUrl: string @@ -259,6 +283,12 @@ export interface TokenFavoriteProps { tokenId: string } +export interface HiddenTokenProps { + chainId: string + contractAddress: string + tokenId?: string +} + export interface WatchedWalletProps { watchedAddress: string nickname?: string @@ -493,6 +523,33 @@ export interface DeleteTokenFavoriteRequest { export interface DeleteTokenFavoriteResponse {} +export interface ListHiddenTokensRequest { + wallet: string + pageSize: number + cursor: string +} + +export interface ListHiddenTokensResponse { + hiddenTokens: Array + nextCursor: string +} + +export interface PutHiddenTokenRequest { + wallet: string + token: HiddenTokenProps +} + +export interface PutHiddenTokenResponse { + hiddenToken: HiddenToken +} + +export interface DeleteHiddenTokenRequest { + wallet: string + id: number +} + +export interface DeleteHiddenTokenResponse {} + // // Client // @@ -539,6 +596,9 @@ export class UserData implements UserDataClient { listTokenFavorites: (req: ListTokenFavoritesRequest) => ['UserData', 'listTokenFavorites', req] as const, putTokenFavorite: (req: PutTokenFavoriteRequest) => ['UserData', 'putTokenFavorite', req] as const, deleteTokenFavorite: (req: DeleteTokenFavoriteRequest) => ['UserData', 'deleteTokenFavorite', req] as const, + listHiddenTokens: (req: ListHiddenTokensRequest) => ['UserData', 'listHiddenTokens', req] as const, + putHiddenToken: (req: PutHiddenTokenRequest) => ['UserData', 'putHiddenToken', req] as const, + deleteHiddenToken: (req: DeleteHiddenTokenRequest) => ['UserData', 'deleteHiddenToken', req] as const, } getCapabilities = (headers?: object, signal?: AbortSignal): Promise => { @@ -1089,6 +1149,72 @@ export class UserData implements UserDataClient { }, ) } + + listHiddenTokens = ( + req: ListHiddenTokensRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('ListHiddenTokens'), + createHttpRequest(JsonEncode(req, 'ListHiddenTokensRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListHiddenTokensResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putHiddenToken = ( + req: PutHiddenTokenRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('PutHiddenToken'), + createHttpRequest(JsonEncode(req, 'PutHiddenTokenRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutHiddenTokenResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deleteHiddenToken = ( + req: DeleteHiddenTokenRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('DeleteHiddenToken'), + createHttpRequest(JsonEncode(req, 'DeleteHiddenTokenRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'DeleteHiddenTokenResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } } const createHttpRequest = (body: string = '{}', headers: object = {}, signal: AbortSignal | null = null): object => { From a89134ae93adcd0f2b62d7b04841639476f525cb Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 9 Feb 2026 16:07:40 +0100 Subject: [PATCH 072/144] 3.0.0-beta.13 --- .changeset/nine-areas-fall.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/nine-areas-fall.md diff --git a/.changeset/nine-areas-fall.md b/.changeset/nine-areas-fall.md new file mode 100644 index 000000000..8495b8a5c --- /dev/null +++ b/.changeset/nine-areas-fall.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 +--- + +Userdata service updates diff --git a/.changeset/pre.json b/.changeset/pre.json index 3b0804872..cfd464311 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,20 +4,20 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.11", - "@0xsequence/builder": "3.0.0-beta.11", - "@0xsequence/guard": "3.0.0-beta.11", - "@0xsequence/identity-instrument": "3.0.0-beta.11", - "@0xsequence/indexer": "3.0.0-beta.11", - "@0xsequence/marketplace": "3.0.0-beta.11", - "@0xsequence/metadata": "3.0.0-beta.11", - "@0xsequence/relayer": "3.0.0-beta.11", - "@0xsequence/userdata": "3.0.0-beta.11", - "@0xsequence/abi": "3.0.0-beta.11", - "@0xsequence/wallet-core": "3.0.0-beta.11", - "@0xsequence/dapp-client": "3.0.0-beta.11", - "@0xsequence/wallet-primitives": "3.0.0-beta.11", - "@0xsequence/wallet-wdk": "3.0.0-beta.11", + "@0xsequence/api": "3.0.0-beta.12", + "@0xsequence/builder": "3.0.0-beta.12", + "@0xsequence/guard": "3.0.0-beta.12", + "@0xsequence/identity-instrument": "3.0.0-beta.12", + "@0xsequence/indexer": "3.0.0-beta.12", + "@0xsequence/marketplace": "3.0.0-beta.12", + "@0xsequence/metadata": "3.0.0-beta.12", + "@0xsequence/relayer": "3.0.0-beta.12", + "@0xsequence/userdata": "3.0.0-beta.12", + "@0xsequence/abi": "3.0.0-beta.12", + "@0xsequence/wallet-core": "3.0.0-beta.12", + "@0xsequence/dapp-client": "3.0.0-beta.12", + "@0xsequence/wallet-primitives": "3.0.0-beta.12", + "@0xsequence/wallet-wdk": "3.0.0-beta.12", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" @@ -30,6 +30,7 @@ "goofy-laws-serve", "new-turkeys-double", "nice-tips-slide", + "nine-areas-fall", "open-toes-marry", "plain-feet-stare", "tiny-files-chew", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 369f5a0c6..8e1edb5c1 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 36714de7e..4bd96c9af 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.12", + "version": "3.0.0-beta.13", "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 1faea9afa..5b03e6ef4 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 7dbaf13d7..193930dfb 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.12", + "version": "3.0.0-beta.13", "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 5588185ac..b023ee9e7 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 727a5049e..9355386c0 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.12", + "version": "3.0.0-beta.13", "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 9215b7596..23da6a85f 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.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index d1adaba0c..fb2df4603 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.12", + "version": "3.0.0-beta.13", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index a92bbe45d..ae37cc6ea 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index db6986b7b..11186e051 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.12", + "version": "3.0.0-beta.13", "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 0744e1ebd..1c6cc42e0 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 81c7cea93..6b8654f68 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.12", + "version": "3.0.0-beta.13", "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 a44a72ff7..36d32ba68 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 202346f94..bdcf3bab2 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.12", + "version": "3.0.0-beta.13", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 6a4eacc87..4a691e7fd 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.13 + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 10bceb82b..a2d721eb0 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.12", + "version": "3.0.0-beta.13", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index f66f7dec2..d9099f922 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 22956ef66..8a9ddbbfa 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.12", + "version": "3.0.0-beta.13", "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 fc61642ed..9a781a04a 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index a98f343bb..356ce1abf 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.12", + "version": "3.0.0-beta.13", "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 496ed0657..12953ab71 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.13 + - @0xsequence/relayer@3.0.0-beta.13 + - @0xsequence/wallet-primitives@3.0.0-beta.13 + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index c99a354cc..1fe24cd29 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.12", + "version": "3.0.0-beta.13", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index a4df68552..2a18339b5 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.13 + +### Patch Changes + +- Userdata service updates +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.13 + - @0xsequence/relayer@3.0.0-beta.13 + - @0xsequence/wallet-core@3.0.0-beta.13 + - @0xsequence/wallet-primitives@3.0.0-beta.13 + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 784422dc0..864db6bdd 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.12", + "version": "3.0.0-beta.13", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 9163a5f15..396d9efc5 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index b4ffa58da..ff15402bb 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.12", + "version": "3.0.0-beta.13", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index eb4758767..22a136c7f 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.13 + +### Patch Changes + +- Userdata service updates +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.13 + - @0xsequence/identity-instrument@3.0.0-beta.13 + - @0xsequence/relayer@3.0.0-beta.13 + - @0xsequence/wallet-core@3.0.0-beta.13 + - @0xsequence/wallet-primitives@3.0.0-beta.13 + ## 3.0.0-beta.12 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 7cca52e6e..9381af65e 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.12", + "version": "3.0.0-beta.13", "license": "Apache-2.0", "type": "module", "publishConfig": { From 0b22b7f07345b1617db726e45f038ca2902c4138 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Feb 2026 16:35:13 +0100 Subject: [PATCH 073/144] Bump next from 15.5.9 to 15.5.10 (#961) Bumps [next](https://github.com/vercel/next.js) from 15.5.9 to 15.5.10. - [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.9...v15.5.10) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.10 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 | 120 ++++++++++++++++++++++++++++++--------- 3 files changed, 96 insertions(+), 28 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index 29fbc4bc7..338f0dc91 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.9", + "next": "^15.5.10", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/extras/web/package.json b/extras/web/package.json index b0b621e95..e818efa3f 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.9", + "next": "^15.5.10", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fdbb822b8..db7b97bdf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.9 - version: 15.5.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.10 + version: 15.5.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -76,8 +76,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.9 - version: 15.5.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.10 + version: 15.5.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -488,7 +488,7 @@ importers: version: 7.0.1(eslint@9.39.2) eslint-plugin-turbo: specifier: ^2.6.3 - version: 2.6.3(eslint@9.39.2)(turbo@2.6.3) + version: 2.6.3(eslint@9.39.2)(turbo@2.8.3) globals: specifier: ^16.5.0 version: 16.5.0 @@ -678,8 +678,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} '@esbuild/aix-ppc64@0.27.1': resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} @@ -1070,8 +1070,8 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.5.9': - resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} + '@next/env@15.5.10': + resolution: {integrity: sha512-plg+9A/KoZcTS26fe15LHg+QxReTazrIOoKKUC3Uz4leGGeNPgLHdevVraAAOX0snnUs3WkRx3eUQpj9mreG6A==} '@next/eslint-plugin-next@15.5.9': resolution: {integrity: sha512-kUzXx0iFiXw27cQAViE1yKWnz/nF8JzRmwgMRTMh8qMY90crNsdXJRh2e+R0vBpFR3kk1yvAR7wev7+fCCb79Q==} @@ -1664,8 +1664,8 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - caniuse-lite@1.0.30001760: - resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} + caniuse-lite@1.0.30001769: + resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} @@ -2214,7 +2214,7 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} @@ -2850,8 +2850,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.5.9: - resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} + next@15.5.10: + resolution: {integrity: sha512-r0X65PNwyDDyOrWNKpQoZvOatw7BcsTPRKdwEqtc9cj3wv7mbBIk9tKed4klRaFXJdX0rugpuMTHslDrAU1bBg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3293,6 +3293,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + sentence-case@2.1.1: resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} @@ -3588,35 +3593,69 @@ packages: cpu: [x64] os: [darwin] + turbo-darwin-64@2.8.3: + resolution: {integrity: sha512-4kXRLfcygLOeNcP6JquqRLmGB/ATjjfehiojL2dJkL7GFm3SPSXbq7oNj8UbD8XriYQ5hPaSuz59iF1ijPHkTw==} + cpu: [x64] + os: [darwin] + turbo-darwin-arm64@2.6.3: resolution: {integrity: sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==} cpu: [arm64] os: [darwin] + turbo-darwin-arm64@2.8.3: + resolution: {integrity: sha512-xF7uCeC0UY0Hrv/tqax0BMbFlVP1J/aRyeGQPZT4NjvIPj8gSPDgFhfkfz06DhUwDg5NgMo04uiSkAWE8WB/QQ==} + cpu: [arm64] + os: [darwin] + turbo-linux-64@2.6.3: resolution: {integrity: sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==} cpu: [x64] os: [linux] + turbo-linux-64@2.8.3: + resolution: {integrity: sha512-vxMDXwaOjweW/4etY7BxrXCSkvtwh0PbwVafyfT1Ww659SedUxd5rM3V2ZCmbwG8NiCfY7d6VtxyHx3Wh1GoZA==} + cpu: [x64] + os: [linux] + turbo-linux-arm64@2.6.3: resolution: {integrity: sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==} cpu: [arm64] os: [linux] + turbo-linux-arm64@2.8.3: + resolution: {integrity: sha512-mQX7uYBZFkuPLLlKaNe9IjR1JIef4YvY8f21xFocvttXvdPebnq3PK1Zjzl9A1zun2BEuWNUwQIL8lgvN9Pm3Q==} + cpu: [arm64] + os: [linux] + turbo-windows-64@2.6.3: resolution: {integrity: sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==} cpu: [x64] os: [win32] + turbo-windows-64@2.8.3: + resolution: {integrity: sha512-YLGEfppGxZj3VWcNOVa08h6ISsVKiG85aCAWosOKNUjb6yErWEuydv6/qImRJUI+tDLvDvW7BxopAkujRnWCrw==} + cpu: [x64] + os: [win32] + turbo-windows-arm64@2.6.3: resolution: {integrity: sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==} cpu: [arm64] os: [win32] + turbo-windows-arm64@2.8.3: + resolution: {integrity: sha512-afTUGKBRmOJU1smQSBnFGcbq0iabAPwh1uXu2BVk7BREg30/1gMnJh9DFEQTah+UD3n3ru8V55J83RQNFfqoyw==} + cpu: [arm64] + os: [win32] + turbo@2.6.3: resolution: {integrity: sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==} hasBin: true + turbo@2.8.3: + resolution: {integrity: sha512-8Osxz5Tu/Dw2kb31EAY+nhq/YZ3wzmQSmYa1nIArqxgCAldxv9TPlrAiaBUDVnKA4aiPn0OFBD1ACcpc5VFOAQ==} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -4173,7 +4212,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true @@ -4398,7 +4437,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.8.1 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -4463,7 +4502,7 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.5.9': {} + '@next/env@15.5.10': {} '@next/eslint-plugin-next@15.5.9': dependencies: @@ -5039,7 +5078,7 @@ snapshots: browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.7 - caniuse-lite: 1.0.30001760 + caniuse-lite: 1.0.30001769 electron-to-chromium: 1.5.267 node-releases: 2.0.27 update-browserslist-db: 1.2.2(browserslist@4.28.1) @@ -5075,7 +5114,7 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001760: {} + caniuse-lite@1.0.30001769: {} cbor2@1.12.0: {} @@ -5526,11 +5565,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.6.3): + eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.8.3): dependencies: dotenv: 16.0.3 eslint: 9.39.2 - turbo: 2.6.3 + turbo: 2.8.3 eslint-scope@8.4.0: dependencies: @@ -6351,7 +6390,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 make-error@1.3.6: {} @@ -6408,11 +6447,11 @@ snapshots: netmask@2.0.2: {} - next@15.5.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@next/env': 15.5.9 + '@next/env': 15.5.10 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001760 + caniuse-lite: 1.0.30001769 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -6949,6 +6988,8 @@ snapshots: semver@7.7.3: {} + semver@7.7.4: {} + sentence-case@2.1.1: dependencies: no-case: 2.3.2 @@ -6980,7 +7021,7 @@ snapshots: dependencies: '@img/colour': 1.0.0 detect-libc: 2.1.2 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -7297,21 +7338,39 @@ snapshots: turbo-darwin-64@2.6.3: optional: true + turbo-darwin-64@2.8.3: + optional: true + turbo-darwin-arm64@2.6.3: optional: true + turbo-darwin-arm64@2.8.3: + optional: true + turbo-linux-64@2.6.3: optional: true + turbo-linux-64@2.8.3: + optional: true + turbo-linux-arm64@2.6.3: optional: true + turbo-linux-arm64@2.8.3: + optional: true + turbo-windows-64@2.6.3: optional: true + turbo-windows-64@2.8.3: + optional: true + turbo-windows-arm64@2.6.3: optional: true + turbo-windows-arm64@2.8.3: + optional: true + turbo@2.6.3: optionalDependencies: turbo-darwin-64: 2.6.3 @@ -7321,6 +7380,15 @@ snapshots: turbo-windows-64: 2.6.3 turbo-windows-arm64: 2.6.3 + turbo@2.8.3: + optionalDependencies: + turbo-darwin-64: 2.8.3 + turbo-darwin-arm64: 2.8.3 + turbo-linux-64: 2.8.3 + turbo-linux-arm64: 2.8.3 + turbo-windows-64: 2.8.3 + turbo-windows-arm64: 2.8.3 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 From 93aa730a6b12bfd3afb5d5a9b5b8ede0c2f0b954 Mon Sep 17 00:00:00 2001 From: 0xsequence-bot <50996415+0xsequence-bot@users.noreply.github.com> Date: Mon, 9 Feb 2026 10:35:44 -0500 Subject: [PATCH 074/144] [AUTOMATED] Update: api/proto/clients/api.gen.ts (#958) Co-authored-by: VojtechVitek <139342+VojtechVitek@users.noreply.github.com> --- packages/services/api/src/api.gen.ts | 1900 ++++++++------------------ 1 file changed, 562 insertions(+), 1338 deletions(-) diff --git a/packages/services/api/src/api.gen.ts b/packages/services/api/src/api.gen.ts index bf07aa039..b9d2e5870 100644 --- a/packages/services/api/src/api.gen.ts +++ b/packages/services/api/src/api.gen.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// sequence-api v0.4.0 d7026da603b2c29baf21c6aceeebc86eada372d8 +// sequence-api v0.4.0 3c15fa79614e43a5321cd2ac0c080e80af291bd1 // -- // Code generated by Webrpc-gen@v0.31.0 with typescript generator. DO NOT EDIT. // @@ -12,7 +12,7 @@ export const WebrpcVersion = 'v1' export const WebrpcSchemaVersion = 'v0.4.0' // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = 'd7026da603b2c29baf21c6aceeebc86eada372d8' +export const WebrpcSchemaHash = '3c15fa79614e43a5321cd2ac0c080e80af291bd1' // // Client interface @@ -47,14 +47,10 @@ export interface APIClient { sendPasswordlessLink( req: SendPasswordlessLinkRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise - registerPublicKey( - req: RegisterPublicKeyRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + registerPublicKey(req: RegisterPublicKeyRequest, headers?: object, signal?: AbortSignal): Promise getPublicKey(req: GetPublicKeyRequest, headers?: object, signal?: AbortSignal): Promise @@ -65,11 +61,7 @@ export interface APIClient { */ friendList(req: FriendListRequest, headers?: object, signal?: AbortSignal): Promise - getFriendByAddress( - req: GetFriendByAddressRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + getFriendByAddress(req: GetFriendByAddressRequest, headers?: object, signal?: AbortSignal): Promise searchFriends(req: SearchFriendsRequest, headers?: object, signal?: AbortSignal): Promise @@ -78,7 +70,7 @@ export interface APIClient { updateFriendNickname( req: UpdateFriendNicknameRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise removeFriend(req: RemoveFriendRequest, headers?: object, signal?: AbortSignal): Promise @@ -90,16 +82,12 @@ export interface APIClient { */ contractCall(req: ContractCallRequest, headers?: object, signal?: AbortSignal): Promise - decodeContractCall( - req: DecodeContractCallRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + decodeContractCall(req: DecodeContractCallRequest, headers?: object, signal?: AbortSignal): Promise lookupContractCallSelectors( req: LookupContractCallSelectorsRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise /** @@ -107,24 +95,16 @@ export interface APIClient { * User Storage * */ - userStorageFetch( - req: UserStorageFetchRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + userStorageFetch(req: UserStorageFetchRequest, headers?: object, signal?: AbortSignal): Promise userStorageSave(req: UserStorageSaveRequest, headers?: object, signal?: AbortSignal): Promise - userStorageDelete( - req: UserStorageDeleteRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + userStorageDelete(req: UserStorageDeleteRequest, headers?: object, signal?: AbortSignal): Promise userStorageFetchAll( req: UserStorageFetchAllRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise /** @@ -137,38 +117,30 @@ export interface APIClient { /** * - IsUsingGoogleMail(domain: string) => (yes: bool) */ - resolveENSAddress( - req: ResolveENSAddressRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + resolveENSAddress(req: ResolveENSAddressRequest, 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( - req: IsValidSignatureRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + isValidSignature(req: IsValidSignatureRequest, headers?: object, signal?: AbortSignal): Promise isValidMessageSignature( req: IsValidMessageSignatureRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise isValidTypedDataSignature( req: IsValidTypedDataSignatureRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise isValidETHAuthProof( req: IsValidETHAuthProofRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise getOnRampURL(req: GetOnRampURLRequest, headers?: object, signal?: AbortSignal): Promise @@ -183,13 +155,13 @@ export interface APIClient { transakGetSupportedNFTCheckoutChains( headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise transakGetWidgetURL( req: TransakGetWidgetURLRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise /** @@ -202,7 +174,7 @@ export interface APIClient { getCollectiblePrices( req: GetCollectiblePricesRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise /** @@ -231,26 +203,18 @@ export interface APIClient { /** * NOTE: we're still using this from SW-API to Sequence-API to claim invite code */ - isValidAccessCode( - req: IsValidAccessCodeRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + isValidAccessCode(req: IsValidAccessCodeRequest, headers?: object, signal?: AbortSignal): Promise internalClaimAccessCode( req: InternalClaimAccessCodeRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise /** * Utils */ - blockNumberAtTime( - req: BlockNumberAtTimeRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + blockNumberAtTime(req: BlockNumberAtTimeRequest, headers?: object, signal?: AbortSignal): Promise /** * @@ -258,16 +222,12 @@ export interface APIClient { * TODO: deprecate in the future * */ - paperSessionSecret( - req: PaperSessionSecretRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + paperSessionSecret(req: PaperSessionSecretRequest, headers?: object, signal?: AbortSignal): Promise paperSessionSecret2( req: PaperSessionSecret2Request, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise /** @@ -277,17 +237,9 @@ export interface APIClient { */ linkWallet(req: LinkWalletRequest, headers?: object, signal?: AbortSignal): Promise - getLinkedWallets( - req: GetLinkedWalletsRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + getLinkedWallets(req: GetLinkedWalletsRequest, headers?: object, signal?: AbortSignal): Promise - removeLinkedWallet( - req: RemoveLinkedWalletRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + removeLinkedWallet(req: RemoveLinkedWalletRequest, 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 @@ -296,13 +248,13 @@ export interface APIClient { generateWaaSVerificationURL( req: GenerateWaaSVerificationURLRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise validateWaaSVerificationNonce( req: ValidateWaaSVerificationNonceRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise /** @@ -311,11 +263,7 @@ export interface APIClient { * WaaS child wallet adoption * */ - listAdoptedWallets( - req: ListAdoptedWalletsRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + listAdoptedWallets(req: ListAdoptedWalletsRequest, headers?: object, signal?: AbortSignal): Promise getLifiChains(headers?: object, signal?: AbortSignal): Promise @@ -325,36 +273,9 @@ export interface APIClient { * All parameters except `params` are deprecated. * Use only the `params` object to pass values. */ - getLifiSwapRoutes( - req: GetLifiSwapRoutesRequest, - headers?: object, - signal?: AbortSignal, - ): Promise + getLifiSwapRoutes(req: GetLifiSwapRoutesRequest, headers?: object, signal?: AbortSignal): Promise - getLifiSwapQuote( - req: GetLifiSwapQuoteRequest, - headers?: object, - signal?: AbortSignal, - ): Promise - - /** - * - * Chain abstraction - * - */ - getIntentCallsPayloads( - req: GetIntentCallsPayloadsRequest, - headers?: object, - signal?: AbortSignal, - ): Promise - - commitIntentConfig( - req: CommitIntentConfigRequest, - headers?: object, - signal?: AbortSignal, - ): Promise - - getIntentConfig(req: GetIntentConfigRequest, headers?: object, signal?: AbortSignal): Promise + getLifiSwapQuote(req: GetLifiSwapQuoteRequest, headers?: object, signal?: AbortSignal): Promise /** * @@ -366,43 +287,43 @@ export interface APIClient { addOffchainInventory( req: AddOffchainInventoryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise getOffchainInventory( req: GetOffchainInventoryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise listOffchainInventories( req: ListOffchainInventoriesRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise updateOffchainInventory( req: UpdateOffchainInventoryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise deleteOffchainInventory( req: DeleteOffchainInventoryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise requestOffchainPayment( req: RequestOffchainPaymentRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise listOffchainPayments( req: ListOffchainPaymentsRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise /** @@ -418,85 +339,39 @@ export interface APIClient { deletePack(req: DeletePackRequest, headers?: object, signal?: AbortSignal): Promise - updatePackContent( - req: UpdatePackContentRequest, - 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, + signal?: AbortSignal ): Promise checkoutOptionsSecondary( req: CheckoutOptionsSecondaryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise checkoutOptionsGetTransakContractID( req: CheckoutOptionsGetTransakContractIDRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise fortePayCreateIntent( req: FortePayCreateIntentRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise fortePayGetPaymentStatuses( req: FortePayGetPaymentStatusesRequest, headers?: object, - signal?: AbortSignal, + 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 } // @@ -505,50 +380,50 @@ export interface APIClient { export enum SortOrder { DESC = 'DESC', - ASC = 'ASC', + ASC = 'ASC' } 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', - transak = 'transak', + transak = 'transak' } export enum CheckoutOptionOnRampProvider { unknown = 'unknown', - transak = 'transak', + transak = 'transak' } export enum CheckoutOptionSwapProvider { unknown = 'unknown', - lifi = 'lifi', + lifi = 'lifi' } export interface Version { @@ -632,38 +507,6 @@ export interface MetaTxn { input: string } -export interface Call { - to: string - value?: string - data?: string - gasLimit?: string - delegateCall?: boolean - onlyFallback?: boolean - behaviorOnError?: number -} - -export interface IntentCallsPayload { - chainId: string - space?: string - nonce?: string - calls: Array -} - -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 MetaTxnReceipt { metaTxID: string status: string @@ -703,30 +546,6 @@ export interface TupleComponent { value: any } -export interface AddressOverrides { - trailsLiFiSapientSignerAddress?: string - trailsRelaySapientSignerAddress?: string - trailsCCTPV2SapientSignerAddress?: string -} - -export interface TakerFee { - address: string - bps: number -} - -export interface OriginCall { - chainId: number - to: string - transactionData: string - transactionValue: string -} - -export interface IntentPrecondition { - type: string - chainId: string - data: any -} - export interface UserStorage { userAddress: string key: string @@ -866,18 +685,6 @@ export interface OffchainInventory { 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 @@ -1228,33 +1035,6 @@ 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 PingRequest {} export interface PingResponse { @@ -1738,10 +1518,6 @@ export interface GetLifiTokensResponse { export interface GetLifiSwapRoutesRequest { params: GetLifiSwapRouteParams - chainId: number - toTokenAddress: string - toTokenAmount: string - walletAddress: string } export interface GetLifiSwapRoutesResponse { @@ -1756,57 +1532,6 @@ export interface GetLifiSwapQuoteResponse { quote: LifiSwapQuote } -export interface GetIntentCallsPayloadsRequest { - userAddress: string - destinationChainId: number - destinationTokenAddress: string - destinationTokenAmount: string - destinationToAddress: string - originChainId: number - originTokenAddress: string - originTokenAmount: string - destinationCallData?: string - destinationCallValue?: string - provider?: string - addressOverrides?: AddressOverrides - destinationSalt?: string - takerFee?: TakerFee - slippageTolerance?: number - tradeType?: TradeType -} - -export interface GetIntentCallsPayloadsResponse { - calls: Array - preconditions: Array - metaTxns: Array - trailsFee: TrailsFee - quote: IntentQuote - feeQuotes: { [key: string]: string } - originIntentAddress: string - destinationIntentAddress: string -} - -export interface CommitIntentConfigRequest { - originIntentAddress: string - destinationIntentAddress: string - mainSigner: string - calls: Array - preconditions: Array - addressOverrides?: AddressOverrides -} - -export interface CommitIntentConfigResponse { - config: IntentConfig -} - -export interface GetIntentConfigRequest { - intentAddress: string -} - -export interface GetIntentConfigResponse { - config: IntentConfig -} - export interface ListCurrencyGroupsRequest {} export interface ListCurrencyGroupsResponse { @@ -1975,59 +1700,6 @@ export interface FortePayGetPaymentStatusesResponse { statuses: Array } -export interface GetCCTPTransferRequest { - id: string -} - -export interface GetCCTPTransferResponse { - transfer: CCTPTransfer -} - -export interface QueueCCTPTransferRequest { - sourceTxHash?: string - metaTxHash?: string - sourceChainId: number - destinationChainId: number -} - -export interface QueueCCTPTransferResponse { - transfer: CCTPTransfer -} - -export interface QueueIntentConfigExecutionRequest { - intentConfigId: number -} - -export interface QueueIntentConfigExecutionResponse { - status: boolean -} - -export interface GetIntentConfigExecutionStatusRequest { - intentConfigId: number -} - -export interface GetIntentConfigExecutionStatusResponse { - executionStatus: string -} - -export interface ListIntentConfigsRequest { - page?: Page - executionStatus?: string -} - -export interface ListIntentConfigsResponse { - page: Page - intentConfigs: Array -} - -export interface QueueMetaTxnReceiptRequest { - metaTxID: string -} - -export interface QueueMetaTxnReceiptResponse { - status: boolean -} - // // Client // @@ -2075,8 +1747,7 @@ export class API implements APIClient { 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, + 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, @@ -2108,9 +1779,6 @@ export class API implements APIClient { 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, @@ -2126,1759 +1794,1315 @@ export class API implements APIClient { 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, + 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, + fortePayGetPaymentStatuses: (req: FortePayGetPaymentStatusesRequest) => ['API', 'fortePayGetPaymentStatuses', 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) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'PingResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'VersionResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'RuntimeStatusResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'ClockResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetSequenceContextResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('GetAuthToken'), createHttpRequest(JsonEncode(req, 'GetAuthTokenRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetAuthTokenResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getAuthToken2 = ( - req: GetAuthToken2Request, - headers?: object, - signal?: AbortSignal, - ): Promise => { + getAuthToken2 = (req: GetAuthToken2Request, headers?: object, signal?: AbortSignal): Promise => { return this.fetch( this.url('GetAuthToken2'), - createHttpRequest(JsonEncode(req, 'GetAuthToken2Request'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetAuthToken2Request'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetAuthToken2Response') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } sendPasswordlessLink = ( req: SendPasswordlessLinkRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('SendPasswordlessLink'), - createHttpRequest(JsonEncode(req, 'SendPasswordlessLinkRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'SendPasswordlessLinkRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'SendPasswordlessLinkResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } registerPublicKey = ( req: RegisterPublicKeyRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('RegisterPublicKey'), - createHttpRequest(JsonEncode(req, 'RegisterPublicKeyRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'RegisterPublicKeyRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'RegisterPublicKeyResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('GetPublicKey'), createHttpRequest(JsonEncode(req, 'GetPublicKeyRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetPublicKeyResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('FriendList'), createHttpRequest(JsonEncode(req, 'FriendListRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'FriendListResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getFriendByAddress = ( req: GetFriendByAddressRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('GetFriendByAddress'), - createHttpRequest(JsonEncode(req, 'GetFriendByAddressRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetFriendByAddressRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetFriendByAddressResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - searchFriends = ( - req: SearchFriendsRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { + searchFriends = (req: SearchFriendsRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch( this.url('SearchFriends'), - createHttpRequest(JsonEncode(req, 'SearchFriendsRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'SearchFriendsRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'SearchFriendsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('AddFriend'), createHttpRequest(JsonEncode(req, 'AddFriendRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'AddFriendResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } updateFriendNickname = ( req: UpdateFriendNicknameRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('UpdateFriendNickname'), - createHttpRequest(JsonEncode(req, 'UpdateFriendNicknameRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'UpdateFriendNicknameRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'UpdateFriendNicknameResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('RemoveFriend'), createHttpRequest(JsonEncode(req, 'RemoveFriendRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'RemoveFriendResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('ContractCall'), createHttpRequest(JsonEncode(req, 'ContractCallRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'ContractCallResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } decodeContractCall = ( req: DecodeContractCallRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('DecodeContractCall'), - createHttpRequest(JsonEncode(req, 'DecodeContractCallRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'DecodeContractCallRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'DecodeContractCallResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } lookupContractCallSelectors = ( req: LookupContractCallSelectorsRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('LookupContractCallSelectors'), - createHttpRequest(JsonEncode(req, 'LookupContractCallSelectorsRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'LookupContractCallSelectorsRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'LookupContractCallSelectorsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } userStorageFetch = ( req: UserStorageFetchRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('UserStorageFetch'), - createHttpRequest(JsonEncode(req, 'UserStorageFetchRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'UserStorageFetchRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'UserStorageFetchResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - userStorageSave = ( - req: UserStorageSaveRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { + userStorageSave = (req: UserStorageSaveRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch( this.url('UserStorageSave'), - createHttpRequest(JsonEncode(req, 'UserStorageSaveRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'UserStorageSaveRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'UserStorageSaveResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } userStorageDelete = ( req: UserStorageDeleteRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('UserStorageDelete'), - createHttpRequest(JsonEncode(req, 'UserStorageDeleteRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'UserStorageDeleteRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'UserStorageDeleteResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } userStorageFetchAll = ( req: UserStorageFetchAllRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('UserStorageFetchAll'), - createHttpRequest(JsonEncode(req, 'UserStorageFetchAllRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'UserStorageFetchAllRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'UserStorageFetchAllResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getMoonpayLink = ( - req: GetMoonpayLinkRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { + getMoonpayLink = (req: GetMoonpayLinkRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch( this.url('GetMoonpayLink'), - createHttpRequest(JsonEncode(req, 'GetMoonpayLinkRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetMoonpayLinkRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetMoonpayLinkResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } resolveENSAddress = ( req: ResolveENSAddressRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('ResolveENSAddress'), - createHttpRequest(JsonEncode(req, 'ResolveENSAddressRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'ResolveENSAddressRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'ResolveENSAddressResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } isValidSignature = ( req: IsValidSignatureRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('IsValidSignature'), - createHttpRequest(JsonEncode(req, 'IsValidSignatureRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'IsValidSignatureRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'IsValidSignatureResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } isValidMessageSignature = ( req: IsValidMessageSignatureRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('IsValidMessageSignature'), - createHttpRequest(JsonEncode(req, 'IsValidMessageSignatureRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'IsValidMessageSignatureRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'IsValidMessageSignatureResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } isValidTypedDataSignature = ( req: IsValidTypedDataSignatureRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('IsValidTypedDataSignature'), - createHttpRequest(JsonEncode(req, 'IsValidTypedDataSignatureRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'IsValidTypedDataSignatureRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'IsValidTypedDataSignatureResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } isValidETHAuthProof = ( req: IsValidETHAuthProofRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('IsValidETHAuthProof'), - createHttpRequest(JsonEncode(req, 'IsValidETHAuthProofRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'IsValidETHAuthProofRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'IsValidETHAuthProofResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('GetOnRampURL'), createHttpRequest(JsonEncode(req, 'GetOnRampURLRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetOnRampURLResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } transakGetCountries = (headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('TransakGetCountries'), createHttpRequest('{}', headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'TransakGetCountriesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - transakGetCryptoCurrencies = ( - headers?: object, - signal?: AbortSignal, - ): Promise => { + transakGetCryptoCurrencies = (headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('TransakGetCryptoCurrencies'), createHttpRequest('{}', headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'TransakGetCryptoCurrenciesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } transakGetFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('TransakGetFiatCurrencies'), createHttpRequest('{}', headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'TransakGetFiatCurrenciesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - transakGetPrice = ( - req: TransakGetPriceRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { + transakGetPrice = (req: TransakGetPriceRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch( this.url('TransakGetPrice'), - createHttpRequest(JsonEncode(req, 'TransakGetPriceRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'TransakGetPriceRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'TransakGetPriceResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } transakGetSupportedNFTCheckoutChains = ( headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch(this.url('TransakGetSupportedNFTCheckoutChains'), createHttpRequest('{}', headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode( - _data, - 'TransakGetSupportedNFTCheckoutChainsResponse', - ) - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'TransakGetSupportedNFTCheckoutChainsResponse') }) }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } transakGetWidgetURL = ( req: TransakGetWidgetURLRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('TransakGetWidgetURL'), - createHttpRequest(JsonEncode(req, 'TransakGetWidgetURLRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'TransakGetWidgetURLRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'TransakGetWidgetURLResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getCoinPrices = ( - req: GetCoinPricesRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { + getCoinPrices = (req: GetCoinPricesRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch( this.url('GetCoinPrices'), - createHttpRequest(JsonEncode(req, 'GetCoinPricesRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetCoinPricesRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetCoinPricesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getCollectiblePrices = ( req: GetCollectiblePricesRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('GetCollectiblePrices'), - createHttpRequest(JsonEncode(req, 'GetCollectiblePricesRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetCollectiblePricesRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetCollectiblePricesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getExchangeRate = ( - req: GetExchangeRateRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { + getExchangeRate = (req: GetExchangeRateRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch( this.url('GetExchangeRate'), - createHttpRequest(JsonEncode(req, 'GetExchangeRateRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetExchangeRateRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetExchangeRateResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('MemoryStore'), createHttpRequest(JsonEncode(req, 'MemoryStoreRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'MemoryStoreResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('MemoryLoad'), createHttpRequest(JsonEncode(req, 'MemoryLoadRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'MemoryLoadResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetInviteInfoResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } isValidAccessCode = ( req: IsValidAccessCodeRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('IsValidAccessCode'), - createHttpRequest(JsonEncode(req, 'IsValidAccessCodeRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'IsValidAccessCodeRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'IsValidAccessCodeResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } internalClaimAccessCode = ( req: InternalClaimAccessCodeRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('InternalClaimAccessCode'), - createHttpRequest(JsonEncode(req, 'InternalClaimAccessCodeRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'InternalClaimAccessCodeRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'InternalClaimAccessCodeResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } blockNumberAtTime = ( req: BlockNumberAtTimeRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('BlockNumberAtTime'), - createHttpRequest(JsonEncode(req, 'BlockNumberAtTimeRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'BlockNumberAtTimeRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'BlockNumberAtTimeResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } paperSessionSecret = ( req: PaperSessionSecretRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('PaperSessionSecret'), - createHttpRequest(JsonEncode(req, 'PaperSessionSecretRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'PaperSessionSecretRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'PaperSessionSecretResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } paperSessionSecret2 = ( req: PaperSessionSecret2Request, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('PaperSessionSecret2'), - createHttpRequest(JsonEncode(req, 'PaperSessionSecret2Request'), headers, signal), + createHttpRequest(JsonEncode(req, 'PaperSessionSecret2Request'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'PaperSessionSecret2Response') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('LinkWallet'), createHttpRequest(JsonEncode(req, 'LinkWalletRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'LinkWalletResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getLinkedWallets = ( req: GetLinkedWalletsRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('GetLinkedWallets'), - createHttpRequest(JsonEncode(req, 'GetLinkedWalletsRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetLinkedWalletsRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetLinkedWalletsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } removeLinkedWallet = ( req: RemoveLinkedWalletRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('RemoveLinkedWallet'), - createHttpRequest(JsonEncode(req, 'RemoveLinkedWalletRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'RemoveLinkedWalletRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'RemoveLinkedWalletResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } generateWaaSVerificationURL = ( req: GenerateWaaSVerificationURLRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('GenerateWaaSVerificationURL'), - createHttpRequest(JsonEncode(req, 'GenerateWaaSVerificationURLRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GenerateWaaSVerificationURLRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GenerateWaaSVerificationURLResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } validateWaaSVerificationNonce = ( req: ValidateWaaSVerificationNonceRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('ValidateWaaSVerificationNonce'), - createHttpRequest(JsonEncode(req, 'ValidateWaaSVerificationNonceRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'ValidateWaaSVerificationNonceRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'ValidateWaaSVerificationNonceResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } listAdoptedWallets = ( req: ListAdoptedWalletsRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('ListAdoptedWallets'), - createHttpRequest(JsonEncode(req, 'ListAdoptedWalletsRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'ListAdoptedWalletsRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'ListAdoptedWalletsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetLifiChainsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getLifiTokens = ( - req: GetLifiTokensRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { + getLifiTokens = (req: GetLifiTokensRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch( this.url('GetLifiTokens'), - createHttpRequest(JsonEncode(req, 'GetLifiTokensRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetLifiTokensRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetLifiTokensResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getLifiSwapRoutes = ( req: GetLifiSwapRoutesRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('GetLifiSwapRoutes'), - createHttpRequest(JsonEncode(req, 'GetLifiSwapRoutesRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetLifiSwapRoutesRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetLifiSwapRoutesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getLifiSwapQuote = ( req: GetLifiSwapQuoteRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('GetLifiSwapQuote'), - createHttpRequest(JsonEncode(req, 'GetLifiSwapQuoteRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetLifiSwapQuoteRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetLifiSwapQuoteResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, - ) - } - - getIntentCallsPayloads = ( - req: GetIntentCallsPayloadsRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('GetIntentCallsPayloads'), - createHttpRequest(JsonEncode(req, 'GetIntentCallsPayloadsRequest'), headers, signal), - ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'GetIntentCallsPayloadsResponse') - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, - ) - } - - commitIntentConfig = ( - req: CommitIntentConfigRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('CommitIntentConfig'), - createHttpRequest(JsonEncode(req, 'CommitIntentConfigRequest'), headers, signal), - ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'CommitIntentConfigResponse') - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, - ) - } - - getIntentConfig = ( - req: GetIntentConfigRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('GetIntentConfig'), - createHttpRequest(JsonEncode(req, 'GetIntentConfigRequest'), headers, signal), - ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'GetIntentConfigResponse') - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'ListCurrencyGroupsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } addOffchainInventory = ( req: AddOffchainInventoryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('AddOffchainInventory'), - createHttpRequest(JsonEncode(req, 'AddOffchainInventoryRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'AddOffchainInventoryRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'AddOffchainInventoryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getOffchainInventory = ( req: GetOffchainInventoryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('GetOffchainInventory'), - createHttpRequest(JsonEncode(req, 'GetOffchainInventoryRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetOffchainInventoryRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetOffchainInventoryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } listOffchainInventories = ( req: ListOffchainInventoriesRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('ListOffchainInventories'), - createHttpRequest(JsonEncode(req, 'ListOffchainInventoriesRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'ListOffchainInventoriesRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'ListOffchainInventoriesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } updateOffchainInventory = ( req: UpdateOffchainInventoryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('UpdateOffchainInventory'), - createHttpRequest(JsonEncode(req, 'UpdateOffchainInventoryRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'UpdateOffchainInventoryRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'UpdateOffchainInventoryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } deleteOffchainInventory = ( req: DeleteOffchainInventoryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('DeleteOffchainInventory'), - createHttpRequest(JsonEncode(req, 'DeleteOffchainInventoryRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'DeleteOffchainInventoryRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'DeleteOffchainInventoryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } requestOffchainPayment = ( req: RequestOffchainPaymentRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('RequestOffchainPayment'), - createHttpRequest(JsonEncode(req, 'RequestOffchainPaymentRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'RequestOffchainPaymentRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'RequestOffchainPaymentResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } listOffchainPayments = ( req: ListOffchainPaymentsRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('ListOffchainPayments'), - createHttpRequest(JsonEncode(req, 'ListOffchainPaymentsRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'ListOffchainPaymentsRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'ListOffchainPaymentsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('SavePack'), createHttpRequest(JsonEncode(req, 'SavePackRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'SavePackResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetPackResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('GetPackIds'), createHttpRequest(JsonEncode(req, 'GetPackIdsRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetPackIdsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } 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 this.fetch(this.url('DeletePack'), createHttpRequest(JsonEncode(req, 'DeletePackRequest'), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'DeletePackResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } updatePackContent = ( req: UpdatePackContentRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('UpdatePackContent'), - createHttpRequest(JsonEncode(req, 'UpdatePackContentRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'UpdatePackContentRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'UpdatePackContentResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getRevealTxData = ( - req: GetRevealTxDataRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { + getRevealTxData = (req: GetRevealTxDataRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch( this.url('GetRevealTxData'), - createHttpRequest(JsonEncode(req, 'GetRevealTxDataRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'GetRevealTxDataRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'GetRevealTxDataResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } checkoutOptionsPrimary = ( req: CheckoutOptionsPrimaryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('CheckoutOptionsPrimary'), - createHttpRequest(JsonEncode(req, 'CheckoutOptionsPrimaryRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'CheckoutOptionsPrimaryRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'CheckoutOptionsPrimaryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } checkoutOptionsSecondary = ( req: CheckoutOptionsSecondaryRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('CheckoutOptionsSecondary'), - createHttpRequest(JsonEncode(req, 'CheckoutOptionsSecondaryRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'CheckoutOptionsSecondaryRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'CheckoutOptionsSecondaryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } checkoutOptionsGetTransakContractID = ( req: CheckoutOptionsGetTransakContractIDRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('CheckoutOptionsGetTransakContractID'), - createHttpRequest(JsonEncode(req, 'CheckoutOptionsGetTransakContractIDRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'CheckoutOptionsGetTransakContractIDRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode( - _data, - 'CheckoutOptionsGetTransakContractIDResponse', - ) - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'CheckoutOptionsGetTransakContractIDResponse') }) }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } fortePayCreateIntent = ( req: FortePayCreateIntentRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('FortePayCreateIntent'), - createHttpRequest(JsonEncode(req, 'FortePayCreateIntentRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'FortePayCreateIntentRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'FortePayCreateIntentResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } fortePayGetPaymentStatuses = ( req: FortePayGetPaymentStatusesRequest, headers?: object, - signal?: AbortSignal, + signal?: AbortSignal ): Promise => { return this.fetch( this.url('FortePayGetPaymentStatuses'), - createHttpRequest(JsonEncode(req, 'FortePayGetPaymentStatusesRequest'), headers, signal), + createHttpRequest(JsonEncode(req, 'FortePayGetPaymentStatusesRequest'), headers, signal) ).then( - (res) => { - return buildResponse(res).then((_data) => { + res => { + return buildResponse(res).then(_data => { return JsonDecode(_data, 'FortePayGetPaymentStatusesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, - ) - } - - getCCTPTransfer = ( - req: GetCCTPTransferRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('GetCCTPTransfer'), - createHttpRequest(JsonEncode(req, 'GetCCTPTransferRequest'), headers, signal), - ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'GetCCTPTransferResponse') - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, - ) - } - - queueCCTPTransfer = ( - req: QueueCCTPTransferRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('QueueCCTPTransfer'), - createHttpRequest(JsonEncode(req, 'QueueCCTPTransferRequest'), headers, signal), - ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'QueueCCTPTransferResponse') - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, - ) - } - - queueIntentConfigExecution = ( - req: QueueIntentConfigExecutionRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('QueueIntentConfigExecution'), - createHttpRequest(JsonEncode(req, 'QueueIntentConfigExecutionRequest'), headers, signal), - ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'QueueIntentConfigExecutionResponse') - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, - ) - } - - getIntentConfigExecutionStatus = ( - req: GetIntentConfigExecutionStatusRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('GetIntentConfigExecutionStatus'), - createHttpRequest(JsonEncode(req, 'GetIntentConfigExecutionStatusRequest'), headers, signal), - ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'GetIntentConfigExecutionStatusResponse') - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, - ) - } - - listIntentConfigs = ( - req: ListIntentConfigsRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('ListIntentConfigs'), - createHttpRequest(JsonEncode(req, 'ListIntentConfigsRequest'), headers, signal), - ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'ListIntentConfigsResponse') - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, - ) - } - - queueMetaTxnReceipt = ( - req: QueueMetaTxnReceiptRequest, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('QueueMetaTxnReceipt'), - createHttpRequest(JsonEncode(req, 'QueueMetaTxnReceiptRequest'), headers, signal), - ).then( - (res) => { - return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'QueueMetaTxnReceiptResponse') - }) - }, - (error) => { - throw WebrpcRequestFailedError.new({ - cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, - }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } } @@ -3887,20 +3111,20 @@ const createHttpRequest = (body: string = '{}', headers: object = {}, signal: Ab const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json', - [WebrpcHeader]: WebrpcHeaderValue, + [WebrpcHeader]: WebrpcHeaderValue } return { method: 'POST', headers: reqHeaders, body, 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) { throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}`, + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}` }) } if (!res.ok) { @@ -4426,7 +3650,7 @@ export enum errors { Unavailable = 'Unavailable', QueryFailed = 'QueryFailed', NotFound = 'NotFound', - UnsupportedNetwork = 'UnsupportedNetwork', + UnsupportedNetwork = 'UnsupportedNetwork' } export enum WebrpcErrorCodes { @@ -4465,7 +3689,7 @@ export enum WebrpcErrorCodes { Unavailable = 2002, QueryFailed = 2003, NotFound = 3000, - UnsupportedNetwork = 3008, + UnsupportedNetwork = 3008 } export const webrpcErrorByCode: { [code: number]: any } = { @@ -4504,7 +3728,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { [2002]: UnavailableError, [2003]: QueryFailedError, [3000]: NotFoundError, - [3008]: UnsupportedNetworkError, + [3008]: UnsupportedNetworkError } // @@ -4531,7 +3755,7 @@ export function VersionFromHeader(headers: Headers): WebrpcGenVersions { codeGenName: '', codeGenVersion: '', schemaName: '', - schemaVersion: '', + schemaVersion: '' } } @@ -4546,7 +3770,7 @@ function parseWebrpcGenVersions(header: string): WebrpcGenVersions { codeGenName: '', codeGenVersion: '', schemaName: '', - schemaVersion: '', + schemaVersion: '' } } @@ -4559,6 +3783,6 @@ function parseWebrpcGenVersions(header: string): WebrpcGenVersions { codeGenName: codeGenName ?? '', codeGenVersion: codeGenVersion ?? '', schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '', + schemaVersion: schemaVersion ?? '' } } From c75e77f2d8e149d4027b8da362f1d3c26187ea1a Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Tue, 10 Feb 2026 09:41:05 +1300 Subject: [PATCH 075/144] Seq.js uses to address for feeOptions (#962) --- .../services/relayer/src/relayer/relayer.ts | 1 + .../relayer/src/relayer/rpc-relayer/index.ts | 5 +++-- .../relayer/src/relayer/standard/eip6963.ts | 3 ++- .../relayer/src/relayer/standard/local.ts | 21 ++++--------------- .../src/relayer/standard/pk-relayer.ts | 3 ++- .../relayer/src/relayer/standard/sequence.ts | 2 +- .../relayer/test/relayer/relayer.test.ts | 2 +- .../dapp-client/src/ChainSessionManager.ts | 4 +++- .../wallet/wdk/src/sequence/transactions.ts | 6 +++++- 9 files changed, 22 insertions(+), 25 deletions(-) diff --git a/packages/services/relayer/src/relayer/relayer.ts b/packages/services/relayer/src/relayer/relayer.ts index 3ed5a6962..0be2c92af 100644 --- a/packages/services/relayer/src/relayer/relayer.ts +++ b/packages/services/relayer/src/relayer/relayer.ts @@ -16,6 +16,7 @@ export interface Relayer { feeOptions( wallet: Address.Address, chainId: number, + to: Address.Address, calls: Payload.Call[], ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> diff --git a/packages/services/relayer/src/relayer/rpc-relayer/index.ts b/packages/services/relayer/src/relayer/rpc-relayer/index.ts index 04db6aa40..d4cac8e71 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/index.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/index.ts @@ -134,6 +134,7 @@ export class RpcRelayer implements Relayer { async feeOptions( wallet: Address.Address, chainId: number, + to: Address.Address, calls: Payload.Call[], ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { const callsStruct: Payload.Calls = { type: 'call', space: 0n, nonce: 0n, calls: calls } @@ -142,8 +143,8 @@ export class RpcRelayer implements Relayer { try { const result = await this.client.feeOptions( { - wallet: wallet, - to: wallet, + wallet, + to, data: Bytes.toHex(data), }, { ...(this.projectAccessKey ? { 'X-Access-Key': this.projectAccessKey } : undefined) }, diff --git a/packages/services/relayer/src/relayer/standard/eip6963.ts b/packages/services/relayer/src/relayer/standard/eip6963.ts index 9d4861363..285ad498c 100644 --- a/packages/services/relayer/src/relayer/standard/eip6963.ts +++ b/packages/services/relayer/src/relayer/standard/eip6963.ts @@ -30,9 +30,10 @@ export class EIP6963Relayer implements Relayer { feeOptions( wallet: Address.Address, chainId: number, + to: Address.Address, calls: Payload.Call[], ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { - return this.relayer.feeOptions(wallet, chainId, calls) + return this.relayer.feeOptions(wallet, chainId, to, calls) } async relay(to: Address.Address, data: Hex.Hex, chainId: number, _?: FeeQuote): Promise<{ opHash: Hex.Hex }> { diff --git a/packages/services/relayer/src/relayer/standard/local.ts b/packages/services/relayer/src/relayer/standard/local.ts index 14d697aa2..15453a774 100644 --- a/packages/services/relayer/src/relayer/standard/local.ts +++ b/packages/services/relayer/src/relayer/standard/local.ts @@ -54,27 +54,14 @@ export class LocalRelayer implements Relayer { } feeOptions( - wallet: Address.Address, - chainId: number, - calls: Payload.Call[], + _wallet: Address.Address, + _chainId: number, + _to: Address.Address, + _calls: Payload.Call[], ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { return Promise.resolve({ options: [] }) } - private decodeCalls(data: Hex.Hex): Payload.Calls { - const executeSelector = AbiFunction.getSelector(Constants.EXECUTE) - - let packedPayload - if (data.startsWith(executeSelector)) { - const decode = AbiFunction.decodeData(Constants.EXECUTE, data) - packedPayload = decode[0] - } else { - packedPayload = data - } - - return Payload.decode(Bytes.fromHex(packedPayload)) - } - async relay( to: Address.Address, data: Hex.Hex, diff --git a/packages/services/relayer/src/relayer/standard/pk-relayer.ts b/packages/services/relayer/src/relayer/standard/pk-relayer.ts index 37b2e5a08..452d23554 100644 --- a/packages/services/relayer/src/relayer/standard/pk-relayer.ts +++ b/packages/services/relayer/src/relayer/standard/pk-relayer.ts @@ -114,9 +114,10 @@ export class PkRelayer implements Relayer { feeOptions( wallet: Address.Address, chainId: number, + to: Address.Address, calls: Payload.Call[], ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { - return this.relayer.feeOptions(wallet, chainId, calls) + return this.relayer.feeOptions(wallet, chainId, to, calls) } async relay(to: Address.Address, data: Hex.Hex, chainId: number, _?: FeeQuote): Promise<{ opHash: Hex.Hex }> { diff --git a/packages/services/relayer/src/relayer/standard/sequence.ts b/packages/services/relayer/src/relayer/standard/sequence.ts index 5c0bd1663..500d6ecf6 100644 --- a/packages/services/relayer/src/relayer/standard/sequence.ts +++ b/packages/services/relayer/src/relayer/standard/sequence.ts @@ -36,9 +36,9 @@ export class SequenceRelayer implements Relayer { async feeOptions( wallet: Address.Address, _chainId: number, + to: Address.Address, calls: Payload.Call[], ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { - const to = wallet // TODO: this might be the guest module const execute = AbiFunction.from('function execute(bytes calldata _payload, bytes calldata _signature)') const payload = Payload.encode({ type: 'call', space: 0n, nonce: 0n, calls }, to) const signature = '0x0001' // TODO: use a stub signature diff --git a/packages/services/relayer/test/relayer/relayer.test.ts b/packages/services/relayer/test/relayer/relayer.test.ts index adbadd236..e06d0e6a3 100644 --- a/packages/services/relayer/test/relayer/relayer.test.ts +++ b/packages/services/relayer/test/relayer/relayer.test.ts @@ -310,7 +310,7 @@ describe('Relayer', () => { const isAvailable = await mockRelayer.isAvailable(TEST_WALLET_ADDRESS, TEST_CHAIN_ID) expect(isAvailable).toBe(true) - const feeOptions = await mockRelayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, []) + const feeOptions = await mockRelayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, []) expect(feeOptions.options).toEqual([]) const relayResult = await mockRelayer.relay(TEST_TO_ADDRESS, TEST_DATA, TEST_CHAIN_ID) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 324843ba4..229db1ea3 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -851,7 +851,9 @@ export class ChainSessionManager { createdAtMs: Date.now(), } } - const feeOptions = await this.relayer.feeOptions(signedCall.to, this.chainId, callsToSend) + const walletAddress = this.walletAddress + if (!walletAddress) throw new InitializationError('Wallet is not initialized.') + const feeOptions = await this.relayer.feeOptions(walletAddress, this.chainId, signedCall.to, callsToSend) return feeOptions.options } catch (err) { throw new FeeOptionError(`Failed to get fee options: ${err instanceof Error ? err.message : String(err)}`) diff --git a/packages/wallet/wdk/src/sequence/transactions.ts b/packages/wallet/wdk/src/sequence/transactions.ts index 824cb00f6..b06fadf76 100644 --- a/packages/wallet/wdk/src/sequence/transactions.ts +++ b/packages/wallet/wdk/src/sequence/transactions.ts @@ -347,7 +347,11 @@ export class Transactions implements TransactionsInterface { return [] } - const feeOptions = await relayer.feeOptions(tx.wallet, tx.envelope.chainId, tx.envelope.payload.calls) + // Determine the to address for the built transaction + const walletStatus = await wallet.getStatus(provider) + const to = walletStatus.isDeployed ? wallet.address : wallet.guest + + const feeOptions = await relayer.feeOptions(tx.wallet, tx.envelope.chainId, to, tx.envelope.payload.calls) if (feeOptions.options.length === 0) { const { name, icon } = relayer instanceof Relayer.EIP6963.EIP6963Relayer ? relayer.info : {} From 747e6b5853d216b7ccbe9b79a100fc3c20ebeefb Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 10 Feb 2026 16:27:12 +0100 Subject: [PATCH 076/144] 3.0.0-beta.14 --- .changeset/pre.json | 29 ++++++++++--------- .changeset/smart-cups-exist.md | 18 ++++++++++++ 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, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/smart-cups-exist.md diff --git a/.changeset/pre.json b/.changeset/pre.json index cfd464311..6c2320499 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,20 +4,20 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.12", - "@0xsequence/builder": "3.0.0-beta.12", - "@0xsequence/guard": "3.0.0-beta.12", - "@0xsequence/identity-instrument": "3.0.0-beta.12", - "@0xsequence/indexer": "3.0.0-beta.12", - "@0xsequence/marketplace": "3.0.0-beta.12", - "@0xsequence/metadata": "3.0.0-beta.12", - "@0xsequence/relayer": "3.0.0-beta.12", - "@0xsequence/userdata": "3.0.0-beta.12", - "@0xsequence/abi": "3.0.0-beta.12", - "@0xsequence/wallet-core": "3.0.0-beta.12", - "@0xsequence/dapp-client": "3.0.0-beta.12", - "@0xsequence/wallet-primitives": "3.0.0-beta.12", - "@0xsequence/wallet-wdk": "3.0.0-beta.12", + "@0xsequence/api": "3.0.0-beta.13", + "@0xsequence/builder": "3.0.0-beta.13", + "@0xsequence/guard": "3.0.0-beta.13", + "@0xsequence/identity-instrument": "3.0.0-beta.13", + "@0xsequence/indexer": "3.0.0-beta.13", + "@0xsequence/marketplace": "3.0.0-beta.13", + "@0xsequence/metadata": "3.0.0-beta.13", + "@0xsequence/relayer": "3.0.0-beta.13", + "@0xsequence/userdata": "3.0.0-beta.13", + "@0xsequence/abi": "3.0.0-beta.13", + "@0xsequence/wallet-core": "3.0.0-beta.13", + "@0xsequence/dapp-client": "3.0.0-beta.13", + "@0xsequence/wallet-primitives": "3.0.0-beta.13", + "@0xsequence/wallet-wdk": "3.0.0-beta.13", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" @@ -33,6 +33,7 @@ "nine-areas-fall", "open-toes-marry", "plain-feet-stare", + "smart-cups-exist", "tiny-files-chew", "wild-feet-carry", "wise-heads-buy" diff --git a/.changeset/smart-cups-exist.md b/.changeset/smart-cups-exist.md new file mode 100644 index 000000000..556adcbbd --- /dev/null +++ b/.changeset/smart-cups-exist.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 +--- + +Relayer fee options fix diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 8e1edb5c1..b128c5ff3 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 4bd96c9af..bc3cb01f9 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.13", + "version": "3.0.0-beta.14", "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 5b03e6ef4..ebe8b517a 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 193930dfb..9735708a1 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.13", + "version": "3.0.0-beta.14", "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 b023ee9e7..9eec36307 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 9355386c0..648b82da9 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.13", + "version": "3.0.0-beta.14", "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 23da6a85f..339d2ea9b 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.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index fb2df4603..bccdc0fcf 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.13", + "version": "3.0.0-beta.14", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index ae37cc6ea..a8b473d85 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 11186e051..97d083ce8 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.13", + "version": "3.0.0-beta.14", "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 1c6cc42e0..a2a38e2b2 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 6b8654f68..77327c24d 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.13", + "version": "3.0.0-beta.14", "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 36d32ba68..beafb27e4 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index bdcf3bab2..e7244a1c1 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.13", + "version": "3.0.0-beta.14", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 4a691e7fd..c87be6901 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.14 + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index a2d721eb0..d901e8922 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.13", + "version": "3.0.0-beta.14", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index d9099f922..f8ad642d9 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 8a9ddbbfa..e0925a77b 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.13", + "version": "3.0.0-beta.14", "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 9a781a04a..b79fc18fa 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 356ce1abf..42d3c4bca 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.13", + "version": "3.0.0-beta.14", "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 12953ab71..b5a4f5c70 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.14 + - @0xsequence/relayer@3.0.0-beta.14 + - @0xsequence/wallet-primitives@3.0.0-beta.14 + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 1fe24cd29..4467fec0c 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.13", + "version": "3.0.0-beta.14", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 2a18339b5..39d1471c6 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.14 + +### Patch Changes + +- Relayer fee options fix +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.14 + - @0xsequence/relayer@3.0.0-beta.14 + - @0xsequence/wallet-core@3.0.0-beta.14 + - @0xsequence/wallet-primitives@3.0.0-beta.14 + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 864db6bdd..99f617253 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.13", + "version": "3.0.0-beta.14", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 396d9efc5..e494722cd 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index ff15402bb..f975a0622 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.13", + "version": "3.0.0-beta.14", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 22a136c7f..e0feded72 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.14 + +### Patch Changes + +- Relayer fee options fix +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.14 + - @0xsequence/identity-instrument@3.0.0-beta.14 + - @0xsequence/relayer@3.0.0-beta.14 + - @0xsequence/wallet-core@3.0.0-beta.14 + - @0xsequence/wallet-primitives@3.0.0-beta.14 + ## 3.0.0-beta.13 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 9381af65e..bc69bdc1f 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.13", + "version": "3.0.0-beta.14", "license": "Apache-2.0", "type": "module", "publishConfig": { From 9c73e31ce547dd0ef6c6b7e173b1ae9a163fae2f Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Wed, 11 Feb 2026 14:14:21 +0300 Subject: [PATCH 077/144] Add env injection for core and wdk (#955) * Add env injection for core and wdk * wdk: use injected timer for auth key retry delay --- .../core/src/bundler/bundlers/pimlico.ts | 10 +- packages/wallet/core/src/env.ts | 68 +++++++ packages/wallet/core/src/index.ts | 1 + packages/wallet/core/src/signers/passkey.ts | 24 ++- .../wallet/core/src/signers/pk/encrypted.ts | 117 ++++++++++-- .../wallet/core/src/state/local/indexed-db.ts | 17 +- .../wallet/core/src/state/remote/dev-http.ts | 10 +- .../wallet/core/src/state/sequence/index.ts | 10 +- packages/wallet/wdk/src/dbs/auth-keys.ts | 24 ++- packages/wallet/wdk/src/env.ts | 58 ++++++ packages/wallet/wdk/src/identity/signer.ts | 14 +- packages/wallet/wdk/src/index.ts | 1 + packages/wallet/wdk/src/sequence/cron.ts | 117 +++++++----- .../src/sequence/handlers/authcode-pkce.ts | 8 +- .../wdk/src/sequence/handlers/authcode.ts | 31 ++- .../wdk/src/sequence/handlers/identity.ts | 24 ++- .../wallet/wdk/src/sequence/handlers/otp.ts | 5 +- .../wdk/src/sequence/handlers/passkeys.ts | 24 +-- packages/wallet/wdk/src/sequence/index.ts | 2 + packages/wallet/wdk/src/sequence/manager.ts | 178 ++++++++++++++++-- .../wdk/src/sequence/passkeys-provider.ts | 55 ++++++ packages/wallet/wdk/src/sequence/wallets.ts | 25 ++- 22 files changed, 698 insertions(+), 125 deletions(-) create mode 100644 packages/wallet/core/src/env.ts create mode 100644 packages/wallet/wdk/src/env.ts create mode 100644 packages/wallet/wdk/src/sequence/passkeys-provider.ts diff --git a/packages/wallet/core/src/bundler/bundlers/pimlico.ts b/packages/wallet/core/src/bundler/bundlers/pimlico.ts index e2d95ec33..cc28079a6 100644 --- a/packages/wallet/core/src/bundler/bundlers/pimlico.ts +++ b/packages/wallet/core/src/bundler/bundlers/pimlico.ts @@ -21,11 +21,17 @@ export class PimlicoBundler implements Bundler { public readonly provider: Provider.Provider public readonly bundlerRpcUrl: string + private readonly fetcher: typeof fetch - constructor(bundlerRpcUrl: string, provider: Provider.Provider | string) { + constructor(bundlerRpcUrl: string, provider: Provider.Provider | string, fetcher?: typeof fetch) { this.id = `pimlico-erc4337-${bundlerRpcUrl}` this.provider = typeof provider === 'string' ? Provider.from(RpcTransport.fromHttp(provider)) : provider this.bundlerRpcUrl = bundlerRpcUrl + const resolvedFetch = fetcher ?? (globalThis as any).fetch + if (!resolvedFetch) { + throw new Error('fetch is not available') + } + this.fetcher = resolvedFetch } async isAvailable(entrypoint: Address.Address, chainId: number): Promise { @@ -165,7 +171,7 @@ export class PimlicoBundler implements Bundler { private async bundlerRpc(method: string, params: any[]): Promise { const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }) - const res = await fetch(this.bundlerRpcUrl, { + const res = await this.fetcher(this.bundlerRpcUrl, { method: 'POST', headers: { 'content-type': 'application/json' }, body, diff --git a/packages/wallet/core/src/env.ts b/packages/wallet/core/src/env.ts new file mode 100644 index 000000000..0a463dd1d --- /dev/null +++ b/packages/wallet/core/src/env.ts @@ -0,0 +1,68 @@ +export type StorageLike = { + getItem: (key: string) => string | null + setItem: (key: string, value: string) => void + removeItem: (key: string) => void +} + +export type CryptoLike = { + subtle: SubtleCrypto + getRandomValues: (array: T) => T +} + +export type TextEncodingLike = { + TextEncoder: typeof TextEncoder + TextDecoder: typeof TextDecoder +} + +export type CoreEnv = { + fetch?: typeof fetch + crypto?: CryptoLike + storage?: StorageLike + indexedDB?: IDBFactory + text?: Partial +} + +function isStorageLike(value: unknown): value is StorageLike { + if (!value || typeof value !== 'object') return false + const candidate = value as StorageLike + return ( + typeof candidate.getItem === 'function' && + typeof candidate.setItem === 'function' && + typeof candidate.removeItem === 'function' + ) +} + +export function resolveCoreEnv(env?: CoreEnv): CoreEnv { + const globalObj = globalThis as any + const windowObj = typeof window !== 'undefined' ? window : (globalObj.window ?? {}) + let storage: StorageLike | undefined + let text: Partial | undefined + + if (isStorageLike(env?.storage)) { + storage = env.storage + } else if (isStorageLike(windowObj.localStorage)) { + storage = windowObj.localStorage + } else if (isStorageLike(globalObj.localStorage)) { + storage = globalObj.localStorage + } + + if (env?.text) { + if (!env.text.TextEncoder || !env.text.TextDecoder) { + throw new Error('env.text must provide both TextEncoder and TextDecoder') + } + text = env.text + } else { + text = { + TextEncoder: windowObj.TextEncoder ?? globalObj.TextEncoder, + TextDecoder: windowObj.TextDecoder ?? globalObj.TextDecoder, + } + } + + return { + fetch: env?.fetch ?? windowObj.fetch ?? globalObj.fetch, + crypto: env?.crypto ?? windowObj.crypto ?? globalObj.crypto, + storage, + indexedDB: env?.indexedDB ?? windowObj.indexedDB ?? globalObj.indexedDB, + text, + } +} diff --git a/packages/wallet/core/src/index.ts b/packages/wallet/core/src/index.ts index b36e917ca..27c54b8f5 100644 --- a/packages/wallet/core/src/index.ts +++ b/packages/wallet/core/src/index.ts @@ -5,6 +5,7 @@ export * as State from './state/index.js' export * as Bundler from './bundler/index.js' export * as Envelope from './envelope.js' export * as Utils from './utils/index.js' +export * from './env.js' export { type ExplicitSessionConfig, type ExplicitSession, diff --git a/packages/wallet/core/src/signers/passkey.ts b/packages/wallet/core/src/signers/passkey.ts index 0cc7cacab..62c6d1886 100644 --- a/packages/wallet/core/src/signers/passkey.ts +++ b/packages/wallet/core/src/signers/passkey.ts @@ -5,12 +5,15 @@ import { WebAuthnP256 } from 'ox' import { State } from '../index.js' import { SapientSigner, Witnessable } from './index.js' +export type WebAuthnLike = Pick + export type PasskeyOptions = { extensions: Pick publicKey: Extensions.Passkeys.PublicKey credentialId: string embedMetadata?: boolean metadata?: Extensions.Passkeys.PasskeyMetadata + webauthn?: WebAuthnLike } export type CreatePasskeyOptions = { @@ -18,6 +21,11 @@ export type CreatePasskeyOptions = { requireUserVerification?: boolean credentialName?: string embedMetadata?: boolean + webauthn?: WebAuthnLike +} + +export type FindPasskeyOptions = { + webauthn?: WebAuthnLike } export type WitnessMessage = { @@ -45,6 +53,7 @@ export class Passkey implements SapientSigner, Witnessable { public readonly imageHash: Hex.Hex public readonly embedMetadata: boolean public readonly metadata?: Extensions.Passkeys.PasskeyMetadata + private readonly webauthn: WebAuthnLike constructor(options: PasskeyOptions) { this.address = options.extensions.passkeys @@ -53,6 +62,7 @@ export class Passkey implements SapientSigner, Witnessable { this.embedMetadata = options.embedMetadata ?? false this.imageHash = Extensions.Passkeys.rootFor(options.publicKey) this.metadata = options.metadata + this.webauthn = options.webauthn ?? WebAuthnP256 } static async loadFromWitness( @@ -60,6 +70,7 @@ export class Passkey implements SapientSigner, Witnessable { extensions: Pick, wallet: Address.Address, imageHash: Hex.Hex, + options?: FindPasskeyOptions, ) { // In the witness we will find the public key, and may find the credential id const witness = await stateReader.getWitnessForSapient(wallet, extensions.passkeys, imageHash) @@ -90,13 +101,15 @@ export class Passkey implements SapientSigner, Witnessable { publicKey: message.publicKey, embedMetadata: decodedSignature.embedMetadata, metadata, + webauthn: options?.webauthn, }) } static async create(extensions: Pick, options?: CreatePasskeyOptions) { + const webauthn = options?.webauthn ?? WebAuthnP256 const name = options?.credentialName ?? `Sequence (${Date.now()})` - const credential = await WebAuthnP256.createCredential({ + const credential = await webauthn.createCredential({ user: { name, }, @@ -120,6 +133,7 @@ export class Passkey implements SapientSigner, Witnessable { }, embedMetadata: options?.embedMetadata, metadata, + webauthn, }) if (options?.stateProvider) { @@ -132,8 +146,10 @@ export class Passkey implements SapientSigner, Witnessable { static async find( stateReader: State.Reader, extensions: Pick, + options?: FindPasskeyOptions, ): Promise { - const response = await WebAuthnP256.sign({ challenge: Hex.random(32) }) + const webauthn = options?.webauthn ?? WebAuthnP256 + const response = await webauthn.sign({ challenge: Hex.random(32) }) if (!response.raw) throw new Error('No credential returned') const authenticatorDataBytes = Bytes.fromHex(response.metadata.authenticatorData) @@ -218,7 +234,7 @@ export class Passkey implements SapientSigner, Witnessable { console.warn('Multiple signers found for passkey', flattened) } - return Passkey.loadFromWitness(stateReader, extensions, flattened[0]!.wallet, flattened[0]!.imageHash) + return Passkey.loadFromWitness(stateReader, extensions, flattened[0]!.wallet, flattened[0]!.imageHash, options) } async signSapient( @@ -234,7 +250,7 @@ export class Passkey implements SapientSigner, Witnessable { const challenge = Hex.fromBytes(Payload.hash(wallet, chainId, payload)) - const response = await WebAuthnP256.sign({ + const response = await this.webauthn.sign({ challenge, credentialId: this.credentialId, userVerification: this.publicKey.requireUserVerification ? 'required' : 'discouraged', diff --git a/packages/wallet/core/src/signers/pk/encrypted.ts b/packages/wallet/core/src/signers/pk/encrypted.ts index c75bc57f9..dce0eb3cc 100644 --- a/packages/wallet/core/src/signers/pk/encrypted.ts +++ b/packages/wallet/core/src/signers/pk/encrypted.ts @@ -1,4 +1,5 @@ import { Hex, Address, PublicKey, Secp256k1, Bytes } from 'ox' +import { resolveCoreEnv, type CoreEnv, type CryptoLike, type StorageLike, type TextEncodingLike } from '../../env.js' import { PkStore } from './index.js' export interface EncryptedData { @@ -17,6 +18,7 @@ export class EncryptedPksDb { constructor( private readonly localStorageKeyPrefix: string = 'e_pk_key_', tableName: string = 'e_pk', + private readonly env?: CoreEnv, ) { this.tableName = tableName } @@ -25,9 +27,59 @@ export class EncryptedPksDb { return `pk_${address.toLowerCase()}` } + private getIndexedDB(): IDBFactory { + const globalObj = globalThis as any + const indexedDb = this.env?.indexedDB ?? globalObj.indexedDB ?? globalObj.window?.indexedDB + if (!indexedDb) { + throw new Error('indexedDB is not available') + } + return indexedDb + } + + private getStorage(): StorageLike { + const storage = resolveCoreEnv(this.env).storage + if (!storage) { + throw new Error('storage is not available') + } + return storage + } + + private getCrypto(): CryptoLike { + const globalObj = globalThis as any + const crypto = this.env?.crypto ?? globalObj.crypto ?? globalObj.window?.crypto + if (!crypto?.subtle || !crypto?.getRandomValues) { + throw new Error('crypto.subtle is not available') + } + return crypto + } + + private getTextEncoderCtor(): TextEncodingLike['TextEncoder'] { + const globalObj = globalThis as any + if (this.env?.text && (!this.env.text.TextEncoder || !this.env.text.TextDecoder)) { + throw new Error('env.text must provide both TextEncoder and TextDecoder') + } + const encoderCtor = this.env?.text?.TextEncoder ?? globalObj.TextEncoder ?? globalObj.window?.TextEncoder + if (!encoderCtor) { + throw new Error('TextEncoder is not available') + } + return encoderCtor + } + + private getTextDecoderCtor(): TextEncodingLike['TextDecoder'] { + const globalObj = globalThis as any + if (this.env?.text && (!this.env.text.TextEncoder || !this.env.text.TextDecoder)) { + throw new Error('env.text must provide both TextEncoder and TextDecoder') + } + const decoderCtor = this.env?.text?.TextDecoder ?? globalObj.TextDecoder ?? globalObj.window?.TextDecoder + if (!decoderCtor) { + throw new Error('TextDecoder is not available') + } + return decoderCtor + } + private openDB(): Promise { return new Promise((resolve, reject) => { - const request = indexedDB.open(this.dbName, this.dbVersion) + const request = this.getIndexedDB().open(this.dbName, this.dbVersion) request.onupgradeneeded = () => { const db = request.result if (!db.objectStoreNames.contains(this.tableName)) { @@ -73,7 +125,11 @@ export class EncryptedPksDb { } async generateAndStore(): Promise { - const encryptionKey = await window.crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, [ + const crypto = this.getCrypto() + const storage = this.getStorage() + const TextEncoderCtor = this.getTextEncoderCtor() + + const encryptionKey = await crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt', ]) @@ -84,13 +140,13 @@ export class EncryptedPksDb { const address = Address.fromPublicKey(publicKey) const keyPointer = this.localStorageKeyPrefix + address - const exportedKey = await window.crypto.subtle.exportKey('jwk', encryptionKey) - window.localStorage.setItem(keyPointer, JSON.stringify(exportedKey)) + const exportedKey = await crypto.subtle.exportKey('jwk', encryptionKey) + storage.setItem(keyPointer, JSON.stringify(exportedKey)) - const encoder = new TextEncoder() + const encoder = new TextEncoderCtor() const encodedPk = encoder.encode(privateKey) - const iv = window.crypto.getRandomValues(new Uint8Array(12)) - const encryptedBuffer = await window.crypto.subtle.encrypt({ name: 'AES-GCM', iv }, encryptionKey, encodedPk) + const iv = crypto.getRandomValues(new Uint8Array(12)) + const encryptedBuffer = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, encryptionKey, encodedPk) const encrypted: EncryptedData = { iv, @@ -113,7 +169,7 @@ export class EncryptedPksDb { async getEncryptedPkStore(address: Address.Address): Promise { const entry = await this.getEncryptedEntry(address) if (!entry) return - return new EncryptedPkStore(entry) + return new EncryptedPkStore(entry, this.env) } async listAddresses(): Promise { @@ -125,12 +181,41 @@ export class EncryptedPksDb { const dbKey = this.computeDbKey(address) await this.putData(dbKey, undefined) const keyPointer = this.localStorageKeyPrefix + address - window.localStorage.removeItem(keyPointer) + this.getStorage().removeItem(keyPointer) } } export class EncryptedPkStore implements PkStore { - constructor(private readonly encrypted: EncryptedData) {} + constructor( + private readonly encrypted: EncryptedData, + private readonly env?: CoreEnv, + ) {} + + private getStorage(): StorageLike { + const storage = resolveCoreEnv(this.env).storage + if (!storage) { + throw new Error('storage is not available') + } + return storage + } + + private getCrypto(): CryptoLike { + const globalObj = globalThis as any + const crypto = this.env?.crypto ?? globalObj.crypto ?? globalObj.window?.crypto + if (!crypto?.subtle) { + throw new Error('crypto.subtle is not available') + } + return crypto + } + + private getTextDecoderCtor(): TextEncodingLike['TextDecoder'] { + const globalObj = globalThis as any + const decoderCtor = this.env?.text?.TextDecoder ?? globalObj.TextDecoder ?? globalObj.window?.TextDecoder + if (!decoderCtor) { + throw new Error('TextDecoder is not available') + } + return decoderCtor + } address(): Address.Address { return this.encrypted.address @@ -141,16 +226,20 @@ export class EncryptedPkStore implements PkStore { } async signDigest(digest: Bytes.Bytes): Promise<{ r: bigint; s: bigint; yParity: number }> { - const keyJson = window.localStorage.getItem(this.encrypted.keyPointer) + const storage = this.getStorage() + const crypto = this.getCrypto() + const TextDecoderCtor = this.getTextDecoderCtor() + + const keyJson = storage.getItem(this.encrypted.keyPointer) if (!keyJson) throw new Error('Encryption key not found in localStorage') const jwk = JSON.parse(keyJson) - const encryptionKey = await window.crypto.subtle.importKey('jwk', jwk, { name: 'AES-GCM' }, false, ['decrypt']) - const decryptedBuffer = await window.crypto.subtle.decrypt( + const encryptionKey = await crypto.subtle.importKey('jwk', jwk, { name: 'AES-GCM' }, false, ['decrypt']) + const decryptedBuffer = await crypto.subtle.decrypt( { name: 'AES-GCM', iv: this.encrypted.iv }, encryptionKey, this.encrypted.data, ) - const decoder = new TextDecoder() + const decoder = new TextDecoderCtor() const privateKey = decoder.decode(decryptedBuffer) as Hex.Hex return Secp256k1.sign({ payload: digest, privateKey }) } diff --git a/packages/wallet/core/src/state/local/indexed-db.ts b/packages/wallet/core/src/state/local/indexed-db.ts index 98a43743c..eeb5cd346 100644 --- a/packages/wallet/core/src/state/local/indexed-db.ts +++ b/packages/wallet/core/src/state/local/indexed-db.ts @@ -1,5 +1,6 @@ import { Context, Payload, Signature, Config, GenericTree } from '@0xsequence/wallet-primitives' import { Address, Hex } from 'ox' +import type { CoreEnv } from '../../env.js' import { Store } from './index.js' const DB_VERSION = 1 @@ -16,15 +17,27 @@ export class IndexedDbStore implements Store { private _db: IDBDatabase | null = null private dbName: string - constructor(dbName: string = 'sequence-indexeddb') { + constructor( + dbName: string = 'sequence-indexeddb', + private readonly env?: CoreEnv, + ) { this.dbName = dbName } + private getIndexedDB(): IDBFactory { + const globalObj = globalThis as any + const indexedDb = this.env?.indexedDB ?? globalObj.indexedDB ?? globalObj.window?.indexedDB + if (!indexedDb) { + throw new Error('indexedDB is not available') + } + return indexedDb + } + private async openDB(): Promise { if (this._db) return this._db return new Promise((resolve, reject) => { - const request = indexedDB.open(this.dbName, DB_VERSION) + const request = this.getIndexedDB().open(this.dbName, DB_VERSION) request.onupgradeneeded = () => { const db = request.result diff --git a/packages/wallet/core/src/state/remote/dev-http.ts b/packages/wallet/core/src/state/remote/dev-http.ts index d7fe0f492..357263711 100644 --- a/packages/wallet/core/src/state/remote/dev-http.ts +++ b/packages/wallet/core/src/state/remote/dev-http.ts @@ -4,10 +4,16 @@ import { Provider } from '../index.js' export class DevHttpProvider implements Provider { private readonly baseUrl: string + private readonly fetcher: typeof fetch - constructor(baseUrl: string) { + constructor(baseUrl: string, fetcher?: typeof fetch) { // Remove trailing slash if present this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl + const resolvedFetch = fetcher ?? (globalThis as any).fetch + if (!resolvedFetch) { + throw new Error('fetch is not available') + } + this.fetcher = resolvedFetch } private async request(method: 'GET' | 'POST', path: string, body?: any): Promise { @@ -24,7 +30,7 @@ export class DevHttpProvider implements Provider { let response: Response try { - response = await fetch(url, options) + response = await this.fetcher(url, options) } catch (networkError) { // Handle immediate network errors (e.g., DNS resolution failure, refused connection) console.error(`Network error during ${method} request to ${url}:`, networkError) diff --git a/packages/wallet/core/src/state/sequence/index.ts b/packages/wallet/core/src/state/sequence/index.ts index 3712f2aa5..a016e640d 100644 --- a/packages/wallet/core/src/state/sequence/index.ts +++ b/packages/wallet/core/src/state/sequence/index.ts @@ -9,13 +9,17 @@ import { TransactionRequest, } from 'ox' import { normalizeAddressKeys, Provider as ProviderInterface } from '../index.js' -import { Sessions, SignatureType } from './sessions.gen.js' +import { Sessions, SignatureType, type Fetch } from './sessions.gen.js' export class Provider implements ProviderInterface { private readonly service: Sessions - constructor(host = 'https://keymachine.sequence.app') { - this.service = new Sessions(host, fetch) + constructor(host = 'https://keymachine.sequence.app', fetcher?: Fetch) { + const resolvedFetch = fetcher ?? (globalThis as any).fetch + if (!resolvedFetch) { + throw new Error('fetch is not available') + } + this.service = new Sessions(host, resolvedFetch) } async getConfiguration(imageHash: Hex.Hex): Promise { diff --git a/packages/wallet/wdk/src/dbs/auth-keys.ts b/packages/wallet/wdk/src/dbs/auth-keys.ts index 56cf1ddf9..4f851f0b3 100644 --- a/packages/wallet/wdk/src/dbs/auth-keys.ts +++ b/packages/wallet/wdk/src/dbs/auth-keys.ts @@ -1,5 +1,6 @@ import { Generic, Migration } from './generic.js' import { IDBPDatabase, IDBPTransaction } from 'idb' +import type { WdkEnv } from '../env.js' const TABLE_NAME = 'auth-keys' @@ -11,9 +12,12 @@ export type AuthKey = { } export class AuthKeys extends Generic { - private expirationTimers = new Map() + private expirationTimers = new Map>() - constructor(dbName: string = 'sequence-auth-keys') { + constructor( + dbName: string = 'sequence-auth-keys', + private readonly env?: WdkEnv, + ) { super(dbName, TABLE_NAME, 'address', [ ( db: IDBPDatabase, @@ -64,7 +68,10 @@ export class AuthKeys extends Generic { if (result !== undefined) { return result } else if (attempt < 2) { - await new Promise((resolve) => setTimeout(resolve, 50)) + const setTimeoutFn = this.env?.timers?.setTimeout ?? (globalThis as any).setTimeout + if (setTimeoutFn) { + await new Promise((resolve) => setTimeoutFn(resolve, 50)) + } return this.getBySigner(signer, attempt + 1) } else { try { @@ -108,7 +115,11 @@ export class AuthKeys extends Generic { await this.del(authKey.address.toLowerCase()) return } - const timer = window.setTimeout(() => { + const setTimeoutFn = this.env?.timers?.setTimeout ?? (globalThis as any).setTimeout + if (!setTimeoutFn) { + return + } + const timer = setTimeoutFn(() => { console.log('removing expired auth key', authKey) this.del(authKey.address.toLowerCase()) }, delay) @@ -118,7 +129,10 @@ export class AuthKeys extends Generic { private clearExpiration(address: string): void { const timer = this.expirationTimers.get(address.toLowerCase()) if (timer) { - window.clearTimeout(timer) + const clearTimeoutFn = this.env?.timers?.clearTimeout ?? (globalThis as any).clearTimeout + if (clearTimeoutFn) { + clearTimeoutFn(timer) + } this.expirationTimers.delete(address.toLowerCase()) } } diff --git a/packages/wallet/wdk/src/env.ts b/packages/wallet/wdk/src/env.ts new file mode 100644 index 000000000..4e3cecb1a --- /dev/null +++ b/packages/wallet/wdk/src/env.ts @@ -0,0 +1,58 @@ +import type { CoreEnv } from '@0xsequence/wallet-core' +import { resolveCoreEnv } from '@0xsequence/wallet-core' + +export type TimersLike = { + setTimeout: typeof setTimeout + clearTimeout: typeof clearTimeout + setInterval: typeof setInterval + clearInterval: typeof clearInterval +} + +export type LockManagerLike = { + request: (name: string, callback: (lock: Lock | null) => Promise | void) => Promise +} + +export type NavigationLike = { + getPathname: () => string + redirect: (url: string) => void +} + +export type WdkEnv = CoreEnv & { + timers?: TimersLike + locks?: LockManagerLike + navigation?: NavigationLike + urlSearchParams?: typeof URLSearchParams +} + +export function resolveWdkEnv(env?: WdkEnv): WdkEnv { + const core = resolveCoreEnv(env) + const globalObj = globalThis as any + const windowObj = typeof window !== 'undefined' ? window : (globalObj.window ?? {}) + const location = windowObj.location ?? globalObj.location + + return { + ...core, + timers: + env?.timers ?? + (typeof globalObj.setTimeout === 'function' + ? { + setTimeout: globalObj.setTimeout.bind(globalObj), + clearTimeout: globalObj.clearTimeout.bind(globalObj), + setInterval: globalObj.setInterval.bind(globalObj), + clearInterval: globalObj.clearInterval.bind(globalObj), + } + : undefined), + locks: env?.locks ?? globalObj.navigator?.locks ?? windowObj.navigator?.locks, + navigation: + env?.navigation ?? + (location + ? { + getPathname: () => location.pathname, + redirect: (url: string) => { + location.href = url + }, + } + : undefined), + urlSearchParams: env?.urlSearchParams ?? globalObj.URLSearchParams ?? windowObj.URLSearchParams, + } +} diff --git a/packages/wallet/wdk/src/identity/signer.ts b/packages/wallet/wdk/src/identity/signer.ts index fdc53ca41..0bd7162c9 100644 --- a/packages/wallet/wdk/src/identity/signer.ts +++ b/packages/wallet/wdk/src/identity/signer.ts @@ -1,17 +1,22 @@ import { Address, Signature, Hex, Bytes, PersonalMessage } from 'ox' -import { Signers, State } from '@0xsequence/wallet-core' +import { Signers, State, type CryptoLike } from '@0xsequence/wallet-core' import { IdentityInstrument, KeyType } from '@0xsequence/identity-instrument' import { AuthKey } from '../dbs/auth-keys.js' import { Payload, Signature as SequenceSignature } from '@0xsequence/wallet-primitives' import * as Identity from '@0xsequence/identity-instrument' -export function toIdentityAuthKey(authKey: AuthKey): Identity.AuthKey { +export function toIdentityAuthKey(authKey: AuthKey, crypto?: CryptoLike): Identity.AuthKey { + const globalObj = globalThis as any + const resolvedCrypto = crypto ?? globalObj.window?.crypto ?? globalObj.crypto + if (!resolvedCrypto?.subtle) { + throw new Error('crypto.subtle is not available') + } return { address: authKey.address, keyType: Identity.KeyType.WebCrypto_Secp256r1, signer: authKey.identitySigner, async sign(digest: Bytes.Bytes) { - const authKeySignature = await window.crypto.subtle.sign( + const authKeySignature = await resolvedCrypto.subtle.sign( { name: 'ECDSA', hash: 'SHA-256', @@ -28,6 +33,7 @@ export class IdentitySigner implements Signers.Signer { constructor( readonly identityInstrument: IdentityInstrument, readonly authKey: AuthKey, + private readonly crypto?: CryptoLike, ) {} get address(): Address.Address { @@ -47,7 +53,7 @@ export class IdentitySigner implements Signers.Signer { } async signDigest(digest: Bytes.Bytes): Promise { - const sigHex = await this.identityInstrument.sign(toIdentityAuthKey(this.authKey), digest) + const sigHex = await this.identityInstrument.sign(toIdentityAuthKey(this.authKey, this.crypto), digest) const sig = Signature.fromHex(sigHex) return { type: 'hash', diff --git a/packages/wallet/wdk/src/index.ts b/packages/wallet/wdk/src/index.ts index 973ec785a..003abdd72 100644 --- a/packages/wallet/wdk/src/index.ts +++ b/packages/wallet/wdk/src/index.ts @@ -1,2 +1,3 @@ export * as Identity from './identity/signer.js' export * as Sequence from './sequence/index.js' +export * from './env.js' diff --git a/packages/wallet/wdk/src/sequence/cron.ts b/packages/wallet/wdk/src/sequence/cron.ts index a1640a7cf..f95117109 100644 --- a/packages/wallet/wdk/src/sequence/cron.ts +++ b/packages/wallet/wdk/src/sequence/cron.ts @@ -17,12 +17,14 @@ export class Cron { private readonly STORAGE_KEY = 'sequence-cron-jobs' private isStopping: boolean = false private currentCheckJobsPromise: Promise = Promise.resolve() + private readonly env: Shared['env'] /** * Initializes the Cron scheduler and starts the periodic job checker. * @param shared Shared context for modules and logging. */ constructor(private readonly shared: Shared) { + this.env = shared.env this.start() } @@ -33,7 +35,11 @@ export class Cron { private start() { if (this.isStopping) return this.executeCheckJobsChain() - this.checkInterval = setInterval(() => this.executeCheckJobsChain(), 60 * 1000) + const setIntervalFn = this.env.timers?.setInterval ?? (globalThis as any).setInterval + if (!setIntervalFn) { + return + } + this.checkInterval = setIntervalFn(() => this.executeCheckJobsChain(), 60 * 1000) } /** @@ -58,7 +64,10 @@ export class Cron { this.isStopping = true if (this.checkInterval) { - clearInterval(this.checkInterval) + const clearIntervalFn = this.env.timers?.clearInterval ?? (globalThis as any).clearInterval + if (clearIntervalFn) { + clearIntervalFn(this.checkInterval) + } this.checkInterval = undefined this.shared.modules.logger.log('Cron: Interval cleared.') } @@ -104,48 +113,22 @@ export class Cron { } try { - await navigator.locks.request('sequence-cron-jobs', async (lock: Lock | null) => { - if (this.isStopping) { - return - } - if (!lock) { - return - } - - const now = Date.now() - const storage = await this.getStorageState() - - for (const [id, job] of this.jobs) { + const locks = this.env.locks ?? (globalThis as any).navigator?.locks + if (locks?.request) { + await locks.request('sequence-cron-jobs', async (lock: Lock | null) => { if (this.isStopping) { - break + return } - - const lastRun = storage.get(id)?.lastRun ?? job.lastRun - const timeSinceLastRun = now - lastRun - - if (timeSinceLastRun >= job.interval) { - try { - await job.handler() - if (!this.isStopping) { - job.lastRun = now - storage.set(id, { lastRun: now }) - } - } catch (error) { - if (error instanceof DOMException && error.name === 'AbortError') { - this.shared.modules.logger.log(`Cron: Job ${id} was aborted.`) - } else { - console.error(`Cron job ${id} failed:`, error) - } - } + if (!lock) { + return } - } - - if (!this.isStopping) { - await this.syncWithStorage() - } - }) + await this.runJobs() + }) + } else { + await this.runJobs() + } } catch (error) { - if (error instanceof DOMException && error.name === 'AbortError') { + if (this.isAbortError(error)) { this.shared.modules.logger.log('Cron: navigator.locks.request was aborted.') } else { console.error('Cron: Error in navigator.locks.request:', error) @@ -153,13 +136,51 @@ export class Cron { } } + private async runJobs(): Promise { + const now = Date.now() + const storage = await this.getStorageState() + + for (const [id, job] of this.jobs) { + if (this.isStopping) { + break + } + + const lastRun = storage.get(id)?.lastRun ?? job.lastRun + const timeSinceLastRun = now - lastRun + + if (timeSinceLastRun >= job.interval) { + try { + await job.handler() + if (!this.isStopping) { + job.lastRun = now + storage.set(id, { lastRun: now }) + } + } catch (error) { + if (this.isAbortError(error)) { + this.shared.modules.logger.log(`Cron: Job ${id} was aborted.`) + } else { + console.error(`Cron job ${id} failed:`, error) + } + } + } + } + + if (!this.isStopping) { + await this.syncWithStorage() + } + } + /** * Loads the persisted last run times for jobs from localStorage. * @returns Map of job IDs to their last run times. */ private async getStorageState(): Promise> { if (this.isStopping) return new Map() - const state = localStorage.getItem(this.STORAGE_KEY) + const storage = this.env.storage + if (!storage) { + return new Map() + } + const state = storage.getItem(this.STORAGE_KEY) return new Map(state ? JSON.parse(state) : []) } @@ -168,7 +189,19 @@ export class Cron { */ private async syncWithStorage() { if (this.isStopping) return + const storage = this.env.storage + if (!storage) { + return + } const state = Array.from(this.jobs.entries()).map(([id, job]) => [id, { lastRun: job.lastRun }]) - localStorage.setItem(this.STORAGE_KEY, JSON.stringify(state)) + storage.setItem(this.STORAGE_KEY, JSON.stringify(state)) + } + + private isAbortError(error: unknown): boolean { + const domException = (globalThis as any).DOMException + if (domException && error instanceof domException) { + return (error as DOMException).name === 'AbortError' + } + return (error as any)?.name === 'AbortError' } } diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts index 0b4706c0e..94d456d3e 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts @@ -5,6 +5,7 @@ import { Signatures } from '../signatures.js' import * as Identity from '@0xsequence/identity-instrument' import { IdentitySigner } from '../../identity/signer.js' import { AuthCodeHandler } from './authcode.js' +import type { WdkEnv } from '../../env.js' export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { constructor( @@ -16,8 +17,9 @@ export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { signatures: Signatures, commitments: Db.AuthCommitments, authKeys: Db.AuthKeys, + env?: WdkEnv, ) { - super(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys) + super(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys, env) } public async commitAuth(target: string, isSignUp: boolean, state?: string, signer?: string) { @@ -40,7 +42,7 @@ export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { isSignUp, }) - const searchParams = new URLSearchParams({ + const searchParams = this.serializeQuery({ code_challenge: codeChallenge, code_challenge_method: 'S256', client_id: this.audience, @@ -51,7 +53,7 @@ export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { state, }) - return `${this.oauthUrl}?${searchParams.toString()}` + return `${this.oauthUrl}?${searchParams}` } public async completeAuth( diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode.ts b/packages/wallet/wdk/src/sequence/handlers/authcode.ts index 74ad9ee93..8e98745e8 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode.ts @@ -6,6 +6,7 @@ import * as Identity from '@0xsequence/identity-instrument' import { SignerUnavailable, SignerReady, SignerActionable, BaseSignatureRequest } from '../types/signature-request.js' import { IdentitySigner } from '../../identity/signer.js' import { IdentityHandler } from './identity.js' +import type { NavigationLike, WdkEnv } from '../../env.js' export class AuthCodeHandler extends IdentityHandler implements Handler { protected redirectUri: string = '' @@ -19,8 +20,9 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { signatures: Signatures, protected readonly commitments: Db.AuthCommitments, authKeys: Db.AuthKeys, + env?: WdkEnv, ) { - super(nitro, authKeys, signatures, Identity.IdentityType.OIDC) + super(nitro, authKeys, signatures, Identity.IdentityType.OIDC, env) } public get kind() { @@ -45,7 +47,7 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { isSignUp, }) - const searchParams = new URLSearchParams({ + const searchParams = this.serializeQuery({ client_id: this.audience, redirect_uri: this.redirectUri, response_type: 'code', @@ -53,7 +55,7 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { ...(this.signupKind === 'apple' ? {} : { scope: 'openid profile email' }), }) - return `${this.oauthUrl}?${searchParams.toString()}` + return `${this.oauthUrl}?${searchParams}` } public async completeAuth( @@ -94,10 +96,29 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { status: 'actionable', message: 'request-redirect', handle: async () => { - const url = await this.commitAuth(window.location.pathname, false, request.id, address) - window.location.href = url + const navigation = this.getNavigation() + const url = await this.commitAuth(navigation.getPathname(), false, request.id, address) + navigation.redirect(url) return true }, } } + + protected serializeQuery(params: Record): string { + const searchParamsCtor = this.env.urlSearchParams ?? (globalThis as any).URLSearchParams + if (searchParamsCtor) { + return new searchParamsCtor(params).toString() + } + return Object.entries(params) + .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`) + .join('&') + } + + private getNavigation(): NavigationLike { + const navigation = this.env.navigation + if (!navigation) { + throw new Error('navigation is not available') + } + return navigation + } } diff --git a/packages/wallet/wdk/src/sequence/handlers/identity.ts b/packages/wallet/wdk/src/sequence/handlers/identity.ts index f18245222..815c4d385 100644 --- a/packages/wallet/wdk/src/sequence/handlers/identity.ts +++ b/packages/wallet/wdk/src/sequence/handlers/identity.ts @@ -4,6 +4,7 @@ import * as Identity from '@0xsequence/identity-instrument' import { Signatures } from '../signatures.js' import { BaseSignatureRequest } from '../types/signature-request.js' import { IdentitySigner, toIdentityAuthKey } from '../../identity/signer.js' +import { resolveWdkEnv, type WdkEnv } from '../../env.js' export const identityTypeToHex = (identityType?: Identity.IdentityType): Hex.Hex => { // Bytes4 @@ -19,12 +20,17 @@ export const identityTypeToHex = (identityType?: Identity.IdentityType): Hex.Hex } export class IdentityHandler { + protected readonly env: WdkEnv + constructor( private readonly nitro: Identity.IdentityInstrument, private readonly authKeys: Db.AuthKeys, private readonly signatures: Signatures, public readonly identityType: Identity.IdentityType, - ) {} + env?: WdkEnv, + ) { + this.env = resolveWdkEnv(env) + } public onStatusChange(cb: () => void): () => void { return this.authKeys.addListener(cb) @@ -37,7 +43,7 @@ export class IdentityHandler { throw new Error('no-auth-key') } - const res = await this.nitro.commitVerifier(toIdentityAuthKey(authKey), challenge) + const res = await this.nitro.commitVerifier(toIdentityAuthKey(authKey, this.env.crypto), challenge) return res } @@ -47,7 +53,7 @@ export class IdentityHandler { throw new Error('no-auth-key') } - const res = await this.nitro.completeAuth(toIdentityAuthKey(authKey), challenge) + const res = await this.nitro.completeAuth(toIdentityAuthKey(authKey, this.env.crypto), challenge) authKey.identitySigner = res.signer.address authKey.expiresAt = new Date(Date.now() + 1000 * 60 * 3) // 3 minutes @@ -55,7 +61,7 @@ export class IdentityHandler { await this.authKeys.delBySigner(authKey.identitySigner) await this.authKeys.set(authKey) - const signer = new IdentitySigner(this.nitro, authKey) + const signer = new IdentitySigner(this.nitro, authKey, this.env.crypto) return { signer, email: res.identity.email } } @@ -72,13 +78,17 @@ export class IdentityHandler { if (!authKey) { return undefined } - return new IdentitySigner(this.nitro, authKey) + return new IdentitySigner(this.nitro, authKey, this.env.crypto) } private async getAuthKey(signer: string): Promise { let authKey = await this.authKeys.getBySigner(signer) if (!signer && !authKey) { - const keyPair = await window.crypto.subtle.generateKey( + const crypto = this.env.crypto ?? (globalThis as any).crypto + if (!crypto?.subtle) { + throw new Error('crypto.subtle is not available') + } + const keyPair = await crypto.subtle.generateKey( { name: 'ECDSA', namedCurve: 'P-256', @@ -86,7 +96,7 @@ export class IdentityHandler { false, ['sign', 'verify'], ) - const publicKey = await window.crypto.subtle.exportKey('raw', keyPair.publicKey) + const publicKey = await crypto.subtle.exportKey('raw', keyPair.publicKey) authKey = { address: Hex.fromBytes(new Uint8Array(publicKey)), identitySigner: '', diff --git a/packages/wallet/wdk/src/sequence/handlers/otp.ts b/packages/wallet/wdk/src/sequence/handlers/otp.ts index f037189cb..a4e7b750b 100644 --- a/packages/wallet/wdk/src/sequence/handlers/otp.ts +++ b/packages/wallet/wdk/src/sequence/handlers/otp.ts @@ -8,6 +8,7 @@ import { SignerUnavailable, SignerReady, SignerActionable, BaseSignatureRequest import { Kinds } from '../types/signer.js' import { IdentityHandler } from './identity.js' import { AnswerIncorrectError, ChallengeExpiredError, TooManyAttemptsError } from '../errors.js' +import type { WdkEnv } from '../../env.js' type RespondFn = (otp: string) => Promise @@ -18,8 +19,8 @@ export class OtpHandler extends IdentityHandler implements Handler { private onPromptOtp: undefined | PromptOtpHandler - constructor(nitro: Identity.IdentityInstrument, signatures: Signatures, authKeys: Db.AuthKeys) { - super(nitro, authKeys, signatures, Identity.IdentityType.Email) + constructor(nitro: Identity.IdentityInstrument, signatures: Signatures, authKeys: Db.AuthKeys, env?: WdkEnv) { + super(nitro, authKeys, signatures, Identity.IdentityType.Email, env) } public registerUI(onPromptOtp: PromptOtpHandler) { diff --git a/packages/wallet/wdk/src/sequence/handlers/passkeys.ts b/packages/wallet/wdk/src/sequence/handlers/passkeys.ts index da3db7ff3..7f1e5050a 100644 --- a/packages/wallet/wdk/src/sequence/handlers/passkeys.ts +++ b/packages/wallet/wdk/src/sequence/handlers/passkeys.ts @@ -1,33 +1,35 @@ -import { Signers, State } from '@0xsequence/wallet-core' +import { State } from '@0xsequence/wallet-core' import { Address, Hex } from 'ox' import { Kinds } from '../types/signer.js' import { Signatures } from '../signatures.js' -import { Extensions } from '@0xsequence/wallet-primitives' +import { Config, Extensions } from '@0xsequence/wallet-primitives' import { Handler } from './handler.js' import { SignerActionable, SignerUnavailable, BaseSignatureRequest } from '../types/index.js' +import type { PasskeyProvider, PasskeySigner } from '../passkeys-provider.js' export class PasskeysHandler implements Handler { kind = Kinds.LoginPasskey - private readySigners = new Map() + private readySigners = new Map() constructor( private readonly signatures: Signatures, private readonly extensions: Pick, private readonly stateReader: State.Reader, + private readonly passkeyProvider: PasskeyProvider, ) {} onStatusChange(cb: () => void): () => void { return () => {} } - public addReadySigner(signer: Signers.Passkey.Passkey) { + public addReadySigner(signer: PasskeySigner) { // Use credentialId as key to match specific passkey instances this.readySigners.set(signer.credentialId, signer) } - private async loadPasskey(wallet: Address.Address, imageHash: Hex.Hex): Promise { + private async loadPasskey(wallet: Address.Address, imageHash: Hex.Hex): Promise { try { - return await Signers.Passkey.Passkey.loadFromWitness(this.stateReader, this.extensions, wallet, imageHash) + return await this.passkeyProvider.loadFromWitness(this.stateReader, this.extensions, wallet, imageHash) } catch (e) { console.warn('Failed to load passkey:', e) return undefined @@ -55,7 +57,7 @@ export class PasskeysHandler implements Handler { } // First check if we have a ready signer that matches the imageHash - let passkey: Signers.Passkey.Passkey | undefined + let passkey: PasskeySigner | undefined // Look for a ready signer with matching imageHash for (const readySigner of this.readySigners.values()) { @@ -91,12 +93,10 @@ export class PasskeysHandler implements Handler { message: 'request-interaction-with-passkey', imageHash: imageHash, handle: async () => { - const signature = await passkey.signSapient( - request.envelope.wallet, - request.envelope.chainId, - request.envelope.payload, - imageHash, + const normalized = Config.normalizeSignerSignature( + passkey.signSapient(request.envelope.wallet, request.envelope.chainId, request.envelope.payload, imageHash), ) + const signature = await normalized.signature await this.signatures.addSignature(request.id, { address, imageHash, diff --git a/packages/wallet/wdk/src/sequence/index.ts b/packages/wallet/wdk/src/sequence/index.ts index 37729a477..ed2f9e440 100644 --- a/packages/wallet/wdk/src/sequence/index.ts +++ b/packages/wallet/wdk/src/sequence/index.ts @@ -3,6 +3,8 @@ export { Network as Networks } export type { ManagerOptions, Databases, Sequence, Modules, Shared } from './manager.js' export { ManagerOptionsDefaults, CreateWalletOptionsDefaults, applyManagerOptionsDefaults, Manager } from './manager.js' +export { defaultPasskeyProvider } from './passkeys-provider.js' +export type { PasskeyProvider, PasskeySigner } from './passkeys-provider.js' export { Sessions } from './sessions.js' export { Signatures } from './signatures.js' export type { diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index ba27116cf..80ca1653c 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -5,6 +5,7 @@ import { createAttestationVerifyingFetch } from '@0xsequence/tee-verifier' import { Config, Constants, Context, Extensions, Network } from '@0xsequence/wallet-primitives' import { Address } from 'ox' import * as Db from '../dbs/index.js' +import { resolveWdkEnv, type WdkEnv } from '../env.js' import { Cron } from './cron.js' import { Devices } from './devices.js' import { Guards, GuardRole } from './guards.js' @@ -31,6 +32,7 @@ import { GuardHandler, PromptCodeHandler } from './handlers/guard.js' import { PasskeyCredential } from '../dbs/index.js' import { PromptMnemonicHandler } from './handlers/mnemonic.js' import { PromptOtpHandler } from './handlers/otp.js' +import { defaultPasskeyProvider, type PasskeyProvider } from './passkeys-provider.js' export type ManagerOptions = { verbose?: boolean @@ -52,6 +54,9 @@ export type ManagerOptions = { dbPruningInterval?: number + env?: WdkEnv + passkeyProvider?: PasskeyProvider + stateProvider?: State.Provider networks?: Network.Network[] relayers?: Relayer.Relayer[] | (() => Relayer.Relayer[]) @@ -70,7 +75,7 @@ export type ManagerOptions = { identity?: { url?: string - fetch?: typeof window.fetch + fetch?: typeof fetch verifyAttestation?: boolean expectedPcr0?: string[] scope?: string @@ -95,6 +100,72 @@ export type ManagerOptions = { } } +export type ResolvedIdentityOptions = { + url: string + fetch?: typeof fetch + verifyAttestation: boolean + expectedPcr0?: string[] + scope?: string + email: { + enabled: boolean + } + google: { + enabled: boolean + clientId: string + } + apple: { + enabled: boolean + clientId: string + } + customProviders?: { + kind: `custom-${string}` + authMethod: 'id-token' | 'authcode' | 'authcode-pkce' + issuer: string + oauthUrl: string + clientId: string + }[] +} + +export type ResolvedManagerOptions = { + verbose: boolean + + extensions: Extensions.Extensions + context: Context.Context + context4337: Context.Context + guest: Address.Address + + encryptedPksDb: CoreSigners.Pk.Encrypted.EncryptedPksDb + managerDb: Db.Wallets + transactionsDb: Db.Transactions + signaturesDb: Db.Signatures + messagesDb: Db.Messages + authCommitmentsDb: Db.AuthCommitments + authKeysDb: Db.AuthKeys + recoveryDb: Db.Recovery + passkeyCredentialsDb: Db.PasskeyCredentials + + dbPruningInterval: number + + env: WdkEnv + passkeyProvider: PasskeyProvider + + stateProvider: State.Provider + networks: Network.Network[] + relayers: Relayer.Relayer[] | (() => Relayer.Relayer[]) + bundlers: Bundler.Bundler[] + guardUrl: string + guardAddresses: Record + + nonWitnessableSigners: Address.Address[] + + defaultGuardTopology: Config.Topology + defaultRecoverySettings: RecoverySettings + + multiInjectedProviderDiscovery: boolean + + identity: ResolvedIdentityOptions +} + export const ManagerOptionsDefaults = { verbose: false, @@ -115,7 +186,9 @@ export const ManagerOptionsDefaults = { dbPruningInterval: 1000 * 60 * 60 * 24, // 24 hours - stateProvider: new State.Sequence.Provider(), + passkeyProvider: defaultPasskeyProvider, + + stateProvider: typeof fetch !== 'undefined' ? new State.Sequence.Provider(undefined, fetch) : undefined, networks: Network.ALL, relayers: () => { if (typeof window !== 'undefined') { @@ -186,13 +259,45 @@ export const CreateWalletOptionsDefaults = { useGuard: false, } -export function applyManagerOptionsDefaults(options?: ManagerOptions) { - const merged = { - ...ManagerOptionsDefaults, - ...options, - identity: { ...ManagerOptionsDefaults.identity, ...options?.identity }, +export function applyManagerOptionsDefaults(options?: ManagerOptions): ResolvedManagerOptions { + const env = resolveWdkEnv(options?.env) + + const identity: ResolvedIdentityOptions = { + ...ManagerOptionsDefaults.identity, + ...options?.identity, + email: { ...ManagerOptionsDefaults.identity.email, ...options?.identity?.email }, + google: { ...ManagerOptionsDefaults.identity.google, ...options?.identity?.google }, + apple: { ...ManagerOptionsDefaults.identity.apple, ...options?.identity?.apple }, + } + + if (!identity.fetch && env.fetch) { + identity.fetch = env.fetch + } + + let encryptedPksDb = options?.encryptedPksDb ?? ManagerOptionsDefaults.encryptedPksDb + if (!options?.encryptedPksDb && options?.env) { + encryptedPksDb = new CoreSigners.Pk.Encrypted.EncryptedPksDb(undefined, undefined, env) + } + + let authKeysDb = options?.authKeysDb ?? ManagerOptionsDefaults.authKeysDb + if (!options?.authKeysDb && options?.env) { + authKeysDb = new Db.AuthKeys(undefined, env) } + let stateProvider = options?.stateProvider ?? ManagerOptionsDefaults.stateProvider + if (!options?.stateProvider && options?.env?.fetch) { + stateProvider = new State.Sequence.Provider(undefined, options.env.fetch) + } else if (!stateProvider && env.fetch) { + stateProvider = new State.Sequence.Provider(undefined, env.fetch) + } + + if (!stateProvider) { + throw new Error('stateProvider is required. Provide ManagerOptions.stateProvider or env.fetch') + } + + const extensions = options?.extensions ?? ManagerOptionsDefaults.extensions + const defaultGuardTopology = options?.defaultGuardTopology ?? ManagerOptionsDefaults.defaultGuardTopology + // Merge and normalize non-witnessable signers. // We always include the sessions extension address for the active extensions set. const nonWitnessable = new Set() @@ -202,12 +307,12 @@ export function applyManagerOptionsDefaults(options?: ManagerOptions) { for (const address of options?.nonWitnessableSigners ?? []) { nonWitnessable.add(address.toLowerCase()) } - nonWitnessable.add(merged.extensions.sessions.toLowerCase()) + nonWitnessable.add(extensions.sessions.toLowerCase()) // Include static signer leaves from the guard topology (e.g. recovery guard signer), // but ignore the placeholder address that is later replaced per-role. - if (merged.defaultGuardTopology) { - const guardTopologySigners = Config.getSigners(merged.defaultGuardTopology) + if (defaultGuardTopology) { + const guardTopologySigners = Config.getSigners(defaultGuardTopology) for (const signer of guardTopologySigners.signers) { if (Address.isEqual(signer, Constants.PlaceholderAddress)) { continue @@ -219,9 +324,46 @@ export function applyManagerOptionsDefaults(options?: ManagerOptions) { } } - merged.nonWitnessableSigners = Array.from(nonWitnessable) as Address.Address[] + return { + verbose: options?.verbose ?? ManagerOptionsDefaults.verbose, - return merged + extensions, + context: options?.context ?? ManagerOptionsDefaults.context, + context4337: options?.context4337 ?? ManagerOptionsDefaults.context4337, + guest: options?.guest ?? ManagerOptionsDefaults.guest, + + encryptedPksDb, + managerDb: options?.managerDb ?? ManagerOptionsDefaults.managerDb, + transactionsDb: options?.transactionsDb ?? ManagerOptionsDefaults.transactionsDb, + signaturesDb: options?.signaturesDb ?? ManagerOptionsDefaults.signaturesDb, + messagesDb: options?.messagesDb ?? ManagerOptionsDefaults.messagesDb, + authCommitmentsDb: options?.authCommitmentsDb ?? ManagerOptionsDefaults.authCommitmentsDb, + recoveryDb: options?.recoveryDb ?? ManagerOptionsDefaults.recoveryDb, + authKeysDb, + passkeyCredentialsDb: options?.passkeyCredentialsDb ?? ManagerOptionsDefaults.passkeyCredentialsDb, + + dbPruningInterval: options?.dbPruningInterval ?? ManagerOptionsDefaults.dbPruningInterval, + + env, + passkeyProvider: options?.passkeyProvider ?? ManagerOptionsDefaults.passkeyProvider, + + stateProvider, + networks: options?.networks ?? ManagerOptionsDefaults.networks, + relayers: options?.relayers ?? ManagerOptionsDefaults.relayers, + bundlers: options?.bundlers ?? ManagerOptionsDefaults.bundlers, + guardUrl: options?.guardUrl ?? ManagerOptionsDefaults.guardUrl, + guardAddresses: options?.guardAddresses ?? ManagerOptionsDefaults.guardAddresses, + + nonWitnessableSigners: Array.from(nonWitnessable) as Address.Address[], + + defaultGuardTopology, + defaultRecoverySettings: options?.defaultRecoverySettings ?? ManagerOptionsDefaults.defaultRecoverySettings, + + multiInjectedProviderDiscovery: + options?.multiInjectedProviderDiscovery ?? ManagerOptionsDefaults.multiInjectedProviderDiscovery, + + identity, + } } export type RecoverySettings = { @@ -283,6 +425,8 @@ export type Shared = { readonly sequence: Sequence readonly databases: Databases + readonly env: WdkEnv + readonly passkeyProvider: PasskeyProvider readonly handlers: Map @@ -469,6 +613,9 @@ export class Manager { pruningInterval: ops.dbPruningInterval, }, + env: ops.env, + passkeyProvider: ops.passkeyProvider, + modules: {} as any, handlers: new Map(), } @@ -501,6 +648,7 @@ export class Manager { modules.signatures, shared.sequence.extensions, shared.sequence.stateProvider, + shared.passkeyProvider, ) shared.handlers.set(Kinds.LoginPasskey, this.passkeysHandler) @@ -523,7 +671,7 @@ export class Manager { const identityInstrument = new IdentityInstrument(ops.identity.url, ops.identity.scope, verifyingFetch) if (ops.identity.email?.enabled) { - this.otpHandler = new OtpHandler(identityInstrument, modules.signatures, shared.databases.authKeys) + this.otpHandler = new OtpHandler(identityInstrument, modules.signatures, shared.databases.authKeys, shared.env) shared.handlers.set(Kinds.LoginEmailOtp, this.otpHandler) } if (ops.identity.google?.enabled) { @@ -538,6 +686,7 @@ export class Manager { modules.signatures, shared.databases.authCommitments, shared.databases.authKeys, + shared.env, ), ) } @@ -553,6 +702,7 @@ export class Manager { modules.signatures, shared.databases.authCommitments, shared.databases.authKeys, + shared.env, ), ) } @@ -573,6 +723,7 @@ export class Manager { modules.signatures, shared.databases.authCommitments, shared.databases.authKeys, + shared.env, ), ) break @@ -588,6 +739,7 @@ export class Manager { modules.signatures, shared.databases.authCommitments, shared.databases.authKeys, + shared.env, ), ) break diff --git a/packages/wallet/wdk/src/sequence/passkeys-provider.ts b/packages/wallet/wdk/src/sequence/passkeys-provider.ts new file mode 100644 index 000000000..3ed2068fe --- /dev/null +++ b/packages/wallet/wdk/src/sequence/passkeys-provider.ts @@ -0,0 +1,55 @@ +import { Signers, State } from '@0xsequence/wallet-core' +import type { Extensions } from '@0xsequence/wallet-primitives' +import type { Address, Hex } from 'ox' + +export type PasskeySigner = Signers.SapientSigner & + Signers.Witnessable & { + credentialId: string + publicKey: Extensions.Passkeys.PublicKey + imageHash: Hex.Hex + } + +export type PasskeyProvider = { + create: ( + extensions: Pick, + options?: Signers.Passkey.CreatePasskeyOptions, + ) => Promise + find: ( + stateReader: State.Reader, + extensions: Pick, + options?: Signers.Passkey.FindPasskeyOptions, + ) => Promise + loadFromWitness: ( + stateReader: State.Reader, + extensions: Pick, + wallet: Address.Address, + imageHash: Hex.Hex, + options?: Signers.Passkey.FindPasskeyOptions, + ) => Promise + fromCredential: (args: { + credentialId: string + publicKey: Extensions.Passkeys.PublicKey + extensions: Pick + embedMetadata?: boolean + metadata?: Extensions.Passkeys.PasskeyMetadata + webauthn?: Signers.Passkey.WebAuthnLike + }) => PasskeySigner + isSigner?: (signer: unknown) => signer is PasskeySigner +} + +export const defaultPasskeyProvider: PasskeyProvider = { + create: (extensions, options) => Signers.Passkey.Passkey.create(extensions, options), + find: (stateReader, extensions, options) => Signers.Passkey.Passkey.find(stateReader, extensions, options), + loadFromWitness: (stateReader, extensions, wallet, imageHash, options) => + Signers.Passkey.Passkey.loadFromWitness(stateReader, extensions, wallet, imageHash, options), + fromCredential: ({ credentialId, publicKey, extensions, embedMetadata, metadata, webauthn }) => + new Signers.Passkey.Passkey({ + credentialId, + publicKey, + extensions, + embedMetadata, + metadata, + webauthn, + }), + isSigner: (signer: unknown): signer is PasskeySigner => signer instanceof Signers.Passkey.Passkey, +} diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index fd0320cc4..04fb9586a 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -12,6 +12,7 @@ import { Kinds, SignerWithKind, WitnessExtraSignerKind } from './types/signer.js import { Wallet, WalletSelectionUiHandler } from './types/wallet.js' import { PasskeysHandler } from './handlers/passkeys.js' import { GuardRole } from './guards.js' +import type { PasskeySigner } from './passkeys-provider.js' export type StartSignUpWithRedirectArgs = { kind: 'google-pkce' | 'apple' | `custom-${string}` @@ -626,7 +627,7 @@ export class Wallets implements WalletsInterface { }> { switch (args.kind) { case 'passkey': - const passkeySigner = await Signers.Passkey.Passkey.create(this.shared.sequence.extensions, { + const passkeySigner = await this.shared.passkeyProvider.create(this.shared.sequence.extensions, { stateProvider: this.shared.sequence.stateProvider, credentialName: args.name, }) @@ -891,7 +892,7 @@ export class Wallets implements WalletsInterface { } // Store passkey credential ID mapping if this is a passkey signup - if (args.kind === 'passkey' && loginSigner.signer instanceof Signers.Passkey.Passkey) { + if (args.kind === 'passkey' && this.isPasskeySigner(loginSigner.signer)) { try { await this.shared.databases.passkeyCredentials.saveCredential( loginSigner.signer.credentialId, @@ -1075,7 +1076,7 @@ export class Wallets implements WalletsInterface { } if (isLoginToPasskeyArgs(args)) { - let passkeySigner: Signers.Passkey.Passkey + let passkeySigner: PasskeySigner if (args.credentialId) { // Application-controlled login: use the provided credentialId @@ -1087,7 +1088,7 @@ export class Wallets implements WalletsInterface { } // Create passkey signer from stored credential - passkeySigner = new Signers.Passkey.Passkey({ + passkeySigner = this.shared.passkeyProvider.fromCredential({ credentialId: credential.credentialId, publicKey: credential.publicKey, extensions: this.shared.sequence.extensions, @@ -1098,7 +1099,7 @@ export class Wallets implements WalletsInterface { // Default discovery behavior: use WebAuthn discovery this.shared.modules.logger.log('No credentialId provided, using discovery method') - const foundPasskeySigner = await Signers.Passkey.Passkey.find( + const foundPasskeySigner = await this.shared.passkeyProvider.find( this.shared.sequence.stateProvider, this.shared.sequence.extensions, ) @@ -1153,6 +1154,20 @@ export class Wallets implements WalletsInterface { throw new Error('invalid-login-args') } + private isPasskeySigner(signer: unknown): signer is PasskeySigner { + const guard = this.shared.passkeyProvider.isSigner + if (guard) { + return guard(signer) + } + return ( + typeof signer === 'object' && + signer !== null && + 'credentialId' in signer && + 'publicKey' in signer && + 'imageHash' in signer + ) + } + async completeLogin(requestId: string) { const request = await this.shared.modules.signatures.get(requestId) From 3c1f13fb554d464976a693820c0c53efe167c78f Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Wed, 11 Feb 2026 18:30:40 +0100 Subject: [PATCH 078/144] Add Etherlink Shadownet Testnet --- packages/wallet/primitives/src/network.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index b0ef2bbde..97b7aee2c 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -105,6 +105,7 @@ export const ChainId = { // ETHERLINK ETHERLINK: 42793, ETHERLINK_TESTNET: 128123, + ETHERLINK_SHADOWNET_TESTNET = 127823, // MOONBEAM MOONBEAM: 1284, @@ -799,15 +800,15 @@ export const ALL: Network[] = [ }, }, { - chainId: ChainId.ETHERLINK_TESTNET, + chainId: ChainId.ETHERLINK_SHADOWNET_TESTNET, type: NetworkType.TESTNET, - name: 'etherlink-testnet', - title: 'Etherlink Testnet', - rpcUrl: getRpcUrl('etherlink-testnet'), - logoUrl: getLogoUrl(ChainId.ETHERLINK_TESTNET), + name: 'etherlink-shadownet-testnet', + title: 'Etherlink Shadownet Testnet', + rpcUrl: getRpcUrl('etherlink-shadownet-testnet'), + logoUrl: getLogoUrl(ChainId.ETHERLINK_SHADOWNET_TESTNET), blockExplorer: { - name: 'Etherlink Testnet Explorer', - url: 'https://testnet.explorer.etherlink.com/', + name: 'Etherlink Shadownet Testnet Explorer', + url: 'https://shadownet.explorer.etherlink.com/', }, nativeCurrency: { symbol: 'XTZ', From 49d8a2fd5b559e84ffedccb8effbf918f010b73d Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Wed, 11 Feb 2026 18:50:55 +0100 Subject: [PATCH 079/144] 3.0.0-beta.15 --- .changeset/brave-papayas-join.md | 18 ++++++++++++ .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/primitives/src/network.ts | 2 +- packages/wallet/wdk/CHANGELOG.md | 12 ++++++++ packages/wallet/wdk/package.json | 2 +- 31 files changed, 149 insertions(+), 29 deletions(-) create mode 100644 .changeset/brave-papayas-join.md diff --git a/.changeset/brave-papayas-join.md b/.changeset/brave-papayas-join.md new file mode 100644 index 000000000..bd37b6ba8 --- /dev/null +++ b/.changeset/brave-papayas-join.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +New chains, minor fixes diff --git a/.changeset/pre.json b/.changeset/pre.json index 6c2320499..23bcec1f7 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,25 +4,26 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.13", - "@0xsequence/builder": "3.0.0-beta.13", - "@0xsequence/guard": "3.0.0-beta.13", - "@0xsequence/identity-instrument": "3.0.0-beta.13", - "@0xsequence/indexer": "3.0.0-beta.13", - "@0xsequence/marketplace": "3.0.0-beta.13", - "@0xsequence/metadata": "3.0.0-beta.13", - "@0xsequence/relayer": "3.0.0-beta.13", - "@0xsequence/userdata": "3.0.0-beta.13", - "@0xsequence/abi": "3.0.0-beta.13", - "@0xsequence/wallet-core": "3.0.0-beta.13", - "@0xsequence/dapp-client": "3.0.0-beta.13", - "@0xsequence/wallet-primitives": "3.0.0-beta.13", - "@0xsequence/wallet-wdk": "3.0.0-beta.13", + "@0xsequence/api": "3.0.0-beta.14", + "@0xsequence/builder": "3.0.0-beta.14", + "@0xsequence/guard": "3.0.0-beta.14", + "@0xsequence/identity-instrument": "3.0.0-beta.14", + "@0xsequence/indexer": "3.0.0-beta.14", + "@0xsequence/marketplace": "3.0.0-beta.14", + "@0xsequence/metadata": "3.0.0-beta.14", + "@0xsequence/relayer": "3.0.0-beta.14", + "@0xsequence/userdata": "3.0.0-beta.14", + "@0xsequence/abi": "3.0.0-beta.14", + "@0xsequence/wallet-core": "3.0.0-beta.14", + "@0xsequence/dapp-client": "3.0.0-beta.14", + "@0xsequence/wallet-primitives": "3.0.0-beta.14", + "@0xsequence/wallet-wdk": "3.0.0-beta.14", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" }, "changesets": [ + "brave-papayas-join", "bright-pots-hope", "crisp-zoos-retire", "cyan-radios-relax", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index b128c5ff3..83321160e 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index bc3cb01f9..f99a65fa3 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index ebe8b517a..c18f31aea 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 9735708a1..418abefb1 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 9eec36307..187bcfc63 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 648b82da9..16d3b8fe7 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 339d2ea9b..342c6a2e9 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.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index bccdc0fcf..e8f9e2794 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/identity-instrument", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index a8b473d85..1c31f61ec 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 97d083ce8..b7c5152f8 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index a2a38e2b2..5aae05141 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 77327c24d..9ae08a910 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index beafb27e4..054874c69 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index e7244a1c1..27741fef9 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index c87be6901..de48157fd 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.15 + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index d901e8922..84e7b2530 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index f8ad642d9..ebe8e5600 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index e0925a77b..a4987876e 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms Inc.", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index b79fc18fa..71017558b 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 42d3c4bca..10937aa5f 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index b5a4f5c70..a5a0d4479 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.15 + - @0xsequence/relayer@3.0.0-beta.15 + - @0xsequence/wallet-primitives@3.0.0-beta.15 + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 4467fec0c..086d37c34 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 39d1471c6..0d34059ba 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.15 + +### Patch Changes + +- New chains, minor fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.15 + - @0xsequence/relayer@3.0.0-beta.15 + - @0xsequence/wallet-core@3.0.0-beta.15 + - @0xsequence/wallet-primitives@3.0.0-beta.15 + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 99f617253..4c15334ba 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/dapp-client", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index e494722cd..7587cdd31 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index f975a0622..6e36c9063 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index 97b7aee2c..e3ddfb6d8 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -105,7 +105,7 @@ export const ChainId = { // ETHERLINK ETHERLINK: 42793, ETHERLINK_TESTNET: 128123, - ETHERLINK_SHADOWNET_TESTNET = 127823, + ETHERLINK_SHADOWNET_TESTNET: 127823, // MOONBEAM MOONBEAM: 1284, diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index e0feded72..b7a96cbda 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.15 + +### Patch Changes + +- New chains, minor fixes +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.15 + - @0xsequence/identity-instrument@3.0.0-beta.15 + - @0xsequence/relayer@3.0.0-beta.15 + - @0xsequence/wallet-core@3.0.0-beta.15 + - @0xsequence/wallet-primitives@3.0.0-beta.15 + ## 3.0.0-beta.14 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index bc69bdc1f..e464ead52 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.0-beta.14", + "version": "3.0.0-beta.15", "license": "Apache-2.0", "type": "module", "publishConfig": { From e2fc5a4ece4101137a36b00e5b59d9a1d0a739f2 Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Thu, 12 Feb 2026 13:50:01 +0300 Subject: [PATCH 080/144] feat: add ethauth option for dapp client connect (#963) * feat: add ethauth option for dapp client connect * Update tests --- .../dapp-client/src/ChainSessionManager.ts | 19 ++ packages/wallet/dapp-client/src/DappClient.ts | 11 + packages/wallet/dapp-client/src/index.ts | 2 + .../wallet/dapp-client/src/types/index.ts | 21 ++ .../wallet/dapp-client/src/utils/storage.ts | 34 +++ .../dapp-client/test/ethauth-proof.test.ts | 208 ++++++++++++++++++ 6 files changed, 295 insertions(+) create mode 100644 packages/wallet/dapp-client/test/ethauth-proof.test.ts diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 229db1ea3..095d07107 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -37,12 +37,14 @@ import { TransportMode, GuardConfig, CreateNewSessionPayload, + EthAuthSettings, ModifyExplicitSessionPayload, SessionResponse, AddExplicitSessionPayload, FeeOption, OperationFailedStatus, OperationStatus, + ETHAuthProof, } from './types/index.js' import { CACHE_DB_NAME, VALUE_FORWARDER_ADDRESS } from './utils/constants.js' import { ExplicitSession, ImplicitSession, ExplicitSessionConfig } from './index.js' @@ -285,6 +287,7 @@ export class ChainSessionManager { preferredLoginMethod?: LoginMethod email?: string includeImplicitSession?: boolean + ethAuth?: EthAuthSettings } = {}, ): Promise { if (this.isInitialized) { @@ -311,6 +314,7 @@ export class ChainSessionManager { origin, session: completeSession as ExplicitSession | undefined, includeImplicitSession: options.includeImplicitSession ?? false, + ethAuth: options.ethAuth, preferredLoginMethod: options.preferredLoginMethod, email: options.preferredLoginMethod === 'email' ? options.email : undefined, } @@ -377,6 +381,10 @@ export class ChainSessionManager { this.guard = guard } + if (payload.ethAuth) { + await this._saveEthAuthProofIfProvided(connectResponse.ethAuthProof) + } + if (this.transport.mode === TransportMode.POPUP) { this.transport.closeWallet() } @@ -596,6 +604,10 @@ export class ChainSessionManager { this.userEmail = userEmail ?? null this.guard = guard } + + if (savedPayload?.ethAuth) { + await this._saveEthAuthProofIfProvided(connectResponse.ethAuthProof) + } } else if (response.action === RequestActionType.ADD_EXPLICIT_SESSION) { if (!this.walletAddress || !Address.isEqual(receivedAddress, this.walletAddress)) { throw new InitializationError('Received an explicit session for a wallet that is not active.') @@ -1104,6 +1116,13 @@ export class ChainSessionManager { await this.sequenceStorage.clearSessionlessConnection() } + private async _saveEthAuthProofIfProvided(ethAuthProof?: ETHAuthProof): Promise { + if (!ethAuthProof) { + return + } + await this.sequenceStorage.saveEthAuthProof(ethAuthProof) + } + private _getCachedSignedCall(calls: Payload.Call[]): { to: Address.Address; data: Hex.Hex } | null { if (!this.lastSignedCallCache) { return null diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index 3c5a29cba..a2b73afd7 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -14,8 +14,10 @@ import { GetFeeTokensResponse, GuardConfig, LoginMethod, + EthAuthSettings, RandomPrivateKeyFn, RequestActionType, + ETHAuthProof, SendWalletTransactionPayload, SequenceSessionStorage, SignMessagePayload, @@ -407,6 +409,13 @@ export class DappClient { } } + /** + * Returns the latest persisted ETHAuth proof, if one has been received from the wallet. + */ + public async getEthAuthProof(): Promise { + return this.sequenceStorage.getEthAuthProof() + } + /** * Restores a sessionless connection that was previously persisted via {@link disconnect} or a connect flow. * @returns A promise that resolves to true if a sessionless connection was applied. @@ -559,6 +568,7 @@ export class DappClient { preferredLoginMethod?: LoginMethod email?: string includeImplicitSession?: boolean + ethAuth?: EthAuthSettings } = {}, ): Promise { if (this.isInitialized) { @@ -614,6 +624,7 @@ export class DappClient { preferredLoginMethod?: LoginMethod email?: string includeImplicitSession?: boolean + ethAuth?: EthAuthSettings } = {}, ): Promise { if (!this.isInitialized || !this.hasSessionlessConnection || !this.walletAddress) { diff --git a/packages/wallet/dapp-client/src/index.ts b/packages/wallet/dapp-client/src/index.ts index c2315b138..ce976c13d 100644 --- a/packages/wallet/dapp-client/src/index.ts +++ b/packages/wallet/dapp-client/src/index.ts @@ -24,6 +24,8 @@ export type { FeeToken, FeeOption, TransportMessage, + EthAuthSettings, + ETHAuthProof, } from './types/index.js' export { RequestActionType, TransportMode, MessageType } from './types/index.js' export { diff --git a/packages/wallet/dapp-client/src/types/index.ts b/packages/wallet/dapp-client/src/types/index.ts index 6a0eb08da..0f023c2bb 100644 --- a/packages/wallet/dapp-client/src/types/index.ts +++ b/packages/wallet/dapp-client/src/types/index.ts @@ -28,12 +28,32 @@ export interface GuardConfig { moduleAddresses: Map } +export interface EthAuthSettings { + app?: string + /** expiry number (in seconds) that is used for ETHAuth proof. Default is 1 week in seconds. */ + expiry?: number + /** origin hint of the dapp's host opening the wallet. This value will automatically + * be determined and verified for integrity, and can be omitted. */ + origin?: string + /** authorizeNonce is an optional number to be passed as ETHAuth's nonce claim for replay protection. **/ + nonce?: number +} + +export interface ETHAuthProof { + // eip712 typed-data payload for ETHAuth domain as input + typedData: Payload.TypedDataToSign + + // signature encoded in an ETHAuth proof string + ewtString: string +} + // --- Payloads for Transport --- export interface CreateNewSessionPayload { origin?: string session?: ExplicitSession includeImplicitSession?: boolean + ethAuth?: EthAuthSettings preferredLoginMethod?: LoginMethod email?: string } @@ -81,6 +101,7 @@ export interface CreateNewSessionResponse { userEmail?: string loginMethod?: LoginMethod guard?: GuardConfig + ethAuthProof?: ETHAuthProof } export interface SignatureResponse { diff --git a/packages/wallet/dapp-client/src/utils/storage.ts b/packages/wallet/dapp-client/src/utils/storage.ts index 8928d354e..8a56015ba 100644 --- a/packages/wallet/dapp-client/src/utils/storage.ts +++ b/packages/wallet/dapp-client/src/utils/storage.ts @@ -5,6 +5,7 @@ import { SignMessagePayload, SignTypedDataPayload, GuardConfig, + ETHAuthProof, SendWalletTransactionPayload, ModifyExplicitSessionPayload, CreateNewSessionPayload, @@ -81,6 +82,10 @@ export interface SequenceStorage { getSessionlessConnection(): Promise clearSessionlessConnection(): Promise + saveEthAuthProof(proof: ETHAuthProof): Promise + getEthAuthProof(): Promise + clearEthAuthProof(): Promise + saveSessionlessConnectionSnapshot?(sessionData: SessionlessConnectionData): Promise getSessionlessConnectionSnapshot?(): Promise clearSessionlessConnectionSnapshot?(): Promise @@ -94,6 +99,7 @@ const STORE_NAME = 'userKeys' const IMPLICIT_SESSIONS_IDB_KEY = 'SequenceImplicitSession' const EXPLICIT_SESSIONS_IDB_KEY = 'SequenceExplicitSession' const SESSIONLESS_CONNECTION_IDB_KEY = 'SequenceSessionlessConnection' +const ETH_AUTH_PROOF_IDB_KEY = 'SequenceEthAuthProof' const SESSIONLESS_CONNECTION_SNAPSHOT_IDB_KEY = 'SequenceSessionlessConnectionSnapshot' const PENDING_REDIRECT_REQUEST_KEY = 'SequencePendingRedirect' @@ -305,6 +311,15 @@ export class WebStorage implements SequenceStorage { } } + async saveEthAuthProof(proof: ETHAuthProof): Promise { + try { + await this.setIDBItem(ETH_AUTH_PROOF_IDB_KEY, proof) + } catch (error) { + console.error('Failed to save ETHAuth proof:', error) + throw error + } + } + async getSessionlessConnection(): Promise { try { return (await this.getIDBItem(SESSIONLESS_CONNECTION_IDB_KEY)) ?? null @@ -314,6 +329,15 @@ export class WebStorage implements SequenceStorage { } } + async getEthAuthProof(): Promise { + try { + return (await this.getIDBItem(ETH_AUTH_PROOF_IDB_KEY)) ?? null + } catch (error) { + console.error('Failed to retrieve ETHAuth proof:', error) + return null + } + } + async clearSessionlessConnection(): Promise { try { await this.deleteIDBItem(SESSIONLESS_CONNECTION_IDB_KEY) @@ -323,6 +347,15 @@ export class WebStorage implements SequenceStorage { } } + async clearEthAuthProof(): Promise { + try { + await this.deleteIDBItem(ETH_AUTH_PROOF_IDB_KEY) + } catch (error) { + console.error('Failed to clear ETHAuth proof:', error) + throw error + } + } + async saveSessionlessConnectionSnapshot(sessionData: SessionlessConnectionData): Promise { try { await this.setIDBItem(SESSIONLESS_CONNECTION_SNAPSHOT_IDB_KEY, sessionData) @@ -363,6 +396,7 @@ export class WebStorage implements SequenceStorage { await this.clearExplicitSessions() await this.clearImplicitSession() await this.clearSessionlessConnection() + await this.clearEthAuthProof() await this.clearSessionlessConnectionSnapshot() } catch (error) { console.error('Failed to clear all data:', error) diff --git a/packages/wallet/dapp-client/test/ethauth-proof.test.ts b/packages/wallet/dapp-client/test/ethauth-proof.test.ts new file mode 100644 index 000000000..9d26306b7 --- /dev/null +++ b/packages/wallet/dapp-client/test/ethauth-proof.test.ts @@ -0,0 +1,208 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' + +import { DappClient } from '../src/DappClient.js' +import { DappTransport } from '../src/DappTransport.js' +import { RequestActionType, TransportMode } from '../src/types/index.js' +import { WebStorage } from '../src/utils/storage.js' + +describe('ETHAuth proof persistence', () => { + afterEach(() => { + vi.restoreAllMocks() + vi.unstubAllGlobals() + }) + + const createSequenceStorageMock = () => + ({ + setPendingRedirectRequest: vi.fn().mockResolvedValue(undefined), + isRedirectRequestPending: vi.fn().mockResolvedValue(false), + saveTempSessionPk: vi.fn().mockResolvedValue(undefined), + getAndClearTempSessionPk: vi.fn().mockResolvedValue(null), + savePendingRequest: vi.fn().mockResolvedValue(undefined), + getAndClearPendingRequest: vi.fn().mockResolvedValue(null), + peekPendingRequest: vi.fn().mockResolvedValue(null), + saveExplicitSession: vi.fn().mockResolvedValue(undefined), + getExplicitSessions: vi.fn().mockResolvedValue([]), + clearExplicitSessions: vi.fn().mockResolvedValue(undefined), + saveImplicitSession: vi.fn().mockResolvedValue(undefined), + getImplicitSession: vi.fn().mockResolvedValue(null), + clearImplicitSession: vi.fn().mockResolvedValue(undefined), + saveSessionlessConnection: vi.fn().mockResolvedValue(undefined), + getSessionlessConnection: vi.fn().mockResolvedValue(null), + clearSessionlessConnection: vi.fn().mockResolvedValue(undefined), + saveEthAuthProof: vi.fn().mockResolvedValue(undefined), + getEthAuthProof: vi.fn().mockResolvedValue(null), + clearEthAuthProof: vi.fn().mockResolvedValue(undefined), + clearAllData: vi.fn().mockResolvedValue(undefined), + }) as any + + it('persists ETHAuth proof when connect requests ethAuth in redirect mode', async () => { + const fetchMock = vi.fn() + vi.stubGlobal('fetch', fetchMock) + vi.stubGlobal('window', { fetch: fetchMock } as any) + + const ethAuthProof = { + typedData: { + domain: {}, + types: {}, + message: {}, + }, + ewtString: 'proof-string', + } as any + + const sequenceStorage = createSequenceStorageMock() + const sendRequestMock = vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ + walletAddress: '0x1111111111111111111111111111111111111111', + ethAuthProof, + } as any) + + const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { + sequenceStorage, + transportMode: TransportMode.REDIRECT, + canUseIndexedDb: false, + redirectActionHandler: vi.fn(), + }) + + await client.connect(1, undefined, { + ethAuth: { + app: 'app-name', + }, + }) + + expect(sendRequestMock).toHaveBeenCalledWith( + RequestActionType.CREATE_NEW_SESSION, + 'https://dapp.example', + expect.objectContaining({ + ethAuth: { + app: 'app-name', + }, + }), + expect.any(Object), + ) + expect(sequenceStorage.saveEthAuthProof).toHaveBeenCalledWith(ethAuthProof) + }) + + it('persists ETHAuth proof when connect requests ethAuth in popup mode', async () => { + const fetchMock = vi.fn() + vi.stubGlobal('fetch', fetchMock) + vi.stubGlobal('window', { fetch: fetchMock } as any) + vi.stubGlobal('document', {} as any) + + const ethAuthProof = { + typedData: { + domain: {}, + types: {}, + message: {}, + }, + ewtString: 'proof-string', + } as any + + const sequenceStorage = createSequenceStorageMock() + const sendRequestMock = vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ + walletAddress: '0x1111111111111111111111111111111111111111', + ethAuthProof, + } as any) + + const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { + sequenceStorage, + transportMode: TransportMode.POPUP, + canUseIndexedDb: false, + }) + + await client.connect(1, undefined, { + ethAuth: { + app: 'app-name', + }, + }) + + expect(sendRequestMock).toHaveBeenCalledWith( + RequestActionType.CREATE_NEW_SESSION, + 'https://dapp.example', + expect.objectContaining({ + ethAuth: { + app: 'app-name', + }, + }), + expect.any(Object), + ) + expect(sequenceStorage.saveEthAuthProof).toHaveBeenCalledWith(ethAuthProof) + }) + + it('does not persist ETHAuth proof when connect does not request ethAuth', async () => { + const fetchMock = vi.fn() + vi.stubGlobal('fetch', fetchMock) + vi.stubGlobal('window', { fetch: fetchMock } as any) + + const ethAuthProof = { + typedData: { + domain: {}, + types: {}, + message: {}, + }, + ewtString: 'proof-string', + } as any + + const sequenceStorage = createSequenceStorageMock() + const sendRequestMock = vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ + walletAddress: '0x1111111111111111111111111111111111111111', + ethAuthProof, + } as any) + + const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { + sequenceStorage, + transportMode: TransportMode.REDIRECT, + canUseIndexedDb: false, + redirectActionHandler: vi.fn(), + }) + + await client.connect(1) + + expect(sendRequestMock).toHaveBeenCalledWith( + RequestActionType.CREATE_NEW_SESSION, + 'https://dapp.example', + expect.not.objectContaining({ + ethAuth: expect.anything(), + }), + expect.any(Object), + ) + expect(sequenceStorage.saveEthAuthProof).not.toHaveBeenCalled() + }) + + it('clears ETHAuth proof on disconnect', async () => { + const fetchMock = vi.fn() + vi.stubGlobal('fetch', fetchMock) + vi.stubGlobal('window', { fetch: fetchMock } as any) + + const ethAuthProof = { + typedData: { + domain: {}, + types: {}, + message: {}, + }, + ewtString: 'proof-string', + } as any + + vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ + walletAddress: '0x1111111111111111111111111111111111111111', + ethAuthProof, + } as any) + + const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { + sequenceStorage: new WebStorage(), + transportMode: TransportMode.REDIRECT, + canUseIndexedDb: false, + redirectActionHandler: vi.fn(), + }) + + await client.connect(1, undefined, { + ethAuth: { + app: 'app-name', + }, + }) + + expect(await client.getEthAuthProof()).toEqual(ethAuthProof) + + await client.disconnect() + + expect(await client.getEthAuthProof()).toBeNull() + }) +}) From f68be621b8d0e5f714349dc87f0d45432808b21c Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 12 Feb 2026 11:57:35 +0100 Subject: [PATCH 081/144] 3.0.0-beta.16 --- .changeset/all-rings-bow.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/all-rings-bow.md diff --git a/.changeset/all-rings-bow.md b/.changeset/all-rings-bow.md new file mode 100644 index 000000000..402bc8aee --- /dev/null +++ b/.changeset/all-rings-bow.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +ethauth support diff --git a/.changeset/pre.json b/.changeset/pre.json index 23bcec1f7..49368d22d 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,25 +4,26 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.14", - "@0xsequence/builder": "3.0.0-beta.14", - "@0xsequence/guard": "3.0.0-beta.14", - "@0xsequence/identity-instrument": "3.0.0-beta.14", - "@0xsequence/indexer": "3.0.0-beta.14", - "@0xsequence/marketplace": "3.0.0-beta.14", - "@0xsequence/metadata": "3.0.0-beta.14", - "@0xsequence/relayer": "3.0.0-beta.14", - "@0xsequence/userdata": "3.0.0-beta.14", - "@0xsequence/abi": "3.0.0-beta.14", - "@0xsequence/wallet-core": "3.0.0-beta.14", - "@0xsequence/dapp-client": "3.0.0-beta.14", - "@0xsequence/wallet-primitives": "3.0.0-beta.14", - "@0xsequence/wallet-wdk": "3.0.0-beta.14", + "@0xsequence/api": "3.0.0-beta.15", + "@0xsequence/builder": "3.0.0-beta.15", + "@0xsequence/guard": "3.0.0-beta.15", + "@0xsequence/identity-instrument": "3.0.0-beta.15", + "@0xsequence/indexer": "3.0.0-beta.15", + "@0xsequence/marketplace": "3.0.0-beta.15", + "@0xsequence/metadata": "3.0.0-beta.15", + "@0xsequence/relayer": "3.0.0-beta.15", + "@0xsequence/userdata": "3.0.0-beta.15", + "@0xsequence/abi": "3.0.0-beta.15", + "@0xsequence/wallet-core": "3.0.0-beta.15", + "@0xsequence/dapp-client": "3.0.0-beta.15", + "@0xsequence/wallet-primitives": "3.0.0-beta.15", + "@0xsequence/wallet-wdk": "3.0.0-beta.15", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" }, "changesets": [ + "all-rings-bow", "brave-papayas-join", "bright-pots-hope", "crisp-zoos-retire", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 83321160e..bc1959686 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index f99a65fa3..4b86f2030 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms Inc.", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index c18f31aea..0721cdb8d 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 418abefb1..c641a4b48 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms Inc.", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 187bcfc63..b8a0a9514 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 16d3b8fe7..52dbd589d 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms Inc.", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 342c6a2e9..d5f8af0d3 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.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index e8f9e2794..bc77f0edf 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/identity-instrument", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 1c31f61ec..ca665306f 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index b7c5152f8..e5084709b 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms Inc.", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 5aae05141..a92109365 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 9ae08a910..36f2c2324 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms Inc.", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 054874c69..e5c41b32e 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 27741fef9..de32e8041 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index de48157fd..f2c87bf54 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.16 + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 84e7b2530..1640229a2 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index ebe8e5600..774faa865 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index a4987876e..6f1aa2bfb 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms Inc.", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 71017558b..f62406f83 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 10937aa5f..07d57a345 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms Inc.", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index a5a0d4479..752a46056 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.16 + - @0xsequence/relayer@3.0.0-beta.16 + - @0xsequence/wallet-primitives@3.0.0-beta.16 + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 086d37c34..3295b9a3a 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 0d34059ba..4cf425c05 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.16 + +### Patch Changes + +- ethauth support +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.16 + - @0xsequence/relayer@3.0.0-beta.16 + - @0xsequence/wallet-core@3.0.0-beta.16 + - @0xsequence/wallet-primitives@3.0.0-beta.16 + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 4c15334ba..3db8b8bf9 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/dapp-client", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 7587cdd31..9da2119c2 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 6e36c9063..660ec6136 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index b7a96cbda..7fb4e804c 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.16 + +### Patch Changes + +- ethauth support +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.16 + - @0xsequence/identity-instrument@3.0.0-beta.16 + - @0xsequence/relayer@3.0.0-beta.16 + - @0xsequence/wallet-core@3.0.0-beta.16 + - @0xsequence/wallet-primitives@3.0.0-beta.16 + ## 3.0.0-beta.15 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index e464ead52..bd0777bca 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.0-beta.15", + "version": "3.0.0-beta.16", "license": "Apache-2.0", "type": "module", "publishConfig": { From 0d4670e178d051c515897bd018c5a62c2739ef54 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Thu, 12 Feb 2026 14:15:15 -0500 Subject: [PATCH 082/144] Use Address.isEqual for address comparison in recovery module --- packages/wallet/wdk/src/sequence/recovery.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wallet/wdk/src/sequence/recovery.ts b/packages/wallet/wdk/src/sequence/recovery.ts index 600fb7674..616f55394 100644 --- a/packages/wallet/wdk/src/sequence/recovery.ts +++ b/packages/wallet/wdk/src/sequence/recovery.ts @@ -284,7 +284,7 @@ export class Recovery implements RecoveryInterface { } await this.updateRecoveryModule(modules, (leaves) => { - const next = leaves.filter((l) => l.signer !== address) + const next = leaves.filter((l) => !Address.isEqual(l.signer, address)) if (next.length === 0) { return [ { From 6ab21794c4c7649c95f7108e13d8b2ddb2de3451 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Thu, 12 Feb 2026 16:44:36 -0500 Subject: [PATCH 083/144] Recovery.fetchQueuedPayloads can continue after encountering a node error --- .../primitives/src/extensions/recovery.ts | 2 +- packages/wallet/wdk/src/sequence/recovery.ts | 92 ++++++++++--------- 2 files changed, 49 insertions(+), 45 deletions(-) diff --git a/packages/wallet/primitives/src/extensions/recovery.ts b/packages/wallet/primitives/src/extensions/recovery.ts index 7073272e5..cb8c93868 100644 --- a/packages/wallet/primitives/src/extensions/recovery.ts +++ b/packages/wallet/primitives/src/extensions/recovery.ts @@ -203,7 +203,7 @@ export function parseBranch(encoded: Bytes.Bytes): { nodes: Tree[]; leftover: By */ export function trimTopology(topology: Tree, signer: Address.Address): Tree { if (isRecoveryLeaf(topology)) { - if (topology.signer === signer) { + if (Address.isEqual(topology.signer, signer)) { return topology } else { return hashConfiguration(topology) diff --git a/packages/wallet/wdk/src/sequence/recovery.ts b/packages/wallet/wdk/src/sequence/recovery.ts index 616f55394..b40b138f8 100644 --- a/packages/wallet/wdk/src/sequence/recovery.ts +++ b/packages/wallet/wdk/src/sequence/recovery.ts @@ -530,60 +530,64 @@ export class Recovery implements RecoveryInterface { for (const signer of signers) { for (const { chainId, provider } of providers) { - const totalPayloads = await Extensions.Recovery.totalQueuedPayloads( - provider, - this.shared.sequence.extensions.recovery, - wallet, - signer.address, - ) - - for (let i = 0n; i < totalPayloads; i++) { - const payloadHash = await Extensions.Recovery.queuedPayloadHashOf( + try { + const totalPayloads = await Extensions.Recovery.totalQueuedPayloads( provider, this.shared.sequence.extensions.recovery, wallet, signer.address, - i, ) - const timestamp = await Extensions.Recovery.timestampForQueuedPayload( - provider, - this.shared.sequence.extensions.recovery, - wallet, - signer.address, - payloadHash, - ) - - const payload = await this.shared.sequence.stateProvider.getPayload(payloadHash) + for (let i = 0n; i < totalPayloads; i++) { + const payloadHash = await Extensions.Recovery.queuedPayloadHashOf( + provider, + this.shared.sequence.extensions.recovery, + wallet, + signer.address, + i, + ) + + const timestamp = await Extensions.Recovery.timestampForQueuedPayload( + provider, + this.shared.sequence.extensions.recovery, + wallet, + signer.address, + payloadHash, + ) + + const payload = await this.shared.sequence.stateProvider.getPayload(payloadHash) + + // If ready, we need to check if it was executed already + // for this, we check if the wallet nonce for the given space + // is greater than the nonce in the payload + if (timestamp < Date.now() / 1000 && payload && Payload.isCalls(payload.payload)) { + const nonce = await this.shared.modules.wallets.getNonce(chainId, wallet, payload.payload.space) + if (nonce > i) { + continue + } + } - // If ready, we need to check if it was executed already - // for this, we check if the wallet nonce for the given space - // is greater than the nonce in the payload - if (timestamp < Date.now() / 1000 && payload && Payload.isCalls(payload.payload)) { - const nonce = await this.shared.modules.wallets.getNonce(chainId, wallet, payload.payload.space) - if (nonce > i) { - continue + // The id is the index + signer address + chainId + wallet address + const id = `${i}-${signer.address}-${chainId}-${wallet}` + + // Create a new payload + const payloadEntry: QueuedRecoveryPayload = { + id, + index: i, + recoveryModule: this.shared.sequence.extensions.recovery, + wallet: wallet, + signer: signer.address, + chainId, + startTimestamp: timestamp, + endTimestamp: timestamp + signer.requiredDeltaTime, + payloadHash, + payload: payload?.payload, } - } - // The id is the index + signer address + chainId + wallet address - const id = `${i}-${signer.address}-${chainId}-${wallet}` - - // Create a new payload - const payloadEntry: QueuedRecoveryPayload = { - id, - index: i, - recoveryModule: this.shared.sequence.extensions.recovery, - wallet: wallet, - signer: signer.address, - chainId, - startTimestamp: timestamp, - endTimestamp: timestamp + signer.requiredDeltaTime, - payloadHash, - payload: payload?.payload, + payloads.push(payloadEntry) } - - payloads.push(payloadEntry) + } catch (err) { + console.error('Recovery.fetchQueuedPayloads error', err) } } } From 46dfab78a729e0d5bd58e9c5bb81b22c7a5915c6 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 16 Feb 2026 13:25:07 +0100 Subject: [PATCH 084/144] chore: update company name references (#964) --- packages/services/api/package.json | 2 +- packages/services/builder/package.json | 2 +- packages/services/guard/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/services/userdata/package.json | 2 +- packages/utils/abi/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 4b86f2030..1cc6df0dd 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -3,7 +3,7 @@ "version": "3.0.0-beta.16", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", - "author": "Sequence Platforms Inc.", + "author": "Sequence Platforms ULC", "license": "Apache-2.0", "publishConfig": { "access": "public" diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index c641a4b48..80db5117e 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -3,7 +3,7 @@ "version": "3.0.0-beta.16", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", - "author": "Sequence Platforms Inc.", + "author": "Sequence Platforms ULC", "license": "Apache-2.0", "publishConfig": { "access": "public" diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 52dbd589d..bbfc80249 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -3,7 +3,7 @@ "version": "3.0.0-beta.16", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", - "author": "Sequence Platforms Inc.", + "author": "Sequence Platforms ULC", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index e5084709b..92286197d 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -3,7 +3,7 @@ "version": "3.0.0-beta.16", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", - "author": "Sequence Platforms Inc.", + "author": "Sequence Platforms ULC", "license": "Apache-2.0", "publishConfig": { "access": "public" diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 36f2c2324..79b7f9771 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -3,7 +3,7 @@ "version": "3.0.0-beta.16", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", - "author": "Sequence Platforms Inc.", + "author": "Sequence Platforms ULC", "license": "Apache-2.0", "publishConfig": { "access": "public" diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index de32e8041..00f2f6e6f 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -6,7 +6,7 @@ }, "description": "metadata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/metadata", - "author": "Sequence Platforms Inc.", + "author": "Sequence Platforms ULC", "license": "Apache-2.0", "scripts": { "build": "tsc", diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 1640229a2..2fd579bec 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -7,7 +7,7 @@ }, "description": "relayer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/relayer", - "author": "Sequence Platforms Inc.", + "author": "Sequence Platforms ULC", "license": "Apache-2.0", "scripts": { "build": "tsc", diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 6f1aa2bfb..ea0124807 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -3,7 +3,7 @@ "version": "3.0.0-beta.16", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", - "author": "Sequence Platforms Inc.", + "author": "Sequence Platforms ULC", "license": "Apache-2.0", "publishConfig": { "access": "public" diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 07d57a345..533f400fe 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -3,7 +3,7 @@ "version": "3.0.0-beta.16", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", - "author": "Sequence Platforms Inc.", + "author": "Sequence Platforms ULC", "license": "Apache-2.0", "publishConfig": { "access": "public" From b9c2524dd0f603639eba8d7cec333967f47cfacc Mon Sep 17 00:00:00 2001 From: 0xsequence-bot <50996415+0xsequence-bot@users.noreply.github.com> Date: Mon, 16 Feb 2026 07:34:22 -0500 Subject: [PATCH 085/144] [AUTOMATED] Update files from 0xsequence/indexer (#897) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> --- packages/indexer/src/indexer.gen.ts | 2765 +++++++++++++++++++++++++ packages/indexer/src/indexergw.gen.ts | 1787 ++++++++++++++++ 2 files changed, 4552 insertions(+) create mode 100644 packages/indexer/src/indexer.gen.ts create mode 100644 packages/indexer/src/indexergw.gen.ts diff --git a/packages/indexer/src/indexer.gen.ts b/packages/indexer/src/indexer.gen.ts new file mode 100644 index 000000000..97d3d2472 --- /dev/null +++ b/packages/indexer/src/indexer.gen.ts @@ -0,0 +1,2765 @@ +/* eslint-disable */ +// sequence-indexer v0.4.0 caf5c4c3677ac2dce41858dce7cd727a7810845f +// -- +// Code generated by Webrpc-gen@v0.31.2 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=merged.gen.json -service=Indexer -target=typescript -client -out=./clients/indexer.gen.ts + +// Webrpc description and code-gen version +export const WebrpcVersion = 'v1' + +// Schema version of your RIDL schema +export const WebrpcSchemaVersion = 'v0.4.0' + +// Schema hash generated from your RIDL schema +export const WebrpcSchemaHash = 'caf5c4c3677ac2dce41858dce7cd727a7810845f' + +// +// Client interface +// + +export interface IndexerClient { + addWebhookListener(req: AddWebhookListenerRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * Fetches a single receipt and then will stop the subscription + */ + fetchTransactionReceipt( + req: FetchTransactionReceiptRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Fetches a single receipt with filter and then will stop the subscription + */ + fetchTransactionReceiptWithFilter( + req: FetchTransactionReceiptWithFilterRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Webhooks + */ + getAllWebhookListeners( + req: GetAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Get balance update aggregate values -- useful for syncing balance details of a contract, ie. from Skyweaver. + * Also consider using SubscribeBalanceUpdates or SubscribeEvents as other alternatives. + */ + getBalanceUpdates(req: GetBalanceUpdatesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * Get the chain ID of the indexer + */ + getChainID(headers?: object, signal?: AbortSignal): Promise + + /** + * Queries an ethereum node for the latest and confirm ETH balances + * DEPRECATED: use GetNativeTokenBalance instead + * + * @deprecated GetNativeTokenBalance + */ + getEtherBalance(req: GetEtherBalanceRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetMarketplaceOrders queries marketplace orders with filtering and pagination. + * + * Retrieves buy orders (offers) and sell orders (listings) from a specific marketplace + * and collection with comprehensive filtering options. + * + * Parameters: + * marketplaceContractAddress: Target marketplace contract (required) + * collectionAddress: NFT collection contract (required) + * filter: MarketplaceOrderFilter with options: + * - isListing: true=listings, false=offers, omit=both + * - userAddresses: Include specific users + * - currencyAddresses: Filter by currencies (empty=all) + * - orderIds: Filter by specific order ids (empty=all) + * - tokenIds: Filter by specific tokens (empty=all) + * - excludeUserAddresses: Exclude specific users + * - blockNumberGt: Orders greater than block number + * - createdAtAfter: Orders after timestamp + * - orderStatuses: Filter by status (OPEN, CLOSED, CANCELLED) + * - returnExpired: Include expired orders + * page: Pagination control (optional) + * + * Returns: Updated pagination info and array of matching orders + */ + getMarketplaceOrders( + req: GetMarketplaceOrdersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetMarketplaceTopOrders finds the most competitive orders for specific tokens. + * + * Optimized for price discovery, returns the best available orders for each token. + * Useful for displaying current market prices and finding trading opportunities. + * + * Parameters: + * marketplaceContractAddress: Target marketplace contract (required) + * collectionAddress: NFT collection contract (required) + * filter: MarketplaceTopOrdersFilter with options: + * - currencyAddresses: Consider specific currencies (empty=all) + * - tokenIds: Target token IDs (required, non-empty) + * - isListing: true=listings/sell orders, false=offers/buy orders + * - priceSort: ASC=lowest first, DESC=highest first + * - excludeUser: Hide orders from specific user + * + * Returns: Array of top-priced active orders, sorted by priceSort preference + */ + getMarketplaceTopOrders( + req: GetMarketplaceTopOrdersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetNativeTokenBalance queries an ethereum node for the latest native token account balance. + * The native token is the token of the chain the indexer is connected to, for example, ETH on Ethereum + * and POL on Polygon. + */ + getNativeTokenBalance( + req: GetNativeTokenBalanceRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalances returns a balance summary/details for a specific account. By default + * if accountAddress is left empty, it will use the account from the jwt session. + * + * Also, if contractAddress is undefined, then it will list all current user coins/collectibles. + * But, if contractAddress is provided, then it will return the token balances for the contract, this is + * only useful for 1155, but for other tokens, it can act as a filter for the single balance. + * + * DEPRECATED: use GetTokenBalancesSummary / GetTokenBalancesDetails + * + * @deprecated GetTokenBalancesSummary + */ + getTokenBalances(req: GetTokenBalancesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenBalancesByContract returns a balances for a specific accounts and + * contracts. The collection ERC721 & ERC1155 tokens are represented as + * individual balances. + * + * If `filter` is not provided, it will error out as it requires at least + * contract address. + * + * If `filter.contractStatus` is not provided, it will include verified only + * tokens. + */ + getTokenBalancesByContract( + req: GetTokenBalancesByContractRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalancesDetails returns a detailed balance summary for a specific + * accounts. The collection ERC721 & ERC1155 tokens are represented as + * individual balances. + * + * If `filter` is not provided, it will use the filter with account from the + * jwt session. + * + * If `filter.contractStatus` is not provided, it will include verified only + * tokens. + */ + getTokenBalancesDetails( + req: GetTokenBalancesDetailsRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalancesSummary returns a summary of token balances for a specific + * accounts. The collection ERC721 & ERC1155 tokens are represented as a + * single aggregated balance. + * + * If `filter` is not provided, it will use the filter with account from the + * jwt session. + * + * If `filter.contractStatus` is not provided, it will include verified only + * tokens. + */ + getTokenBalancesSummary( + req: GetTokenBalancesSummaryRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenIDRanges returns the range of tokenIDs for a token collection contract. + * This is useful for ERC-721 and ERC-1155 contracts to get the range of valid tokenIDs. It is similar to + * GetTokenIDs, but returns the range of tokenIDs instead of the list of tokenIDs, which is more efficient + * for large collections and very easy to the caller to expand the range into a list of tokenIDs. + * + * NOTE: this method will only return up to 15,000 ranges, if there are more ranges, it will return + * a boolean to indicate there are more ranges beyond the first 15,000. Therefore, if `moreRanges` is + * false then you have all the ranges, but if true, you need to make a follow up call to fetch the next + * page of ranges. + * + * As an example, if a NFT collection of 100,000 tokens uses ids from 1,2,3,...,100_000 then this endpoint + * will return just a single range from [1,100_000], but if there are gaps between the sequence, then + * those will be broken into separate range entries. + */ + getTokenIDRanges(req: GetTokenIDRangesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenIDs returns the list of each individual token id for a token collection contract. + * This is useful for ERC-721 and ERC-1155 contracts to get the list of valid tokenIDs. + */ + getTokenIDs(req: GetTokenIDsRequest, headers?: object, signal?: AbortSignal): Promise + + getTokenPrice(req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise + + getTokenPrices(req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenSupplies returns the set of tokenIDs used by a contract address, supporting ERC-20, ERC-721, and ERC-1155 + * contracts, and their respective supply as well. + */ + getTokenSupplies(req: GetTokenSuppliesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenSuppliesMap returns the token supplies of ERC-20 and ERC-1155 tokens as requested in the `tokenMap` + * represented as a map of contractAddress :: []tokenIDs. + * + * For an ERC-20 specify tokenIDs as an empty array or [0], for example, { '0xdef': [] } or { '0xdef': [0] } + * For ERC-1155 pass the array of tokens are strings, ie. { '0xabc': ['1', '2', '3'] } + */ + getTokenSuppliesMap( + req: GetTokenSuppliesMapRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * History of mined transactions for the account which includes a list of token transfers (sent/recieved) + * and sent transactions from a Sequence wallet + */ + getTransactionHistory( + req: GetTransactionHistoryRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + getWebhookListener(req: GetWebhookListenerRequest, headers?: object, signal?: AbortSignal): Promise + + listTokenPrices(req: ListTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise + + pauseAllWebhookListeners( + req: PauseAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Ping the indexer + */ + ping(headers?: object, signal?: AbortSignal): Promise + + removeAllWebhookListeners( + req: RemoveAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + removeWebhookListener( + req: RemoveWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + resumeAllWebhookListeners( + req: ResumeAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Get the current runtime health status of the indexer + */ + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + + /** + * SubscribeBalanceUpdates listens to balance updates for a specific contract address + */ + subscribeBalanceUpdates( + req: SubscribeBalanceUpdatesRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController + + /** + * SubscribeEvents listens to events on-chain based on the filter criteria + * + * TODO: some additional options can be passed such as block, reorg true, etc. + * or stay behind, etc. + */ + subscribeEvents(req: SubscribeEventsRequest, options: WebrpcStreamOptions): WebrpcStreamController + + /** + * Listen to transaction receipts on-chain based on the filter criteria + */ + subscribeReceipts( + req: SubscribeReceiptsRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController + + /** + * Re-sync an incorrect token balance with the correct on-chain balance + * NOTE: this method is almost never used, but we've marked it internal in case + * we ever want to use it again. This method was written a very long time ago in + * scenarios when the indexer had little bugs, but now its solid. + */ + syncBalance(req: SyncBalanceRequest, headers?: object, signal?: AbortSignal): Promise + + toggleWebhookListener( + req: ToggleWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + updateWebhookListener( + req: UpdateWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Get the current version of the indexer + */ + version(headers?: object, signal?: AbortSignal): Promise +} + +// +// Schema types +// + +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 BloomStats { + hitRatio: string + falsePositivesPercent: string + hitCount: number + missCount: number + falsePositives: number +} + +export interface BloomStatus { + enabled: boolean + initialized: boolean + bloomInitElapsedTime: string + stats: BloomStats +} + +export interface Bond { + pebble: PebbleMetrics + estimatedDiskUsagePerTable: any + estimatedDiskUsageTotal: string +} + +export interface ChainInfo { + chainId: number + chainName: string +} + +export interface ContractInfo { + chainId: number + address: string + source: string + name: string + type: string + symbol: string + decimals?: number + logoURI: string + deployed: boolean + bytecodeHash: string + extensions: ContractInfoExtensions + updatedAt: string + queuedAt?: string + status: ResourceStatus +} + +export interface ContractInfoExtensionBridgeInfo { + tokenAddress: string +} + +export interface ContractInfoExtensionIndexingInfo { + useOnChainBalance: boolean +} + +export interface ContractInfoExtensions { + link?: string + description?: string + categories?: Array + bridgeInfo?: { [key: string]: ContractInfoExtensionBridgeInfo } + indexingInfo?: ContractInfoExtensionIndexingInfo + ogImage?: string + ogName?: string + originChainId?: number + originAddress?: string + blacklist?: boolean + verified?: boolean + verifiedBy?: string + featured?: boolean + featureIndex?: number +} + +export enum ContractType { + UNKNOWN = 'UNKNOWN', + NATIVE = 'NATIVE', + ERC20 = 'ERC20', + ERC721 = 'ERC721', + ERC1155 = 'ERC1155', + SEQUENCE_WALLET = 'SEQUENCE_WALLET', + ERC20_BRIDGE = 'ERC20_BRIDGE', + ERC721_BRIDGE = 'ERC721_BRIDGE', + ERC1155_BRIDGE = 'ERC1155_BRIDGE', + SEQ_MARKETPLACE = 'SEQ_MARKETPLACE', + ERC6909 = 'ERC6909' +} + +export enum ContractVerificationStatus { + VERIFIED = 'VERIFIED', + UNVERIFIED = 'UNVERIFIED', + ALL = 'ALL' +} + +export interface DiskUsage { + humanReadable: string + used: number + size: number + percent: number + dirs: { [key: string]: string } +} + +export interface EtherBalance { + accountAddress: string + balanceWei: string +} + +export interface EventDecoded { + topicHash: string + eventSig: string + types: Array + names: Array + values: Array +} + +export interface EventFilter { + events?: Array + contractAddresses?: Array + accounts?: Array + tokenIDs?: Array +} + +export interface EventLog { + id: number + uid: string + type: EventLogType + blockNumber: number + blockHash: string + parentBlockHash: string + contractAddress: string + contractType: ContractType + txnHash: string + txnIndex: number + txnLogIndex: number + logDataType: EventLogDataType + ts: string + txnInfo?: TxnInfo + rawLog?: { [key: string]: any } + event?: EventDecoded +} + +export enum EventLogDataType { + EVENT = 'EVENT', + TOKEN_TRANSFER = 'TOKEN_TRANSFER', + NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', + SEQUENCE_TXN = 'SEQUENCE_TXN' +} + +export enum EventLogType { + UNKNOWN = 'UNKNOWN', + BLOCK_ADDED = 'BLOCK_ADDED', + BLOCK_REMOVED = 'BLOCK_REMOVED' +} + +export interface GatewayBackendResponseTime { + percentiles: { [key: string]: number } + average: number +} + +export interface GatewayBackendRuntimeStatus { + name: string + chainId: number + responseTime: GatewayBackendResponseTime +} + +export interface GatewayEtherBalance { + chainId: number + errorReason?: string + result: EtherBalance +} + +export interface GatewayNativeTokenBalance { + chainId: number + errorReason?: string + result: NativeTokenBalance +} + +export interface GatewayNativeTokenBalances { + chainId: number + errorReason?: string + results: Array +} + +export interface GatewayPrice { + chainID: number + errorReason?: string + results: Array +} + +export interface GatewayRuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + backends: Array +} + +export interface GatewayTokenBalance { + chainId: number + errorReason?: string + results: Array +} + +export interface GatewayTokenPriceQuery { + chainID: number + queries: Array +} + +export interface GatewayTransaction { + chainId: number + errorReason?: string + results: Array +} + +export interface IndexState { + chainId: string + lastBlockNum: number + lastBlockHash: string +} + +export interface IndexedBlock { + blockNumber: number + blockShortHash: string +} + +export interface IndexerMetrics { + blocksPerSecond: number + eventsPerSecond: number +} + +export interface MarketplaceOrder { + orderId: string + tokenContract: string + tokenId: string + isListing: boolean + quantity: string + quantityRemaining: string + currencyAddress: string + pricePerToken: string + expiry: string + orderStatus: OrderStatus + createdBy: string + blockNumber: number + orderbookContractAddress: string + createdAt: number +} + +export interface MarketplaceOrderFilter { + isListing?: boolean + userAddresses?: Array + currencyAddresses: Array + orderIds: Array + tokenIds: Array + excludeUserAddresses?: Array + blockNumberGt: number + createdAtAfter: number + orderStatuses: Array + returnExpired: boolean +} + +export interface MarketplaceTopOrdersFilter { + currencyAddresses: Array + tokenIds: Array + isListing: boolean + priceSort: SortOrder + excludeUser?: string +} + +export interface MetadataOptions { + verifiedOnly?: boolean + unverifiedOnly?: boolean + includeContracts?: Array +} + +export interface NativeTokenBalance { + accountAddress: string + chainId: number + name: string + symbol: string + balance: string + balanceUSD: string + priceUSD: string + priceUpdatedAt?: string + errorReason?: string +} + +export enum NetworkType { + MAINNETS = 'MAINNETS', + TESTNETS = 'TESTNETS', + ALL = 'ALL' +} + +export enum OrderStatus { + OPEN = 'OPEN', + CLOSED = 'CLOSED', + CANCELLED = 'CANCELLED' +} + +export interface Page { + page?: number + column?: string + before?: any + after?: any + sort?: Array + pageSize?: number + more?: boolean +} + +export interface PebbleMetrics { + compactionCount: number + compactionEstimatedDebt: number + compactionInProgressBytes: number + compactionNumInProgress: number + compactionMarkedFiles: number +} + +export interface Price { + contractAddress: string + tokenID?: string + priceUSD: string + updatedAt?: string +} + +export enum ResourceStatus { + NOT_AVAILABLE = 'NOT_AVAILABLE', + REFRESHING = 'REFRESHING', + AVAILABLE = 'AVAILABLE' +} + +export interface RuntimeChecks { + running: boolean + runnables: any + cgoEnabled: boolean + quotaControlEnabled: boolean + syncMode: string + percentIndexed: number + lastBlockNum: number + lastBlockNumWithState: number + bloomStatus: BloomStatus + bond: Bond + diskUsage: DiskUsage + metrics: IndexerMetrics +} + +export interface RuntimeStatus { + healthOK: boolean + indexerEnabled: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + checks: RuntimeChecks +} + +export interface SortBy { + column: string + order: SortOrder +} + +export enum SortOrder { + DESC = 'DESC', + ASC = 'ASC' +} + +export interface TokenBalance { + contractType: ContractType + contractAddress: string + accountAddress: string + tokenID?: string + balance: string + balanceUSD: string + priceUSD: string + priceUpdatedAt?: string + blockHash: string + blockNumber: number + chainId: number + uniqueCollectibles: string + isSummary: boolean + contractInfo?: ContractInfo + tokenMetadata?: TokenMetadata +} + +export interface TokenBalanceFilter { + contractAddress: string + sinceBlockNumber: number +} + +export interface TokenBalancesByContractFilter { + contractAddresses: Array + accountAddresses?: Array + contractStatus?: ContractVerificationStatus + tokenIDs?: Array +} + +export interface TokenBalancesFilter { + accountAddresses: Array + contractStatus?: ContractVerificationStatus + contractTypes?: Array + contractWhitelist?: Array + contractBlacklist?: Array + omitNativeBalances: boolean + omitPrices?: boolean + tokenIDs?: Array +} + +export interface TokenHistory { + blockNumber: number + blockHash: string + contractAddress: string + contractType: ContractType + fromAddress: string + toAddress: string + txnHash: string + txnIndex: number + txnLogIndex: number + tokenIDs: string + amounts: string + ts: string +} + +export interface TokenIDRange { + start: string + end: string +} + +export interface TokenMetadata { + chainId?: number + contractAddress?: string + tokenId: string + source: 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: ResourceStatus + queuedAt?: string + lastFetched?: string +} + +export interface TokenPriceQuery { + contractAddress: string + tokenID?: string +} + +export interface TokenSupply { + tokenID: string + supply: string + chainId: number + contractInfo?: ContractInfo + tokenMetadata?: TokenMetadata +} + +export interface Transaction { + txnHash: string + blockNumber: number + blockHash: string + chainId: number + metaTxnID?: string + transfers?: Array + timestamp: string +} + +export interface TransactionFilter { + txnHash?: string + from?: string + to?: string + contractAddress?: string + event?: string +} + +export interface TransactionHistoryFilter { + accountAddress?: string + contractAddress?: string + accountAddresses?: Array + contractAddresses?: Array + transactionHashes?: Array + metaTransactionIDs?: Array + fromBlock?: number + toBlock?: number + tokenID?: string + omitPrices?: boolean +} + +export interface TransactionLog { + contractAddress: string + topics: Array + data: string + index: number +} + +export interface TransactionReceipt { + txnHash: string + txnStatus: TransactionStatus + txnIndex: number + txnType: TransactionType + blockHash: string + blockNumber: number + gasUsed: number + effectiveGasPrice: string + from: string + to: string + logs: Array + final: boolean + reorged: boolean +} + +export enum TransactionStatus { + FAILED = 'FAILED', + SUCCESSFUL = 'SUCCESSFUL' +} + +export enum TransactionType { + LegacyTxnType = 'LegacyTxnType', + AccessListTxnType = 'AccessListTxnType', + DynamicFeeTxnType = 'DynamicFeeTxnType' +} + +export interface TxnInfo { + from: string + to: string + value: string +} + +export interface TxnTransfer { + transferType: TxnTransferType + contractAddress: string + contractType: ContractType + from: string + to: string + tokenIds?: Array + amounts: Array + logIndex: number + amountsUSD?: Array + pricesUSD?: Array + contractInfo?: ContractInfo + tokenMetadata?: { [key: string]: TokenMetadata } +} + +export enum TxnTransferType { + UNKNOWN = 'UNKNOWN', + SEND = 'SEND', + RECEIVE = 'RECEIVE' +} + +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface WALWriterRuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + percentWALWritten: number +} + +export interface WebhookListener { + id: number + projectID: number + url: string + filters: EventFilter + name: string + updatedAt: string + active: boolean +} + +export interface AddWebhookListenerRequest { + url: string + filters: EventFilter + projectId?: number +} + +export interface AddWebhookListenerResponse { + status: boolean + listener: WebhookListener +} + +export interface FetchTransactionReceiptRequest { + txnHash: string + maxBlockWait?: number +} + +export interface FetchTransactionReceiptResponse { + receipt: TransactionReceipt +} + +export interface FetchTransactionReceiptWithFilterRequest { + filter: TransactionFilter + maxBlockWait?: number +} + +export interface FetchTransactionReceiptWithFilterResponse { + receipt: TransactionReceipt +} + +export interface GetAllWebhookListenersRequest { + projectId?: number +} + +export interface GetAllWebhookListenersResponse { + listeners: Array +} + +export interface GetBalanceUpdatesRequest { + contractAddress: string + lastBlockNumber: number + lastBlockHash?: string + page?: Page +} + +export interface GetBalanceUpdatesResponse { + page: Page + balances: Array +} + +export interface GetChainIDRequest {} + +export interface GetChainIDResponse { + chainID: number +} + +export interface GetEtherBalanceRequest { + accountAddress?: string +} + +export interface GetEtherBalanceResponse { + balance: EtherBalance +} + +export interface GetMarketplaceOrdersRequest { + marketplaceContractAddress: string + collectionAddress: string + filter?: MarketplaceOrderFilter + page?: Page +} + +export interface GetMarketplaceOrdersResponse { + page?: Page + orders: Array +} + +export interface GetMarketplaceTopOrdersRequest { + marketplaceContractAddress: string + collectionAddress: string + filter: MarketplaceTopOrdersFilter +} + +export interface GetMarketplaceTopOrdersResponse { + orders: Array +} + +export interface GetNativeTokenBalanceRequest { + accountAddress?: string + omitPrices?: boolean +} + +export interface GetNativeTokenBalanceResponse { + balance: NativeTokenBalance +} + +export interface GetTokenBalancesRequest { + accountAddress?: string + contractAddress?: string + tokenID?: string + includeMetadata?: boolean + metadataOptions?: MetadataOptions + includeCollectionTokens?: boolean + page?: Page +} + +export interface GetTokenBalancesResponse { + page: Page + balances: Array +} + +export interface GetTokenBalancesByContractRequest { + filter: TokenBalancesByContractFilter + omitMetadata?: boolean + page?: Page +} + +export interface GetTokenBalancesByContractResponse { + page: Page + balances: Array +} + +export interface GetTokenBalancesDetailsRequest { + filter: TokenBalancesFilter + omitMetadata?: boolean + page?: Page +} + +export interface GetTokenBalancesDetailsResponse { + page: Page + nativeBalances: Array + balances: Array +} + +export interface GetTokenBalancesSummaryRequest { + filter: TokenBalancesFilter + omitMetadata?: boolean + page?: Page +} + +export interface GetTokenBalancesSummaryResponse { + page: Page + nativeBalances: Array + balances: Array +} + +export interface GetTokenIDRangesRequest { + contractAddress: string + lastTokenID?: string +} + +export interface GetTokenIDRangesResponse { + contractType: ContractType + tokenIDRanges: Array + moreRanges: boolean +} + +export interface GetTokenIDsRequest { + contractAddress: string + page?: Page +} + +export interface GetTokenIDsResponse { + page: Page + contractType: ContractType + tokenIDs: Array +} + +export interface GetTokenPriceRequest { + q: TokenPriceQuery +} + +export interface GetTokenPriceResponse { + price: Price +} + +export interface GetTokenPricesRequest { + q: Array +} + +export interface GetTokenPricesResponse { + prices: Array +} + +export interface GetTokenSuppliesRequest { + contractAddress: string + includeMetadata?: boolean + page?: Page +} + +export interface GetTokenSuppliesResponse { + page: Page + contractType: ContractType + tokenIDs: Array +} + +export interface GetTokenSuppliesMapRequest { + tokenMap: { [key: string]: Array } + includeMetadata?: boolean +} + +export interface GetTokenSuppliesMapResponse { + supplies: { [key: string]: Array } +} + +export interface GetTransactionHistoryRequest { + filter: TransactionHistoryFilter + page?: Page + includeMetadata?: boolean + metadataOptions?: MetadataOptions +} + +export interface GetTransactionHistoryResponse { + page: Page + transactions: Array +} + +export interface GetWebhookListenerRequest { + id: number + projectId?: number +} + +export interface GetWebhookListenerResponse { + listener: WebhookListener +} + +export interface ListTokenPricesRequest { + page?: Page +} + +export interface ListTokenPricesResponse { + page: Page + prices: Array +} + +export interface PauseAllWebhookListenersRequest { + projectId?: number +} + +export interface PauseAllWebhookListenersResponse { + status: boolean +} + +export interface PingRequest {} + +export interface PingResponse { + status: boolean +} + +export interface RemoveAllWebhookListenersRequest { + projectId?: number +} + +export interface RemoveAllWebhookListenersResponse { + status: boolean +} + +export interface RemoveWebhookListenerRequest { + id: number + projectId?: number +} + +export interface RemoveWebhookListenerResponse { + status: boolean +} + +export interface ResumeAllWebhookListenersRequest { + projectId?: number +} + +export interface ResumeAllWebhookListenersResponse { + status: boolean +} + +export interface RuntimeStatusRequest {} + +export interface RuntimeStatusResponse { + status: RuntimeStatus +} + +export interface SubscribeBalanceUpdatesRequest { + contractAddress: string +} + +export interface SubscribeBalanceUpdatesResponse { + balance: TokenBalance +} + +export interface SubscribeEventsRequest { + filter: EventFilter +} + +export interface SubscribeEventsResponse { + log: EventLog +} + +export interface SubscribeReceiptsRequest { + filter: TransactionFilter +} + +export interface SubscribeReceiptsResponse { + receipt: TransactionReceipt +} + +export interface SyncBalanceRequest { + accountAddress: string + contractAddress: string + tokenID?: string +} + +export interface SyncBalanceResponse {} + +export interface ToggleWebhookListenerRequest { + id: number + projectId?: number +} + +export interface ToggleWebhookListenerResponse { + webhookListener: WebhookListener +} + +export interface UpdateWebhookListenerRequest { + listener: WebhookListener + projectId?: number +} + +export interface UpdateWebhookListenerResponse { + status: boolean +} + +export interface VersionRequest {} + +export interface VersionResponse { + version: Version +} + +// +// Client +// + +export class Indexer implements IndexerClient { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/Indexer/' + + 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 = { + addWebhookListener: (req: AddWebhookListenerRequest) => ['Indexer', 'addWebhookListener', req] as const, + fetchTransactionReceipt: (req: FetchTransactionReceiptRequest) => ['Indexer', 'fetchTransactionReceipt', req] as const, + fetchTransactionReceiptWithFilter: (req: FetchTransactionReceiptWithFilterRequest) => + ['Indexer', 'fetchTransactionReceiptWithFilter', req] as const, + getAllWebhookListeners: (req: GetAllWebhookListenersRequest) => ['Indexer', 'getAllWebhookListeners', req] as const, + getBalanceUpdates: (req: GetBalanceUpdatesRequest) => ['Indexer', 'getBalanceUpdates', req] as const, + getChainID: () => ['Indexer', 'getChainID'] as const, + getEtherBalance: (req: GetEtherBalanceRequest) => ['Indexer', 'getEtherBalance', req] as const, + getMarketplaceOrders: (req: GetMarketplaceOrdersRequest) => ['Indexer', 'getMarketplaceOrders', req] as const, + getMarketplaceTopOrders: (req: GetMarketplaceTopOrdersRequest) => ['Indexer', 'getMarketplaceTopOrders', req] as const, + getNativeTokenBalance: (req: GetNativeTokenBalanceRequest) => ['Indexer', 'getNativeTokenBalance', req] as const, + getTokenBalances: (req: GetTokenBalancesRequest) => ['Indexer', 'getTokenBalances', req] as const, + getTokenBalancesByContract: (req: GetTokenBalancesByContractRequest) => + ['Indexer', 'getTokenBalancesByContract', req] as const, + getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => ['Indexer', 'getTokenBalancesDetails', req] as const, + getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => ['Indexer', 'getTokenBalancesSummary', req] as const, + getTokenIDRanges: (req: GetTokenIDRangesRequest) => ['Indexer', 'getTokenIDRanges', req] as const, + getTokenIDs: (req: GetTokenIDsRequest) => ['Indexer', 'getTokenIDs', req] as const, + getTokenPrice: (req: GetTokenPriceRequest) => ['Indexer', 'getTokenPrice', req] as const, + getTokenPrices: (req: GetTokenPricesRequest) => ['Indexer', 'getTokenPrices', req] as const, + getTokenSupplies: (req: GetTokenSuppliesRequest) => ['Indexer', 'getTokenSupplies', req] as const, + getTokenSuppliesMap: (req: GetTokenSuppliesMapRequest) => ['Indexer', 'getTokenSuppliesMap', req] as const, + getTransactionHistory: (req: GetTransactionHistoryRequest) => ['Indexer', 'getTransactionHistory', req] as const, + getWebhookListener: (req: GetWebhookListenerRequest) => ['Indexer', 'getWebhookListener', req] as const, + listTokenPrices: (req: ListTokenPricesRequest) => ['Indexer', 'listTokenPrices', req] as const, + pauseAllWebhookListeners: (req: PauseAllWebhookListenersRequest) => ['Indexer', 'pauseAllWebhookListeners', req] as const, + ping: () => ['Indexer', 'ping'] as const, + removeAllWebhookListeners: (req: RemoveAllWebhookListenersRequest) => ['Indexer', 'removeAllWebhookListeners', req] as const, + removeWebhookListener: (req: RemoveWebhookListenerRequest) => ['Indexer', 'removeWebhookListener', req] as const, + resumeAllWebhookListeners: (req: ResumeAllWebhookListenersRequest) => ['Indexer', 'resumeAllWebhookListeners', req] as const, + runtimeStatus: () => ['Indexer', 'runtimeStatus'] as const, + subscribeBalanceUpdates: (req: SubscribeBalanceUpdatesRequest) => ['Indexer', 'subscribeBalanceUpdates', req] as const, + subscribeEvents: (req: SubscribeEventsRequest) => ['Indexer', 'subscribeEvents', req] as const, + subscribeReceipts: (req: SubscribeReceiptsRequest) => ['Indexer', 'subscribeReceipts', req] as const, + syncBalance: (req: SyncBalanceRequest) => ['Indexer', 'syncBalance', req] as const, + toggleWebhookListener: (req: ToggleWebhookListenerRequest) => ['Indexer', 'toggleWebhookListener', req] as const, + updateWebhookListener: (req: UpdateWebhookListenerRequest) => ['Indexer', 'updateWebhookListener', req] as const, + version: () => ['Indexer', 'version'] as const + } + + addWebhookListener = ( + req: AddWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('AddWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'AddWebhookListenerResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + fetchTransactionReceipt = ( + req: FetchTransactionReceiptRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('FetchTransactionReceipt'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'FetchTransactionReceiptResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + fetchTransactionReceiptWithFilter = ( + req: FetchTransactionReceiptWithFilterRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('FetchTransactionReceiptWithFilter'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'FetchTransactionReceiptWithFilterResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getAllWebhookListeners = ( + req: GetAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetAllWebhookListenersResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getBalanceUpdates = ( + req: GetBalanceUpdatesRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetBalanceUpdates'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetBalanceUpdatesResponse') + }) + }, + error => { + 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( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetChainIDResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getEtherBalance = (req: GetEtherBalanceRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetEtherBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetEtherBalanceResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getMarketplaceOrders = ( + req: GetMarketplaceOrdersRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetMarketplaceOrders'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetMarketplaceOrdersResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getMarketplaceTopOrders = ( + req: GetMarketplaceTopOrdersRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetMarketplaceTopOrders'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetMarketplaceTopOrdersResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getNativeTokenBalance = ( + req: GetNativeTokenBalanceRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetNativeTokenBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetNativeTokenBalanceResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalances = ( + req: GetTokenBalancesRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalances'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalancesByContract = ( + req: GetTokenBalancesByContractRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesByContract'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesByContractResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalancesDetails = ( + req: GetTokenBalancesDetailsRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesDetails'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesDetailsResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalancesSummary = ( + req: GetTokenBalancesSummaryRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesSummary'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesSummaryResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenIDRanges = ( + req: GetTokenIDRangesRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenIDRanges'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenIDRangesResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenIDs = (req: GetTokenIDsRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenIDs'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenIDsResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenPrice = (req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenPrice'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenPriceResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenPrices = (req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenPricesResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenSupplies = ( + req: GetTokenSuppliesRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenSupplies'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenSuppliesResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenSuppliesMap = ( + req: GetTokenSuppliesMapRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenSuppliesMap'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenSuppliesMapResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTransactionHistory = ( + req: GetTransactionHistoryRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTransactionHistory'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTransactionHistoryResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getWebhookListener = ( + req: GetWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetWebhookListenerResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + listTokenPrices = (req: ListTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ListTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'ListTokenPricesResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + pauseAllWebhookListeners = ( + req: PauseAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('PauseAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'PauseAllWebhookListenersResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'PingResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + removeAllWebhookListeners = ( + req: RemoveAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('RemoveAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'RemoveAllWebhookListenersResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + removeWebhookListener = ( + req: RemoveWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('RemoveWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'RemoveWebhookListenerResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + resumeAllWebhookListeners = ( + req: ResumeAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ResumeAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'ResumeAllWebhookListenersResponse') + }) + }, + error => { + 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( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'RuntimeStatusResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + subscribeBalanceUpdates = ( + req: SubscribeBalanceUpdatesRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController => { + const abortController = new AbortController() + const abortSignal = abortController.signal + + if (options.signal) { + abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { + signal: options.signal + }) + } + + const _fetch = () => + this.fetch(this.url('SubscribeBalanceUpdates'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( + async res => { + await sseResponse(res, options, _fetch) + }, + error => { + options.onError(error, _fetch) + } + ) + + const resp = _fetch() + return { + abort: abortController.abort.bind(abortController), + closed: resp + } + } + subscribeEvents = ( + req: SubscribeEventsRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController => { + const abortController = new AbortController() + const abortSignal = abortController.signal + + if (options.signal) { + abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { + signal: options.signal + }) + } + + const _fetch = () => + this.fetch(this.url('SubscribeEvents'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( + async res => { + await sseResponse(res, options, _fetch) + }, + error => { + options.onError(error, _fetch) + } + ) + + const resp = _fetch() + return { + abort: abortController.abort.bind(abortController), + closed: resp + } + } + subscribeReceipts = ( + req: SubscribeReceiptsRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController => { + const abortController = new AbortController() + const abortSignal = abortController.signal + + if (options.signal) { + abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { + signal: options.signal + }) + } + + const _fetch = () => + this.fetch(this.url('SubscribeReceipts'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( + async res => { + await sseResponse(res, options, _fetch) + }, + error => { + options.onError(error, _fetch) + } + ) + + const resp = _fetch() + return { + abort: abortController.abort.bind(abortController), + closed: resp + } + } + syncBalance = (req: SyncBalanceRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SyncBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'SyncBalanceResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + toggleWebhookListener = ( + req: ToggleWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ToggleWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'ToggleWebhookListenerResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + updateWebhookListener = ( + req: UpdateWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('UpdateWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'UpdateWebhookListenerResponse') + }) + }, + error => { + 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( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'VersionResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } +} + +const sseResponse = async (res: Response, options: WebrpcStreamOptions, retryFetch: () => Promise) => { + const { onMessage, onOpen, onClose, onError } = options + + if (!res.ok) { + try { + await buildResponse(res) + } catch (error) { + // @ts-ignore + onError(error, retryFetch) + } + return + } + + if (!res.body) { + onError( + WebrpcBadResponseError.new({ + status: res.status, + cause: 'Invalid response, missing body' + }), + retryFetch + ) + return + } + + onOpen && onOpen() + + const reader = res.body.getReader() + const decoder = new TextDecoder() + let buffer = '' + let lastReadTime = Date.now() + const timeout = (10 + 1) * 1000 + let timeoutError = false + const intervalId = setInterval(() => { + if (Date.now() - lastReadTime > timeout) { + timeoutError = true + clearInterval(intervalId) + reader.releaseLock() + } + }, timeout) + + while (true) { + let value + let done + try { + ;({ value, done } = await reader.read()) + if (timeoutError) throw new Error('Timeout, no data or heartbeat received') + lastReadTime = Date.now() + buffer += decoder.decode(value, { stream: true }) + } catch (error) { + if (error instanceof DOMException && error.name === 'AbortError') { + onError( + WebrpcClientAbortedError.new({ + message: 'AbortError', + cause: `AbortError: ${error instanceof Error ? error.message : String(error)}` + }), + () => { + throw new Error('Abort signal cannot be used to reconnect') + } + ) + } else { + onError( + WebrpcStreamLostError.new({ + cause: `reader.read(): ${error instanceof Error ? error.message : String(error)}` + }), + retryFetch + ) + } + return + } + + let lines = buffer.split('\n') + for (let i = 0; i < lines.length - 1; i++) { + const line = lines[i] + if (line?.length === 0) { + continue + } + let data: any + try { + data = JSON.parse(line) + if (data.hasOwnProperty('webrpcError')) { + const error = data.webrpcError + const code: number = typeof error.code === 'number' ? error.code : 0 + onError((webrpcErrorByCode[code] || WebrpcError).new(error), retryFetch) + return + } + } catch (error) { + if (error instanceof Error && error.message === 'Abort signal cannot be used to reconnect') { + throw error + } + onError( + WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}` + }), + retryFetch + ) + } + onMessage(data) + } + + if (!done) { + const lastLine = lines[lines.length - 1] + buffer = lastLine || '' + continue + } + + onClose && onClose() + return + } +} + +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 => { + 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 interface WebrpcStreamOptions extends WebrpcOptions { + onMessage: (message: T) => void + onError: (error: WebrpcError, reconnect: () => void) => void + onOpen?: () => void + onClose?: () => void +} + +export interface WebrpcOptions { + headers?: HeadersInit + signal?: AbortSignal +} + +export interface WebrpcStreamController { + abort: (reason?: any) => void + closed: Promise +} + +export const JsonEncode = (obj: T): 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 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 AccessKeyMismatchError extends WebrpcError { + 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 AccessKeyNotFoundError extends WebrpcError { + 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 AtLeastOneKeyError extends WebrpcError { + 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 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 InvalidArgumentError extends WebrpcError { + 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 InvalidOriginError extends WebrpcError { + 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(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 MaxAccessKeysError extends WebrpcError { + 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 MetadataCallFailedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'MetadataCallFailed' + this.code = typeof error.code === 'number' ? error.code : 3003 + this.message = error.message || `Metadata service call failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, MetadataCallFailedError.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 NoDefaultKeyError extends WebrpcError { + 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 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 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 ProjectNotFoundError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ProjectNotFound' + this.code = typeof error.code === 'number' ? error.code : 1100 + 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 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 QuotaExceededError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QuotaExceeded' + this.code = typeof error.code === 'number' ? error.code : 1200 + this.message = error.message || `Quota 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 RateLimitError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'RateLimit' + this.code = typeof error.code === 'number' ? error.code : 1201 + this.message = error.message || `Rate limit exceeded` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, RateLimitError.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 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 ResourceExhaustedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ResourceExhausted' + this.code = typeof error.code === 'number' ? error.code : 2004 + this.message = error.message || `Resource exhausted` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, ResourceExhaustedError.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 TimeoutError extends WebrpcError { + 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 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 UnauthorizedUserError extends WebrpcError { + 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 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 enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientAborted = 'WebrpcClientAborted', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Aborted = 'Aborted', + AccessKeyMismatch = 'AccessKeyMismatch', + AccessKeyNotFound = 'AccessKeyNotFound', + AtLeastOneKey = 'AtLeastOneKey', + Geoblocked = 'Geoblocked', + InvalidArgument = 'InvalidArgument', + InvalidOrigin = 'InvalidOrigin', + InvalidService = 'InvalidService', + MaxAccessKeys = 'MaxAccessKeys', + MetadataCallFailed = 'MetadataCallFailed', + MethodNotFound = 'MethodNotFound', + NoDefaultKey = 'NoDefaultKey', + NotFound = 'NotFound', + PermissionDenied = 'PermissionDenied', + ProjectNotFound = 'ProjectNotFound', + QueryFailed = 'QueryFailed', + QuotaExceeded = 'QuotaExceeded', + RateLimit = 'RateLimit', + RateLimited = 'RateLimited', + RequestConflict = 'RequestConflict', + ResourceExhausted = 'ResourceExhausted', + SessionExpired = 'SessionExpired', + Timeout = 'Timeout', + Unauthorized = 'Unauthorized', + UnauthorizedUser = 'UnauthorizedUser', + Unavailable = 'Unavailable' +} + +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, + Aborted = 1005, + AccessKeyMismatch = 1102, + AccessKeyNotFound = 1101, + AtLeastOneKey = 1302, + Geoblocked = 1006, + InvalidArgument = 2001, + InvalidOrigin = 1103, + InvalidService = 1104, + MaxAccessKeys = 1301, + MetadataCallFailed = 3003, + MethodNotFound = 1003, + NoDefaultKey = 1300, + NotFound = 3000, + PermissionDenied = 1001, + ProjectNotFound = 1100, + QueryFailed = 2003, + QuotaExceeded = 1200, + RateLimit = 1201, + RateLimited = 1007, + RequestConflict = 1004, + ResourceExhausted = 2004, + SessionExpired = 1002, + Timeout = 1900, + Unauthorized = 1000, + UnauthorizedUser = 1105, + Unavailable = 2002 +} + +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, + [1005]: AbortedError, + [1102]: AccessKeyMismatchError, + [1101]: AccessKeyNotFoundError, + [1302]: AtLeastOneKeyError, + [1006]: GeoblockedError, + [2001]: InvalidArgumentError, + [1103]: InvalidOriginError, + [1104]: InvalidServiceError, + [1301]: MaxAccessKeysError, + [3003]: MetadataCallFailedError, + [1003]: MethodNotFoundError, + [1300]: NoDefaultKeyError, + [3000]: NotFoundError, + [1001]: PermissionDeniedError, + [1100]: ProjectNotFoundError, + [2003]: QueryFailedError, + [1200]: QuotaExceededError, + [1201]: RateLimitError, + [1007]: RateLimitedError, + [1004]: RequestConflictError, + [2004]: ResourceExhaustedError, + [1002]: SessionExpiredError, + [1900]: TimeoutError, + [1000]: UnauthorizedError, + [1105]: UnauthorizedUserError, + [2002]: UnavailableError +} + +// +// Webrpc +// + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.31.2;gen-typescript@v0.23.1;sequence-indexer@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 ?? '' + } +} diff --git a/packages/indexer/src/indexergw.gen.ts b/packages/indexer/src/indexergw.gen.ts new file mode 100644 index 000000000..729d04cdc --- /dev/null +++ b/packages/indexer/src/indexergw.gen.ts @@ -0,0 +1,1787 @@ +/* eslint-disable */ +// sequence-indexer v0.4.0 b978d153702d614d5f1b9c98ff7f2e5857cccfd6 +// -- +// Code generated by Webrpc-gen@v0.31.2 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=merged.gen.json -service=IndexerGateway -target=typescript -client -out=./clients/indexergw.gen.ts + +// Webrpc description and code-gen version +export const WebrpcVersion = 'v1' + +// Schema version of your RIDL schema +export const WebrpcSchemaVersion = 'v0.4.0' + +// Schema hash generated from your RIDL schema +export const WebrpcSchemaHash = 'b978d153702d614d5f1b9c98ff7f2e5857cccfd6' + +// +// Client interface +// + +export interface IndexerGatewayClient { + /** + * GetTokenBalances returns a balance summary/details for an specific account + * on all indexer nodes. By default if accountAddress is left empty, it will + * use the account from the jwt session. + */ + getBalanceUpdates(req: GetBalanceUpdatesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetChains returns a list of chains with their ID and name + */ + getChains(req: GetChainsRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetNativeTokenBalance queries indexer nodes for the latest native token + * account balance. + */ + getNativeTokenBalance( + req: GetNativeTokenBalanceRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalances returns a balance summary/details for a specific account + * on all indexer nodes. By default if accountAddress is left empty, it will + * use the account from the jwt session. + * + * @deprecated Use GetTokenBalancesSummary or GetTokenBalancesDetails instead. + */ + getTokenBalances(req: GetTokenBalancesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenBalancesByContract returns a balances for specific accounts and + * contracts on all indexer nodes. The collection ERC721 & ERC1155 tokens are + * represented as individual balances. + */ + getTokenBalancesByContract( + req: GetTokenBalancesByContractRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalancesDetails returns a detailed balance summary for the given + * accounts on all indexer nodes. The collection ERC721 & ERC1155 tokens are + * represented as individual balances. + */ + getTokenBalancesDetails( + req: GetTokenBalancesDetailsRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalancesSummary returns a summary of token balances for the given + * accounts on all indexer nodes. The collection ERC721 & ERC1155 tokens are + * represented as a single aggregated balance. + */ + getTokenBalancesSummary( + req: GetTokenBalancesSummaryRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + getTokenPrice(req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise + + getTokenPrices(req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTransactionHistory returns the history of mined transactions for the + * given account on all indexer nodes, which includes a list of token transfer + * (sent/received) , and sent transactions from a Sequence wallet. + */ + getTransactionHistory( + req: GetTransactionHistoryRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Ping the indexer + */ + ping(headers?: object, signal?: AbortSignal): Promise + + /** + * Get the current runtime health status of the indexer gatewya + */ + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + + /** + * Get the current version of the indexer + */ + version(headers?: object, signal?: AbortSignal): Promise +} + +// +// Schema types +// + +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 BloomStats { + hitRatio: string + falsePositivesPercent: string + hitCount: number + missCount: number + falsePositives: number +} + +export interface BloomStatus { + enabled: boolean + initialized: boolean + bloomInitElapsedTime: string + stats: BloomStats +} + +export interface Bond { + pebble: PebbleMetrics + estimatedDiskUsagePerTable: any + estimatedDiskUsageTotal: string +} + +export interface ChainInfo { + chainId: number + chainName: string +} + +export interface ContractInfo { + chainId: number + address: string + source: string + name: string + type: string + symbol: string + decimals?: number + logoURI: string + deployed: boolean + bytecodeHash: string + extensions: ContractInfoExtensions + updatedAt: string + queuedAt?: string + status: ResourceStatus +} + +export interface ContractInfoExtensionBridgeInfo { + tokenAddress: string +} + +export interface ContractInfoExtensionIndexingInfo { + useOnChainBalance: boolean +} + +export interface ContractInfoExtensions { + link?: string + description?: string + categories?: Array + bridgeInfo?: { [key: string]: ContractInfoExtensionBridgeInfo } + indexingInfo?: ContractInfoExtensionIndexingInfo + ogImage?: string + ogName?: string + originChainId?: number + originAddress?: string + blacklist?: boolean + verified?: boolean + verifiedBy?: string + featured?: boolean + featureIndex?: number +} + +export enum ContractType { + UNKNOWN = 'UNKNOWN', + NATIVE = 'NATIVE', + ERC20 = 'ERC20', + ERC721 = 'ERC721', + ERC1155 = 'ERC1155', + SEQUENCE_WALLET = 'SEQUENCE_WALLET', + ERC20_BRIDGE = 'ERC20_BRIDGE', + ERC721_BRIDGE = 'ERC721_BRIDGE', + ERC1155_BRIDGE = 'ERC1155_BRIDGE', + SEQ_MARKETPLACE = 'SEQ_MARKETPLACE', + ERC6909 = 'ERC6909' +} + +export enum ContractVerificationStatus { + VERIFIED = 'VERIFIED', + UNVERIFIED = 'UNVERIFIED', + ALL = 'ALL' +} + +export interface DiskUsage { + humanReadable: string + used: number + size: number + percent: number + dirs: { [key: string]: string } +} + +export interface EtherBalance { + accountAddress: string + balanceWei: string +} + +export interface EventDecoded { + topicHash: string + eventSig: string + types: Array + names: Array + values: Array +} + +export interface EventFilter { + events?: Array + contractAddresses?: Array + accounts?: Array + tokenIDs?: Array +} + +export interface EventLog { + id: number + uid: string + type: EventLogType + blockNumber: number + blockHash: string + parentBlockHash: string + contractAddress: string + contractType: ContractType + txnHash: string + txnIndex: number + txnLogIndex: number + logDataType: EventLogDataType + ts: string + txnInfo?: TxnInfo + rawLog?: { [key: string]: any } + event?: EventDecoded +} + +export enum EventLogDataType { + EVENT = 'EVENT', + TOKEN_TRANSFER = 'TOKEN_TRANSFER', + NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', + SEQUENCE_TXN = 'SEQUENCE_TXN' +} + +export enum EventLogType { + UNKNOWN = 'UNKNOWN', + BLOCK_ADDED = 'BLOCK_ADDED', + BLOCK_REMOVED = 'BLOCK_REMOVED' +} + +export interface GatewayBackendResponseTime { + percentiles: { [key: string]: number } + average: number +} + +export interface GatewayBackendRuntimeStatus { + name: string + chainId: number + responseTime: GatewayBackendResponseTime +} + +export interface GatewayEtherBalance { + chainId: number + errorReason?: string + result: EtherBalance +} + +export interface GatewayNativeTokenBalance { + chainId: number + errorReason?: string + result: NativeTokenBalance +} + +export interface GatewayNativeTokenBalances { + chainId: number + errorReason?: string + results: Array +} + +export interface GatewayPrice { + chainID: number + errorReason?: string + results: Array +} + +export interface GatewayRuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + backends: Array +} + +export interface GatewayTokenBalance { + chainId: number + errorReason?: string + results: Array +} + +export interface GatewayTokenPriceQuery { + chainID: number + queries: Array +} + +export interface GatewayTransaction { + chainId: number + errorReason?: string + results: Array +} + +export interface IndexState { + chainId: string + lastBlockNum: number + lastBlockHash: string +} + +export interface IndexedBlock { + blockNumber: number + blockShortHash: string +} + +export interface IndexerMetrics { + blocksPerSecond: number + eventsPerSecond: number +} + +export interface MarketplaceOrder { + orderId: string + tokenContract: string + tokenId: string + isListing: boolean + quantity: string + quantityRemaining: string + currencyAddress: string + pricePerToken: string + expiry: string + orderStatus: OrderStatus + createdBy: string + blockNumber: number + orderbookContractAddress: string + createdAt: number +} + +export interface MarketplaceOrderFilter { + isListing?: boolean + userAddresses?: Array + currencyAddresses: Array + orderIds: Array + tokenIds: Array + excludeUserAddresses?: Array + blockNumberGt: number + createdAtAfter: number + orderStatuses: Array + returnExpired: boolean +} + +export interface MarketplaceTopOrdersFilter { + currencyAddresses: Array + tokenIds: Array + isListing: boolean + priceSort: SortOrder + excludeUser?: string +} + +export interface MetadataOptions { + verifiedOnly?: boolean + unverifiedOnly?: boolean + includeContracts?: Array +} + +export interface NativeTokenBalance { + accountAddress: string + chainId: number + name: string + symbol: string + balance: string + balanceUSD: string + priceUSD: string + priceUpdatedAt?: string + errorReason?: string +} + +export enum NetworkType { + MAINNETS = 'MAINNETS', + TESTNETS = 'TESTNETS', + ALL = 'ALL' +} + +export enum OrderStatus { + OPEN = 'OPEN', + CLOSED = 'CLOSED', + CANCELLED = 'CANCELLED' +} + +export interface Page { + page?: number + column?: string + before?: any + after?: any + sort?: Array + pageSize?: number + more?: boolean +} + +export interface PebbleMetrics { + compactionCount: number + compactionEstimatedDebt: number + compactionInProgressBytes: number + compactionNumInProgress: number + compactionMarkedFiles: number +} + +export interface Price { + contractAddress: string + tokenID?: string + priceUSD: string + updatedAt?: string +} + +export enum ResourceStatus { + NOT_AVAILABLE = 'NOT_AVAILABLE', + REFRESHING = 'REFRESHING', + AVAILABLE = 'AVAILABLE' +} + +export interface RuntimeChecks { + running: boolean + runnables: any + cgoEnabled: boolean + quotaControlEnabled: boolean + syncMode: string + percentIndexed: number + lastBlockNum: number + lastBlockNumWithState: number + bloomStatus: BloomStatus + bond: Bond + diskUsage: DiskUsage + metrics: IndexerMetrics +} + +export interface RuntimeStatus { + healthOK: boolean + indexerEnabled: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + checks: RuntimeChecks +} + +export interface SortBy { + column: string + order: SortOrder +} + +export enum SortOrder { + DESC = 'DESC', + ASC = 'ASC' +} + +export interface TokenBalance { + contractType: ContractType + contractAddress: string + accountAddress: string + tokenID?: string + balance: string + balanceUSD: string + priceUSD: string + priceUpdatedAt?: string + blockHash: string + blockNumber: number + chainId: number + uniqueCollectibles: string + isSummary: boolean + contractInfo?: ContractInfo + tokenMetadata?: TokenMetadata +} + +export interface TokenBalanceFilter { + contractAddress: string + sinceBlockNumber: number +} + +export interface TokenBalancesByContractFilter { + contractAddresses: Array + accountAddresses?: Array + contractStatus?: ContractVerificationStatus + tokenIDs?: Array +} + +export interface TokenBalancesFilter { + accountAddresses: Array + contractStatus?: ContractVerificationStatus + contractTypes?: Array + contractWhitelist?: Array + contractBlacklist?: Array + omitNativeBalances: boolean + omitPrices?: boolean + tokenIDs?: Array +} + +export interface TokenHistory { + blockNumber: number + blockHash: string + contractAddress: string + contractType: ContractType + fromAddress: string + toAddress: string + txnHash: string + txnIndex: number + txnLogIndex: number + tokenIDs: string + amounts: string + ts: string +} + +export interface TokenIDRange { + start: string + end: string +} + +export interface TokenMetadata { + chainId?: number + contractAddress?: string + tokenId: string + source: 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: ResourceStatus + queuedAt?: string + lastFetched?: string +} + +export interface TokenPriceQuery { + contractAddress: string + tokenID?: string +} + +export interface TokenSupply { + tokenID: string + supply: string + chainId: number + contractInfo?: ContractInfo + tokenMetadata?: TokenMetadata +} + +export interface Transaction { + txnHash: string + blockNumber: number + blockHash: string + chainId: number + metaTxnID?: string + transfers?: Array + timestamp: string +} + +export interface TransactionFilter { + txnHash?: string + from?: string + to?: string + contractAddress?: string + event?: string +} + +export interface TransactionHistoryFilter { + accountAddress?: string + contractAddress?: string + accountAddresses?: Array + contractAddresses?: Array + transactionHashes?: Array + metaTransactionIDs?: Array + fromBlock?: number + toBlock?: number + tokenID?: string + omitPrices?: boolean +} + +export interface TransactionLog { + contractAddress: string + topics: Array + data: string + index: number +} + +export interface TransactionReceipt { + txnHash: string + txnStatus: TransactionStatus + txnIndex: number + txnType: TransactionType + blockHash: string + blockNumber: number + gasUsed: number + effectiveGasPrice: string + from: string + to: string + logs: Array + final: boolean + reorged: boolean +} + +export enum TransactionStatus { + FAILED = 'FAILED', + SUCCESSFUL = 'SUCCESSFUL' +} + +export enum TransactionType { + LegacyTxnType = 'LegacyTxnType', + AccessListTxnType = 'AccessListTxnType', + DynamicFeeTxnType = 'DynamicFeeTxnType' +} + +export interface TxnInfo { + from: string + to: string + value: string +} + +export interface TxnTransfer { + transferType: TxnTransferType + contractAddress: string + contractType: ContractType + from: string + to: string + tokenIds?: Array + amounts: Array + logIndex: number + amountsUSD?: Array + pricesUSD?: Array + contractInfo?: ContractInfo + tokenMetadata?: { [key: string]: TokenMetadata } +} + +export enum TxnTransferType { + UNKNOWN = 'UNKNOWN', + SEND = 'SEND', + RECEIVE = 'RECEIVE' +} + +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface WALWriterRuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + percentWALWritten: number +} + +export interface WebhookListener { + id: number + projectID: number + url: string + filters: EventFilter + name: string + updatedAt: string + active: boolean +} + +export interface GetBalanceUpdatesRequest { + chainIds?: Array + networks?: Array + networkType?: NetworkType + contractAddress: string + lastBlockNumber: number + lastBlockHash?: string + page?: Page +} + +export interface GetBalanceUpdatesResponse { + page: Page + balances: Array +} + +export interface GetChainsRequest { + networkType?: NetworkType +} + +export interface GetChainsResponse { + chains: Array +} + +export interface GetNativeTokenBalanceRequest { + chainIds?: Array + networks?: Array + networkType?: NetworkType + accountAddress?: string + omitPrices?: boolean +} + +export interface GetNativeTokenBalanceResponse { + balances: Array +} + +export interface GetTokenBalancesRequest { + chainIds?: Array + networks?: Array + networkType?: NetworkType + accountAddress?: string + contractAddress?: string + tokenID?: string + includeMetadata?: boolean + metadataOptions?: MetadataOptions + includeCollectionTokens?: boolean + page?: Page +} + +export interface GetTokenBalancesResponse { + page: Page + balances: Array +} + +export interface GetTokenBalancesByContractRequest { + chainIds?: Array + networks?: Array + networkType?: NetworkType + filter: TokenBalancesByContractFilter + omitMetadata?: boolean + page?: Page +} + +export interface GetTokenBalancesByContractResponse { + page: Page + balances: Array +} + +export interface GetTokenBalancesDetailsRequest { + chainIds?: Array + networks?: Array + networkType?: NetworkType + filter: TokenBalancesFilter + omitMetadata?: boolean + page?: Page +} + +export interface GetTokenBalancesDetailsResponse { + page: Page + nativeBalances: Array + balances: Array +} + +export interface GetTokenBalancesSummaryRequest { + chainIds?: Array + networks?: Array + networkType?: NetworkType + filter: TokenBalancesFilter + omitMetadata?: boolean + page?: Page +} + +export interface GetTokenBalancesSummaryResponse { + page: Page + nativeBalances: Array + balances: Array +} + +export interface GetTokenPriceRequest { + q: GatewayTokenPriceQuery +} + +export interface GetTokenPriceResponse { + price: GatewayPrice +} + +export interface GetTokenPricesRequest { + q: Array +} + +export interface GetTokenPricesResponse { + prices: Array +} + +export interface GetTransactionHistoryRequest { + chainIds?: Array + networks?: Array + networkType?: NetworkType + filter: TransactionHistoryFilter + includeMetadata?: boolean + metadataOptions?: MetadataOptions + page?: Page +} + +export interface GetTransactionHistoryResponse { + page: Page + transactions: Array +} + +export interface PingRequest {} + +export interface PingResponse { + status: boolean +} + +export interface RuntimeStatusRequest {} + +export interface RuntimeStatusResponse { + status: GatewayRuntimeStatus +} + +export interface VersionRequest {} + +export interface VersionResponse { + version: Version +} + +// +// Client +// + +export class IndexerGateway implements IndexerGatewayClient { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/IndexerGateway/' + + 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 = { + getBalanceUpdates: (req: GetBalanceUpdatesRequest) => ['IndexerGateway', 'getBalanceUpdates', req] as const, + getChains: (req: GetChainsRequest) => ['IndexerGateway', 'getChains', req] as const, + getNativeTokenBalance: (req: GetNativeTokenBalanceRequest) => ['IndexerGateway', 'getNativeTokenBalance', req] as const, + getTokenBalances: (req: GetTokenBalancesRequest) => ['IndexerGateway', 'getTokenBalances', req] as const, + getTokenBalancesByContract: (req: GetTokenBalancesByContractRequest) => + ['IndexerGateway', 'getTokenBalancesByContract', req] as const, + getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => ['IndexerGateway', 'getTokenBalancesDetails', req] as const, + getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => ['IndexerGateway', 'getTokenBalancesSummary', req] as const, + getTokenPrice: (req: GetTokenPriceRequest) => ['IndexerGateway', 'getTokenPrice', req] as const, + getTokenPrices: (req: GetTokenPricesRequest) => ['IndexerGateway', 'getTokenPrices', req] as const, + getTransactionHistory: (req: GetTransactionHistoryRequest) => ['IndexerGateway', 'getTransactionHistory', req] as const, + ping: () => ['IndexerGateway', 'ping'] as const, + runtimeStatus: () => ['IndexerGateway', 'runtimeStatus'] as const, + version: () => ['IndexerGateway', 'version'] as const + } + + getBalanceUpdates = ( + req: GetBalanceUpdatesRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetBalanceUpdates'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetBalanceUpdatesResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getChains = (req: GetChainsRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetChains'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetChainsResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getNativeTokenBalance = ( + req: GetNativeTokenBalanceRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetNativeTokenBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetNativeTokenBalanceResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalances = ( + req: GetTokenBalancesRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalances'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalancesByContract = ( + req: GetTokenBalancesByContractRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesByContract'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesByContractResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalancesDetails = ( + req: GetTokenBalancesDetailsRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesDetails'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesDetailsResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalancesSummary = ( + req: GetTokenBalancesSummaryRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesSummary'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesSummaryResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenPrice = (req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenPrice'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenPriceResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenPrices = (req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenPricesResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTransactionHistory = ( + req: GetTransactionHistoryRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTransactionHistory'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTransactionHistoryResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'PingResponse') + }) + }, + error => { + 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( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'RuntimeStatusResponse') + }) + }, + error => { + 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( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'VersionResponse') + }) + }, + 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', + [WebrpcHeader]: WebrpcHeaderValue + } + 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): 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 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 AccessKeyMismatchError extends WebrpcError { + 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 AccessKeyNotFoundError extends WebrpcError { + 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 AtLeastOneKeyError extends WebrpcError { + 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 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 InvalidArgumentError extends WebrpcError { + 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 InvalidOriginError extends WebrpcError { + 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(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 MaxAccessKeysError extends WebrpcError { + 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 MetadataCallFailedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'MetadataCallFailed' + this.code = typeof error.code === 'number' ? error.code : 3003 + this.message = error.message || `Metadata service call failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, MetadataCallFailedError.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 NoDefaultKeyError extends WebrpcError { + 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 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 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 ProjectNotFoundError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ProjectNotFound' + this.code = typeof error.code === 'number' ? error.code : 1100 + 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 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 QuotaExceededError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QuotaExceeded' + this.code = typeof error.code === 'number' ? error.code : 1200 + this.message = error.message || `Quota 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 RateLimitError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'RateLimit' + this.code = typeof error.code === 'number' ? error.code : 1201 + this.message = error.message || `Rate limit exceeded` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, RateLimitError.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 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 ResourceExhaustedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ResourceExhausted' + this.code = typeof error.code === 'number' ? error.code : 2004 + this.message = error.message || `Resource exhausted` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, ResourceExhaustedError.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 TimeoutError extends WebrpcError { + 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 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 UnauthorizedUserError extends WebrpcError { + 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 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 enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientAborted = 'WebrpcClientAborted', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Aborted = 'Aborted', + AccessKeyMismatch = 'AccessKeyMismatch', + AccessKeyNotFound = 'AccessKeyNotFound', + AtLeastOneKey = 'AtLeastOneKey', + Geoblocked = 'Geoblocked', + InvalidArgument = 'InvalidArgument', + InvalidOrigin = 'InvalidOrigin', + InvalidService = 'InvalidService', + MaxAccessKeys = 'MaxAccessKeys', + MetadataCallFailed = 'MetadataCallFailed', + MethodNotFound = 'MethodNotFound', + NoDefaultKey = 'NoDefaultKey', + NotFound = 'NotFound', + PermissionDenied = 'PermissionDenied', + ProjectNotFound = 'ProjectNotFound', + QueryFailed = 'QueryFailed', + QuotaExceeded = 'QuotaExceeded', + RateLimit = 'RateLimit', + RateLimited = 'RateLimited', + RequestConflict = 'RequestConflict', + ResourceExhausted = 'ResourceExhausted', + SessionExpired = 'SessionExpired', + Timeout = 'Timeout', + Unauthorized = 'Unauthorized', + UnauthorizedUser = 'UnauthorizedUser', + Unavailable = 'Unavailable' +} + +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, + Aborted = 1005, + AccessKeyMismatch = 1102, + AccessKeyNotFound = 1101, + AtLeastOneKey = 1302, + Geoblocked = 1006, + InvalidArgument = 2001, + InvalidOrigin = 1103, + InvalidService = 1104, + MaxAccessKeys = 1301, + MetadataCallFailed = 3003, + MethodNotFound = 1003, + NoDefaultKey = 1300, + NotFound = 3000, + PermissionDenied = 1001, + ProjectNotFound = 1100, + QueryFailed = 2003, + QuotaExceeded = 1200, + RateLimit = 1201, + RateLimited = 1007, + RequestConflict = 1004, + ResourceExhausted = 2004, + SessionExpired = 1002, + Timeout = 1900, + Unauthorized = 1000, + UnauthorizedUser = 1105, + Unavailable = 2002 +} + +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, + [1005]: AbortedError, + [1102]: AccessKeyMismatchError, + [1101]: AccessKeyNotFoundError, + [1302]: AtLeastOneKeyError, + [1006]: GeoblockedError, + [2001]: InvalidArgumentError, + [1103]: InvalidOriginError, + [1104]: InvalidServiceError, + [1301]: MaxAccessKeysError, + [3003]: MetadataCallFailedError, + [1003]: MethodNotFoundError, + [1300]: NoDefaultKeyError, + [3000]: NotFoundError, + [1001]: PermissionDeniedError, + [1100]: ProjectNotFoundError, + [2003]: QueryFailedError, + [1200]: QuotaExceededError, + [1201]: RateLimitError, + [1007]: RateLimitedError, + [1004]: RequestConflictError, + [2004]: ResourceExhaustedError, + [1002]: SessionExpiredError, + [1900]: TimeoutError, + [1000]: UnauthorizedError, + [1105]: UnauthorizedUserError, + [2002]: UnavailableError +} + +// +// Webrpc +// + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.31.2;gen-typescript@v0.23.1;sequence-indexer@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 a4db649d1894f10f9356f44cf511d7dd23c5bd0b Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 16 Feb 2026 18:32:16 +0100 Subject: [PATCH 086/144] Add Berachain, Sonic, HyperEVM --- packages/wallet/primitives/src/network.ts | 64 +++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index e3ddfb6d8..b9b79a8f7 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -130,6 +130,15 @@ export const ChainId = { // ARC ARC_TESTNET: 5042002, + + // HYPEREVM + HYPEREVM: 999, + + // SONIC + SONIC: 146, + + // BERACHAIN + BERACHAIN: 80094, } as const export type ChainId = (typeof ChainId)[keyof typeof ChainId] @@ -958,6 +967,61 @@ export const ALL: Network[] = [ decimals: 6, }, }, + + { + chainId: ChainId.HYPEREVM, + type: NetworkType.MAINNET, + name: 'hyperevm', + title: 'HyperEVM', + rpcUrl: getRpcUrl('hyperevm'), + logoUrl: getLogoUrl(ChainId.HYPEREVM), + blockExplorer: { + name: 'HyperEVM Explorer', + url: 'https://www.hyperscan.com/', + }, + nativeCurrency: { + symbol: 'HYPE', + name: 'HYPE', + decimals: 18, + }, + }, + + { + chainId: ChainId.BERACHAIN, + type: NetworkType.MAINNET, + name: 'berachain', + title: 'Berachain', + rpcUrl: getRpcUrl('berachain'), + logoUrl: getLogoUrl(ChainId.BERACHAIN), + blockExplorer: { + name: 'Berachain Explorer', + url: 'https://berascan.com/', + }, + nativeCurrency: { + symbol: 'BEAR', + name: 'BEAR', + decimals: 18, + }, + }, + + { + chainId: ChainId.SONIC, + type: NetworkType.MAINNET, + name: 'sonic', + title: 'Sonic', + rpcUrl: getRpcUrl('sonic'), + logoUrl: getLogoUrl(ChainId.SONIC), + blockExplorer: { + name: 'Sonic Explorer', + url: 'https://sonicscan.com/', + }, + nativeCurrency: { + symbol: 'S', + name: 'Sonic', + decimals: 18, + }, + }, + ] function getRpcUrl(networkName: string): string { From 12100c55ab53339f9af6f596de91767da84ed99b Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 17 Feb 2026 12:06:28 +0100 Subject: [PATCH 087/144] fix(relayer): match wallet-webapp FeeOptions request shape (#966) * fix(relayer): wrap feeOptions calldata for simulation * fix(relayer): request FeeOptions as wallet (match wallet-webapp-v3) * fix(relayer): restore AbiFunction import --- .../relayer/src/relayer/rpc-relayer/index.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/services/relayer/src/relayer/rpc-relayer/index.ts b/packages/services/relayer/src/relayer/rpc-relayer/index.ts index d4cac8e71..221d04496 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/index.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/index.ts @@ -7,7 +7,7 @@ import { TransactionPrecondition, ETHTxnStatus, } from './relayer.gen.js' -import { Address, Hex, Bytes, AbiFunction } from 'ox' +import { Address, Hex, AbiFunction } from 'ox' import { Constants, Payload, Network } from '@0xsequence/wallet-primitives' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' import { decodePrecondition } from '../../preconditions/index.js' @@ -137,15 +137,21 @@ export class RpcRelayer implements Relayer { to: Address.Address, calls: Payload.Call[], ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { + // IMPORTANT: + // The relayer FeeOptions endpoint simulates `eth_call(to, data)`. + // wallet-webapp-v3 requests FeeOptions with `to = wallet` and `data = Payload.encode(calls, self=wallet)`. + // This works for undeployed wallets and avoids guest-module simulation pitfalls. const callsStruct: Payload.Calls = { type: 'call', space: 0n, nonce: 0n, calls: calls } - const data = Payload.encode(callsStruct) + + const feeOptionsTo = wallet + const data = Payload.encode(callsStruct, wallet) try { const result = await this.client.feeOptions( { wallet, - to, - data: Bytes.toHex(data), + to: feeOptionsTo, + data: Hex.fromBytes(data), }, { ...(this.projectAccessKey ? { 'X-Access-Key': this.projectAccessKey } : undefined) }, ) From 23cb9e9be3761f48d8705db87f41d492837ca90c Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 17 Feb 2026 12:50:56 +0100 Subject: [PATCH 088/144] 3.0.0-beta.17 --- .changeset/chilly-hands-carry.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/chilly-hands-carry.md diff --git a/.changeset/chilly-hands-carry.md b/.changeset/chilly-hands-carry.md new file mode 100644 index 000000000..82086927c --- /dev/null +++ b/.changeset/chilly-hands-carry.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +New chains, relayer rpc fix diff --git a/.changeset/pre.json b/.changeset/pre.json index 49368d22d..83d3a7c22 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,20 +4,20 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.15", - "@0xsequence/builder": "3.0.0-beta.15", - "@0xsequence/guard": "3.0.0-beta.15", - "@0xsequence/identity-instrument": "3.0.0-beta.15", - "@0xsequence/indexer": "3.0.0-beta.15", - "@0xsequence/marketplace": "3.0.0-beta.15", - "@0xsequence/metadata": "3.0.0-beta.15", - "@0xsequence/relayer": "3.0.0-beta.15", - "@0xsequence/userdata": "3.0.0-beta.15", - "@0xsequence/abi": "3.0.0-beta.15", - "@0xsequence/wallet-core": "3.0.0-beta.15", - "@0xsequence/dapp-client": "3.0.0-beta.15", - "@0xsequence/wallet-primitives": "3.0.0-beta.15", - "@0xsequence/wallet-wdk": "3.0.0-beta.15", + "@0xsequence/api": "3.0.0-beta.16", + "@0xsequence/builder": "3.0.0-beta.16", + "@0xsequence/guard": "3.0.0-beta.16", + "@0xsequence/identity-instrument": "3.0.0-beta.16", + "@0xsequence/indexer": "3.0.0-beta.16", + "@0xsequence/marketplace": "3.0.0-beta.16", + "@0xsequence/metadata": "3.0.0-beta.16", + "@0xsequence/relayer": "3.0.0-beta.16", + "@0xsequence/userdata": "3.0.0-beta.16", + "@0xsequence/abi": "3.0.0-beta.16", + "@0xsequence/wallet-core": "3.0.0-beta.16", + "@0xsequence/dapp-client": "3.0.0-beta.16", + "@0xsequence/wallet-primitives": "3.0.0-beta.16", + "@0xsequence/wallet-wdk": "3.0.0-beta.16", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" @@ -26,6 +26,7 @@ "all-rings-bow", "brave-papayas-join", "bright-pots-hope", + "chilly-hands-carry", "crisp-zoos-retire", "cyan-radios-relax", "free-tips-switch", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index bc1959686..00db1dd45 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 1cc6df0dd..19d391f0a 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.16", + "version": "3.0.0-beta.17", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 0721cdb8d..0d913884d 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 80db5117e..aae15c947 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.16", + "version": "3.0.0-beta.17", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index b8a0a9514..e5c10a66b 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index bbfc80249..8900a0c61 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.16", + "version": "3.0.0-beta.17", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index d5f8af0d3..da691188f 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.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index bc77f0edf..4efd73ef5 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.16", + "version": "3.0.0-beta.17", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index ca665306f..a315b337f 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 92286197d..8492719cb 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.16", + "version": "3.0.0-beta.17", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index a92109365..89cd4a109 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 79b7f9771..ddda3b5f1 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.16", + "version": "3.0.0-beta.17", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index e5c41b32e..0b7029c4c 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 00f2f6e6f..310188389 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.16", + "version": "3.0.0-beta.17", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index f2c87bf54..de3453973 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.17 + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 2fd579bec..b24fb9772 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.16", + "version": "3.0.0-beta.17", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 774faa865..757ccf3f8 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index ea0124807..925144a0c 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.16", + "version": "3.0.0-beta.17", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index f62406f83..1b4a00f13 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 533f400fe..48246aa3d 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.16", + "version": "3.0.0-beta.17", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 752a46056..c1a775250 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.17 + - @0xsequence/relayer@3.0.0-beta.17 + - @0xsequence/wallet-primitives@3.0.0-beta.17 + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 3295b9a3a..1e022ba63 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.16", + "version": "3.0.0-beta.17", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 4cf425c05..e247b6ea9 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.17 + +### Patch Changes + +- New chains, relayer rpc fix +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.17 + - @0xsequence/relayer@3.0.0-beta.17 + - @0xsequence/wallet-core@3.0.0-beta.17 + - @0xsequence/wallet-primitives@3.0.0-beta.17 + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 3db8b8bf9..8c4a69819 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.16", + "version": "3.0.0-beta.17", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 9da2119c2..2fe21a304 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 660ec6136..5a2b9191c 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.16", + "version": "3.0.0-beta.17", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 7fb4e804c..fecd34149 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.17 + +### Patch Changes + +- New chains, relayer rpc fix +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.17 + - @0xsequence/identity-instrument@3.0.0-beta.17 + - @0xsequence/relayer@3.0.0-beta.17 + - @0xsequence/wallet-core@3.0.0-beta.17 + - @0xsequence/wallet-primitives@3.0.0-beta.17 + ## 3.0.0-beta.16 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index bd0777bca..e39dd0908 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.16", + "version": "3.0.0-beta.17", "license": "Apache-2.0", "type": "module", "publishConfig": { From 8f6a29aa1f38253ac0d67e1295e292f7d4db45c2 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Tue, 17 Feb 2026 13:07:34 -0500 Subject: [PATCH 089/144] Use multicall3 to aggregate queued payload checking across N signers (#967) * Use multicall3 to aggregate queued payload checking across N signers * Adding contracts object to Network type to store per network contract configs for common contracts like ensUniversalResolver and multicall3 * Parallelzing fetched queued payloads and adding fallback for when multicall3 batching either fails or is not configured on the network * Add includeTestnets option to RecoverySettings, default: false so fetchingQueuedPayloads can skip testnets to reduce requests --- .../relayer/src/relayer/rpc-relayer/index.ts | 12 +- packages/wallet/primitives/src/network.ts | 156 ++++++++++++- packages/wallet/wdk/src/sequence/manager.ts | 2 + packages/wallet/wdk/src/sequence/recovery.ts | 209 +++++++++++++----- 4 files changed, 320 insertions(+), 59 deletions(-) diff --git a/packages/services/relayer/src/relayer/rpc-relayer/index.ts b/packages/services/relayer/src/relayer/rpc-relayer/index.ts index 221d04496..3029126db 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/index.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/index.ts @@ -49,12 +49,14 @@ const networkToChain = (network: Network.Network): Chain => { }, } : undefined, - contracts: network.ensAddress - ? { - ensUniversalResolver: { - address: network.ensAddress as `0x${string}`, + contracts: network.contracts + ? Object.entries(network.contracts).reduce( + (acc, [name, address]) => { + acc[name] = { address } + return acc }, - } + {} as Record, + ) : undefined, } as Chain } diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index b9b79a8f7..b176db084 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -1,3 +1,8 @@ +import { Address } from 'ox' + +const DEFAULT_MULTICALL3_ADDRESS: Address.Address = '0xcA11bde05977b3631167028862bE2a173976CA11' +const SEQUENCE_MULTICALL3_ADDRESS: Address.Address = '0xae96419a81516f063744206d4b5E36f3168280f8' + export enum NetworkType { MAINNET = 'mainnet', TESTNET = 'testnet', @@ -21,8 +26,11 @@ export interface Network { name: string decimals: number } - ensAddress?: string deprecated?: true + contracts?: { + multicall3?: Address.Address + ensUniversalResolver?: Address.Address + } } export const ChainId = { @@ -160,7 +168,10 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, - ensAddress: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + ensUniversalResolver: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', + }, }, { chainId: ChainId.SEPOLIA, @@ -178,6 +189,9 @@ export const ALL: Network[] = [ name: 'Sepolia Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.POLYGON, @@ -195,6 +209,9 @@ export const ALL: Network[] = [ name: 'POL', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.POLYGON_AMOY, @@ -212,6 +229,9 @@ export const ALL: Network[] = [ name: 'Amoy POL', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.POLYGON_ZKEVM, @@ -229,6 +249,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.BSC, @@ -246,6 +269,9 @@ export const ALL: Network[] = [ name: 'BNB', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.BSC_TESTNET, @@ -263,6 +289,9 @@ export const ALL: Network[] = [ name: 'Testnet BNB', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.OPTIMISM, @@ -280,6 +309,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.OPTIMISM_SEPOLIA, @@ -297,6 +329,9 @@ export const ALL: Network[] = [ name: 'Sepolia Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.ARBITRUM, @@ -314,6 +349,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.ARBITRUM_SEPOLIA, @@ -331,6 +369,9 @@ export const ALL: Network[] = [ name: 'Sepolia Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.ARBITRUM_NOVA, @@ -348,6 +389,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.AVALANCHE, @@ -365,6 +409,9 @@ export const ALL: Network[] = [ name: 'AVAX', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.AVALANCHE_TESTNET, @@ -382,6 +429,9 @@ export const ALL: Network[] = [ name: 'Testnet AVAX', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.GNOSIS, @@ -399,6 +449,9 @@ export const ALL: Network[] = [ name: 'XDAI', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.BASE, @@ -416,6 +469,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.BASE_SEPOLIA, @@ -433,6 +489,9 @@ export const ALL: Network[] = [ name: 'Sepolia Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.HOMEVERSE, @@ -450,6 +509,9 @@ export const ALL: Network[] = [ name: 'OAS', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.HOMEVERSE_TESTNET, @@ -467,6 +529,9 @@ export const ALL: Network[] = [ name: 'Testnet OAS', decimals: 18, }, + contracts: { + multicall3: SEQUENCE_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.XAI, @@ -484,6 +549,9 @@ export const ALL: Network[] = [ name: 'XAI', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.XAI_SEPOLIA, @@ -501,6 +569,9 @@ export const ALL: Network[] = [ name: 'Sepolia XAI', decimals: 18, }, + contracts: { + multicall3: SEQUENCE_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.B3, @@ -518,6 +589,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.B3_SEPOLIA, @@ -535,6 +609,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.APECHAIN, @@ -552,6 +629,9 @@ export const ALL: Network[] = [ name: 'ApeCoin', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.APECHAIN_TESTNET, @@ -569,6 +649,9 @@ export const ALL: Network[] = [ name: 'ApeCoin', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.BLAST, @@ -586,6 +669,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.BLAST_SEPOLIA, @@ -603,6 +689,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.TELOS, @@ -620,6 +709,9 @@ export const ALL: Network[] = [ name: 'TLOS', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.TELOS_TESTNET, @@ -637,6 +729,9 @@ export const ALL: Network[] = [ name: 'TLOS', decimals: 18, }, + contracts: { + multicall3: SEQUENCE_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.SKALE_NEBULA, @@ -654,6 +749,9 @@ export const ALL: Network[] = [ name: 'SKALE Fuel', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.SKALE_NEBULA_TESTNET, @@ -671,6 +769,9 @@ export const ALL: Network[] = [ name: 'SKALE Fuel', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.SONEIUM, @@ -688,6 +789,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.SONEIUM_MINATO, @@ -705,6 +809,9 @@ export const ALL: Network[] = [ name: 'Ether', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.TOY_TESTNET, @@ -722,6 +829,9 @@ export const ALL: Network[] = [ name: 'TOY', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.IMMUTABLE_ZKEVM, @@ -739,6 +849,9 @@ export const ALL: Network[] = [ name: 'IMX', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.IMMUTABLE_ZKEVM_TESTNET, @@ -756,6 +869,9 @@ export const ALL: Network[] = [ name: 'IMX', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.MOONBEAM, @@ -773,6 +889,9 @@ export const ALL: Network[] = [ name: 'GLMR', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.MOONBASE_ALPHA, @@ -790,6 +909,9 @@ export const ALL: Network[] = [ name: 'GLMR', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.ETHERLINK, @@ -807,6 +929,9 @@ export const ALL: Network[] = [ name: 'Tez', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.ETHERLINK_SHADOWNET_TESTNET, @@ -824,6 +949,9 @@ export const ALL: Network[] = [ name: 'Tez', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.MONAD, @@ -841,6 +969,9 @@ export const ALL: Network[] = [ name: 'MON', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { chainId: ChainId.MONAD_TESTNET, @@ -858,6 +989,9 @@ export const ALL: Network[] = [ name: 'MON', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { @@ -876,6 +1010,9 @@ export const ALL: Network[] = [ name: 'SOMI', decimals: 18, }, + contracts: { + multicall3: SEQUENCE_MULTICALL3_ADDRESS, + }, }, { @@ -894,6 +1031,9 @@ export const ALL: Network[] = [ name: 'STT', decimals: 18, }, + contracts: { + multicall3: SEQUENCE_MULTICALL3_ADDRESS, + }, }, { @@ -912,6 +1052,9 @@ export const ALL: Network[] = [ name: 'TCENT', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { @@ -930,6 +1073,9 @@ export const ALL: Network[] = [ name: 'ETH', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { @@ -948,6 +1094,9 @@ export const ALL: Network[] = [ name: 'SAND', decimals: 18, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { @@ -966,6 +1115,9 @@ export const ALL: Network[] = [ name: 'USDC', decimals: 6, }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, }, { diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 80ca1653c..783dfc201 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -233,6 +233,7 @@ export const ManagerOptionsDefaults = { defaultRecoverySettings: { requiredDeltaTime: 2592000n, // 30 days (in seconds) minTimestamp: 0n, + includeTestnets: false, }, multiInjectedProviderDiscovery: true, @@ -369,6 +370,7 @@ export function applyManagerOptionsDefaults(options?: ManagerOptions): ResolvedM export type RecoverySettings = { requiredDeltaTime: bigint minTimestamp: bigint + includeTestnets?: boolean } export type Databases = { diff --git a/packages/wallet/wdk/src/sequence/recovery.ts b/packages/wallet/wdk/src/sequence/recovery.ts index b40b138f8..2e6074364 100644 --- a/packages/wallet/wdk/src/sequence/recovery.ts +++ b/packages/wallet/wdk/src/sequence/recovery.ts @@ -1,12 +1,16 @@ import { Envelope } from '@0xsequence/wallet-core' import { Config, Constants, Extensions, GenericTree, Payload } from '@0xsequence/wallet-primitives' -import { Address, Hex, Provider, RpcTransport } from 'ox' +import { Abi, AbiFunction, Address, Hex, Provider, RpcTransport } from 'ox' import { MnemonicHandler } from './handlers/mnemonic.js' import { Shared } from './manager.js' import { Actions, Module } from './types/index.js' import { QueuedRecoveryPayload } from './types/recovery.js' import { Kinds, RecoverySigner } from './types/signer.js' +const AGGREGATE3 = Abi.from([ + 'function aggregate3((address target, bool allowFailure, bytes callData)[] calls) external payable returns ((bool success, bytes returnData)[])', +])[0]! + export interface RecoveryInterface { /** * Retrieves the list of configured recovery signers for a given wallet. @@ -514,9 +518,16 @@ export class Recovery implements RecoveryInterface { async fetchQueuedPayloads(wallet: Address.Address, chainId?: number): Promise { // Create providers for each network const providers = this.shared.sequence.networks - .filter((network) => (chainId ? network.chainId === chainId : true)) + .filter((network) => + chainId + ? network.chainId === chainId + : !this.shared.sequence.defaultRecoverySettings.includeTestnets + ? network.type !== 'testnet' + : true, + ) .map((network) => ({ chainId: network.chainId, + multicall3Address: network.contracts?.multicall3, provider: Provider.from(RpcTransport.fromHttp(network.rpcUrl)), })) @@ -526,73 +537,167 @@ export class Recovery implements RecoveryInterface { return [] } + const recoveryExtension = this.shared.sequence.extensions.recovery const payloads: QueuedRecoveryPayload[] = [] - for (const signer of signers) { - for (const { chainId, provider } of providers) { + await Promise.all( + providers.map(async ({ chainId, provider, multicall3Address }) => { try { - const totalPayloads = await Extensions.Recovery.totalQueuedPayloads( - provider, - this.shared.sequence.extensions.recovery, - wallet, - signer.address, - ) - - for (let i = 0n; i < totalPayloads; i++) { - const payloadHash = await Extensions.Recovery.queuedPayloadHashOf( - provider, - this.shared.sequence.extensions.recovery, - wallet, - signer.address, - i, - ) - - const timestamp = await Extensions.Recovery.timestampForQueuedPayload( + let totalPayloadsBySigner: bigint[] + + if (multicall3Address) { + try { + // Batch all totalQueuedPayloads calls for every signer into a single Multicall3 request. + // This reduces N signer calls per network down to 1 call per network. + totalPayloadsBySigner = await this.fetchTotalQueuedPayloadsBatched( + provider, + recoveryExtension, + wallet, + signers, + multicall3Address, + ) + } catch (err) { + console.error( + `Recovery.fetchQueuedPayloads multicall3 failed for chainId ${chainId}, retrying with individual calls:`, + err, + ) + totalPayloadsBySigner = await this.fetchTotalQueuedPayloadsFallback( + provider, + recoveryExtension, + wallet, + signers, + ) + } + } else { + totalPayloadsBySigner = await this.fetchTotalQueuedPayloadsFallback( provider, - this.shared.sequence.extensions.recovery, + recoveryExtension, wallet, - signer.address, - payloadHash, + signers, ) + } - const payload = await this.shared.sequence.stateProvider.getPayload(payloadHash) + for (let s = 0; s < signers.length; s++) { + const signer = signers[s]! + const totalPayloads = totalPayloadsBySigner[s]! + if (totalPayloads === 0n) continue + + // Only make individual calls for the rare case where payloads actually exist + for (let i = 0n; i < totalPayloads; i++) { + const payloadHash = await Extensions.Recovery.queuedPayloadHashOf( + provider, + recoveryExtension, + wallet, + signer.address, + i, + ) + + const timestamp = await Extensions.Recovery.timestampForQueuedPayload( + provider, + recoveryExtension, + wallet, + signer.address, + payloadHash, + ) + + const payload = await this.shared.sequence.stateProvider.getPayload(payloadHash) + + // If ready, we need to check if it was executed already + // for this, we check if the wallet nonce for the given space + // is greater than the nonce in the payload + if (timestamp < Date.now() / 1000 && payload && Payload.isCalls(payload.payload)) { + const nonce = await this.shared.modules.wallets.getNonce(chainId, wallet, payload.payload.space) + if (nonce > i) { + continue + } + } - // If ready, we need to check if it was executed already - // for this, we check if the wallet nonce for the given space - // is greater than the nonce in the payload - if (timestamp < Date.now() / 1000 && payload && Payload.isCalls(payload.payload)) { - const nonce = await this.shared.modules.wallets.getNonce(chainId, wallet, payload.payload.space) - if (nonce > i) { - continue + // The id is the index + signer address + chainId + wallet address + const id = `${i}-${signer.address}-${chainId}-${wallet}` + + const payloadEntry: QueuedRecoveryPayload = { + id, + index: i, + recoveryModule: recoveryExtension, + wallet: wallet, + signer: signer.address, + chainId, + startTimestamp: timestamp, + endTimestamp: timestamp + signer.requiredDeltaTime, + payloadHash, + payload: payload?.payload, } - } - // The id is the index + signer address + chainId + wallet address - const id = `${i}-${signer.address}-${chainId}-${wallet}` - - // Create a new payload - const payloadEntry: QueuedRecoveryPayload = { - id, - index: i, - recoveryModule: this.shared.sequence.extensions.recovery, - wallet: wallet, - signer: signer.address, - chainId, - startTimestamp: timestamp, - endTimestamp: timestamp + signer.requiredDeltaTime, - payloadHash, - payload: payload?.payload, + payloads.push(payloadEntry) } - - payloads.push(payloadEntry) } } catch (err) { - console.error('Recovery.fetchQueuedPayloads error', err) + console.error(`Recovery.fetchQueuedPayloads error for chainId ${chainId}:`, err) } + }), + ) + + return payloads + } + + private async fetchTotalQueuedPayloadsBatched( + provider: Provider.Provider, + recoveryExtension: Address.Address, + wallet: Address.Address, + signers: RecoverySigner[], + multicall3Address: Address.Address, + ): Promise { + const calls = signers.map((signer) => ({ + target: recoveryExtension, + allowFailure: true, + callData: AbiFunction.encodeData(Extensions.Recovery.TOTAL_QUEUED_PAYLOADS, [wallet, signer.address]), + })) + + const response = await provider.request({ + method: 'eth_call', + params: [ + { + to: multicall3Address, + data: AbiFunction.encodeData(AGGREGATE3, [calls]), + }, + 'latest', + ], + }) + + const results = AbiFunction.decodeResult(AGGREGATE3, response) as readonly { + success: boolean + returnData: Hex.Hex + }[] + + return results.map((result) => { + if (!result.success || result.returnData === '0x') { + return 0n } + return Hex.toBigInt(result.returnData) + }) + } + + private fetchTotalQueuedPayloadsFallback = async ( + provider: Provider.Provider, + recoveryExtension: Address.Address, + wallet: Address.Address, + signers: RecoverySigner[], + ): Promise => { + const result: bigint[] = signers.map(() => 0n) + + // Fallback to individual calls if the multicall3 call fails + for (let s = 0; s < signers.length; s++) { + const signer = signers[s]! + const totalPayloads = await Extensions.Recovery.totalQueuedPayloads( + provider, + recoveryExtension, + wallet, + signer.address, + ) + result[s] = totalPayloads } - return payloads + return result } async encodeRecoverySignature(imageHash: Hex.Hex, signer: Address.Address) { From 493836fe331c2eef4bf53bf4d3c6d110914c5d50 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 17 Feb 2026 22:26:05 +0100 Subject: [PATCH 090/144] 3.0.0-beta.18 --- .changeset/four-beds-stare.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/four-beds-stare.md diff --git a/.changeset/four-beds-stare.md b/.changeset/four-beds-stare.md new file mode 100644 index 000000000..05d79c07d --- /dev/null +++ b/.changeset/four-beds-stare.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 +--- + +multicall3 optimization diff --git a/.changeset/pre.json b/.changeset/pre.json index 83d3a7c22..996831db9 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,20 +4,20 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.16", - "@0xsequence/builder": "3.0.0-beta.16", - "@0xsequence/guard": "3.0.0-beta.16", - "@0xsequence/identity-instrument": "3.0.0-beta.16", - "@0xsequence/indexer": "3.0.0-beta.16", - "@0xsequence/marketplace": "3.0.0-beta.16", - "@0xsequence/metadata": "3.0.0-beta.16", - "@0xsequence/relayer": "3.0.0-beta.16", - "@0xsequence/userdata": "3.0.0-beta.16", - "@0xsequence/abi": "3.0.0-beta.16", - "@0xsequence/wallet-core": "3.0.0-beta.16", - "@0xsequence/dapp-client": "3.0.0-beta.16", - "@0xsequence/wallet-primitives": "3.0.0-beta.16", - "@0xsequence/wallet-wdk": "3.0.0-beta.16", + "@0xsequence/api": "3.0.0-beta.17", + "@0xsequence/builder": "3.0.0-beta.17", + "@0xsequence/guard": "3.0.0-beta.17", + "@0xsequence/identity-instrument": "3.0.0-beta.17", + "@0xsequence/indexer": "3.0.0-beta.17", + "@0xsequence/marketplace": "3.0.0-beta.17", + "@0xsequence/metadata": "3.0.0-beta.17", + "@0xsequence/relayer": "3.0.0-beta.17", + "@0xsequence/userdata": "3.0.0-beta.17", + "@0xsequence/abi": "3.0.0-beta.17", + "@0xsequence/wallet-core": "3.0.0-beta.17", + "@0xsequence/dapp-client": "3.0.0-beta.17", + "@0xsequence/wallet-primitives": "3.0.0-beta.17", + "@0xsequence/wallet-wdk": "3.0.0-beta.17", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" @@ -29,6 +29,7 @@ "chilly-hands-carry", "crisp-zoos-retire", "cyan-radios-relax", + "four-beds-stare", "free-tips-switch", "goofy-laws-serve", "new-turkeys-double", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 00db1dd45..75c0ca6ca 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 19d391f0a..b80904acc 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.17", + "version": "3.0.0-beta.18", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 0d913884d..12c908ebf 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index aae15c947..f32fa7ee2 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.17", + "version": "3.0.0-beta.18", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index e5c10a66b..21d8e5c44 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 8900a0c61..dd6f1cdaa 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.17", + "version": "3.0.0-beta.18", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index da691188f..9dca35590 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.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 4efd73ef5..7ef89866d 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.17", + "version": "3.0.0-beta.18", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index a315b337f..94df6781f 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 8492719cb..ff7ed7a40 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.17", + "version": "3.0.0-beta.18", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 89cd4a109..b625d5ae0 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index ddda3b5f1..4df52cb4b 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.17", + "version": "3.0.0-beta.18", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 0b7029c4c..ce2207ecb 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 310188389..9e5503f3a 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.17", + "version": "3.0.0-beta.18", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index de3453973..1651e8c78 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.18 + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index b24fb9772..19316b206 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.17", + "version": "3.0.0-beta.18", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 757ccf3f8..c9bb0b53b 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 925144a0c..9d16b1939 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.17", + "version": "3.0.0-beta.18", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 1b4a00f13..9adb0382f 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 48246aa3d..07f05bfcd 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.17", + "version": "3.0.0-beta.18", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index c1a775250..5796907e8 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.18 + - @0xsequence/relayer@3.0.0-beta.18 + - @0xsequence/wallet-primitives@3.0.0-beta.18 + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 1e022ba63..b3034e795 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.17", + "version": "3.0.0-beta.18", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index e247b6ea9..7fc8f313d 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.18 + +### Patch Changes + +- multicall3 optimization +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.18 + - @0xsequence/relayer@3.0.0-beta.18 + - @0xsequence/wallet-core@3.0.0-beta.18 + - @0xsequence/wallet-primitives@3.0.0-beta.18 + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 8c4a69819..d2a9b66b5 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.17", + "version": "3.0.0-beta.18", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 2fe21a304..d6f800a8c 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 5a2b9191c..07430638a 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.17", + "version": "3.0.0-beta.18", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index fecd34149..07e91e3b7 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.18 + +### Patch Changes + +- multicall3 optimization +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.18 + - @0xsequence/identity-instrument@3.0.0-beta.18 + - @0xsequence/relayer@3.0.0-beta.18 + - @0xsequence/wallet-core@3.0.0-beta.18 + - @0xsequence/wallet-primitives@3.0.0-beta.18 + ## 3.0.0-beta.17 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index e39dd0908..a793b44bf 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.17", + "version": "3.0.0-beta.18", "license": "Apache-2.0", "type": "module", "publishConfig": { From 800bbd1c5127202d4cfa4c68f75b2f6864c42c11 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Mon, 23 Feb 2026 09:12:23 -0500 Subject: [PATCH 091/144] Feb 2026: Updating Dev Dependencies (#970) * Updating happy-dom, vitest, prettier, and syncpack dev dependencies * Updating turbo repo * Updating lefthook * Updating rimraf * Updating @types/node * Updating dotenv * Updating nodemon and esbuild for primitives-cli --- extras/docs/package.json | 2 +- extras/web/package.json | 2 +- package.json | 14 +- 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 | 8 +- packages/wallet/dapp-client/package.json | 10 +- packages/wallet/primitives-cli/package.json | 6 +- packages/wallet/primitives/package.json | 4 +- packages/wallet/wdk/package.json | 10 +- pnpm-lock.yaml | 1314 +++++++---------- repo/ui/package.json | 2 +- turbo.json | 2 +- 21 files changed, 541 insertions(+), 859 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index 338f0dc91..9c51ce6c1 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -20,7 +20,7 @@ "devDependencies": { "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "eslint": "^9.39.2", diff --git a/extras/web/package.json b/extras/web/package.json index e818efa3f..e7fd226c0 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -20,7 +20,7 @@ "devDependencies": { "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "eslint": "^9.39.2", diff --git a/package.json b/package.json index 53a8caae3..26ff0147e 100644 --- a/package.json +++ b/package.json @@ -16,16 +16,16 @@ "reinstall": "rimraf -g ./**/node_modules && pnpm install", "test:anvil": "anvil --fork-url https://nodes.sequence.app/arbitrum", "clean": "turbo clean", - "deps:lint": "syncpack list-mismatches", - "deps:fix": "syncpack fix-mismatches" + "deps:lint": "syncpack lint --dependency-types prod,dev", + "deps:fix": "syncpack fix" }, "devDependencies": { "@changesets/cli": "^2.29.8", - "lefthook": "^2.0.12", - "prettier": "^3.7.4", - "rimraf": "^6.1.2", - "syncpack": "^13.0.4", - "turbo": "^2.6.3", + "lefthook": "^2.1.1", + "prettier": "^3.8.1", + "rimraf": "^6.1.3", + "syncpack": "^14.0.0", + "turbo": "^2.8.10", "typescript": "^5.9.3" }, "pnpm": { diff --git a/packages/services/api/package.json b/packages/services/api/package.json index b80904acc..6cde8a324 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3" } } diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index f32fa7ee2..84cc9cee3 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3" } } diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index dd6f1cdaa..abaf5a0bf 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -25,9 +25,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3", - "vitest": "^4.0.15" + "vitest": "^4.0.18" }, "dependencies": { "ox": "^0.9.17" diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 7ef89866d..60e39dd35 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": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3", - "vitest": "^4.0.15" + "vitest": "^4.0.18" }, "dependencies": { "json-canonicalize": "^2.0.0", diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index ff7ed7a40..34210c9ae 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3" } } diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 4df52cb4b..d02d9a572 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3" } } diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 9e5503f3a..2ba7640a5 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3" } } diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 19316b206..7b9d5b538 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -27,9 +27,9 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3", - "vitest": "^4.0.15" + "vitest": "^4.0.18" }, "dependencies": { "@0xsequence/wallet-primitives": "workspace:^", diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 9d16b1939..d1b84a0f0 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3" } } diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 07f05bfcd..56afc3980 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "typescript": "^5.9.3" } } diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index b3034e795..79ed68524 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -23,12 +23,12 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", - "@vitest/coverage-v8": "^4.0.15", - "dotenv": "^17.2.3", + "@types/node": "^25.3.0", + "@vitest/coverage-v8": "^4.0.18", + "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", "typescript": "^5.9.3", - "vitest": "^4.0.15" + "vitest": "^4.0.18" }, "dependencies": { "@0xsequence/guard": "workspace:^", diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index d2a9b66b5..bb1c8f8d5 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": "^25.0.2", - "@vitest/coverage-v8": "^4.0.15", - "dotenv": "^17.2.3", + "@types/node": "^25.3.0", + "@vitest/coverage-v8": "^4.0.18", + "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", - "happy-dom": "^20.0.11", + "happy-dom": "^20.7.0", "typescript": "^5.9.3", - "vitest": "^4.0.15" + "vitest": "^4.0.18" }, "dependencies": { "@0xsequence/guard": "workspace:^", diff --git a/packages/wallet/primitives-cli/package.json b/packages/wallet/primitives-cli/package.json index 0a8c978d4..ec35fc66e 100644 --- a/packages/wallet/primitives-cli/package.json +++ b/packages/wallet/primitives-cli/package.json @@ -23,11 +23,11 @@ "devDependencies": { "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "@types/yargs": "^17.0.35", "concurrently": "^9.2.1", - "esbuild": "^0.27.1", - "nodemon": "^3.1.11", + "esbuild": "^0.27.3", + "nodemon": "^3.1.14", "typescript": "^5.9.3" }, "dependencies": { diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 07430638a..03df5e248 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.15", + "@vitest/coverage-v8": "^4.0.18", "typescript": "^5.9.3", - "vitest": "^4.0.15" + "vitest": "^4.0.18" }, "dependencies": { "ox": "^0.9.17" diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index a793b44bf..d421f90e6 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -24,13 +24,13 @@ }, "devDependencies": { "@repo/typescript-config": "workspace:^", - "@types/node": "^25.0.2", - "@vitest/coverage-v8": "^4.0.15", - "dotenv": "^17.2.3", + "@types/node": "^25.3.0", + "@vitest/coverage-v8": "^4.0.18", + "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", - "happy-dom": "^20.0.11", + "happy-dom": "^20.7.0", "typescript": "^5.9.3", - "vitest": "^4.0.15" + "vitest": "^4.0.18" }, "dependencies": { "@0xsequence/guard": "workspace:^", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db7b97bdf..dedfa2290 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,22 +13,22 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.29.8 - version: 2.29.8(@types/node@25.0.2) + version: 2.29.8(@types/node@25.3.0) lefthook: - specifier: ^2.0.12 - version: 2.0.12 + specifier: ^2.1.1 + version: 2.1.1 prettier: - specifier: ^3.7.4 - version: 3.7.4 + specifier: ^3.8.1 + version: 3.8.1 rimraf: - specifier: ^6.1.2 - version: 6.1.2 + specifier: ^6.1.3 + version: 6.1.3 syncpack: - specifier: ^13.0.4 - version: 13.0.4(typescript@5.9.3) + specifier: ^14.0.0 + version: 14.0.0 turbo: - specifier: ^2.6.3 - version: 2.6.3 + specifier: ^2.8.10 + version: 2.8.10 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -55,8 +55,8 @@ importers: specifier: workspace:^ version: link:../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 '@types/react': specifier: ^19.2.7 version: 19.2.7 @@ -92,8 +92,8 @@ importers: specifier: workspace:^ version: link:../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 '@types/react': specifier: ^19.2.7 version: 19.2.7 @@ -113,8 +113,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -125,8 +125,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -141,14 +141,14 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.15 - version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) + specifier: ^4.0.18 + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) packages/services/identity-instrument: dependencies: @@ -166,14 +166,14 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.15 - version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) + specifier: ^4.0.18 + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) packages/services/indexer: devDependencies: @@ -181,8 +181,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -193,8 +193,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -205,8 +205,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -230,14 +230,14 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.15 - version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) + specifier: ^4.0.18 + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) packages/services/userdata: devDependencies: @@ -245,8 +245,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -257,8 +257,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -288,14 +288,14 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 '@vitest/coverage-v8': - specifier: ^4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)) + specifier: ^4.0.18 + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)) dotenv: - specifier: ^17.2.3 - version: 17.2.3 + specifier: ^17.3.1 + version: 17.3.1 fake-indexeddb: specifier: ^6.2.5 version: 6.2.5 @@ -303,8 +303,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.15 - version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) + specifier: ^4.0.18 + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) packages/wallet/dapp-client: dependencies: @@ -328,26 +328,26 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 '@vitest/coverage-v8': - specifier: ^4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)) + specifier: ^4.0.18 + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)) dotenv: - specifier: ^17.2.3 - version: 17.2.3 + specifier: ^17.3.1 + version: 17.3.1 fake-indexeddb: specifier: ^6.2.5 version: 6.2.5 happy-dom: - specifier: ^20.0.11 - version: 20.0.11 + specifier: ^20.7.0 + version: 20.7.0 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.15 - version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) + specifier: ^4.0.18 + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) packages/wallet/primitives: dependencies: @@ -359,14 +359,14 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@vitest/coverage-v8': - specifier: ^4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)) + specifier: ^4.0.18 + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)) typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.15 - version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) + specifier: ^4.0.18 + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) packages/wallet/primitives-cli: dependencies: @@ -387,8 +387,8 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 '@types/yargs': specifier: ^17.0.35 version: 17.0.35 @@ -396,11 +396,11 @@ importers: specifier: ^9.2.1 version: 9.2.1 esbuild: - specifier: ^0.27.1 - version: 0.27.1 + specifier: ^0.27.3 + version: 0.27.3 nodemon: - specifier: ^3.1.11 - version: 3.1.11 + specifier: ^3.1.14 + version: 3.1.14 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -442,26 +442,26 @@ importers: specifier: workspace:^ version: link:../../../repo/typescript-config '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 '@vitest/coverage-v8': - specifier: ^4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)) + specifier: ^4.0.18 + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)) dotenv: - specifier: ^17.2.3 - version: 17.2.3 + specifier: ^17.3.1 + version: 17.3.1 fake-indexeddb: specifier: ^6.2.5 version: 6.2.5 happy-dom: - specifier: ^20.0.11 - version: 20.0.11 + specifier: ^20.7.0 + version: 20.7.0 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.15 - version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11) + specifier: ^4.0.18 + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) repo/eslint-config: devDependencies: @@ -488,7 +488,7 @@ importers: version: 7.0.1(eslint@9.39.2) eslint-plugin-turbo: specifier: ^2.6.3 - version: 2.6.3(eslint@9.39.2)(turbo@2.8.3) + version: 2.6.3(eslint@9.39.2)(turbo@2.8.10) globals: specifier: ^16.5.0 version: 16.5.0 @@ -518,10 +518,10 @@ importers: version: link:../typescript-config '@turbo/gen': specifier: ^1.13.4 - version: 1.13.4(@types/node@25.0.2)(typescript@5.9.3) + version: 1.13.4(@types/node@25.3.0)(typescript@5.9.3) '@types/node': - specifier: ^25.0.2 - version: 25.0.2 + specifier: ^25.3.0 + version: 25.3.0 '@types/react': specifier: ^19.2.7 version: 19.2.7 @@ -681,158 +681,158 @@ packages: '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - '@esbuild/aix-ppc64@0.27.1': - resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.1': - resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.1': - resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.1': - resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.1': - resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.1': - resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.1': - resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.1': - resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.1': - resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.1': - resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.1': - resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.1': - resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.1': - resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.1': - resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.1': - resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.1': - resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.1': - resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.1': - resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.1': - resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.1': - resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.1': - resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.1': - resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.1': - resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.1': - resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.1': - resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.1': - resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1037,14 +1037,6 @@ packages: '@types/node': optional: true - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - 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==} @@ -1271,10 +1263,6 @@ 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==} @@ -1329,11 +1317,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.27': - resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} - - '@types/node@25.0.2': - resolution: {integrity: sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA==} + '@types/node@25.3.0': + resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} @@ -1352,6 +1337,9 @@ packages: '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -1417,20 +1405,20 @@ packages: 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.15': - resolution: {integrity: sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==} + '@vitest/coverage-v8@4.0.18': + resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} peerDependencies: - '@vitest/browser': 4.0.15 - vitest: 4.0.15 + '@vitest/browser': 4.0.18 + vitest: 4.0.18 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.15': - resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} - '@vitest/mocker@4.0.15': - resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -1440,20 +1428,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.15': - resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} - '@vitest/runner@4.0.15': - resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} - '@vitest/snapshot@4.0.15': - resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} - '@vitest/spy@4.0.15': - resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} - '@vitest/utils@4.0.15': - resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} abitype@1.1.0: resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} @@ -1587,8 +1575,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.8: - resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} + ast-v8-to-istanbul@0.3.11: + resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} @@ -1601,6 +1589,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1629,6 +1621,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.3: + resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1675,10 +1671,6 @@ packages: 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'} @@ -1691,10 +1683,6 @@ 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==} @@ -1720,10 +1708,6 @@ 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'} @@ -1764,10 +1748,6 @@ 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==} @@ -1785,15 +1765,6 @@ packages: core-js-pure@3.47.0: resolution: {integrity: sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==} - 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==} @@ -1882,17 +1853,14 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - dotenv@17.2.3: - resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + dotenv@17.3.1: + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} engines: {node: '>=12'} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - 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==} @@ -1906,12 +1874,9 @@ packages: 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==} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} @@ -1948,8 +1913,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.27.1: - resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} hasBin: true @@ -2070,10 +2035,6 @@ packages: 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==} @@ -2208,9 +2169,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@13.0.0: - resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} - engines: {node: 20 || >=22} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -2236,10 +2197,6 @@ 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'} @@ -2256,8 +2213,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.0.11: - resolution: {integrity: sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g==} + happy-dom@20.7.0: + resolution: {integrity: sha512-hR/uLYQdngTyEfxnOoa+e6KTcfBFyc1hgFj/Cc144A5JJUuHFYqIEBDcD4FeGqUeKLRZqJ9eN9u7/GDjYEgS1g==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -2300,10 +2257,6 @@ packages: 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} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2390,9 +2343,6 @@ 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'} @@ -2449,10 +2399,6 @@ 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==} @@ -2516,14 +2462,6 @@ 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==} @@ -2566,10 +2504,6 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} @@ -2578,12 +2512,12 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -2603,9 +2537,6 @@ 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==} @@ -2617,9 +2548,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -2637,71 +2565,64 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - lefthook-darwin-arm64@2.0.12: - resolution: {integrity: sha512-tuBz1sNLien+nKKb8BDopKjS6EnbXU8rQzhMVBY+bnVfsTiYDfbBr4wo/IzA5TcwoTL/b5somCJhljEw6DvSyg==} + lefthook-darwin-arm64@2.1.1: + resolution: {integrity: sha512-O/RS1j03/Fnq5zCzEb2r7UOBsqPeBuf1C5pMkIJcO4TSE6hf3rhLUkcorKc2M5ni/n5zLGtzQUXHV08/fSAT3Q==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@2.0.12: - resolution: {integrity: sha512-FnuUMPPRMJyTEPXg6PotSrFJ8qf8FDLhhD1zLh74D+9Cye5j9n3lcrCQEjXubPT8du/GZLxMBjjffRbcZ8eYDA==} + lefthook-darwin-x64@2.1.1: + resolution: {integrity: sha512-mm/kdKl81ROPoYnj9XYk5JDqj+/6Al8w/SSPDfhItkLJyl4pqS+hWUOP6gDGrnuRk8S0DvJ2+hzhnDsQnZohWQ==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@2.0.12: - resolution: {integrity: sha512-DXElB0qR5e6a8cXkFNYakhwCieypbfh6Y4QG39pzMnLsG03g/nhe093o6owfiUZ4mUFyDM6+0xmy0steOooF2g==} + lefthook-freebsd-arm64@2.1.1: + resolution: {integrity: sha512-F7JXlKmjxGqGbCWPLND0bVB4DMQezIe48pEwTlUQZbxh450c2gP5Q8FdttMZKOT163kBGGTqJAJSEC6zW+QSxA==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@2.0.12: - resolution: {integrity: sha512-iJN1ZxFeaDi4Fi3b9jcW9wgyNl19LOv2NaVOaAi/tG6mlIn196cmSdXkOA3+943ZbqbdfV9I+bBcIKwneXDA3Q==} + lefthook-freebsd-x64@2.1.1: + resolution: {integrity: sha512-Po8/lJMqNzKSZPuEI46dLuWoBoXtAxCuRpeOh6DAV/M4RhBynaCu8rLMZ9BqF7cVbZEWoplOmYo6HdOuiYpCkQ==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@2.0.12: - resolution: {integrity: sha512-byvmO4Iri6P0COwM8c3lGgeCV3Q0hh1XJpRfrcZDr4Wslq9O63t6J3T6i87oOtY+UjC9pXLl6xGk6hlUcHZ3BQ==} + lefthook-linux-arm64@2.1.1: + resolution: {integrity: sha512-mI2ljFgPEqHxI8vrN9nKgnVu63Rz1KisDbPwlvs7BTYNwq3sncdK5ukpGR4zzWdh6saNJ5tCtHEtep5GQI11nw==} cpu: [arm64] os: [linux] - lefthook-linux-x64@2.0.12: - resolution: {integrity: sha512-KBaiinmf336rA+/dmYs7H7TTeAOByB0CyLA7k8IecTCuaiuKr6ez7ktSjht19poa5G+V0mts4GgEGcx6HViR0w==} + lefthook-linux-x64@2.1.1: + resolution: {integrity: sha512-m3G/FaxC+crxeg9XeaUuHfEoL+i9gbkg2Hp2KD2IcVVIxprqlyqf0Hb8zbLV2NMXuo5RSGokJu44oAoTO3Ou2g==} cpu: [x64] os: [linux] - lefthook-openbsd-arm64@2.0.12: - resolution: {integrity: sha512-1QBMXX1UW5rtgC4TB52OKWB7Rz/kCBRB+bKKLT/gDD79aPzLgJANTitQQzgFNIWoa7aM9UvzvIAJzOo6FcFIbg==} + lefthook-openbsd-arm64@2.1.1: + resolution: {integrity: sha512-gz/8FJPvhjOdOFt1GmFvuvDOe+W+BBRjoeAT1/mTgkN7HCXMXgqNjjvakQKQeGz1I1v08wXG1ZNf5y+T9XBCDQ==} cpu: [arm64] os: [openbsd] - lefthook-openbsd-x64@2.0.12: - resolution: {integrity: sha512-zPcvUzs65GexRA37UHmaZqWuEGSU/zpBaPIY98MybXzzcJfCIf+O0oUQe2riMllwYGvNW0B1y3NOYRziDNe/vA==} + lefthook-openbsd-x64@2.1.1: + resolution: {integrity: sha512-ch3lyMUtbmtWUufaQVn4IoEs/2hjK51XqaCdY1mh5ca//VctR1peknIwQ5feHu+vATCDviWQ7HsdNDewm3HMPg==} cpu: [x64] os: [openbsd] - lefthook-windows-arm64@2.0.12: - resolution: {integrity: sha512-kgwxguS2GssoHM4SMTp+ArD/Gjg9q5MinD6iI5vSFpuJygD13ZWiXQQfESMHq9y/v1XkD0BdHTJej49dx8P+Vw==} + lefthook-windows-arm64@2.1.1: + resolution: {integrity: sha512-mm3PZhKDs9FE/jQDimkfWxtoj9xQ2k8uw2MdhtC825bhvIh+MEi0WFj/MOW+ug0RBg0I55tGYzZ5aVuozAWpTQ==} cpu: [arm64] os: [win32] - lefthook-windows-x64@2.0.12: - resolution: {integrity: sha512-Tf/VtSOtF3rBTc9dzRWROa+HuhqaiIV+Xp+1gzlx5+uCueLM0m87Rz6yd4IN5mL7TrDaNkiRXI3FvjCp0dUE4Q==} + lefthook-windows-x64@2.1.1: + resolution: {integrity: sha512-1L2oGIzmhfOTxfwbe5mpSQ+m3ilpvGNymwIhn4UHq6hwHsUL6HEhODqx02GfBn6OXpVIr56bvdBAusjL/SVYGQ==} cpu: [x64] os: [win32] - lefthook@2.0.12: - resolution: {integrity: sha512-I2FdA9cdnq1icwlNz4RADs7exuqe47q1N9+p2LmcP/WfchWh16mvTB82OAD7w7zK9GxblS9GpF7pASaOSl4c7A==} + lefthook@2.1.1: + resolution: {integrity: sha512-Tl9h9c+sG3ShzTHKuR3LAIblnnh+Mgxnm2Ul7yu9cu260Z27LEbO3V6Zw4YZFP59/2rlD42pt/llYsQCkkCFzw==} 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'} @@ -2731,10 +2652,6 @@ 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 @@ -2745,9 +2662,6 @@ packages: lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.4: resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} engines: {node: 20 || >=22} @@ -2791,13 +2705,9 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - 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@10.2.2: + resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} + engines: {node: 18 || 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2809,8 +2719,8 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} mipd@0.0.7: @@ -2881,8 +2791,8 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - nodemon@3.1.11: - resolution: {integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==} + nodemon@3.1.14: + resolution: {integrity: sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==} engines: {node: '>=10'} hasBin: true @@ -2890,10 +2800,6 @@ 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'} @@ -2936,10 +2842,6 @@ 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'} @@ -2952,10 +2854,6 @@ 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'} @@ -3028,10 +2926,6 @@ 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==} @@ -3053,18 +2947,14 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 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==} @@ -3108,19 +2998,11 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.7.4: - resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} 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==} @@ -3138,9 +3020,6 @@ 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==} @@ -3174,10 +3053,6 @@ 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'} @@ -3226,10 +3101,6 @@ 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'} @@ -3239,8 +3110,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@6.1.2: - resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} + rimraf@6.1.3: + resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==} engines: {node: 20 || >=22} hasBin: true @@ -3359,17 +3230,10 @@ 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'} @@ -3405,10 +3269,6 @@ 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'} @@ -3455,10 +3315,6 @@ 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'} @@ -3503,9 +3359,49 @@ 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'} + syncpack-darwin-arm64@14.0.0: + resolution: {integrity: sha512-mEcku9YkOHfM6JOxhq9McgeLvd4djsJvRwNONZXHeoJ6+yqC96DdxZwFjkw3e8Vn95wsxsrwY5ZjMExs5Gbacw==} + cpu: [arm64] + os: [darwin] + + syncpack-darwin-x64@14.0.0: + resolution: {integrity: sha512-qSj3bT3SIZA5NLM5PNVeExapyOrdmptlGSMu0SLVHj9hata/Vqh3xWgwq7wB9uajmlrHljeJ84R/NKAHyzFewA==} + cpu: [x64] + os: [darwin] + + syncpack-linux-arm64-musl@14.0.0: + resolution: {integrity: sha512-i57Chz0tHP7ybKElPLhoygl6Cab1fxyUKS9xRgezX5NDrNxKUgrvqBfYd7288/QKB4C8+IcYHugFPjZjoFlAIA==} + cpu: [arm64] + os: [linux] + + syncpack-linux-arm64@14.0.0: + resolution: {integrity: sha512-votlkb4P/0Bxd9yhBWCSUOjZwaii+LfFn1tZZVN5dfs8qcjcLeqfdG5zbnlJSzZhS3T+BfzejFW+Z95OxZag0A==} + cpu: [arm64] + os: [linux] + + syncpack-linux-x64-musl@14.0.0: + resolution: {integrity: sha512-RKyp+29UlLGE8oYkd3UfwgjWUHN4dLHDyarv0dS6gWVpWM6qHtHS339KBc9JcIS7FD1vNGnQ3GmSaAodxDlkMA==} + cpu: [x64] + os: [linux] + + syncpack-linux-x64@14.0.0: + resolution: {integrity: sha512-sZGy4+uL+P/+nI0yc9jwW/R22u9lw0+NXDYC/9ts9eYiWFyO4+luOeosvVKbED1OavUp/GQJqNV+9KHjMwq0Fw==} + cpu: [x64] + os: [linux] + + syncpack-windows-arm64@14.0.0: + resolution: {integrity: sha512-aNtr0F6HkA7M0azDuDkt//DlPWlplFa4kmvHXirwDmJQ9u3SAvN3ZItW4ZYS96ZbiV1DgO15jIKBI7rDkzcwrQ==} + cpu: [arm64] + os: [win32] + + syncpack-windows-x64@14.0.0: + resolution: {integrity: sha512-usMH61wlonssfh2Q8SJDiiAcsXVzuPzRl8XdHqdavR3XeCSGBIW9ieJpPfiKvDPWslekufWD+GhLNoH+8vV0Cg==} + cpu: [x64] + os: [win32] + + syncpack@14.0.0: + resolution: {integrity: sha512-OfAa3Oip5YC9Ad1jEs92Hw08Wy4JfdpdeequIwaJGsQG0tJtb8gpQfCdLuBefsk6n8WiUdt/5qmzcW+BDXtzbQ==} + engines: {node: '>=14.17.0'} hasBin: true term-size@2.2.1: @@ -3515,10 +3411,6 @@ packages: 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==} @@ -3579,81 +3471,44 @@ 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.6.3: - resolution: {integrity: sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg==} + turbo-darwin-64@2.8.10: + resolution: {integrity: sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g==} cpu: [x64] os: [darwin] - turbo-darwin-64@2.8.3: - resolution: {integrity: sha512-4kXRLfcygLOeNcP6JquqRLmGB/ATjjfehiojL2dJkL7GFm3SPSXbq7oNj8UbD8XriYQ5hPaSuz59iF1ijPHkTw==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.6.3: - resolution: {integrity: sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==} + turbo-darwin-arm64@2.8.10: + resolution: {integrity: sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA==} cpu: [arm64] os: [darwin] - turbo-darwin-arm64@2.8.3: - resolution: {integrity: sha512-xF7uCeC0UY0Hrv/tqax0BMbFlVP1J/aRyeGQPZT4NjvIPj8gSPDgFhfkfz06DhUwDg5NgMo04uiSkAWE8WB/QQ==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.6.3: - resolution: {integrity: sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==} - cpu: [x64] - os: [linux] - - turbo-linux-64@2.8.3: - resolution: {integrity: sha512-vxMDXwaOjweW/4etY7BxrXCSkvtwh0PbwVafyfT1Ww659SedUxd5rM3V2ZCmbwG8NiCfY7d6VtxyHx3Wh1GoZA==} + turbo-linux-64@2.8.10: + resolution: {integrity: sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.6.3: - resolution: {integrity: sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==} - cpu: [arm64] - os: [linux] - - turbo-linux-arm64@2.8.3: - resolution: {integrity: sha512-mQX7uYBZFkuPLLlKaNe9IjR1JIef4YvY8f21xFocvttXvdPebnq3PK1Zjzl9A1zun2BEuWNUwQIL8lgvN9Pm3Q==} + turbo-linux-arm64@2.8.10: + resolution: {integrity: sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ==} cpu: [arm64] os: [linux] - turbo-windows-64@2.6.3: - resolution: {integrity: sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==} + turbo-windows-64@2.8.10: + resolution: {integrity: sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw==} cpu: [x64] os: [win32] - turbo-windows-64@2.8.3: - resolution: {integrity: sha512-YLGEfppGxZj3VWcNOVa08h6ISsVKiG85aCAWosOKNUjb6yErWEuydv6/qImRJUI+tDLvDvW7BxopAkujRnWCrw==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.6.3: - resolution: {integrity: sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==} - cpu: [arm64] - os: [win32] - - turbo-windows-arm64@2.8.3: - resolution: {integrity: sha512-afTUGKBRmOJU1smQSBnFGcbq0iabAPwh1uXu2BVk7BREg30/1gMnJh9DFEQTah+UD3n3ru8V55J83RQNFfqoyw==} + turbo-windows-arm64@2.8.10: + resolution: {integrity: sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ==} cpu: [arm64] os: [win32] - turbo@2.6.3: - resolution: {integrity: sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==} - hasBin: true - - turbo@2.8.3: - resolution: {integrity: sha512-8Osxz5Tu/Dw2kb31EAY+nhq/YZ3wzmQSmYa1nIArqxgCAldxv9TPlrAiaBUDVnKA4aiPn0OFBD1ACcpc5VFOAQ==} + turbo@2.8.10: + resolution: {integrity: sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==} hasBin: true type-check@0.4.0: @@ -3704,15 +3559,8 @@ packages: undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - 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'} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -3754,10 +3602,6 @@ 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.42.1: resolution: {integrity: sha512-NzT/f54jT+b0Um6pYzN/uAGMLg+3twhricAzXS+XH8pVIREzPEh7P25rlhPQnLYiPWzQd9mrFcvnm73Sc8bx+A==} peerDependencies: @@ -3806,18 +3650,18 @@ packages: yaml: optional: true - vitest@4.0.15: - resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} 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.15 - '@vitest/browser-preview': 4.0.15 - '@vitest/browser-webdriverio': 4.0.15 - '@vitest/ui': 4.0.15 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -4093,7 +3937,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.8(@types/node@25.0.2)': + '@changesets/cli@2.29.8(@types/node@25.3.0)': dependencies: '@changesets/apply-release-plan': 7.0.14 '@changesets/assemble-release-plan': 6.0.9 @@ -4109,7 +3953,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@25.0.2) + '@inquirer/external-editor': 1.0.3(@types/node@25.3.0) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -4217,82 +4061,82 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.1': + '@esbuild/aix-ppc64@0.27.3': optional: true - '@esbuild/android-arm64@0.27.1': + '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/android-arm@0.27.1': + '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/android-x64@0.27.1': + '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/darwin-arm64@0.27.1': + '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/darwin-x64@0.27.1': + '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/freebsd-arm64@0.27.1': + '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/freebsd-x64@0.27.1': + '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/linux-arm64@0.27.1': + '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-arm@0.27.1': + '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-ia32@0.27.1': + '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-loong64@0.27.1': + '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-mips64el@0.27.1': + '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-ppc64@0.27.1': + '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.27.1': + '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-s390x@0.27.1': + '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/linux-x64@0.27.1': + '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.27.1': + '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.27.1': + '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.27.1': + '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.27.1': + '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/openharmony-arm64@0.27.1': + '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/sunos-x64@0.27.1': + '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/win32-arm64@0.27.1': + '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-ia32@0.27.1': + '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-x64@0.27.1': + '@esbuild/win32-x64@0.27.3': optional: true '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)': @@ -4449,18 +4293,12 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/external-editor@1.0.3(@types/node@25.0.2)': + '@inquirer/external-editor@1.0.3(@types/node@25.3.0)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.1 optionalDependencies: - '@types/node': 25.0.2 - - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 + '@types/node': 25.3.0 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -4633,8 +4471,6 @@ 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': @@ -4651,17 +4487,17 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@1.13.4(@types/node@25.0.2)(typescript@5.9.3)': + '@turbo/gen@1.13.4(@types/node@25.3.0)(typescript@5.9.3)': dependencies: - '@turbo/workspaces': 1.13.4(@types/node@25.0.2) + '@turbo/workspaces': 1.13.4(@types/node@25.3.0) chalk: 2.4.2 commander: 10.0.1 fs-extra: 10.1.0 - inquirer: 8.2.7(@types/node@25.0.2) + inquirer: 8.2.7(@types/node@25.3.0) minimatch: 9.0.5 node-plop: 0.26.3 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@25.0.2)(typescript@5.9.3) + ts-node: 10.9.2(@types/node@25.3.0)(typescript@5.9.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -4671,7 +4507,7 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@1.13.4(@types/node@25.0.2)': + '@turbo/workspaces@1.13.4(@types/node@25.3.0)': dependencies: chalk: 2.4.2 commander: 10.0.1 @@ -4679,7 +4515,7 @@ snapshots: fast-glob: 3.3.3 fs-extra: 10.1.0 gradient-string: 2.0.2 - inquirer: 8.2.7(@types/node@25.0.2) + inquirer: 8.2.7(@types/node@25.3.0) js-yaml: 4.1.1 ora: 4.1.1 rimraf: 3.0.2 @@ -4700,7 +4536,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 25.0.2 + '@types/node': 25.3.0 '@types/inquirer@6.5.0': dependencies: @@ -4715,13 +4551,9 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.19.27': + '@types/node@25.3.0': dependencies: - undici-types: 6.21.0 - - '@types/node@25.0.2': - dependencies: - undici-types: 7.16.0 + undici-types: 7.18.2 '@types/react-dom@19.2.3(@types/react@19.2.7)': dependencies: @@ -4733,12 +4565,16 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 25.0.2 + '@types/node': 25.3.0 '@types/tinycolor2@1.4.6': {} '@types/whatwg-mimetype@3.0.2': {} + '@types/ws@8.18.1': + dependencies: + '@types/node': 25.3.0 + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.35': @@ -4836,60 +4672,57 @@ snapshots: '@typescript-eslint/types': 8.50.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0))': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.15 - ast-v8-to-istanbul: 0.3.8 + '@vitest/utils': 4.0.18 + ast-v8-to-istanbul: 0.3.11 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 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.15(@types/node@25.0.2)(happy-dom@20.0.11) - transitivePeerDependencies: - - supports-color + vitest: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) - '@vitest/expect@4.0.15': + '@vitest/expect@4.0.18': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(vite@7.3.0(@types/node@25.0.2))': + '@vitest/mocker@4.0.18(vite@7.3.0(@types/node@25.3.0))': dependencies: - '@vitest/spy': 4.0.15 + '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.0(@types/node@25.0.2) + vite: 7.3.0(@types/node@25.3.0) - '@vitest/pretty-format@4.0.15': + '@vitest/pretty-format@4.0.18': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.15': + '@vitest/runner@4.0.18': dependencies: - '@vitest/utils': 4.0.15 + '@vitest/utils': 4.0.18 pathe: 2.0.3 - '@vitest/snapshot@4.0.15': + '@vitest/snapshot@4.0.18': dependencies: - '@vitest/pretty-format': 4.0.15 + '@vitest/pretty-format': 4.0.18 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.15': {} + '@vitest/spy@4.0.18': {} - '@vitest/utils@4.0.15': + '@vitest/utils@4.0.18': dependencies: - '@vitest/pretty-format': 4.0.15 + '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 abitype@1.1.0(typescript@5.9.3)(zod@4.2.0): @@ -5030,11 +4863,11 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.8: + ast-v8-to-istanbul@0.3.11: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 - js-tokens: 9.0.1 + js-tokens: 10.0.0 async-function@1.0.0: {} @@ -5044,6 +4877,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.9.7: {} @@ -5071,6 +4906,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.3: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -5120,10 +4959,6 @@ snapshots: chai@6.2.1: {} - chalk-template@1.1.2: - dependencies: - chalk: 5.6.2 - chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -5140,8 +4975,6 @@ 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 @@ -5187,10 +5020,6 @@ 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: {} @@ -5225,8 +5054,6 @@ snapshots: commander@10.0.1: {} - commander@13.1.0: {} - concat-map@0.0.1: {} concurrently@9.2.1: @@ -5247,15 +5074,6 @@ snapshots: 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.1 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.9.3 - create-require@1.1.1: {} cross-spawn@7.0.6: @@ -5350,7 +5168,7 @@ snapshots: dotenv@16.0.3: {} - dotenv@17.2.3: {} + dotenv@17.3.1: {} dunder-proto@1.0.1: dependencies: @@ -5358,11 +5176,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - 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: {} @@ -5374,11 +5187,7 @@ snapshots: 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 + entities@7.0.1: {} es-abstract@1.24.1: dependencies: @@ -5483,34 +5292,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.27.1: + esbuild@0.27.3: optionalDependencies: - '@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 + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 escalade@3.2.0: {} @@ -5565,11 +5374,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.8.3): + eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.8.10): dependencies: dotenv: 16.0.3 eslint: 9.39.2 - turbo: 2.8.3 + turbo: 2.8.10 eslint-scope@8.4.0: dependencies: @@ -5669,10 +5478,6 @@ snapshots: fake-indexeddb@6.2.5: {} - fast-check@3.23.2: - dependencies: - pure-rand: 6.1.0 - fast-deep-equal@3.1.3: {} fast-glob@3.3.1: @@ -5822,11 +5627,11 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@13.0.0: + glob@13.0.6: dependencies: - minimatch: 10.1.1 - minipass: 7.1.2 - path-scurry: 2.0.1 + minimatch: 10.2.2 + minipass: 7.1.3 + path-scurry: 2.0.2 glob@7.2.3: dependencies: @@ -5866,15 +5671,6 @@ 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: {} @@ -5893,11 +5689,17 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.0.11: + happy-dom@20.7.0: dependencies: - '@types/node': 20.19.27 + '@types/node': 25.3.0 '@types/whatwg-mimetype': 3.0.2 + '@types/ws': 8.18.1 + entities: 7.0.1 whatwg-mimetype: 3.0.0 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate has-bigints@1.1.0: {} @@ -5934,10 +5736,6 @@ snapshots: dependencies: hermes-estree: 0.25.1 - hosted-git-info@8.1.0: - dependencies: - lru-cache: 10.4.3 - html-escaper@2.0.2: {} http-proxy-agent@7.0.2: @@ -6010,9 +5808,9 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - inquirer@8.2.7(@types/node@25.0.2): + inquirer@8.2.7(@types/node@25.3.0): dependencies: - '@inquirer/external-editor': 1.0.3(@types/node@25.0.2) + '@inquirer/external-editor': 1.0.3(@types/node@25.3.0) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -6044,8 +5842,6 @@ 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 @@ -6106,8 +5902,6 @@ snapshots: is-interactive@1.0.0: {} - is-interactive@2.0.0: {} - is-lower-case@1.1.3: dependencies: lower-case: 1.1.4 @@ -6163,10 +5957,6 @@ 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 @@ -6202,14 +5992,6 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.6: - dependencies: - '@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.2.0: dependencies: html-escaper: 2.0.2 @@ -6224,9 +6006,9 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - js-tokens@4.0.0: {} + js-tokens@10.0.0: {} - js-tokens@9.0.1: {} + js-tokens@4.0.0: {} js-yaml@3.14.2: dependencies: @@ -6243,16 +6025,12 @@ 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: {} json5@2.2.3: {} - jsonc-parser@3.3.1: {} - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -6276,58 +6054,54 @@ snapshots: dependencies: json-buffer: 3.0.1 - kleur@3.0.3: {} - - lefthook-darwin-arm64@2.0.12: + lefthook-darwin-arm64@2.1.1: optional: true - lefthook-darwin-x64@2.0.12: + lefthook-darwin-x64@2.1.1: optional: true - lefthook-freebsd-arm64@2.0.12: + lefthook-freebsd-arm64@2.1.1: optional: true - lefthook-freebsd-x64@2.0.12: + lefthook-freebsd-x64@2.1.1: optional: true - lefthook-linux-arm64@2.0.12: + lefthook-linux-arm64@2.1.1: optional: true - lefthook-linux-x64@2.0.12: + lefthook-linux-x64@2.1.1: optional: true - lefthook-openbsd-arm64@2.0.12: + lefthook-openbsd-arm64@2.1.1: optional: true - lefthook-openbsd-x64@2.0.12: + lefthook-openbsd-x64@2.1.1: optional: true - lefthook-windows-arm64@2.0.12: + lefthook-windows-arm64@2.1.1: optional: true - lefthook-windows-x64@2.0.12: + lefthook-windows-x64@2.1.1: optional: true - lefthook@2.0.12: + lefthook@2.1.1: optionalDependencies: - 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 + lefthook-darwin-arm64: 2.1.1 + lefthook-darwin-x64: 2.1.1 + lefthook-freebsd-arm64: 2.1.1 + lefthook-freebsd-x64: 2.1.1 + lefthook-linux-arm64: 2.1.1 + lefthook-linux-x64: 2.1.1 + lefthook-openbsd-arm64: 2.1.1 + lefthook-openbsd-x64: 2.1.1 + lefthook-windows-arm64: 2.1.1 + lefthook-windows-x64: 2.1.1 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 @@ -6353,11 +6127,6 @@ 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 @@ -6368,8 +6137,6 @@ snapshots: lower-case@1.1.4: {} - lru-cache@10.4.3: {} - lru-cache@11.2.4: {} lru-cache@5.1.1: @@ -6407,11 +6174,9 @@ snapshots: mimic-fn@2.1.0: {} - mimic-function@5.0.1: {} - - minimatch@10.1.1: + minimatch@10.2.2: dependencies: - '@isaacs/brace-expansion': 5.0.0 + brace-expansion: 5.0.3 minimatch@3.1.2: dependencies: @@ -6423,7 +6188,7 @@ snapshots: minimist@1.2.8: {} - minipass@7.1.2: {} + minipass@7.1.3: {} mipd@0.0.7(typescript@5.9.3): optionalDependencies: @@ -6490,14 +6255,14 @@ snapshots: node-releases@2.0.27: {} - nodemon@3.1.11: + nodemon@3.1.14: dependencies: chokidar: 3.6.0 debug: 4.4.3(supports-color@5.5.0) ignore-by-default: 1.0.1 - minimatch: 3.1.2 + minimatch: 10.2.2 pstree.remy: 1.1.8 - semver: 7.7.3 + semver: 7.7.4 simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.1 @@ -6505,13 +6270,6 @@ 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 @@ -6562,10 +6320,6 @@ 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 @@ -6598,18 +6352,6 @@ 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: {} @@ -6695,13 +6437,6 @@ 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 @@ -6719,15 +6454,13 @@ snapshots: path-parse@1.0.7: {} - path-scurry@2.0.1: + path-scurry@2.0.2: dependencies: lru-cache: 11.2.4 - minipass: 7.1.2 + minipass: 7.1.3 path-type@4.0.0: {} - path-type@6.0.0: {} - pathe@2.0.3: {} picocolors@1.1.1: {} @@ -6765,14 +6498,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.7.4: {} - - proc-log@5.0.0: {} - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 + prettier@3.8.1: {} prop-types@15.8.1: dependencies: @@ -6799,8 +6525,6 @@ snapshots: punycode@2.3.1: {} - pure-rand@6.1.0: {} - pvtsutils@1.3.6: dependencies: tslib: 2.8.1 @@ -6834,11 +6558,6 @@ 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 @@ -6901,20 +6620,15 @@ 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.1.2: + rimraf@6.1.3: dependencies: - glob: 13.0.0 + glob: 13.0.6 package-json-from-dist: 1.0.1 rollup@4.53.4: @@ -7093,14 +6807,10 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.3 - - sisteransi@1.0.5: {} + semver: 7.7.4 slash@3.0.0: {} - slash@5.1.0: {} - smart-buffer@4.2.0: {} snake-case@2.1.0: @@ -7135,8 +6845,6 @@ snapshots: std-env@3.10.0: {} - stdin-discarder@0.2.2: {} - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -7212,8 +6920,6 @@ snapshots: strip-bom@3.0.0: {} - strip-bom@4.0.0: {} - strip-final-newline@2.0.0: {} strip-json-comments@2.0.1: {} @@ -7244,34 +6950,45 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.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.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 + syncpack-darwin-arm64@14.0.0: + optional: true + + syncpack-darwin-x64@14.0.0: + optional: true + + syncpack-linux-arm64-musl@14.0.0: + optional: true + + syncpack-linux-arm64@14.0.0: + optional: true + + syncpack-linux-x64-musl@14.0.0: + optional: true + + syncpack-linux-x64@14.0.0: + optional: true + + syncpack-windows-arm64@14.0.0: + optional: true + + syncpack-windows-x64@14.0.0: + optional: true + + syncpack@14.0.0: + optionalDependencies: + syncpack-darwin-arm64: 14.0.0 + syncpack-darwin-x64: 14.0.0 + syncpack-linux-arm64: 14.0.0 + syncpack-linux-arm64-musl: 14.0.0 + syncpack-linux-x64: 14.0.0 + syncpack-linux-x64-musl: 14.0.0 + syncpack-windows-arm64: 14.0.0 + syncpack-windows-x64: 14.0.0 term-size@2.2.1: {} through@2.3.8: {} - tightrope@0.2.0: {} - tinybench@2.9.0: {} tinycolor2@1.6.0: {} @@ -7311,14 +7028,14 @@ snapshots: dependencies: typescript: 5.9.3 - ts-node@10.9.2(@types/node@25.0.2)(typescript@5.9.3): + ts-node@10.9.2(@types/node@25.3.0)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 25.0.2 + '@types/node': 25.3.0 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -7329,65 +7046,36 @@ snapshots: 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.6.3: + turbo-darwin-64@2.8.10: optional: true - turbo-darwin-64@2.8.3: + turbo-darwin-arm64@2.8.10: optional: true - turbo-darwin-arm64@2.6.3: + turbo-linux-64@2.8.10: optional: true - turbo-darwin-arm64@2.8.3: + turbo-linux-arm64@2.8.10: optional: true - turbo-linux-64@2.6.3: + turbo-windows-64@2.8.10: optional: true - turbo-linux-64@2.8.3: + turbo-windows-arm64@2.8.10: optional: true - turbo-linux-arm64@2.6.3: - optional: true - - turbo-linux-arm64@2.8.3: - optional: true - - turbo-windows-64@2.6.3: - optional: true - - turbo-windows-64@2.8.3: - optional: true - - turbo-windows-arm64@2.6.3: - optional: true - - turbo-windows-arm64@2.8.3: - optional: true - - turbo@2.6.3: + turbo@2.8.10: optionalDependencies: - 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 - - turbo@2.8.3: - optionalDependencies: - turbo-darwin-64: 2.8.3 - turbo-darwin-arm64: 2.8.3 - turbo-linux-64: 2.8.3 - turbo-linux-arm64: 2.8.3 - turbo-windows-64: 2.8.3 - turbo-windows-arm64: 2.8.3 + turbo-darwin-64: 2.8.10 + turbo-darwin-arm64: 2.8.10 + turbo-linux-64: 2.8.10 + turbo-linux-arm64: 2.8.10 + turbo-windows-64: 2.8.10 + turbo-windows-arm64: 2.8.10 type-check@0.4.0: dependencies: @@ -7453,11 +7141,7 @@ snapshots: undefsafe@2.0.5: {} - undici-types@6.21.0: {} - - undici-types@7.16.0: {} - - unicorn-magic@0.3.0: {} + undici-types@7.18.2: {} universalify@0.1.2: {} @@ -7492,8 +7176,6 @@ snapshots: validate-npm-package-name@5.0.1: {} - validate-npm-package-name@6.0.2: {} - viem@2.42.1(typescript@5.9.3)(zod@4.2.0): dependencies: '@noble/curves': 1.9.1 @@ -7511,27 +7193,27 @@ snapshots: - utf-8-validate - zod - vite@7.3.0(@types/node@25.0.2): + vite@7.3.0(@types/node@25.3.0): dependencies: - esbuild: 0.27.1 + esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.53.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.0.2 + '@types/node': 25.3.0 fsevents: 2.3.3 - vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11): + vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0): dependencies: - '@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 + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.0(@types/node@25.3.0)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 es-module-lexer: 1.7.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -7543,11 +7225,11 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.0(@types/node@25.0.2) + vite: 7.3.0(@types/node@25.3.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.0.2 - happy-dom: 20.0.11 + '@types/node': 25.3.0 + happy-dom: 20.7.0 transitivePeerDependencies: - jiti - less diff --git a/repo/ui/package.json b/repo/ui/package.json index 6b380862e..f12625d46 100644 --- a/repo/ui/package.json +++ b/repo/ui/package.json @@ -16,7 +16,7 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@turbo/gen": "^1.13.4", - "@types/node": "^25.0.2", + "@types/node": "^25.3.0", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "typescript": "^5.9.3" diff --git a/turbo.json b/turbo.json index fcf046270..bf7b4423d 100644 --- a/turbo.json +++ b/turbo.json @@ -1,5 +1,5 @@ { - "$schema": "https://turbo.build/schema.json", + "$schema": "https://v2-8-10.turborepo.dev/schema.json", "ui": "tui", "tasks": { "build": { From 9d558a8ad047f80b98ef415bb47f91240fb0ac53 Mon Sep 17 00:00:00 2001 From: Alexander Kolberg <74478295+AlexanderKolberg@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:25:36 +0200 Subject: [PATCH 092/144] Move indexer clients to packages/services/indexer and remove old packages/indexer (#969) * Move indexer clients to packages/services/indexer and remove old packages/indexer * Disable noUncheckedIndexedAccess for indexer package --- packages/indexer/src/indexer.gen.ts | 2765 -------------- packages/indexer/src/indexergw.gen.ts | 1787 --------- packages/services/indexer/src/indexer.gen.ts | 3386 +++++++++-------- .../services/indexer/src/indexergw.gen.ts | 2156 ++++++----- packages/services/indexer/tsconfig.json | 4 +- 5 files changed, 3112 insertions(+), 6986 deletions(-) delete mode 100644 packages/indexer/src/indexer.gen.ts delete mode 100644 packages/indexer/src/indexergw.gen.ts diff --git a/packages/indexer/src/indexer.gen.ts b/packages/indexer/src/indexer.gen.ts deleted file mode 100644 index 97d3d2472..000000000 --- a/packages/indexer/src/indexer.gen.ts +++ /dev/null @@ -1,2765 +0,0 @@ -/* eslint-disable */ -// sequence-indexer v0.4.0 caf5c4c3677ac2dce41858dce7cd727a7810845f -// -- -// Code generated by Webrpc-gen@v0.31.2 with typescript generator. DO NOT EDIT. -// -// webrpc-gen -schema=merged.gen.json -service=Indexer -target=typescript -client -out=./clients/indexer.gen.ts - -// Webrpc description and code-gen version -export const WebrpcVersion = 'v1' - -// Schema version of your RIDL schema -export const WebrpcSchemaVersion = 'v0.4.0' - -// Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = 'caf5c4c3677ac2dce41858dce7cd727a7810845f' - -// -// Client interface -// - -export interface IndexerClient { - addWebhookListener(req: AddWebhookListenerRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * Fetches a single receipt and then will stop the subscription - */ - fetchTransactionReceipt( - req: FetchTransactionReceiptRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * Fetches a single receipt with filter and then will stop the subscription - */ - fetchTransactionReceiptWithFilter( - req: FetchTransactionReceiptWithFilterRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * Webhooks - */ - getAllWebhookListeners( - req: GetAllWebhookListenersRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * Get balance update aggregate values -- useful for syncing balance details of a contract, ie. from Skyweaver. - * Also consider using SubscribeBalanceUpdates or SubscribeEvents as other alternatives. - */ - getBalanceUpdates(req: GetBalanceUpdatesRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * Get the chain ID of the indexer - */ - getChainID(headers?: object, signal?: AbortSignal): Promise - - /** - * Queries an ethereum node for the latest and confirm ETH balances - * DEPRECATED: use GetNativeTokenBalance instead - * - * @deprecated GetNativeTokenBalance - */ - getEtherBalance(req: GetEtherBalanceRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * GetMarketplaceOrders queries marketplace orders with filtering and pagination. - * - * Retrieves buy orders (offers) and sell orders (listings) from a specific marketplace - * and collection with comprehensive filtering options. - * - * Parameters: - * marketplaceContractAddress: Target marketplace contract (required) - * collectionAddress: NFT collection contract (required) - * filter: MarketplaceOrderFilter with options: - * - isListing: true=listings, false=offers, omit=both - * - userAddresses: Include specific users - * - currencyAddresses: Filter by currencies (empty=all) - * - orderIds: Filter by specific order ids (empty=all) - * - tokenIds: Filter by specific tokens (empty=all) - * - excludeUserAddresses: Exclude specific users - * - blockNumberGt: Orders greater than block number - * - createdAtAfter: Orders after timestamp - * - orderStatuses: Filter by status (OPEN, CLOSED, CANCELLED) - * - returnExpired: Include expired orders - * page: Pagination control (optional) - * - * Returns: Updated pagination info and array of matching orders - */ - getMarketplaceOrders( - req: GetMarketplaceOrdersRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * GetMarketplaceTopOrders finds the most competitive orders for specific tokens. - * - * Optimized for price discovery, returns the best available orders for each token. - * Useful for displaying current market prices and finding trading opportunities. - * - * Parameters: - * marketplaceContractAddress: Target marketplace contract (required) - * collectionAddress: NFT collection contract (required) - * filter: MarketplaceTopOrdersFilter with options: - * - currencyAddresses: Consider specific currencies (empty=all) - * - tokenIds: Target token IDs (required, non-empty) - * - isListing: true=listings/sell orders, false=offers/buy orders - * - priceSort: ASC=lowest first, DESC=highest first - * - excludeUser: Hide orders from specific user - * - * Returns: Array of top-priced active orders, sorted by priceSort preference - */ - getMarketplaceTopOrders( - req: GetMarketplaceTopOrdersRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * GetNativeTokenBalance queries an ethereum node for the latest native token account balance. - * The native token is the token of the chain the indexer is connected to, for example, ETH on Ethereum - * and POL on Polygon. - */ - getNativeTokenBalance( - req: GetNativeTokenBalanceRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * GetTokenBalances returns a balance summary/details for a specific account. By default - * if accountAddress is left empty, it will use the account from the jwt session. - * - * Also, if contractAddress is undefined, then it will list all current user coins/collectibles. - * But, if contractAddress is provided, then it will return the token balances for the contract, this is - * only useful for 1155, but for other tokens, it can act as a filter for the single balance. - * - * DEPRECATED: use GetTokenBalancesSummary / GetTokenBalancesDetails - * - * @deprecated GetTokenBalancesSummary - */ - getTokenBalances(req: GetTokenBalancesRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * GetTokenBalancesByContract returns a balances for a specific accounts and - * contracts. The collection ERC721 & ERC1155 tokens are represented as - * individual balances. - * - * If `filter` is not provided, it will error out as it requires at least - * contract address. - * - * If `filter.contractStatus` is not provided, it will include verified only - * tokens. - */ - getTokenBalancesByContract( - req: GetTokenBalancesByContractRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * GetTokenBalancesDetails returns a detailed balance summary for a specific - * accounts. The collection ERC721 & ERC1155 tokens are represented as - * individual balances. - * - * If `filter` is not provided, it will use the filter with account from the - * jwt session. - * - * If `filter.contractStatus` is not provided, it will include verified only - * tokens. - */ - getTokenBalancesDetails( - req: GetTokenBalancesDetailsRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * GetTokenBalancesSummary returns a summary of token balances for a specific - * accounts. The collection ERC721 & ERC1155 tokens are represented as a - * single aggregated balance. - * - * If `filter` is not provided, it will use the filter with account from the - * jwt session. - * - * If `filter.contractStatus` is not provided, it will include verified only - * tokens. - */ - getTokenBalancesSummary( - req: GetTokenBalancesSummaryRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * GetTokenIDRanges returns the range of tokenIDs for a token collection contract. - * This is useful for ERC-721 and ERC-1155 contracts to get the range of valid tokenIDs. It is similar to - * GetTokenIDs, but returns the range of tokenIDs instead of the list of tokenIDs, which is more efficient - * for large collections and very easy to the caller to expand the range into a list of tokenIDs. - * - * NOTE: this method will only return up to 15,000 ranges, if there are more ranges, it will return - * a boolean to indicate there are more ranges beyond the first 15,000. Therefore, if `moreRanges` is - * false then you have all the ranges, but if true, you need to make a follow up call to fetch the next - * page of ranges. - * - * As an example, if a NFT collection of 100,000 tokens uses ids from 1,2,3,...,100_000 then this endpoint - * will return just a single range from [1,100_000], but if there are gaps between the sequence, then - * those will be broken into separate range entries. - */ - getTokenIDRanges(req: GetTokenIDRangesRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * GetTokenIDs returns the list of each individual token id for a token collection contract. - * This is useful for ERC-721 and ERC-1155 contracts to get the list of valid tokenIDs. - */ - getTokenIDs(req: GetTokenIDsRequest, headers?: object, signal?: AbortSignal): Promise - - getTokenPrice(req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise - - getTokenPrices(req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * GetTokenSupplies returns the set of tokenIDs used by a contract address, supporting ERC-20, ERC-721, and ERC-1155 - * contracts, and their respective supply as well. - */ - getTokenSupplies(req: GetTokenSuppliesRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * GetTokenSuppliesMap returns the token supplies of ERC-20 and ERC-1155 tokens as requested in the `tokenMap` - * represented as a map of contractAddress :: []tokenIDs. - * - * For an ERC-20 specify tokenIDs as an empty array or [0], for example, { '0xdef': [] } or { '0xdef': [0] } - * For ERC-1155 pass the array of tokens are strings, ie. { '0xabc': ['1', '2', '3'] } - */ - getTokenSuppliesMap( - req: GetTokenSuppliesMapRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * History of mined transactions for the account which includes a list of token transfers (sent/recieved) - * and sent transactions from a Sequence wallet - */ - getTransactionHistory( - req: GetTransactionHistoryRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - getWebhookListener(req: GetWebhookListenerRequest, headers?: object, signal?: AbortSignal): Promise - - listTokenPrices(req: ListTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise - - pauseAllWebhookListeners( - req: PauseAllWebhookListenersRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * Ping the indexer - */ - ping(headers?: object, signal?: AbortSignal): Promise - - removeAllWebhookListeners( - req: RemoveAllWebhookListenersRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - removeWebhookListener( - req: RemoveWebhookListenerRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - resumeAllWebhookListeners( - req: ResumeAllWebhookListenersRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * Get the current runtime health status of the indexer - */ - runtimeStatus(headers?: object, signal?: AbortSignal): Promise - - /** - * SubscribeBalanceUpdates listens to balance updates for a specific contract address - */ - subscribeBalanceUpdates( - req: SubscribeBalanceUpdatesRequest, - options: WebrpcStreamOptions - ): WebrpcStreamController - - /** - * SubscribeEvents listens to events on-chain based on the filter criteria - * - * TODO: some additional options can be passed such as block, reorg true, etc. - * or stay behind, etc. - */ - subscribeEvents(req: SubscribeEventsRequest, options: WebrpcStreamOptions): WebrpcStreamController - - /** - * Listen to transaction receipts on-chain based on the filter criteria - */ - subscribeReceipts( - req: SubscribeReceiptsRequest, - options: WebrpcStreamOptions - ): WebrpcStreamController - - /** - * Re-sync an incorrect token balance with the correct on-chain balance - * NOTE: this method is almost never used, but we've marked it internal in case - * we ever want to use it again. This method was written a very long time ago in - * scenarios when the indexer had little bugs, but now its solid. - */ - syncBalance(req: SyncBalanceRequest, headers?: object, signal?: AbortSignal): Promise - - toggleWebhookListener( - req: ToggleWebhookListenerRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - updateWebhookListener( - req: UpdateWebhookListenerRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * Get the current version of the indexer - */ - version(headers?: object, signal?: AbortSignal): Promise -} - -// -// Schema types -// - -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 BloomStats { - hitRatio: string - falsePositivesPercent: string - hitCount: number - missCount: number - falsePositives: number -} - -export interface BloomStatus { - enabled: boolean - initialized: boolean - bloomInitElapsedTime: string - stats: BloomStats -} - -export interface Bond { - pebble: PebbleMetrics - estimatedDiskUsagePerTable: any - estimatedDiskUsageTotal: string -} - -export interface ChainInfo { - chainId: number - chainName: string -} - -export interface ContractInfo { - chainId: number - address: string - source: string - name: string - type: string - symbol: string - decimals?: number - logoURI: string - deployed: boolean - bytecodeHash: string - extensions: ContractInfoExtensions - updatedAt: string - queuedAt?: string - status: ResourceStatus -} - -export interface ContractInfoExtensionBridgeInfo { - tokenAddress: string -} - -export interface ContractInfoExtensionIndexingInfo { - useOnChainBalance: boolean -} - -export interface ContractInfoExtensions { - link?: string - description?: string - categories?: Array - bridgeInfo?: { [key: string]: ContractInfoExtensionBridgeInfo } - indexingInfo?: ContractInfoExtensionIndexingInfo - ogImage?: string - ogName?: string - originChainId?: number - originAddress?: string - blacklist?: boolean - verified?: boolean - verifiedBy?: string - featured?: boolean - featureIndex?: number -} - -export enum ContractType { - UNKNOWN = 'UNKNOWN', - NATIVE = 'NATIVE', - ERC20 = 'ERC20', - ERC721 = 'ERC721', - ERC1155 = 'ERC1155', - SEQUENCE_WALLET = 'SEQUENCE_WALLET', - ERC20_BRIDGE = 'ERC20_BRIDGE', - ERC721_BRIDGE = 'ERC721_BRIDGE', - ERC1155_BRIDGE = 'ERC1155_BRIDGE', - SEQ_MARKETPLACE = 'SEQ_MARKETPLACE', - ERC6909 = 'ERC6909' -} - -export enum ContractVerificationStatus { - VERIFIED = 'VERIFIED', - UNVERIFIED = 'UNVERIFIED', - ALL = 'ALL' -} - -export interface DiskUsage { - humanReadable: string - used: number - size: number - percent: number - dirs: { [key: string]: string } -} - -export interface EtherBalance { - accountAddress: string - balanceWei: string -} - -export interface EventDecoded { - topicHash: string - eventSig: string - types: Array - names: Array - values: Array -} - -export interface EventFilter { - events?: Array - contractAddresses?: Array - accounts?: Array - tokenIDs?: Array -} - -export interface EventLog { - id: number - uid: string - type: EventLogType - blockNumber: number - blockHash: string - parentBlockHash: string - contractAddress: string - contractType: ContractType - txnHash: string - txnIndex: number - txnLogIndex: number - logDataType: EventLogDataType - ts: string - txnInfo?: TxnInfo - rawLog?: { [key: string]: any } - event?: EventDecoded -} - -export enum EventLogDataType { - EVENT = 'EVENT', - TOKEN_TRANSFER = 'TOKEN_TRANSFER', - NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', - SEQUENCE_TXN = 'SEQUENCE_TXN' -} - -export enum EventLogType { - UNKNOWN = 'UNKNOWN', - BLOCK_ADDED = 'BLOCK_ADDED', - BLOCK_REMOVED = 'BLOCK_REMOVED' -} - -export interface GatewayBackendResponseTime { - percentiles: { [key: string]: number } - average: number -} - -export interface GatewayBackendRuntimeStatus { - name: string - chainId: number - responseTime: GatewayBackendResponseTime -} - -export interface GatewayEtherBalance { - chainId: number - errorReason?: string - result: EtherBalance -} - -export interface GatewayNativeTokenBalance { - chainId: number - errorReason?: string - result: NativeTokenBalance -} - -export interface GatewayNativeTokenBalances { - chainId: number - errorReason?: string - results: Array -} - -export interface GatewayPrice { - chainID: number - errorReason?: string - results: Array -} - -export interface GatewayRuntimeStatus { - healthOK: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - backends: Array -} - -export interface GatewayTokenBalance { - chainId: number - errorReason?: string - results: Array -} - -export interface GatewayTokenPriceQuery { - chainID: number - queries: Array -} - -export interface GatewayTransaction { - chainId: number - errorReason?: string - results: Array -} - -export interface IndexState { - chainId: string - lastBlockNum: number - lastBlockHash: string -} - -export interface IndexedBlock { - blockNumber: number - blockShortHash: string -} - -export interface IndexerMetrics { - blocksPerSecond: number - eventsPerSecond: number -} - -export interface MarketplaceOrder { - orderId: string - tokenContract: string - tokenId: string - isListing: boolean - quantity: string - quantityRemaining: string - currencyAddress: string - pricePerToken: string - expiry: string - orderStatus: OrderStatus - createdBy: string - blockNumber: number - orderbookContractAddress: string - createdAt: number -} - -export interface MarketplaceOrderFilter { - isListing?: boolean - userAddresses?: Array - currencyAddresses: Array - orderIds: Array - tokenIds: Array - excludeUserAddresses?: Array - blockNumberGt: number - createdAtAfter: number - orderStatuses: Array - returnExpired: boolean -} - -export interface MarketplaceTopOrdersFilter { - currencyAddresses: Array - tokenIds: Array - isListing: boolean - priceSort: SortOrder - excludeUser?: string -} - -export interface MetadataOptions { - verifiedOnly?: boolean - unverifiedOnly?: boolean - includeContracts?: Array -} - -export interface NativeTokenBalance { - accountAddress: string - chainId: number - name: string - symbol: string - balance: string - balanceUSD: string - priceUSD: string - priceUpdatedAt?: string - errorReason?: string -} - -export enum NetworkType { - MAINNETS = 'MAINNETS', - TESTNETS = 'TESTNETS', - ALL = 'ALL' -} - -export enum OrderStatus { - OPEN = 'OPEN', - CLOSED = 'CLOSED', - CANCELLED = 'CANCELLED' -} - -export interface Page { - page?: number - column?: string - before?: any - after?: any - sort?: Array - pageSize?: number - more?: boolean -} - -export interface PebbleMetrics { - compactionCount: number - compactionEstimatedDebt: number - compactionInProgressBytes: number - compactionNumInProgress: number - compactionMarkedFiles: number -} - -export interface Price { - contractAddress: string - tokenID?: string - priceUSD: string - updatedAt?: string -} - -export enum ResourceStatus { - NOT_AVAILABLE = 'NOT_AVAILABLE', - REFRESHING = 'REFRESHING', - AVAILABLE = 'AVAILABLE' -} - -export interface RuntimeChecks { - running: boolean - runnables: any - cgoEnabled: boolean - quotaControlEnabled: boolean - syncMode: string - percentIndexed: number - lastBlockNum: number - lastBlockNumWithState: number - bloomStatus: BloomStatus - bond: Bond - diskUsage: DiskUsage - metrics: IndexerMetrics -} - -export interface RuntimeStatus { - healthOK: boolean - indexerEnabled: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - chainID: number - checks: RuntimeChecks -} - -export interface SortBy { - column: string - order: SortOrder -} - -export enum SortOrder { - DESC = 'DESC', - ASC = 'ASC' -} - -export interface TokenBalance { - contractType: ContractType - contractAddress: string - accountAddress: string - tokenID?: string - balance: string - balanceUSD: string - priceUSD: string - priceUpdatedAt?: string - blockHash: string - blockNumber: number - chainId: number - uniqueCollectibles: string - isSummary: boolean - contractInfo?: ContractInfo - tokenMetadata?: TokenMetadata -} - -export interface TokenBalanceFilter { - contractAddress: string - sinceBlockNumber: number -} - -export interface TokenBalancesByContractFilter { - contractAddresses: Array - accountAddresses?: Array - contractStatus?: ContractVerificationStatus - tokenIDs?: Array -} - -export interface TokenBalancesFilter { - accountAddresses: Array - contractStatus?: ContractVerificationStatus - contractTypes?: Array - contractWhitelist?: Array - contractBlacklist?: Array - omitNativeBalances: boolean - omitPrices?: boolean - tokenIDs?: Array -} - -export interface TokenHistory { - blockNumber: number - blockHash: string - contractAddress: string - contractType: ContractType - fromAddress: string - toAddress: string - txnHash: string - txnIndex: number - txnLogIndex: number - tokenIDs: string - amounts: string - ts: string -} - -export interface TokenIDRange { - start: string - end: string -} - -export interface TokenMetadata { - chainId?: number - contractAddress?: string - tokenId: string - source: 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: ResourceStatus - queuedAt?: string - lastFetched?: string -} - -export interface TokenPriceQuery { - contractAddress: string - tokenID?: string -} - -export interface TokenSupply { - tokenID: string - supply: string - chainId: number - contractInfo?: ContractInfo - tokenMetadata?: TokenMetadata -} - -export interface Transaction { - txnHash: string - blockNumber: number - blockHash: string - chainId: number - metaTxnID?: string - transfers?: Array - timestamp: string -} - -export interface TransactionFilter { - txnHash?: string - from?: string - to?: string - contractAddress?: string - event?: string -} - -export interface TransactionHistoryFilter { - accountAddress?: string - contractAddress?: string - accountAddresses?: Array - contractAddresses?: Array - transactionHashes?: Array - metaTransactionIDs?: Array - fromBlock?: number - toBlock?: number - tokenID?: string - omitPrices?: boolean -} - -export interface TransactionLog { - contractAddress: string - topics: Array - data: string - index: number -} - -export interface TransactionReceipt { - txnHash: string - txnStatus: TransactionStatus - txnIndex: number - txnType: TransactionType - blockHash: string - blockNumber: number - gasUsed: number - effectiveGasPrice: string - from: string - to: string - logs: Array - final: boolean - reorged: boolean -} - -export enum TransactionStatus { - FAILED = 'FAILED', - SUCCESSFUL = 'SUCCESSFUL' -} - -export enum TransactionType { - LegacyTxnType = 'LegacyTxnType', - AccessListTxnType = 'AccessListTxnType', - DynamicFeeTxnType = 'DynamicFeeTxnType' -} - -export interface TxnInfo { - from: string - to: string - value: string -} - -export interface TxnTransfer { - transferType: TxnTransferType - contractAddress: string - contractType: ContractType - from: string - to: string - tokenIds?: Array - amounts: Array - logIndex: number - amountsUSD?: Array - pricesUSD?: Array - contractInfo?: ContractInfo - tokenMetadata?: { [key: string]: TokenMetadata } -} - -export enum TxnTransferType { - UNKNOWN = 'UNKNOWN', - SEND = 'SEND', - RECEIVE = 'RECEIVE' -} - -export interface Version { - webrpcVersion: string - schemaVersion: string - schemaHash: string - appVersion: string -} - -export interface WALWriterRuntimeStatus { - healthOK: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - chainID: number - percentWALWritten: number -} - -export interface WebhookListener { - id: number - projectID: number - url: string - filters: EventFilter - name: string - updatedAt: string - active: boolean -} - -export interface AddWebhookListenerRequest { - url: string - filters: EventFilter - projectId?: number -} - -export interface AddWebhookListenerResponse { - status: boolean - listener: WebhookListener -} - -export interface FetchTransactionReceiptRequest { - txnHash: string - maxBlockWait?: number -} - -export interface FetchTransactionReceiptResponse { - receipt: TransactionReceipt -} - -export interface FetchTransactionReceiptWithFilterRequest { - filter: TransactionFilter - maxBlockWait?: number -} - -export interface FetchTransactionReceiptWithFilterResponse { - receipt: TransactionReceipt -} - -export interface GetAllWebhookListenersRequest { - projectId?: number -} - -export interface GetAllWebhookListenersResponse { - listeners: Array -} - -export interface GetBalanceUpdatesRequest { - contractAddress: string - lastBlockNumber: number - lastBlockHash?: string - page?: Page -} - -export interface GetBalanceUpdatesResponse { - page: Page - balances: Array -} - -export interface GetChainIDRequest {} - -export interface GetChainIDResponse { - chainID: number -} - -export interface GetEtherBalanceRequest { - accountAddress?: string -} - -export interface GetEtherBalanceResponse { - balance: EtherBalance -} - -export interface GetMarketplaceOrdersRequest { - marketplaceContractAddress: string - collectionAddress: string - filter?: MarketplaceOrderFilter - page?: Page -} - -export interface GetMarketplaceOrdersResponse { - page?: Page - orders: Array -} - -export interface GetMarketplaceTopOrdersRequest { - marketplaceContractAddress: string - collectionAddress: string - filter: MarketplaceTopOrdersFilter -} - -export interface GetMarketplaceTopOrdersResponse { - orders: Array -} - -export interface GetNativeTokenBalanceRequest { - accountAddress?: string - omitPrices?: boolean -} - -export interface GetNativeTokenBalanceResponse { - balance: NativeTokenBalance -} - -export interface GetTokenBalancesRequest { - accountAddress?: string - contractAddress?: string - tokenID?: string - includeMetadata?: boolean - metadataOptions?: MetadataOptions - includeCollectionTokens?: boolean - page?: Page -} - -export interface GetTokenBalancesResponse { - page: Page - balances: Array -} - -export interface GetTokenBalancesByContractRequest { - filter: TokenBalancesByContractFilter - omitMetadata?: boolean - page?: Page -} - -export interface GetTokenBalancesByContractResponse { - page: Page - balances: Array -} - -export interface GetTokenBalancesDetailsRequest { - filter: TokenBalancesFilter - omitMetadata?: boolean - page?: Page -} - -export interface GetTokenBalancesDetailsResponse { - page: Page - nativeBalances: Array - balances: Array -} - -export interface GetTokenBalancesSummaryRequest { - filter: TokenBalancesFilter - omitMetadata?: boolean - page?: Page -} - -export interface GetTokenBalancesSummaryResponse { - page: Page - nativeBalances: Array - balances: Array -} - -export interface GetTokenIDRangesRequest { - contractAddress: string - lastTokenID?: string -} - -export interface GetTokenIDRangesResponse { - contractType: ContractType - tokenIDRanges: Array - moreRanges: boolean -} - -export interface GetTokenIDsRequest { - contractAddress: string - page?: Page -} - -export interface GetTokenIDsResponse { - page: Page - contractType: ContractType - tokenIDs: Array -} - -export interface GetTokenPriceRequest { - q: TokenPriceQuery -} - -export interface GetTokenPriceResponse { - price: Price -} - -export interface GetTokenPricesRequest { - q: Array -} - -export interface GetTokenPricesResponse { - prices: Array -} - -export interface GetTokenSuppliesRequest { - contractAddress: string - includeMetadata?: boolean - page?: Page -} - -export interface GetTokenSuppliesResponse { - page: Page - contractType: ContractType - tokenIDs: Array -} - -export interface GetTokenSuppliesMapRequest { - tokenMap: { [key: string]: Array } - includeMetadata?: boolean -} - -export interface GetTokenSuppliesMapResponse { - supplies: { [key: string]: Array } -} - -export interface GetTransactionHistoryRequest { - filter: TransactionHistoryFilter - page?: Page - includeMetadata?: boolean - metadataOptions?: MetadataOptions -} - -export interface GetTransactionHistoryResponse { - page: Page - transactions: Array -} - -export interface GetWebhookListenerRequest { - id: number - projectId?: number -} - -export interface GetWebhookListenerResponse { - listener: WebhookListener -} - -export interface ListTokenPricesRequest { - page?: Page -} - -export interface ListTokenPricesResponse { - page: Page - prices: Array -} - -export interface PauseAllWebhookListenersRequest { - projectId?: number -} - -export interface PauseAllWebhookListenersResponse { - status: boolean -} - -export interface PingRequest {} - -export interface PingResponse { - status: boolean -} - -export interface RemoveAllWebhookListenersRequest { - projectId?: number -} - -export interface RemoveAllWebhookListenersResponse { - status: boolean -} - -export interface RemoveWebhookListenerRequest { - id: number - projectId?: number -} - -export interface RemoveWebhookListenerResponse { - status: boolean -} - -export interface ResumeAllWebhookListenersRequest { - projectId?: number -} - -export interface ResumeAllWebhookListenersResponse { - status: boolean -} - -export interface RuntimeStatusRequest {} - -export interface RuntimeStatusResponse { - status: RuntimeStatus -} - -export interface SubscribeBalanceUpdatesRequest { - contractAddress: string -} - -export interface SubscribeBalanceUpdatesResponse { - balance: TokenBalance -} - -export interface SubscribeEventsRequest { - filter: EventFilter -} - -export interface SubscribeEventsResponse { - log: EventLog -} - -export interface SubscribeReceiptsRequest { - filter: TransactionFilter -} - -export interface SubscribeReceiptsResponse { - receipt: TransactionReceipt -} - -export interface SyncBalanceRequest { - accountAddress: string - contractAddress: string - tokenID?: string -} - -export interface SyncBalanceResponse {} - -export interface ToggleWebhookListenerRequest { - id: number - projectId?: number -} - -export interface ToggleWebhookListenerResponse { - webhookListener: WebhookListener -} - -export interface UpdateWebhookListenerRequest { - listener: WebhookListener - projectId?: number -} - -export interface UpdateWebhookListenerResponse { - status: boolean -} - -export interface VersionRequest {} - -export interface VersionResponse { - version: Version -} - -// -// Client -// - -export class Indexer implements IndexerClient { - protected hostname: string - protected fetch: Fetch - protected path = '/rpc/Indexer/' - - 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 = { - addWebhookListener: (req: AddWebhookListenerRequest) => ['Indexer', 'addWebhookListener', req] as const, - fetchTransactionReceipt: (req: FetchTransactionReceiptRequest) => ['Indexer', 'fetchTransactionReceipt', req] as const, - fetchTransactionReceiptWithFilter: (req: FetchTransactionReceiptWithFilterRequest) => - ['Indexer', 'fetchTransactionReceiptWithFilter', req] as const, - getAllWebhookListeners: (req: GetAllWebhookListenersRequest) => ['Indexer', 'getAllWebhookListeners', req] as const, - getBalanceUpdates: (req: GetBalanceUpdatesRequest) => ['Indexer', 'getBalanceUpdates', req] as const, - getChainID: () => ['Indexer', 'getChainID'] as const, - getEtherBalance: (req: GetEtherBalanceRequest) => ['Indexer', 'getEtherBalance', req] as const, - getMarketplaceOrders: (req: GetMarketplaceOrdersRequest) => ['Indexer', 'getMarketplaceOrders', req] as const, - getMarketplaceTopOrders: (req: GetMarketplaceTopOrdersRequest) => ['Indexer', 'getMarketplaceTopOrders', req] as const, - getNativeTokenBalance: (req: GetNativeTokenBalanceRequest) => ['Indexer', 'getNativeTokenBalance', req] as const, - getTokenBalances: (req: GetTokenBalancesRequest) => ['Indexer', 'getTokenBalances', req] as const, - getTokenBalancesByContract: (req: GetTokenBalancesByContractRequest) => - ['Indexer', 'getTokenBalancesByContract', req] as const, - getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => ['Indexer', 'getTokenBalancesDetails', req] as const, - getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => ['Indexer', 'getTokenBalancesSummary', req] as const, - getTokenIDRanges: (req: GetTokenIDRangesRequest) => ['Indexer', 'getTokenIDRanges', req] as const, - getTokenIDs: (req: GetTokenIDsRequest) => ['Indexer', 'getTokenIDs', req] as const, - getTokenPrice: (req: GetTokenPriceRequest) => ['Indexer', 'getTokenPrice', req] as const, - getTokenPrices: (req: GetTokenPricesRequest) => ['Indexer', 'getTokenPrices', req] as const, - getTokenSupplies: (req: GetTokenSuppliesRequest) => ['Indexer', 'getTokenSupplies', req] as const, - getTokenSuppliesMap: (req: GetTokenSuppliesMapRequest) => ['Indexer', 'getTokenSuppliesMap', req] as const, - getTransactionHistory: (req: GetTransactionHistoryRequest) => ['Indexer', 'getTransactionHistory', req] as const, - getWebhookListener: (req: GetWebhookListenerRequest) => ['Indexer', 'getWebhookListener', req] as const, - listTokenPrices: (req: ListTokenPricesRequest) => ['Indexer', 'listTokenPrices', req] as const, - pauseAllWebhookListeners: (req: PauseAllWebhookListenersRequest) => ['Indexer', 'pauseAllWebhookListeners', req] as const, - ping: () => ['Indexer', 'ping'] as const, - removeAllWebhookListeners: (req: RemoveAllWebhookListenersRequest) => ['Indexer', 'removeAllWebhookListeners', req] as const, - removeWebhookListener: (req: RemoveWebhookListenerRequest) => ['Indexer', 'removeWebhookListener', req] as const, - resumeAllWebhookListeners: (req: ResumeAllWebhookListenersRequest) => ['Indexer', 'resumeAllWebhookListeners', req] as const, - runtimeStatus: () => ['Indexer', 'runtimeStatus'] as const, - subscribeBalanceUpdates: (req: SubscribeBalanceUpdatesRequest) => ['Indexer', 'subscribeBalanceUpdates', req] as const, - subscribeEvents: (req: SubscribeEventsRequest) => ['Indexer', 'subscribeEvents', req] as const, - subscribeReceipts: (req: SubscribeReceiptsRequest) => ['Indexer', 'subscribeReceipts', req] as const, - syncBalance: (req: SyncBalanceRequest) => ['Indexer', 'syncBalance', req] as const, - toggleWebhookListener: (req: ToggleWebhookListenerRequest) => ['Indexer', 'toggleWebhookListener', req] as const, - updateWebhookListener: (req: UpdateWebhookListenerRequest) => ['Indexer', 'updateWebhookListener', req] as const, - version: () => ['Indexer', 'version'] as const - } - - addWebhookListener = ( - req: AddWebhookListenerRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('AddWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'AddWebhookListenerResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - fetchTransactionReceipt = ( - req: FetchTransactionReceiptRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('FetchTransactionReceipt'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'FetchTransactionReceiptResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - fetchTransactionReceiptWithFilter = ( - req: FetchTransactionReceiptWithFilterRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('FetchTransactionReceiptWithFilter'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'FetchTransactionReceiptWithFilterResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getAllWebhookListeners = ( - req: GetAllWebhookListenersRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetAllWebhookListenersResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getBalanceUpdates = ( - req: GetBalanceUpdatesRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetBalanceUpdates'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetBalanceUpdatesResponse') - }) - }, - error => { - 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( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetChainIDResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getEtherBalance = (req: GetEtherBalanceRequest, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetEtherBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetEtherBalanceResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getMarketplaceOrders = ( - req: GetMarketplaceOrdersRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetMarketplaceOrders'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetMarketplaceOrdersResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getMarketplaceTopOrders = ( - req: GetMarketplaceTopOrdersRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetMarketplaceTopOrders'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetMarketplaceTopOrdersResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getNativeTokenBalance = ( - req: GetNativeTokenBalanceRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetNativeTokenBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetNativeTokenBalanceResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenBalances = ( - req: GetTokenBalancesRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenBalances'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenBalancesResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenBalancesByContract = ( - req: GetTokenBalancesByContractRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenBalancesByContract'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenBalancesByContractResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenBalancesDetails = ( - req: GetTokenBalancesDetailsRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenBalancesDetails'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenBalancesDetailsResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenBalancesSummary = ( - req: GetTokenBalancesSummaryRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenBalancesSummary'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenBalancesSummaryResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenIDRanges = ( - req: GetTokenIDRangesRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenIDRanges'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenIDRangesResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenIDs = (req: GetTokenIDsRequest, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetTokenIDs'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenIDsResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenPrice = (req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetTokenPrice'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenPriceResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenPrices = (req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenPricesResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenSupplies = ( - req: GetTokenSuppliesRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenSupplies'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenSuppliesResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenSuppliesMap = ( - req: GetTokenSuppliesMapRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenSuppliesMap'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenSuppliesMapResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTransactionHistory = ( - req: GetTransactionHistoryRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTransactionHistory'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTransactionHistoryResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getWebhookListener = ( - req: GetWebhookListenerRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetWebhookListenerResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - listTokenPrices = (req: ListTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('ListTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'ListTokenPricesResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - pauseAllWebhookListeners = ( - req: PauseAllWebhookListenersRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('PauseAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'PauseAllWebhookListenersResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'PingResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - removeAllWebhookListeners = ( - req: RemoveAllWebhookListenersRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('RemoveAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'RemoveAllWebhookListenersResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - removeWebhookListener = ( - req: RemoveWebhookListenerRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('RemoveWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'RemoveWebhookListenerResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - resumeAllWebhookListeners = ( - req: ResumeAllWebhookListenersRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('ResumeAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'ResumeAllWebhookListenersResponse') - }) - }, - error => { - 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( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'RuntimeStatusResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - subscribeBalanceUpdates = ( - req: SubscribeBalanceUpdatesRequest, - options: WebrpcStreamOptions - ): WebrpcStreamController => { - const abortController = new AbortController() - const abortSignal = abortController.signal - - if (options.signal) { - abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { - signal: options.signal - }) - } - - const _fetch = () => - this.fetch(this.url('SubscribeBalanceUpdates'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( - async res => { - await sseResponse(res, options, _fetch) - }, - error => { - options.onError(error, _fetch) - } - ) - - const resp = _fetch() - return { - abort: abortController.abort.bind(abortController), - closed: resp - } - } - subscribeEvents = ( - req: SubscribeEventsRequest, - options: WebrpcStreamOptions - ): WebrpcStreamController => { - const abortController = new AbortController() - const abortSignal = abortController.signal - - if (options.signal) { - abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { - signal: options.signal - }) - } - - const _fetch = () => - this.fetch(this.url('SubscribeEvents'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( - async res => { - await sseResponse(res, options, _fetch) - }, - error => { - options.onError(error, _fetch) - } - ) - - const resp = _fetch() - return { - abort: abortController.abort.bind(abortController), - closed: resp - } - } - subscribeReceipts = ( - req: SubscribeReceiptsRequest, - options: WebrpcStreamOptions - ): WebrpcStreamController => { - const abortController = new AbortController() - const abortSignal = abortController.signal - - if (options.signal) { - abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { - signal: options.signal - }) - } - - const _fetch = () => - this.fetch(this.url('SubscribeReceipts'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( - async res => { - await sseResponse(res, options, _fetch) - }, - error => { - options.onError(error, _fetch) - } - ) - - const resp = _fetch() - return { - abort: abortController.abort.bind(abortController), - closed: resp - } - } - syncBalance = (req: SyncBalanceRequest, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SyncBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'SyncBalanceResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - toggleWebhookListener = ( - req: ToggleWebhookListenerRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('ToggleWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'ToggleWebhookListenerResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - updateWebhookListener = ( - req: UpdateWebhookListenerRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('UpdateWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'UpdateWebhookListenerResponse') - }) - }, - error => { - 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( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'VersionResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } -} - -const sseResponse = async (res: Response, options: WebrpcStreamOptions, retryFetch: () => Promise) => { - const { onMessage, onOpen, onClose, onError } = options - - if (!res.ok) { - try { - await buildResponse(res) - } catch (error) { - // @ts-ignore - onError(error, retryFetch) - } - return - } - - if (!res.body) { - onError( - WebrpcBadResponseError.new({ - status: res.status, - cause: 'Invalid response, missing body' - }), - retryFetch - ) - return - } - - onOpen && onOpen() - - const reader = res.body.getReader() - const decoder = new TextDecoder() - let buffer = '' - let lastReadTime = Date.now() - const timeout = (10 + 1) * 1000 - let timeoutError = false - const intervalId = setInterval(() => { - if (Date.now() - lastReadTime > timeout) { - timeoutError = true - clearInterval(intervalId) - reader.releaseLock() - } - }, timeout) - - while (true) { - let value - let done - try { - ;({ value, done } = await reader.read()) - if (timeoutError) throw new Error('Timeout, no data or heartbeat received') - lastReadTime = Date.now() - buffer += decoder.decode(value, { stream: true }) - } catch (error) { - if (error instanceof DOMException && error.name === 'AbortError') { - onError( - WebrpcClientAbortedError.new({ - message: 'AbortError', - cause: `AbortError: ${error instanceof Error ? error.message : String(error)}` - }), - () => { - throw new Error('Abort signal cannot be used to reconnect') - } - ) - } else { - onError( - WebrpcStreamLostError.new({ - cause: `reader.read(): ${error instanceof Error ? error.message : String(error)}` - }), - retryFetch - ) - } - return - } - - let lines = buffer.split('\n') - for (let i = 0; i < lines.length - 1; i++) { - const line = lines[i] - if (line?.length === 0) { - continue - } - let data: any - try { - data = JSON.parse(line) - if (data.hasOwnProperty('webrpcError')) { - const error = data.webrpcError - const code: number = typeof error.code === 'number' ? error.code : 0 - onError((webrpcErrorByCode[code] || WebrpcError).new(error), retryFetch) - return - } - } catch (error) { - if (error instanceof Error && error.message === 'Abort signal cannot be used to reconnect') { - throw error - } - onError( - WebrpcBadResponseError.new({ - status: res.status, - cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}` - }), - retryFetch - ) - } - onMessage(data) - } - - if (!done) { - const lastLine = lines[lines.length - 1] - buffer = lastLine || '' - continue - } - - onClose && onClose() - return - } -} - -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 => { - 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 interface WebrpcStreamOptions extends WebrpcOptions { - onMessage: (message: T) => void - onError: (error: WebrpcError, reconnect: () => void) => void - onOpen?: () => void - onClose?: () => void -} - -export interface WebrpcOptions { - headers?: HeadersInit - signal?: AbortSignal -} - -export interface WebrpcStreamController { - abort: (reason?: any) => void - closed: Promise -} - -export const JsonEncode = (obj: T): 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 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 AccessKeyMismatchError extends WebrpcError { - 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 AccessKeyNotFoundError extends WebrpcError { - 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 AtLeastOneKeyError extends WebrpcError { - 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 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 InvalidArgumentError extends WebrpcError { - 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 InvalidOriginError extends WebrpcError { - 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(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 MaxAccessKeysError extends WebrpcError { - 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 MetadataCallFailedError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'MetadataCallFailed' - this.code = typeof error.code === 'number' ? error.code : 3003 - this.message = error.message || `Metadata service call failed` - this.status = typeof error.status === 'number' ? error.status : 400 - if (error.cause !== undefined) this.cause = error.cause - Object.setPrototypeOf(this, MetadataCallFailedError.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 NoDefaultKeyError extends WebrpcError { - 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 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 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 ProjectNotFoundError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'ProjectNotFound' - this.code = typeof error.code === 'number' ? error.code : 1100 - 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 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 QuotaExceededError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'QuotaExceeded' - this.code = typeof error.code === 'number' ? error.code : 1200 - this.message = error.message || `Quota 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 RateLimitError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'RateLimit' - this.code = typeof error.code === 'number' ? error.code : 1201 - this.message = error.message || `Rate limit exceeded` - this.status = typeof error.status === 'number' ? error.status : 429 - if (error.cause !== undefined) this.cause = error.cause - Object.setPrototypeOf(this, RateLimitError.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 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 ResourceExhaustedError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'ResourceExhausted' - this.code = typeof error.code === 'number' ? error.code : 2004 - this.message = error.message || `Resource exhausted` - this.status = typeof error.status === 'number' ? error.status : 400 - if (error.cause !== undefined) this.cause = error.cause - Object.setPrototypeOf(this, ResourceExhaustedError.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 TimeoutError extends WebrpcError { - 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 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 UnauthorizedUserError extends WebrpcError { - 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 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 enum errors { - WebrpcEndpoint = 'WebrpcEndpoint', - WebrpcRequestFailed = 'WebrpcRequestFailed', - WebrpcBadRoute = 'WebrpcBadRoute', - WebrpcBadMethod = 'WebrpcBadMethod', - WebrpcBadRequest = 'WebrpcBadRequest', - WebrpcBadResponse = 'WebrpcBadResponse', - WebrpcServerPanic = 'WebrpcServerPanic', - WebrpcInternalError = 'WebrpcInternalError', - WebrpcClientAborted = 'WebrpcClientAborted', - WebrpcStreamLost = 'WebrpcStreamLost', - WebrpcStreamFinished = 'WebrpcStreamFinished', - Aborted = 'Aborted', - AccessKeyMismatch = 'AccessKeyMismatch', - AccessKeyNotFound = 'AccessKeyNotFound', - AtLeastOneKey = 'AtLeastOneKey', - Geoblocked = 'Geoblocked', - InvalidArgument = 'InvalidArgument', - InvalidOrigin = 'InvalidOrigin', - InvalidService = 'InvalidService', - MaxAccessKeys = 'MaxAccessKeys', - MetadataCallFailed = 'MetadataCallFailed', - MethodNotFound = 'MethodNotFound', - NoDefaultKey = 'NoDefaultKey', - NotFound = 'NotFound', - PermissionDenied = 'PermissionDenied', - ProjectNotFound = 'ProjectNotFound', - QueryFailed = 'QueryFailed', - QuotaExceeded = 'QuotaExceeded', - RateLimit = 'RateLimit', - RateLimited = 'RateLimited', - RequestConflict = 'RequestConflict', - ResourceExhausted = 'ResourceExhausted', - SessionExpired = 'SessionExpired', - Timeout = 'Timeout', - Unauthorized = 'Unauthorized', - UnauthorizedUser = 'UnauthorizedUser', - Unavailable = 'Unavailable' -} - -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, - Aborted = 1005, - AccessKeyMismatch = 1102, - AccessKeyNotFound = 1101, - AtLeastOneKey = 1302, - Geoblocked = 1006, - InvalidArgument = 2001, - InvalidOrigin = 1103, - InvalidService = 1104, - MaxAccessKeys = 1301, - MetadataCallFailed = 3003, - MethodNotFound = 1003, - NoDefaultKey = 1300, - NotFound = 3000, - PermissionDenied = 1001, - ProjectNotFound = 1100, - QueryFailed = 2003, - QuotaExceeded = 1200, - RateLimit = 1201, - RateLimited = 1007, - RequestConflict = 1004, - ResourceExhausted = 2004, - SessionExpired = 1002, - Timeout = 1900, - Unauthorized = 1000, - UnauthorizedUser = 1105, - Unavailable = 2002 -} - -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, - [1005]: AbortedError, - [1102]: AccessKeyMismatchError, - [1101]: AccessKeyNotFoundError, - [1302]: AtLeastOneKeyError, - [1006]: GeoblockedError, - [2001]: InvalidArgumentError, - [1103]: InvalidOriginError, - [1104]: InvalidServiceError, - [1301]: MaxAccessKeysError, - [3003]: MetadataCallFailedError, - [1003]: MethodNotFoundError, - [1300]: NoDefaultKeyError, - [3000]: NotFoundError, - [1001]: PermissionDeniedError, - [1100]: ProjectNotFoundError, - [2003]: QueryFailedError, - [1200]: QuotaExceededError, - [1201]: RateLimitError, - [1007]: RateLimitedError, - [1004]: RequestConflictError, - [2004]: ResourceExhaustedError, - [1002]: SessionExpiredError, - [1900]: TimeoutError, - [1000]: UnauthorizedError, - [1105]: UnauthorizedUserError, - [2002]: UnavailableError -} - -// -// Webrpc -// - -export const WebrpcHeader = 'Webrpc' - -export const WebrpcHeaderValue = 'webrpc@v0.31.2;gen-typescript@v0.23.1;sequence-indexer@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 ?? '' - } -} diff --git a/packages/indexer/src/indexergw.gen.ts b/packages/indexer/src/indexergw.gen.ts deleted file mode 100644 index 729d04cdc..000000000 --- a/packages/indexer/src/indexergw.gen.ts +++ /dev/null @@ -1,1787 +0,0 @@ -/* eslint-disable */ -// sequence-indexer v0.4.0 b978d153702d614d5f1b9c98ff7f2e5857cccfd6 -// -- -// Code generated by Webrpc-gen@v0.31.2 with typescript generator. DO NOT EDIT. -// -// webrpc-gen -schema=merged.gen.json -service=IndexerGateway -target=typescript -client -out=./clients/indexergw.gen.ts - -// Webrpc description and code-gen version -export const WebrpcVersion = 'v1' - -// Schema version of your RIDL schema -export const WebrpcSchemaVersion = 'v0.4.0' - -// Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = 'b978d153702d614d5f1b9c98ff7f2e5857cccfd6' - -// -// Client interface -// - -export interface IndexerGatewayClient { - /** - * GetTokenBalances returns a balance summary/details for an specific account - * on all indexer nodes. By default if accountAddress is left empty, it will - * use the account from the jwt session. - */ - getBalanceUpdates(req: GetBalanceUpdatesRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * GetChains returns a list of chains with their ID and name - */ - getChains(req: GetChainsRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * GetNativeTokenBalance queries indexer nodes for the latest native token - * account balance. - */ - getNativeTokenBalance( - req: GetNativeTokenBalanceRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * GetTokenBalances returns a balance summary/details for a specific account - * on all indexer nodes. By default if accountAddress is left empty, it will - * use the account from the jwt session. - * - * @deprecated Use GetTokenBalancesSummary or GetTokenBalancesDetails instead. - */ - getTokenBalances(req: GetTokenBalancesRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * GetTokenBalancesByContract returns a balances for specific accounts and - * contracts on all indexer nodes. The collection ERC721 & ERC1155 tokens are - * represented as individual balances. - */ - getTokenBalancesByContract( - req: GetTokenBalancesByContractRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * GetTokenBalancesDetails returns a detailed balance summary for the given - * accounts on all indexer nodes. The collection ERC721 & ERC1155 tokens are - * represented as individual balances. - */ - getTokenBalancesDetails( - req: GetTokenBalancesDetailsRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * GetTokenBalancesSummary returns a summary of token balances for the given - * accounts on all indexer nodes. The collection ERC721 & ERC1155 tokens are - * represented as a single aggregated balance. - */ - getTokenBalancesSummary( - req: GetTokenBalancesSummaryRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - getTokenPrice(req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise - - getTokenPrices(req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise - - /** - * GetTransactionHistory returns the history of mined transactions for the - * given account on all indexer nodes, which includes a list of token transfer - * (sent/received) , and sent transactions from a Sequence wallet. - */ - getTransactionHistory( - req: GetTransactionHistoryRequest, - headers?: object, - signal?: AbortSignal - ): Promise - - /** - * Ping the indexer - */ - ping(headers?: object, signal?: AbortSignal): Promise - - /** - * Get the current runtime health status of the indexer gatewya - */ - runtimeStatus(headers?: object, signal?: AbortSignal): Promise - - /** - * Get the current version of the indexer - */ - version(headers?: object, signal?: AbortSignal): Promise -} - -// -// Schema types -// - -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 BloomStats { - hitRatio: string - falsePositivesPercent: string - hitCount: number - missCount: number - falsePositives: number -} - -export interface BloomStatus { - enabled: boolean - initialized: boolean - bloomInitElapsedTime: string - stats: BloomStats -} - -export interface Bond { - pebble: PebbleMetrics - estimatedDiskUsagePerTable: any - estimatedDiskUsageTotal: string -} - -export interface ChainInfo { - chainId: number - chainName: string -} - -export interface ContractInfo { - chainId: number - address: string - source: string - name: string - type: string - symbol: string - decimals?: number - logoURI: string - deployed: boolean - bytecodeHash: string - extensions: ContractInfoExtensions - updatedAt: string - queuedAt?: string - status: ResourceStatus -} - -export interface ContractInfoExtensionBridgeInfo { - tokenAddress: string -} - -export interface ContractInfoExtensionIndexingInfo { - useOnChainBalance: boolean -} - -export interface ContractInfoExtensions { - link?: string - description?: string - categories?: Array - bridgeInfo?: { [key: string]: ContractInfoExtensionBridgeInfo } - indexingInfo?: ContractInfoExtensionIndexingInfo - ogImage?: string - ogName?: string - originChainId?: number - originAddress?: string - blacklist?: boolean - verified?: boolean - verifiedBy?: string - featured?: boolean - featureIndex?: number -} - -export enum ContractType { - UNKNOWN = 'UNKNOWN', - NATIVE = 'NATIVE', - ERC20 = 'ERC20', - ERC721 = 'ERC721', - ERC1155 = 'ERC1155', - SEQUENCE_WALLET = 'SEQUENCE_WALLET', - ERC20_BRIDGE = 'ERC20_BRIDGE', - ERC721_BRIDGE = 'ERC721_BRIDGE', - ERC1155_BRIDGE = 'ERC1155_BRIDGE', - SEQ_MARKETPLACE = 'SEQ_MARKETPLACE', - ERC6909 = 'ERC6909' -} - -export enum ContractVerificationStatus { - VERIFIED = 'VERIFIED', - UNVERIFIED = 'UNVERIFIED', - ALL = 'ALL' -} - -export interface DiskUsage { - humanReadable: string - used: number - size: number - percent: number - dirs: { [key: string]: string } -} - -export interface EtherBalance { - accountAddress: string - balanceWei: string -} - -export interface EventDecoded { - topicHash: string - eventSig: string - types: Array - names: Array - values: Array -} - -export interface EventFilter { - events?: Array - contractAddresses?: Array - accounts?: Array - tokenIDs?: Array -} - -export interface EventLog { - id: number - uid: string - type: EventLogType - blockNumber: number - blockHash: string - parentBlockHash: string - contractAddress: string - contractType: ContractType - txnHash: string - txnIndex: number - txnLogIndex: number - logDataType: EventLogDataType - ts: string - txnInfo?: TxnInfo - rawLog?: { [key: string]: any } - event?: EventDecoded -} - -export enum EventLogDataType { - EVENT = 'EVENT', - TOKEN_TRANSFER = 'TOKEN_TRANSFER', - NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', - SEQUENCE_TXN = 'SEQUENCE_TXN' -} - -export enum EventLogType { - UNKNOWN = 'UNKNOWN', - BLOCK_ADDED = 'BLOCK_ADDED', - BLOCK_REMOVED = 'BLOCK_REMOVED' -} - -export interface GatewayBackendResponseTime { - percentiles: { [key: string]: number } - average: number -} - -export interface GatewayBackendRuntimeStatus { - name: string - chainId: number - responseTime: GatewayBackendResponseTime -} - -export interface GatewayEtherBalance { - chainId: number - errorReason?: string - result: EtherBalance -} - -export interface GatewayNativeTokenBalance { - chainId: number - errorReason?: string - result: NativeTokenBalance -} - -export interface GatewayNativeTokenBalances { - chainId: number - errorReason?: string - results: Array -} - -export interface GatewayPrice { - chainID: number - errorReason?: string - results: Array -} - -export interface GatewayRuntimeStatus { - healthOK: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - backends: Array -} - -export interface GatewayTokenBalance { - chainId: number - errorReason?: string - results: Array -} - -export interface GatewayTokenPriceQuery { - chainID: number - queries: Array -} - -export interface GatewayTransaction { - chainId: number - errorReason?: string - results: Array -} - -export interface IndexState { - chainId: string - lastBlockNum: number - lastBlockHash: string -} - -export interface IndexedBlock { - blockNumber: number - blockShortHash: string -} - -export interface IndexerMetrics { - blocksPerSecond: number - eventsPerSecond: number -} - -export interface MarketplaceOrder { - orderId: string - tokenContract: string - tokenId: string - isListing: boolean - quantity: string - quantityRemaining: string - currencyAddress: string - pricePerToken: string - expiry: string - orderStatus: OrderStatus - createdBy: string - blockNumber: number - orderbookContractAddress: string - createdAt: number -} - -export interface MarketplaceOrderFilter { - isListing?: boolean - userAddresses?: Array - currencyAddresses: Array - orderIds: Array - tokenIds: Array - excludeUserAddresses?: Array - blockNumberGt: number - createdAtAfter: number - orderStatuses: Array - returnExpired: boolean -} - -export interface MarketplaceTopOrdersFilter { - currencyAddresses: Array - tokenIds: Array - isListing: boolean - priceSort: SortOrder - excludeUser?: string -} - -export interface MetadataOptions { - verifiedOnly?: boolean - unverifiedOnly?: boolean - includeContracts?: Array -} - -export interface NativeTokenBalance { - accountAddress: string - chainId: number - name: string - symbol: string - balance: string - balanceUSD: string - priceUSD: string - priceUpdatedAt?: string - errorReason?: string -} - -export enum NetworkType { - MAINNETS = 'MAINNETS', - TESTNETS = 'TESTNETS', - ALL = 'ALL' -} - -export enum OrderStatus { - OPEN = 'OPEN', - CLOSED = 'CLOSED', - CANCELLED = 'CANCELLED' -} - -export interface Page { - page?: number - column?: string - before?: any - after?: any - sort?: Array - pageSize?: number - more?: boolean -} - -export interface PebbleMetrics { - compactionCount: number - compactionEstimatedDebt: number - compactionInProgressBytes: number - compactionNumInProgress: number - compactionMarkedFiles: number -} - -export interface Price { - contractAddress: string - tokenID?: string - priceUSD: string - updatedAt?: string -} - -export enum ResourceStatus { - NOT_AVAILABLE = 'NOT_AVAILABLE', - REFRESHING = 'REFRESHING', - AVAILABLE = 'AVAILABLE' -} - -export interface RuntimeChecks { - running: boolean - runnables: any - cgoEnabled: boolean - quotaControlEnabled: boolean - syncMode: string - percentIndexed: number - lastBlockNum: number - lastBlockNumWithState: number - bloomStatus: BloomStatus - bond: Bond - diskUsage: DiskUsage - metrics: IndexerMetrics -} - -export interface RuntimeStatus { - healthOK: boolean - indexerEnabled: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - chainID: number - checks: RuntimeChecks -} - -export interface SortBy { - column: string - order: SortOrder -} - -export enum SortOrder { - DESC = 'DESC', - ASC = 'ASC' -} - -export interface TokenBalance { - contractType: ContractType - contractAddress: string - accountAddress: string - tokenID?: string - balance: string - balanceUSD: string - priceUSD: string - priceUpdatedAt?: string - blockHash: string - blockNumber: number - chainId: number - uniqueCollectibles: string - isSummary: boolean - contractInfo?: ContractInfo - tokenMetadata?: TokenMetadata -} - -export interface TokenBalanceFilter { - contractAddress: string - sinceBlockNumber: number -} - -export interface TokenBalancesByContractFilter { - contractAddresses: Array - accountAddresses?: Array - contractStatus?: ContractVerificationStatus - tokenIDs?: Array -} - -export interface TokenBalancesFilter { - accountAddresses: Array - contractStatus?: ContractVerificationStatus - contractTypes?: Array - contractWhitelist?: Array - contractBlacklist?: Array - omitNativeBalances: boolean - omitPrices?: boolean - tokenIDs?: Array -} - -export interface TokenHistory { - blockNumber: number - blockHash: string - contractAddress: string - contractType: ContractType - fromAddress: string - toAddress: string - txnHash: string - txnIndex: number - txnLogIndex: number - tokenIDs: string - amounts: string - ts: string -} - -export interface TokenIDRange { - start: string - end: string -} - -export interface TokenMetadata { - chainId?: number - contractAddress?: string - tokenId: string - source: 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: ResourceStatus - queuedAt?: string - lastFetched?: string -} - -export interface TokenPriceQuery { - contractAddress: string - tokenID?: string -} - -export interface TokenSupply { - tokenID: string - supply: string - chainId: number - contractInfo?: ContractInfo - tokenMetadata?: TokenMetadata -} - -export interface Transaction { - txnHash: string - blockNumber: number - blockHash: string - chainId: number - metaTxnID?: string - transfers?: Array - timestamp: string -} - -export interface TransactionFilter { - txnHash?: string - from?: string - to?: string - contractAddress?: string - event?: string -} - -export interface TransactionHistoryFilter { - accountAddress?: string - contractAddress?: string - accountAddresses?: Array - contractAddresses?: Array - transactionHashes?: Array - metaTransactionIDs?: Array - fromBlock?: number - toBlock?: number - tokenID?: string - omitPrices?: boolean -} - -export interface TransactionLog { - contractAddress: string - topics: Array - data: string - index: number -} - -export interface TransactionReceipt { - txnHash: string - txnStatus: TransactionStatus - txnIndex: number - txnType: TransactionType - blockHash: string - blockNumber: number - gasUsed: number - effectiveGasPrice: string - from: string - to: string - logs: Array - final: boolean - reorged: boolean -} - -export enum TransactionStatus { - FAILED = 'FAILED', - SUCCESSFUL = 'SUCCESSFUL' -} - -export enum TransactionType { - LegacyTxnType = 'LegacyTxnType', - AccessListTxnType = 'AccessListTxnType', - DynamicFeeTxnType = 'DynamicFeeTxnType' -} - -export interface TxnInfo { - from: string - to: string - value: string -} - -export interface TxnTransfer { - transferType: TxnTransferType - contractAddress: string - contractType: ContractType - from: string - to: string - tokenIds?: Array - amounts: Array - logIndex: number - amountsUSD?: Array - pricesUSD?: Array - contractInfo?: ContractInfo - tokenMetadata?: { [key: string]: TokenMetadata } -} - -export enum TxnTransferType { - UNKNOWN = 'UNKNOWN', - SEND = 'SEND', - RECEIVE = 'RECEIVE' -} - -export interface Version { - webrpcVersion: string - schemaVersion: string - schemaHash: string - appVersion: string -} - -export interface WALWriterRuntimeStatus { - healthOK: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - chainID: number - percentWALWritten: number -} - -export interface WebhookListener { - id: number - projectID: number - url: string - filters: EventFilter - name: string - updatedAt: string - active: boolean -} - -export interface GetBalanceUpdatesRequest { - chainIds?: Array - networks?: Array - networkType?: NetworkType - contractAddress: string - lastBlockNumber: number - lastBlockHash?: string - page?: Page -} - -export interface GetBalanceUpdatesResponse { - page: Page - balances: Array -} - -export interface GetChainsRequest { - networkType?: NetworkType -} - -export interface GetChainsResponse { - chains: Array -} - -export interface GetNativeTokenBalanceRequest { - chainIds?: Array - networks?: Array - networkType?: NetworkType - accountAddress?: string - omitPrices?: boolean -} - -export interface GetNativeTokenBalanceResponse { - balances: Array -} - -export interface GetTokenBalancesRequest { - chainIds?: Array - networks?: Array - networkType?: NetworkType - accountAddress?: string - contractAddress?: string - tokenID?: string - includeMetadata?: boolean - metadataOptions?: MetadataOptions - includeCollectionTokens?: boolean - page?: Page -} - -export interface GetTokenBalancesResponse { - page: Page - balances: Array -} - -export interface GetTokenBalancesByContractRequest { - chainIds?: Array - networks?: Array - networkType?: NetworkType - filter: TokenBalancesByContractFilter - omitMetadata?: boolean - page?: Page -} - -export interface GetTokenBalancesByContractResponse { - page: Page - balances: Array -} - -export interface GetTokenBalancesDetailsRequest { - chainIds?: Array - networks?: Array - networkType?: NetworkType - filter: TokenBalancesFilter - omitMetadata?: boolean - page?: Page -} - -export interface GetTokenBalancesDetailsResponse { - page: Page - nativeBalances: Array - balances: Array -} - -export interface GetTokenBalancesSummaryRequest { - chainIds?: Array - networks?: Array - networkType?: NetworkType - filter: TokenBalancesFilter - omitMetadata?: boolean - page?: Page -} - -export interface GetTokenBalancesSummaryResponse { - page: Page - nativeBalances: Array - balances: Array -} - -export interface GetTokenPriceRequest { - q: GatewayTokenPriceQuery -} - -export interface GetTokenPriceResponse { - price: GatewayPrice -} - -export interface GetTokenPricesRequest { - q: Array -} - -export interface GetTokenPricesResponse { - prices: Array -} - -export interface GetTransactionHistoryRequest { - chainIds?: Array - networks?: Array - networkType?: NetworkType - filter: TransactionHistoryFilter - includeMetadata?: boolean - metadataOptions?: MetadataOptions - page?: Page -} - -export interface GetTransactionHistoryResponse { - page: Page - transactions: Array -} - -export interface PingRequest {} - -export interface PingResponse { - status: boolean -} - -export interface RuntimeStatusRequest {} - -export interface RuntimeStatusResponse { - status: GatewayRuntimeStatus -} - -export interface VersionRequest {} - -export interface VersionResponse { - version: Version -} - -// -// Client -// - -export class IndexerGateway implements IndexerGatewayClient { - protected hostname: string - protected fetch: Fetch - protected path = '/rpc/IndexerGateway/' - - 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 = { - getBalanceUpdates: (req: GetBalanceUpdatesRequest) => ['IndexerGateway', 'getBalanceUpdates', req] as const, - getChains: (req: GetChainsRequest) => ['IndexerGateway', 'getChains', req] as const, - getNativeTokenBalance: (req: GetNativeTokenBalanceRequest) => ['IndexerGateway', 'getNativeTokenBalance', req] as const, - getTokenBalances: (req: GetTokenBalancesRequest) => ['IndexerGateway', 'getTokenBalances', req] as const, - getTokenBalancesByContract: (req: GetTokenBalancesByContractRequest) => - ['IndexerGateway', 'getTokenBalancesByContract', req] as const, - getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => ['IndexerGateway', 'getTokenBalancesDetails', req] as const, - getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => ['IndexerGateway', 'getTokenBalancesSummary', req] as const, - getTokenPrice: (req: GetTokenPriceRequest) => ['IndexerGateway', 'getTokenPrice', req] as const, - getTokenPrices: (req: GetTokenPricesRequest) => ['IndexerGateway', 'getTokenPrices', req] as const, - getTransactionHistory: (req: GetTransactionHistoryRequest) => ['IndexerGateway', 'getTransactionHistory', req] as const, - ping: () => ['IndexerGateway', 'ping'] as const, - runtimeStatus: () => ['IndexerGateway', 'runtimeStatus'] as const, - version: () => ['IndexerGateway', 'version'] as const - } - - getBalanceUpdates = ( - req: GetBalanceUpdatesRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetBalanceUpdates'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetBalanceUpdatesResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getChains = (req: GetChainsRequest, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetChains'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetChainsResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getNativeTokenBalance = ( - req: GetNativeTokenBalanceRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetNativeTokenBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetNativeTokenBalanceResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenBalances = ( - req: GetTokenBalancesRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenBalances'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenBalancesResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenBalancesByContract = ( - req: GetTokenBalancesByContractRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenBalancesByContract'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenBalancesByContractResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenBalancesDetails = ( - req: GetTokenBalancesDetailsRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenBalancesDetails'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenBalancesDetailsResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenBalancesSummary = ( - req: GetTokenBalancesSummaryRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTokenBalancesSummary'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenBalancesSummaryResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenPrice = (req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetTokenPrice'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenPriceResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTokenPrices = (req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTokenPricesResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - getTransactionHistory = ( - req: GetTransactionHistoryRequest, - headers?: object, - signal?: AbortSignal - ): Promise => { - return this.fetch(this.url('GetTransactionHistory'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'GetTransactionHistoryResponse') - }) - }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } - ) - } - - ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'PingResponse') - }) - }, - error => { - 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( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'RuntimeStatusResponse') - }) - }, - error => { - 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( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'VersionResponse') - }) - }, - 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', - [WebrpcHeader]: WebrpcHeaderValue - } - 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): 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 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 AccessKeyMismatchError extends WebrpcError { - 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 AccessKeyNotFoundError extends WebrpcError { - 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 AtLeastOneKeyError extends WebrpcError { - 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 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 InvalidArgumentError extends WebrpcError { - 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 InvalidOriginError extends WebrpcError { - 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(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 MaxAccessKeysError extends WebrpcError { - 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 MetadataCallFailedError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'MetadataCallFailed' - this.code = typeof error.code === 'number' ? error.code : 3003 - this.message = error.message || `Metadata service call failed` - this.status = typeof error.status === 'number' ? error.status : 400 - if (error.cause !== undefined) this.cause = error.cause - Object.setPrototypeOf(this, MetadataCallFailedError.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 NoDefaultKeyError extends WebrpcError { - 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 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 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 ProjectNotFoundError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'ProjectNotFound' - this.code = typeof error.code === 'number' ? error.code : 1100 - 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 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 QuotaExceededError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'QuotaExceeded' - this.code = typeof error.code === 'number' ? error.code : 1200 - this.message = error.message || `Quota 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 RateLimitError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'RateLimit' - this.code = typeof error.code === 'number' ? error.code : 1201 - this.message = error.message || `Rate limit exceeded` - this.status = typeof error.status === 'number' ? error.status : 429 - if (error.cause !== undefined) this.cause = error.cause - Object.setPrototypeOf(this, RateLimitError.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 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 ResourceExhaustedError extends WebrpcError { - constructor(error: WebrpcErrorParams = {}) { - super(error) - this.name = error.name || 'ResourceExhausted' - this.code = typeof error.code === 'number' ? error.code : 2004 - this.message = error.message || `Resource exhausted` - this.status = typeof error.status === 'number' ? error.status : 400 - if (error.cause !== undefined) this.cause = error.cause - Object.setPrototypeOf(this, ResourceExhaustedError.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 TimeoutError extends WebrpcError { - 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 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 UnauthorizedUserError extends WebrpcError { - 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 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 enum errors { - WebrpcEndpoint = 'WebrpcEndpoint', - WebrpcRequestFailed = 'WebrpcRequestFailed', - WebrpcBadRoute = 'WebrpcBadRoute', - WebrpcBadMethod = 'WebrpcBadMethod', - WebrpcBadRequest = 'WebrpcBadRequest', - WebrpcBadResponse = 'WebrpcBadResponse', - WebrpcServerPanic = 'WebrpcServerPanic', - WebrpcInternalError = 'WebrpcInternalError', - WebrpcClientAborted = 'WebrpcClientAborted', - WebrpcStreamLost = 'WebrpcStreamLost', - WebrpcStreamFinished = 'WebrpcStreamFinished', - Aborted = 'Aborted', - AccessKeyMismatch = 'AccessKeyMismatch', - AccessKeyNotFound = 'AccessKeyNotFound', - AtLeastOneKey = 'AtLeastOneKey', - Geoblocked = 'Geoblocked', - InvalidArgument = 'InvalidArgument', - InvalidOrigin = 'InvalidOrigin', - InvalidService = 'InvalidService', - MaxAccessKeys = 'MaxAccessKeys', - MetadataCallFailed = 'MetadataCallFailed', - MethodNotFound = 'MethodNotFound', - NoDefaultKey = 'NoDefaultKey', - NotFound = 'NotFound', - PermissionDenied = 'PermissionDenied', - ProjectNotFound = 'ProjectNotFound', - QueryFailed = 'QueryFailed', - QuotaExceeded = 'QuotaExceeded', - RateLimit = 'RateLimit', - RateLimited = 'RateLimited', - RequestConflict = 'RequestConflict', - ResourceExhausted = 'ResourceExhausted', - SessionExpired = 'SessionExpired', - Timeout = 'Timeout', - Unauthorized = 'Unauthorized', - UnauthorizedUser = 'UnauthorizedUser', - Unavailable = 'Unavailable' -} - -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, - Aborted = 1005, - AccessKeyMismatch = 1102, - AccessKeyNotFound = 1101, - AtLeastOneKey = 1302, - Geoblocked = 1006, - InvalidArgument = 2001, - InvalidOrigin = 1103, - InvalidService = 1104, - MaxAccessKeys = 1301, - MetadataCallFailed = 3003, - MethodNotFound = 1003, - NoDefaultKey = 1300, - NotFound = 3000, - PermissionDenied = 1001, - ProjectNotFound = 1100, - QueryFailed = 2003, - QuotaExceeded = 1200, - RateLimit = 1201, - RateLimited = 1007, - RequestConflict = 1004, - ResourceExhausted = 2004, - SessionExpired = 1002, - Timeout = 1900, - Unauthorized = 1000, - UnauthorizedUser = 1105, - Unavailable = 2002 -} - -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, - [1005]: AbortedError, - [1102]: AccessKeyMismatchError, - [1101]: AccessKeyNotFoundError, - [1302]: AtLeastOneKeyError, - [1006]: GeoblockedError, - [2001]: InvalidArgumentError, - [1103]: InvalidOriginError, - [1104]: InvalidServiceError, - [1301]: MaxAccessKeysError, - [3003]: MetadataCallFailedError, - [1003]: MethodNotFoundError, - [1300]: NoDefaultKeyError, - [3000]: NotFoundError, - [1001]: PermissionDeniedError, - [1100]: ProjectNotFoundError, - [2003]: QueryFailedError, - [1200]: QuotaExceededError, - [1201]: RateLimitError, - [1007]: RateLimitedError, - [1004]: RequestConflictError, - [2004]: ResourceExhaustedError, - [1002]: SessionExpiredError, - [1900]: TimeoutError, - [1000]: UnauthorizedError, - [1105]: UnauthorizedUserError, - [2002]: UnavailableError -} - -// -// Webrpc -// - -export const WebrpcHeader = 'Webrpc' - -export const WebrpcHeaderValue = 'webrpc@v0.31.2;gen-typescript@v0.23.1;sequence-indexer@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 ?? '' - } -} diff --git a/packages/services/indexer/src/indexer.gen.ts b/packages/services/indexer/src/indexer.gen.ts index 89de72566..97d3d2472 100644 --- a/packages/services/indexer/src/indexer.gen.ts +++ b/packages/services/indexer/src/indexer.gen.ts @@ -1,79 +1,388 @@ /* eslint-disable */ -// sequence-indexer v0.4.0 546b527de7002f409ffa602ad35b5a3abe979088 +// sequence-indexer v0.4.0 caf5c4c3677ac2dce41858dce7cd727a7810845f // -- -// Code generated by webrpc-gen@v0.21.1 with typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen@v0.31.2 with typescript generator. DO NOT EDIT. // -// webrpc-gen -schema=indexer.ridl -service=Indexer -target=typescript -client -out=./clients/indexer.gen.ts +// webrpc-gen -schema=merged.gen.json -service=Indexer -target=typescript -client -out=./clients/indexer.gen.ts -export const WebrpcHeader = 'Webrpc' - -export const WebrpcHeaderValue = 'webrpc@v0.21.1;gen-typescript@v0.15.1;sequence-indexer@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 = '546b527de7002f409ffa602ad35b5a3abe979088' +export const WebrpcSchemaHash = 'caf5c4c3677ac2dce41858dce7cd727a7810845f' -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 IndexerClient { + addWebhookListener(req: AddWebhookListenerRequest, headers?: object, signal?: AbortSignal): Promise - return parseWebrpcGenVersions(headerValue) -} + /** + * Fetches a single receipt and then will stop the subscription + */ + fetchTransactionReceipt( + req: FetchTransactionReceiptRequest, + headers?: object, + signal?: AbortSignal + ): Promise -function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(';') - if (versions.length < 3) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } + /** + * Fetches a single receipt with filter and then will stop the subscription + */ + fetchTransactionReceiptWithFilter( + req: FetchTransactionReceiptWithFilterRequest, + headers?: object, + signal?: AbortSignal + ): Promise - const [_, webrpcGenVersion] = versions[0]!.split('@') - const [codeGenName, codeGenVersion] = versions[1]!.split('@') - const [schemaName, schemaVersion] = versions[2]!.split('@') + /** + * Webhooks + */ + getAllWebhookListeners( + req: GetAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Get balance update aggregate values -- useful for syncing balance details of a contract, ie. from Skyweaver. + * Also consider using SubscribeBalanceUpdates or SubscribeEvents as other alternatives. + */ + getBalanceUpdates(req: GetBalanceUpdatesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * Get the chain ID of the indexer + */ + getChainID(headers?: object, signal?: AbortSignal): Promise + + /** + * Queries an ethereum node for the latest and confirm ETH balances + * DEPRECATED: use GetNativeTokenBalance instead + * + * @deprecated GetNativeTokenBalance + */ + getEtherBalance(req: GetEtherBalanceRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetMarketplaceOrders queries marketplace orders with filtering and pagination. + * + * Retrieves buy orders (offers) and sell orders (listings) from a specific marketplace + * and collection with comprehensive filtering options. + * + * Parameters: + * marketplaceContractAddress: Target marketplace contract (required) + * collectionAddress: NFT collection contract (required) + * filter: MarketplaceOrderFilter with options: + * - isListing: true=listings, false=offers, omit=both + * - userAddresses: Include specific users + * - currencyAddresses: Filter by currencies (empty=all) + * - orderIds: Filter by specific order ids (empty=all) + * - tokenIds: Filter by specific tokens (empty=all) + * - excludeUserAddresses: Exclude specific users + * - blockNumberGt: Orders greater than block number + * - createdAtAfter: Orders after timestamp + * - orderStatuses: Filter by status (OPEN, CLOSED, CANCELLED) + * - returnExpired: Include expired orders + * page: Pagination control (optional) + * + * Returns: Updated pagination info and array of matching orders + */ + getMarketplaceOrders( + req: GetMarketplaceOrdersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetMarketplaceTopOrders finds the most competitive orders for specific tokens. + * + * Optimized for price discovery, returns the best available orders for each token. + * Useful for displaying current market prices and finding trading opportunities. + * + * Parameters: + * marketplaceContractAddress: Target marketplace contract (required) + * collectionAddress: NFT collection contract (required) + * filter: MarketplaceTopOrdersFilter with options: + * - currencyAddresses: Consider specific currencies (empty=all) + * - tokenIds: Target token IDs (required, non-empty) + * - isListing: true=listings/sell orders, false=offers/buy orders + * - priceSort: ASC=lowest first, DESC=highest first + * - excludeUser: Hide orders from specific user + * + * Returns: Array of top-priced active orders, sorted by priceSort preference + */ + getMarketplaceTopOrders( + req: GetMarketplaceTopOrdersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetNativeTokenBalance queries an ethereum node for the latest native token account balance. + * The native token is the token of the chain the indexer is connected to, for example, ETH on Ethereum + * and POL on Polygon. + */ + getNativeTokenBalance( + req: GetNativeTokenBalanceRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalances returns a balance summary/details for a specific account. By default + * if accountAddress is left empty, it will use the account from the jwt session. + * + * Also, if contractAddress is undefined, then it will list all current user coins/collectibles. + * But, if contractAddress is provided, then it will return the token balances for the contract, this is + * only useful for 1155, but for other tokens, it can act as a filter for the single balance. + * + * DEPRECATED: use GetTokenBalancesSummary / GetTokenBalancesDetails + * + * @deprecated GetTokenBalancesSummary + */ + getTokenBalances(req: GetTokenBalancesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenBalancesByContract returns a balances for a specific accounts and + * contracts. The collection ERC721 & ERC1155 tokens are represented as + * individual balances. + * + * If `filter` is not provided, it will error out as it requires at least + * contract address. + * + * If `filter.contractStatus` is not provided, it will include verified only + * tokens. + */ + getTokenBalancesByContract( + req: GetTokenBalancesByContractRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalancesDetails returns a detailed balance summary for a specific + * accounts. The collection ERC721 & ERC1155 tokens are represented as + * individual balances. + * + * If `filter` is not provided, it will use the filter with account from the + * jwt session. + * + * If `filter.contractStatus` is not provided, it will include verified only + * tokens. + */ + getTokenBalancesDetails( + req: GetTokenBalancesDetailsRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalancesSummary returns a summary of token balances for a specific + * accounts. The collection ERC721 & ERC1155 tokens are represented as a + * single aggregated balance. + * + * If `filter` is not provided, it will use the filter with account from the + * jwt session. + * + * If `filter.contractStatus` is not provided, it will include verified only + * tokens. + */ + getTokenBalancesSummary( + req: GetTokenBalancesSummaryRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenIDRanges returns the range of tokenIDs for a token collection contract. + * This is useful for ERC-721 and ERC-1155 contracts to get the range of valid tokenIDs. It is similar to + * GetTokenIDs, but returns the range of tokenIDs instead of the list of tokenIDs, which is more efficient + * for large collections and very easy to the caller to expand the range into a list of tokenIDs. + * + * NOTE: this method will only return up to 15,000 ranges, if there are more ranges, it will return + * a boolean to indicate there are more ranges beyond the first 15,000. Therefore, if `moreRanges` is + * false then you have all the ranges, but if true, you need to make a follow up call to fetch the next + * page of ranges. + * + * As an example, if a NFT collection of 100,000 tokens uses ids from 1,2,3,...,100_000 then this endpoint + * will return just a single range from [1,100_000], but if there are gaps between the sequence, then + * those will be broken into separate range entries. + */ + getTokenIDRanges(req: GetTokenIDRangesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenIDs returns the list of each individual token id for a token collection contract. + * This is useful for ERC-721 and ERC-1155 contracts to get the list of valid tokenIDs. + */ + getTokenIDs(req: GetTokenIDsRequest, headers?: object, signal?: AbortSignal): Promise + + getTokenPrice(req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise + + getTokenPrices(req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenSupplies returns the set of tokenIDs used by a contract address, supporting ERC-20, ERC-721, and ERC-1155 + * contracts, and their respective supply as well. + */ + getTokenSupplies(req: GetTokenSuppliesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenSuppliesMap returns the token supplies of ERC-20 and ERC-1155 tokens as requested in the `tokenMap` + * represented as a map of contractAddress :: []tokenIDs. + * + * For an ERC-20 specify tokenIDs as an empty array or [0], for example, { '0xdef': [] } or { '0xdef': [0] } + * For ERC-1155 pass the array of tokens are strings, ie. { '0xabc': ['1', '2', '3'] } + */ + getTokenSuppliesMap( + req: GetTokenSuppliesMapRequest, + headers?: object, + signal?: AbortSignal + ): Promise - return { - webrpcGenVersion: webrpcGenVersion!, - codeGenName: codeGenName!, - codeGenVersion: codeGenVersion!, - schemaName: schemaName!, - schemaVersion: schemaVersion!, - } + /** + * History of mined transactions for the account which includes a list of token transfers (sent/recieved) + * and sent transactions from a Sequence wallet + */ + getTransactionHistory( + req: GetTransactionHistoryRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + getWebhookListener(req: GetWebhookListenerRequest, headers?: object, signal?: AbortSignal): Promise + + listTokenPrices(req: ListTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise + + pauseAllWebhookListeners( + req: PauseAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Ping the indexer + */ + ping(headers?: object, signal?: AbortSignal): Promise + + removeAllWebhookListeners( + req: RemoveAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + removeWebhookListener( + req: RemoveWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + resumeAllWebhookListeners( + req: ResumeAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Get the current runtime health status of the indexer + */ + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + + /** + * SubscribeBalanceUpdates listens to balance updates for a specific contract address + */ + subscribeBalanceUpdates( + req: SubscribeBalanceUpdatesRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController + + /** + * SubscribeEvents listens to events on-chain based on the filter criteria + * + * TODO: some additional options can be passed such as block, reorg true, etc. + * or stay behind, etc. + */ + subscribeEvents(req: SubscribeEventsRequest, options: WebrpcStreamOptions): WebrpcStreamController + + /** + * Listen to transaction receipts on-chain based on the filter criteria + */ + subscribeReceipts( + req: SubscribeReceiptsRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController + + /** + * Re-sync an incorrect token balance with the correct on-chain balance + * NOTE: this method is almost never used, but we've marked it internal in case + * we ever want to use it again. This method was written a very long time ago in + * scenarios when the indexer had little bugs, but now its solid. + */ + syncBalance(req: SyncBalanceRequest, headers?: object, signal?: AbortSignal): Promise + + toggleWebhookListener( + req: ToggleWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + updateWebhookListener( + req: UpdateWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * Get the current version of the indexer + */ + version(headers?: object, signal?: AbortSignal): Promise } // -// Types +// Schema types // -export enum ResourceStatus { - NOT_AVAILABLE = 'NOT_AVAILABLE', - REFRESHING = 'REFRESHING', - AVAILABLE = 'AVAILABLE', +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 BloomStats { + hitRatio: string + falsePositivesPercent: string + hitCount: number + missCount: number + falsePositives: number +} + +export interface BloomStatus { + enabled: boolean + initialized: boolean + bloomInitElapsedTime: string + stats: BloomStats +} + +export interface Bond { + pebble: PebbleMetrics + estimatedDiskUsagePerTable: any + estimatedDiskUsageTotal: string +} + +export interface ChainInfo { + chainId: number + chainName: string } export interface ContractInfo { @@ -93,56 +402,29 @@ export interface ContractInfo { status: ResourceStatus } -export interface ContractInfoExtensions { - link: string - description: string - categories: Array - ogImage: string - ogName: string - originChainId: number - originAddress: string - blacklist: boolean - verified: boolean - verifiedBy: string - featured: boolean - featureIndex: number +export interface ContractInfoExtensionBridgeInfo { + tokenAddress: string } -export interface TokenMetadata { - contractAddress?: string - tokenId: string - source: 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: ResourceStatus - queuedAt?: string - lastFetched?: string +export interface ContractInfoExtensionIndexingInfo { + useOnChainBalance: boolean } -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 ContractInfoExtensions { + link?: string + description?: string + categories?: Array + bridgeInfo?: { [key: string]: ContractInfoExtensionBridgeInfo } + indexingInfo?: ContractInfoExtensionIndexingInfo + ogImage?: string + ogName?: string + originChainId?: number + originAddress?: string + blacklist?: boolean + verified?: boolean + verifiedBy?: string + featured?: boolean + featureIndex?: number } export enum ContractType { @@ -156,72 +438,73 @@ export enum ContractType { ERC721_BRIDGE = 'ERC721_BRIDGE', ERC1155_BRIDGE = 'ERC1155_BRIDGE', SEQ_MARKETPLACE = 'SEQ_MARKETPLACE', + ERC6909 = 'ERC6909' } -export enum EventLogType { - UNKNOWN = 'UNKNOWN', - BLOCK_ADDED = 'BLOCK_ADDED', - BLOCK_REMOVED = 'BLOCK_REMOVED', -} - -export enum EventLogDataType { - EVENT = 'EVENT', - TOKEN_TRANSFER = 'TOKEN_TRANSFER', - NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', - SEQUENCE_TXN = 'SEQUENCE_TXN', -} - -export enum OrderStatus { - OPEN = 'OPEN', - CLOSED = 'CLOSED', - CANCELLED = 'CANCELLED', +export enum ContractVerificationStatus { + VERIFIED = 'VERIFIED', + UNVERIFIED = 'UNVERIFIED', + ALL = 'ALL' } -export enum TxnTransferType { - UNKNOWN = 'UNKNOWN', - SEND = 'SEND', - RECEIVE = 'RECEIVE', +export interface DiskUsage { + humanReadable: string + used: number + size: number + percent: number + dirs: { [key: string]: string } } -export enum TransactionStatus { - FAILED = 'FAILED', - SUCCESSFUL = 'SUCCESSFUL', +export interface EtherBalance { + accountAddress: string + balanceWei: string } -export enum TransactionType { - LegacyTxnType = 'LegacyTxnType', - AccessListTxnType = 'AccessListTxnType', - DynamicFeeTxnType = 'DynamicFeeTxnType', +export interface EventDecoded { + topicHash: string + eventSig: string + types: Array + names: Array + values: Array } -export enum SortOrder { - DESC = 'DESC', - ASC = 'ASC', +export interface EventFilter { + events?: Array + contractAddresses?: Array + accounts?: Array + tokenIDs?: Array } -export enum ContractVerificationStatus { - VERIFIED = 'VERIFIED', - UNVERIFIED = 'UNVERIFIED', - ALL = 'ALL', +export interface EventLog { + id: number + uid: string + type: EventLogType + blockNumber: number + blockHash: string + parentBlockHash: string + contractAddress: string + contractType: ContractType + txnHash: string + txnIndex: number + txnLogIndex: number + logDataType: EventLogDataType + ts: string + txnInfo?: TxnInfo + rawLog?: { [key: string]: any } + event?: EventDecoded } -export interface Version { - webrpcVersion: string - schemaVersion: string - schemaHash: string - appVersion: string +export enum EventLogDataType { + EVENT = 'EVENT', + TOKEN_TRANSFER = 'TOKEN_TRANSFER', + NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', + SEQUENCE_TXN = 'SEQUENCE_TXN' } -export interface RuntimeStatus { - healthOK: boolean - indexerEnabled: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - chainID: number - checks: RuntimeChecks +export enum EventLogType { + UNKNOWN = 'UNKNOWN', + BLOCK_ADDED = 'BLOCK_ADDED', + BLOCK_REMOVED = 'BLOCK_REMOVED' } export interface GatewayBackendResponseTime { @@ -235,6 +518,30 @@ export interface GatewayBackendRuntimeStatus { responseTime: GatewayBackendResponseTime } +export interface GatewayEtherBalance { + chainId: number + errorReason?: string + result: EtherBalance +} + +export interface GatewayNativeTokenBalance { + chainId: number + errorReason?: string + result: NativeTokenBalance +} + +export interface GatewayNativeTokenBalances { + chainId: number + errorReason?: string + results: Array +} + +export interface GatewayPrice { + chainID: number + errorReason?: string + results: Array +} + export interface GatewayRuntimeStatus { healthOK: boolean startTime: string @@ -245,43 +552,115 @@ export interface GatewayRuntimeStatus { backends: Array } -export interface WALWriterRuntimeStatus { - healthOK: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string +export interface GatewayTokenBalance { + chainId: number + errorReason?: string + results: Array +} + +export interface GatewayTokenPriceQuery { chainID: number - percentWALWritten: number + queries: Array +} + +export interface GatewayTransaction { + chainId: number + errorReason?: string + results: Array +} + +export interface IndexState { + chainId: string + lastBlockNum: number + lastBlockHash: string +} + +export interface IndexedBlock { + blockNumber: number + blockShortHash: string +} + +export interface IndexerMetrics { + blocksPerSecond: number + eventsPerSecond: number +} + +export interface MarketplaceOrder { + orderId: string + tokenContract: string + tokenId: string + isListing: boolean + quantity: string + quantityRemaining: string + currencyAddress: string + pricePerToken: string + expiry: string + orderStatus: OrderStatus + createdBy: string + blockNumber: number + orderbookContractAddress: string + createdAt: number +} + +export interface MarketplaceOrderFilter { + isListing?: boolean + userAddresses?: Array + currencyAddresses: Array + orderIds: Array + tokenIds: Array + excludeUserAddresses?: Array + blockNumberGt: number + createdAtAfter: number + orderStatuses: Array + returnExpired: boolean +} + +export interface MarketplaceTopOrdersFilter { + currencyAddresses: Array + tokenIds: Array + isListing: boolean + priceSort: SortOrder + excludeUser?: string } -export interface RuntimeChecks { - running: boolean - runnables: any - cgoEnabled: boolean - quotaControlEnabled: boolean - syncMode: string - percentIndexed: number - lastBlockNum: number - lastBlockNumWithState: number - bloomStatus: BloomStatus - bond: Bond - diskUsage: DiskUsage +export interface MetadataOptions { + verifiedOnly?: boolean + unverifiedOnly?: boolean + includeContracts?: Array } -export interface DiskUsage { - humanReadable: string - used: number - size: number - percent: number - dirs: { [key: string]: string } +export interface NativeTokenBalance { + accountAddress: string + chainId: number + name: string + symbol: string + balance: string + balanceUSD: string + priceUSD: string + priceUpdatedAt?: string + errorReason?: string } -export interface Bond { - pebble: PebbleMetrics - estimatedDiskUsagePerTable: any - estimatedDiskUsageTotal: string +export enum NetworkType { + MAINNETS = 'MAINNETS', + TESTNETS = 'TESTNETS', + ALL = 'ALL' +} + +export enum OrderStatus { + OPEN = 'OPEN', + CLOSED = 'CLOSED', + CANCELLED = 'CANCELLED' +} + +export interface Page { + page?: number + column?: string + before?: any + after?: any + sort?: Array + pageSize?: number + more?: boolean } export interface PebbleMetrics { @@ -292,66 +671,54 @@ export interface PebbleMetrics { compactionMarkedFiles: number } -export interface BloomStatus { - enabled: boolean - initialized: boolean - bloomInitElapsedTime: string -} - -export interface EtherBalance { - accountAddress: string - balanceWei: string +export interface Price { + contractAddress: string + tokenID?: string + priceUSD: string + updatedAt?: string } -export interface NativeTokenBalance { - accountAddress: string - chainId: number - balance: string - error: string +export enum ResourceStatus { + NOT_AVAILABLE = 'NOT_AVAILABLE', + REFRESHING = 'REFRESHING', + AVAILABLE = 'AVAILABLE' } -export interface IndexState { - chainId: string +export interface RuntimeChecks { + running: boolean + runnables: any + cgoEnabled: boolean + quotaControlEnabled: boolean + syncMode: string + percentIndexed: number lastBlockNum: number - lastBlockHash: string -} - -export interface IndexedBlock { - blockNumber: number - blockShortHash: string + lastBlockNumWithState: number + bloomStatus: BloomStatus + bond: Bond + diskUsage: DiskUsage + metrics: IndexerMetrics } -export interface TxnInfo { - from: string - to: string - value: string +export interface RuntimeStatus { + healthOK: boolean + indexerEnabled: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + checks: RuntimeChecks } -export interface EventLog { - id: number - uid: string - type: EventLogType - blockNumber: number - blockHash: string - parentBlockHash: string - contractAddress: string - contractType: ContractType - txnHash: string - txnIndex: number - txnLogIndex: number - logDataType: EventLogDataType - ts: string - txnInfo?: TxnInfo - rawLog?: { [key: string]: any } - event?: EventDecoded +export interface SortBy { + column: string + order: SortOrder } -export interface EventDecoded { - topicHash: string - eventSig: string - types: Array - names: Array - values: Array +export enum SortOrder { + DESC = 'DESC', + ASC = 'ASC' } export interface TokenBalance { @@ -360,6 +727,9 @@ export interface TokenBalance { accountAddress: string tokenID?: string balance: string + balanceUSD: string + priceUSD: string + priceUpdatedAt?: string blockHash: string blockNumber: number chainId: number @@ -369,39 +739,32 @@ export interface TokenBalance { tokenMetadata?: TokenMetadata } -export interface OrderbookOrder { - orderId: string - tokenContract: string - tokenId: string - isListing: boolean - quantity: string - quantityRemaining: string - currencyAddress: string - pricePerToken: string - expiry: string - orderStatus: OrderStatus - createdBy: string - blockNumber: number - orderbookContractAddress: string - createdAt: number +export interface TokenBalanceFilter { + contractAddress: string + sinceBlockNumber: number } -export interface OrderbookOrderFilter { - isListing?: boolean - userAddresses?: Array - tokenIds: Array - excludeUserAddresses?: Array - afterBlockNumber: number - afterCreatedAt: number - beforeExpiry: number - userAddress?: string - excludeUserAddress?: string +export interface TokenBalancesByContractFilter { + contractAddresses: Array + accountAddresses?: Array + contractStatus?: ContractVerificationStatus + tokenIDs?: Array +} + +export interface TokenBalancesFilter { + accountAddresses: Array + contractStatus?: ContractVerificationStatus + contractTypes?: Array + contractWhitelist?: Array + contractBlacklist?: Array + omitNativeBalances: boolean + omitPrices?: boolean + tokenIDs?: Array } export interface TokenHistory { blockNumber: number blockHash: string - accountAddress: string contractAddress: string contractType: ContractType fromAddress: string @@ -409,12 +772,45 @@ export interface TokenHistory { txnHash: string txnIndex: number txnLogIndex: number - logData: string tokenIDs: string - Amounts: string + amounts: string ts: string } +export interface TokenIDRange { + start: string + end: string +} + +export interface TokenMetadata { + chainId?: number + contractAddress?: string + tokenId: string + source: 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: ResourceStatus + queuedAt?: string + lastFetched?: string +} + +export interface TokenPriceQuery { + contractAddress: string + tokenID?: string +} + export interface TokenSupply { tokenID: string supply: string @@ -433,17 +829,12 @@ export interface Transaction { timestamp: string } -export interface TxnTransfer { - transferType: TxnTransferType - contractAddress: string - contractType: ContractType - from: string - to: string - tokenIds?: Array - amounts: Array - logIndex: number - contractInfo?: ContractInfo - tokenMetadata?: { [key: string]: TokenMetadata } +export interface TransactionFilter { + txnHash?: string + from?: string + to?: string + contractAddress?: string + event?: string } export interface TransactionHistoryFilter { @@ -456,14 +847,14 @@ export interface TransactionHistoryFilter { fromBlock?: number toBlock?: number tokenID?: string + omitPrices?: boolean } -export interface TransactionFilter { - txnHash?: string - from?: string - to?: string - contractAddress?: string - event?: string +export interface TransactionLog { + contractAddress: string + topics: Array + data: string + index: number } export interface TransactionReceipt { @@ -482,31 +873,60 @@ export interface TransactionReceipt { reorged: boolean } -export interface TransactionLog { - contractAddress: string - topics: Array - data: string - index: number +export enum TransactionStatus { + FAILED = 'FAILED', + SUCCESSFUL = 'SUCCESSFUL' } -export interface TokenIDRange { - start: string - end: string +export enum TransactionType { + LegacyTxnType = 'LegacyTxnType', + AccessListTxnType = 'AccessListTxnType', + DynamicFeeTxnType = 'DynamicFeeTxnType' +} + +export interface TxnInfo { + from: string + to: string + value: string +} + +export interface TxnTransfer { + transferType: TxnTransferType + contractAddress: string + contractType: ContractType + from: string + to: string + tokenIds?: Array + amounts: Array + logIndex: number + amountsUSD?: Array + pricesUSD?: Array + contractInfo?: ContractInfo + tokenMetadata?: { [key: string]: TokenMetadata } } -export interface Page { - page?: number - column?: string - before?: any - after?: any - sort?: Array - pageSize?: number - more?: boolean +export enum TxnTransferType { + UNKNOWN = 'UNKNOWN', + SEND = 'SEND', + RECEIVE = 'RECEIVE' } -export interface SortBy { - column: string - order: SortOrder +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface WALWriterRuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + percentWALWritten: number } export interface WebhookListener { @@ -519,469 +939,345 @@ export interface WebhookListener { active: boolean } -export interface EventFilter { - events?: Array - contractAddresses?: Array - accounts?: Array - tokenIDs?: Array +export interface AddWebhookListenerRequest { + url: string + filters: EventFilter + projectId?: number } -export interface TokenBalanceFilter { - contractAddress: string - sinceBlockNumber: number +export interface AddWebhookListenerResponse { + status: boolean + listener: WebhookListener } -export interface MetadataOptions { - verifiedOnly?: boolean - unverifiedOnly?: boolean - includeContracts?: Array +export interface FetchTransactionReceiptRequest { + txnHash: string + maxBlockWait?: number } -export interface TokenBalancesFilter { - accountAddresses: Array - contractStatus?: ContractVerificationStatus - contractTypes?: Array - contractWhitelist?: Array - contractBlacklist?: Array - omitNativeBalances: boolean +export interface FetchTransactionReceiptResponse { + receipt: TransactionReceipt } -export interface TokenBalancesByContractFilter { - contractAddresses: Array - accountAddresses?: Array - contractStatus?: ContractVerificationStatus +export interface FetchTransactionReceiptWithFilterRequest { + filter: TransactionFilter + maxBlockWait?: number } -export interface GatewayEtherBalance { - chainId: number - error: string - result: EtherBalance +export interface FetchTransactionReceiptWithFilterResponse { + receipt: TransactionReceipt } -export interface GatewayNativeTokenBalance { - chainId: number - error: string - result: NativeTokenBalance +export interface GetAllWebhookListenersRequest { + projectId?: number } -export interface GatewayNativeTokenBalances { - chainId: number - error: string - results: Array +export interface GetAllWebhookListenersResponse { + listeners: Array } -export interface GatewayTokenBalance { - chainId: number - error: string - results: Array +export interface GetBalanceUpdatesRequest { + contractAddress: string + lastBlockNumber: number + lastBlockHash?: string + page?: Page } -export interface Indexer { - ping(headers?: object, signal?: AbortSignal): Promise - version(headers?: object, signal?: AbortSignal): Promise - runtimeStatus(headers?: object, signal?: AbortSignal): Promise - getChainID(headers?: object, signal?: AbortSignal): Promise - getEtherBalance(args: GetEtherBalanceArgs, headers?: object, signal?: AbortSignal): Promise - getNativeTokenBalance( - args: GetNativeTokenBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTokenBalancesSummary( - args: GetTokenBalancesSummaryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTokenBalancesDetails( - args: GetTokenBalancesDetailsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTokenBalancesByContract( - args: GetTokenBalancesByContractArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTokenBalances(args: GetTokenBalancesArgs, headers?: object, signal?: AbortSignal): Promise - getTokenSupplies(args: GetTokenSuppliesArgs, headers?: object, signal?: AbortSignal): Promise - getTokenSuppliesMap( - args: GetTokenSuppliesMapArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTokenIDs(args: GetTokenIDsArgs, headers?: object, signal?: AbortSignal): Promise - getTokenIDRanges(args: GetTokenIDRangesArgs, headers?: object, signal?: AbortSignal): Promise - getBalanceUpdates( - args: GetBalanceUpdatesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTransactionHistory( - args: GetTransactionHistoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - fetchTransactionReceipt( - args: FetchTransactionReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - fetchTransactionReceiptWithFilter( - args: FetchTransactionReceiptWithFilterArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - subscribeReceipts(args: SubscribeReceiptsArgs, options: WebrpcStreamOptions): Promise - subscribeEvents(args: SubscribeEventsArgs, options: WebrpcStreamOptions): Promise - subscribeBalanceUpdates( - args: SubscribeBalanceUpdatesArgs, - options: WebrpcStreamOptions, - ): Promise - syncBalance(args: SyncBalanceArgs, headers?: object, signal?: AbortSignal): Promise - getAllWebhookListeners( - args: GetAllWebhookListenersArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getWebhookListener( - args: GetWebhookListenerArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - addWebhookListener( - args: AddWebhookListenerArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - updateWebhookListener( - args: UpdateWebhookListenerArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - removeWebhookListener( - args: RemoveWebhookListenerArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - removeAllWebhookListeners( - args: RemoveAllWebhookListenersArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - toggleWebhookListener( - args: ToggleWebhookListenerArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - pauseAllWebhookListeners( - args: PauseAllWebhookListenersArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - resumeAllWebhookListeners( - args: ResumeAllWebhookListenersArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getOrderbookOrders( - args: GetOrderbookOrdersArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTopOrders(args: GetTopOrdersArgs, headers?: object, signal?: AbortSignal): Promise +export interface GetBalanceUpdatesResponse { + page: Page + balances: Array } -export interface PingArgs {} +export interface GetChainIDRequest {} -export interface PingReturn { - status: boolean +export interface GetChainIDResponse { + chainID: number } -export interface VersionArgs {} -export interface VersionReturn { - version: Version +export interface GetEtherBalanceRequest { + accountAddress?: string } -export interface RuntimeStatusArgs {} -export interface RuntimeStatusReturn { - status: RuntimeStatus +export interface GetEtherBalanceResponse { + balance: EtherBalance } -export interface GetChainIDArgs {} -export interface GetChainIDReturn { - chainID: number +export interface GetMarketplaceOrdersRequest { + marketplaceContractAddress: string + collectionAddress: string + filter?: MarketplaceOrderFilter + page?: Page } -export interface GetEtherBalanceArgs { - accountAddress?: string + +export interface GetMarketplaceOrdersResponse { + page?: Page + orders: Array } -export interface GetEtherBalanceReturn { - balance: EtherBalance +export interface GetMarketplaceTopOrdersRequest { + marketplaceContractAddress: string + collectionAddress: string + filter: MarketplaceTopOrdersFilter +} + +export interface GetMarketplaceTopOrdersResponse { + orders: Array } -export interface GetNativeTokenBalanceArgs { + +export interface GetNativeTokenBalanceRequest { accountAddress?: string + omitPrices?: boolean } -export interface GetNativeTokenBalanceReturn { +export interface GetNativeTokenBalanceResponse { balance: NativeTokenBalance } -export interface GetTokenBalancesSummaryArgs { - filter: TokenBalancesFilter - omitMetadata?: boolean + +export interface GetTokenBalancesRequest { + accountAddress?: string + contractAddress?: string + tokenID?: string + includeMetadata?: boolean + metadataOptions?: MetadataOptions + includeCollectionTokens?: boolean page?: Page } -export interface GetTokenBalancesSummaryReturn { +export interface GetTokenBalancesResponse { page: Page - nativeBalances: Array balances: Array } -export interface GetTokenBalancesDetailsArgs { - filter: TokenBalancesFilter + +export interface GetTokenBalancesByContractRequest { + filter: TokenBalancesByContractFilter omitMetadata?: boolean page?: Page } -export interface GetTokenBalancesDetailsReturn { +export interface GetTokenBalancesByContractResponse { page: Page - nativeBalances: Array balances: Array } -export interface GetTokenBalancesByContractArgs { - filter: TokenBalancesByContractFilter + +export interface GetTokenBalancesDetailsRequest { + filter: TokenBalancesFilter omitMetadata?: boolean page?: Page } -export interface GetTokenBalancesByContractReturn { +export interface GetTokenBalancesDetailsResponse { page: Page + nativeBalances: Array balances: Array } -export interface GetTokenBalancesArgs { - accountAddress?: string - contractAddress?: string - tokenID?: string - includeMetadata?: boolean - metadataOptions?: MetadataOptions - includeCollectionTokens?: boolean + +export interface GetTokenBalancesSummaryRequest { + filter: TokenBalancesFilter + omitMetadata?: boolean page?: Page } -export interface GetTokenBalancesReturn { +export interface GetTokenBalancesSummaryResponse { page: Page + nativeBalances: Array balances: Array } -export interface GetTokenSuppliesArgs { + +export interface GetTokenIDRangesRequest { contractAddress: string - includeMetadata?: boolean - metadataOptions?: MetadataOptions - page?: Page + lastTokenID?: string } -export interface GetTokenSuppliesReturn { - page: Page +export interface GetTokenIDRangesResponse { contractType: ContractType - tokenIDs: Array -} -export interface GetTokenSuppliesMapArgs { - tokenMap: { [key: string]: Array } - includeMetadata?: boolean - metadataOptions?: MetadataOptions + tokenIDRanges: Array + moreRanges: boolean } -export interface GetTokenSuppliesMapReturn { - supplies: { [key: string]: Array } -} -export interface GetTokenIDsArgs { +export interface GetTokenIDsRequest { contractAddress: string page?: Page } -export interface GetTokenIDsReturn { +export interface GetTokenIDsResponse { page: Page contractType: ContractType tokenIDs: Array } -export interface GetTokenIDRangesArgs { - contractAddress: string + +export interface GetTokenPriceRequest { + q: TokenPriceQuery } -export interface GetTokenIDRangesReturn { - contractType: ContractType - tokenIDRanges: Array - moreRanges: boolean +export interface GetTokenPriceResponse { + price: Price +} + +export interface GetTokenPricesRequest { + q: Array +} + +export interface GetTokenPricesResponse { + prices: Array } -export interface GetBalanceUpdatesArgs { + +export interface GetTokenSuppliesRequest { contractAddress: string - lastBlockNumber: number - lastBlockHash?: string + includeMetadata?: boolean page?: Page } -export interface GetBalanceUpdatesReturn { +export interface GetTokenSuppliesResponse { page: Page - balances: Array + contractType: ContractType + tokenIDs: Array +} + +export interface GetTokenSuppliesMapRequest { + tokenMap: { [key: string]: Array } + includeMetadata?: boolean +} + +export interface GetTokenSuppliesMapResponse { + supplies: { [key: string]: Array } } -export interface GetTransactionHistoryArgs { + +export interface GetTransactionHistoryRequest { filter: TransactionHistoryFilter page?: Page includeMetadata?: boolean metadataOptions?: MetadataOptions } -export interface GetTransactionHistoryReturn { +export interface GetTransactionHistoryResponse { page: Page transactions: Array } -export interface FetchTransactionReceiptArgs { - txnHash: string - maxBlockWait?: number -} -export interface FetchTransactionReceiptReturn { - receipt: TransactionReceipt -} -export interface FetchTransactionReceiptWithFilterArgs { - filter: TransactionFilter - maxBlockWait?: number +export interface GetWebhookListenerRequest { + id: number + projectId?: number } -export interface FetchTransactionReceiptWithFilterReturn { - receipt: TransactionReceipt -} -export interface SubscribeReceiptsArgs { - filter: TransactionFilter +export interface GetWebhookListenerResponse { + listener: WebhookListener } -export interface SubscribeReceiptsReturn { - receipt: TransactionReceipt -} -export interface SubscribeEventsArgs { - filter: EventFilter +export interface ListTokenPricesRequest { + page?: Page } -export interface SubscribeEventsReturn { - log: EventLog +export interface ListTokenPricesResponse { + page: Page + prices: Array } -export interface SubscribeBalanceUpdatesArgs { - contractAddress: string + +export interface PauseAllWebhookListenersRequest { + projectId?: number } -export interface SubscribeBalanceUpdatesReturn { - balance: TokenBalance +export interface PauseAllWebhookListenersResponse { + status: boolean } -export interface SyncBalanceArgs { - accountAddress: string - contractAddress: string - tokenID?: string + +export interface PingRequest {} + +export interface PingResponse { + status: boolean } -export interface SyncBalanceReturn {} -export interface GetAllWebhookListenersArgs { +export interface RemoveAllWebhookListenersRequest { projectId?: number } -export interface GetAllWebhookListenersReturn { - listeners: Array +export interface RemoveAllWebhookListenersResponse { + status: boolean } -export interface GetWebhookListenerArgs { + +export interface RemoveWebhookListenerRequest { id: number projectId?: number } -export interface GetWebhookListenerReturn { - listener: WebhookListener +export interface RemoveWebhookListenerResponse { + status: boolean } -export interface AddWebhookListenerArgs { - url: string - filters: EventFilter + +export interface ResumeAllWebhookListenersRequest { projectId?: number } -export interface AddWebhookListenerReturn { +export interface ResumeAllWebhookListenersResponse { status: boolean - listener: WebhookListener } -export interface UpdateWebhookListenerArgs { - listener: WebhookListener - projectId?: number + +export interface RuntimeStatusRequest {} + +export interface RuntimeStatusResponse { + status: RuntimeStatus } -export interface UpdateWebhookListenerReturn { - status: boolean +export interface SubscribeBalanceUpdatesRequest { + contractAddress: string } -export interface RemoveWebhookListenerArgs { - id: number - projectId?: number + +export interface SubscribeBalanceUpdatesResponse { + balance: TokenBalance +} + +export interface SubscribeEventsRequest { + filter: EventFilter +} + +export interface SubscribeEventsResponse { + log: EventLog } -export interface RemoveWebhookListenerReturn { - status: boolean +export interface SubscribeReceiptsRequest { + filter: TransactionFilter } -export interface RemoveAllWebhookListenersArgs { - projectId?: number + +export interface SubscribeReceiptsResponse { + receipt: TransactionReceipt } -export interface RemoveAllWebhookListenersReturn { - status: boolean +export interface SyncBalanceRequest { + accountAddress: string + contractAddress: string + tokenID?: string } -export interface ToggleWebhookListenerArgs { + +export interface SyncBalanceResponse {} + +export interface ToggleWebhookListenerRequest { id: number projectId?: number } -export interface ToggleWebhookListenerReturn { +export interface ToggleWebhookListenerResponse { webhookListener: WebhookListener } -export interface PauseAllWebhookListenersArgs { - projectId?: number -} -export interface PauseAllWebhookListenersReturn { - status: boolean -} -export interface ResumeAllWebhookListenersArgs { +export interface UpdateWebhookListenerRequest { + listener: WebhookListener projectId?: number } -export interface ResumeAllWebhookListenersReturn { +export interface UpdateWebhookListenerResponse { status: boolean } -export interface GetOrderbookOrdersArgs { - page?: Page - orderbookContractAddress: string - collectionAddress: string - currencyAddresses: Array - filter: OrderbookOrderFilter - orderStatuses: Array - filters: Array - beforeExpiryTimestamp: number - blockNumberAfter: number - createdAtAfter: number -} -export interface GetOrderbookOrdersReturn { - page?: Page - orders: Array -} -export interface GetTopOrdersArgs { - orderbookContractAddress: string - collectionAddress: string - currencyAddresses: Array - tokenIDs: Array - isListing: boolean - priceSort: SortOrder - excludeUser?: string -} +export interface VersionRequest {} -export interface GetTopOrdersReturn { - orders: Array +export interface VersionResponse { + version: Version } // // Client // -export class Indexer implements Indexer { + +export class Indexer implements IndexerClient { protected hostname: string protected fetch: Fetch protected path = '/rpc/Indexer/' @@ -995,601 +1291,652 @@ export class Indexer implements Indexer { 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, - } + queryKey = { + addWebhookListener: (req: AddWebhookListenerRequest) => ['Indexer', 'addWebhookListener', req] as const, + fetchTransactionReceipt: (req: FetchTransactionReceiptRequest) => ['Indexer', 'fetchTransactionReceipt', req] as const, + fetchTransactionReceiptWithFilter: (req: FetchTransactionReceiptWithFilterRequest) => + ['Indexer', 'fetchTransactionReceiptWithFilter', req] as const, + getAllWebhookListeners: (req: GetAllWebhookListenersRequest) => ['Indexer', 'getAllWebhookListeners', req] as const, + getBalanceUpdates: (req: GetBalanceUpdatesRequest) => ['Indexer', 'getBalanceUpdates', req] as const, + getChainID: () => ['Indexer', 'getChainID'] as const, + getEtherBalance: (req: GetEtherBalanceRequest) => ['Indexer', 'getEtherBalance', req] as const, + getMarketplaceOrders: (req: GetMarketplaceOrdersRequest) => ['Indexer', 'getMarketplaceOrders', req] as const, + getMarketplaceTopOrders: (req: GetMarketplaceTopOrdersRequest) => ['Indexer', 'getMarketplaceTopOrders', req] as const, + getNativeTokenBalance: (req: GetNativeTokenBalanceRequest) => ['Indexer', 'getNativeTokenBalance', req] as const, + getTokenBalances: (req: GetTokenBalancesRequest) => ['Indexer', 'getTokenBalances', req] as const, + getTokenBalancesByContract: (req: GetTokenBalancesByContractRequest) => + ['Indexer', 'getTokenBalancesByContract', req] as const, + getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => ['Indexer', 'getTokenBalancesDetails', req] as const, + getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => ['Indexer', 'getTokenBalancesSummary', req] as const, + getTokenIDRanges: (req: GetTokenIDRangesRequest) => ['Indexer', 'getTokenIDRanges', req] as const, + getTokenIDs: (req: GetTokenIDsRequest) => ['Indexer', 'getTokenIDs', req] as const, + getTokenPrice: (req: GetTokenPriceRequest) => ['Indexer', 'getTokenPrice', req] as const, + getTokenPrices: (req: GetTokenPricesRequest) => ['Indexer', 'getTokenPrices', req] as const, + getTokenSupplies: (req: GetTokenSuppliesRequest) => ['Indexer', 'getTokenSupplies', req] as const, + getTokenSuppliesMap: (req: GetTokenSuppliesMapRequest) => ['Indexer', 'getTokenSuppliesMap', req] as const, + getTransactionHistory: (req: GetTransactionHistoryRequest) => ['Indexer', 'getTransactionHistory', req] as const, + getWebhookListener: (req: GetWebhookListenerRequest) => ['Indexer', 'getWebhookListener', req] as const, + listTokenPrices: (req: ListTokenPricesRequest) => ['Indexer', 'listTokenPrices', req] as const, + pauseAllWebhookListeners: (req: PauseAllWebhookListenersRequest) => ['Indexer', 'pauseAllWebhookListeners', req] as const, + ping: () => ['Indexer', 'ping'] as const, + removeAllWebhookListeners: (req: RemoveAllWebhookListenersRequest) => ['Indexer', 'removeAllWebhookListeners', req] as const, + removeWebhookListener: (req: RemoveWebhookListenerRequest) => ['Indexer', 'removeWebhookListener', req] as const, + resumeAllWebhookListeners: (req: ResumeAllWebhookListenersRequest) => ['Indexer', 'resumeAllWebhookListeners', req] as const, + runtimeStatus: () => ['Indexer', 'runtimeStatus'] as const, + subscribeBalanceUpdates: (req: SubscribeBalanceUpdatesRequest) => ['Indexer', 'subscribeBalanceUpdates', req] as const, + subscribeEvents: (req: SubscribeEventsRequest) => ['Indexer', 'subscribeEvents', req] as const, + subscribeReceipts: (req: SubscribeReceiptsRequest) => ['Indexer', 'subscribeReceipts', req] as const, + syncBalance: (req: SyncBalanceRequest) => ['Indexer', 'syncBalance', req] as const, + toggleWebhookListener: (req: ToggleWebhookListenerRequest) => ['Indexer', 'toggleWebhookListener', req] as const, + updateWebhookListener: (req: UpdateWebhookListenerRequest) => ['Indexer', 'updateWebhookListener', req] as const, + version: () => ['Indexer', 'version'] as const + } + + addWebhookListener = ( + req: AddWebhookListenerRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('AddWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'AddWebhookListenerResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { - return { - version: _data.version, - } + fetchTransactionReceipt = ( + req: FetchTransactionReceiptRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('FetchTransactionReceipt'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'FetchTransactionReceiptResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + fetchTransactionReceiptWithFilter = ( + req: FetchTransactionReceiptWithFilterRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('FetchTransactionReceiptWithFilter'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'FetchTransactionReceiptWithFilterResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { - return { - chainID: _data.chainID, - } + getAllWebhookListeners = ( + req: GetAllWebhookListenersRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetAllWebhookListenersResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getEtherBalance = ( - args: GetEtherBalanceArgs, + getBalanceUpdates = ( + req: GetBalanceUpdatesRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetEtherBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetBalanceUpdates'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetBalanceUpdatesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getNativeTokenBalance = ( - args: GetNativeTokenBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetNativeTokenBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - balance: _data.balance, - } + getChainID = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetChainID'), createHttpRequest('{}', headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetChainIDResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getEtherBalance = (req: GetEtherBalanceRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetEtherBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetEtherBalanceResponse') + }) }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTokenBalancesSummary = ( - args: GetTokenBalancesSummaryArgs, + getMarketplaceOrders = ( + req: GetMarketplaceOrdersRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenBalancesSummary'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - nativeBalances: >_data.nativeBalances, - balances: >_data.balances, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetMarketplaceOrders'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetMarketplaceOrdersResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTokenBalancesDetails = ( - args: GetTokenBalancesDetailsArgs, + getMarketplaceTopOrders = ( + req: GetMarketplaceTopOrdersRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenBalancesDetails'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - nativeBalances: >_data.nativeBalances, - balances: >_data.balances, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetMarketplaceTopOrders'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetMarketplaceTopOrdersResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTokenBalancesByContract = ( - args: GetTokenBalancesByContractArgs, + getNativeTokenBalance = ( + req: GetNativeTokenBalanceRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenBalancesByContract'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - balances: >_data.balances, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetNativeTokenBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetNativeTokenBalanceResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getTokenBalances = ( - args: GetTokenBalancesArgs, + req: GetTokenBalancesRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenBalances'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - balances: >_data.balances, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalances'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTokenSupplies = ( - args: GetTokenSuppliesArgs, + getTokenBalancesByContract = ( + req: GetTokenBalancesByContractRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenSupplies'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - contractType: _data.contractType, - tokenIDs: >_data.tokenIDs, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesByContract'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesByContractResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTokenSuppliesMap = ( - args: GetTokenSuppliesMapArgs, + getTokenBalancesDetails = ( + req: GetTokenBalancesDetailsRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenSuppliesMap'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - supplies: <{ [key: string]: Array }>_data.supplies, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesDetails'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesDetailsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTokenIDs = (args: GetTokenIDsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetTokenIDs'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - contractType: _data.contractType, - tokenIDs: >_data.tokenIDs, - } + getTokenBalancesSummary = ( + req: GetTokenBalancesSummaryRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesSummary'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesSummaryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getTokenIDRanges = ( - args: GetTokenIDRangesArgs, + req: GetTokenIDRangesRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenIDRanges'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - contractType: _data.contractType, - tokenIDRanges: >_data.tokenIDRanges, - moreRanges: _data.moreRanges, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenIDRanges'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenIDRangesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getBalanceUpdates = ( - args: GetBalanceUpdatesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetBalanceUpdates'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - balances: >_data.balances, - } + getTokenIDs = (req: GetTokenIDsRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenIDs'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenIDsResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTransactionHistory = ( - args: GetTransactionHistoryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTransactionHistory'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - transactions: >_data.transactions, - } + getTokenPrice = (req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenPrice'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenPriceResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - fetchTransactionReceipt = ( - args: FetchTransactionReceiptArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('FetchTransactionReceipt'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - receipt: _data.receipt, - } + getTokenPrices = (req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenPricesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - fetchTransactionReceiptWithFilter = ( - args: FetchTransactionReceiptWithFilterArgs, + getTokenSupplies = ( + req: GetTokenSuppliesRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('FetchTransactionReceiptWithFilter'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - receipt: _data.receipt, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenSupplies'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenSuppliesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - subscribeReceipts = ( - args: SubscribeReceiptsArgs, - options: WebrpcStreamOptions, - ): Promise => { - const _fetch = () => - this.fetch(this.url('SubscribeReceipts'), createHTTPRequest(args, options.headers, options.signal)).then( - async (res) => { - await sseResponse(res, options, _fetch) - }, - (error) => { - options.onError(error, _fetch) - }, - ) - return _fetch() - } - subscribeEvents = (args: SubscribeEventsArgs, options: WebrpcStreamOptions): Promise => { - const _fetch = () => - this.fetch(this.url('SubscribeEvents'), createHTTPRequest(args, options.headers, options.signal)).then( - async (res) => { - await sseResponse(res, options, _fetch) - }, - (error) => { - options.onError(error, _fetch) - }, - ) - return _fetch() - } - subscribeBalanceUpdates = ( - args: SubscribeBalanceUpdatesArgs, - options: WebrpcStreamOptions, - ): Promise => { - const _fetch = () => - this.fetch(this.url('SubscribeBalanceUpdates'), createHTTPRequest(args, options.headers, options.signal)).then( - async (res) => { - await sseResponse(res, options, _fetch) - }, - (error) => { - options.onError(error, _fetch) - }, - ) - return _fetch() - } - syncBalance = (args: SyncBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('SyncBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return {} + getTokenSuppliesMap = ( + req: GetTokenSuppliesMapRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenSuppliesMap'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenSuppliesMapResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getAllWebhookListeners = ( - args: GetAllWebhookListenersArgs, + getTransactionHistory = ( + req: GetTransactionHistoryRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetAllWebhookListeners'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - listeners: >_data.listeners, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTransactionHistory'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTransactionHistoryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getWebhookListener = ( - args: GetWebhookListenerArgs, + req: GetWebhookListenerRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetWebhookListener'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - listener: _data.listener, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetWebhookListenerResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + listTokenPrices = (req: ListTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ListTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'ListTokenPricesResponse') + }) }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - addWebhookListener = ( - args: AddWebhookListenerArgs, + pauseAllWebhookListeners = ( + req: PauseAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('AddWebhookListener'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - listener: _data.listener, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('PauseAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'PauseAllWebhookListenersResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'PingResponse') + }) }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - updateWebhookListener = ( - args: UpdateWebhookListenerArgs, + removeAllWebhookListeners = ( + req: RemoveAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('UpdateWebhookListener'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('RemoveAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'RemoveAllWebhookListenersResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } removeWebhookListener = ( - args: RemoveWebhookListenerArgs, + req: RemoveWebhookListenerRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RemoveWebhookListener'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('RemoveWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'RemoveWebhookListenerResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - removeAllWebhookListeners = ( - args: RemoveAllWebhookListenersArgs, + resumeAllWebhookListeners = ( + req: ResumeAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('RemoveAllWebhookListeners'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ResumeAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'ResumeAllWebhookListenersResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - toggleWebhookListener = ( - args: ToggleWebhookListenerArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ToggleWebhookListener'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - webhookListener: _data.webhookListener, - } + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RuntimeStatus'), createHttpRequest('{}', headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'RuntimeStatusResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - pauseAllWebhookListeners = ( - args: PauseAllWebhookListenersArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('PauseAllWebhookListeners'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + subscribeBalanceUpdates = ( + req: SubscribeBalanceUpdatesRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController => { + const abortController = new AbortController() + const abortSignal = abortController.signal + + if (options.signal) { + abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { + signal: options.signal + }) + } + + const _fetch = () => + this.fetch(this.url('SubscribeBalanceUpdates'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( + async res => { + await sseResponse(res, options, _fetch) + }, + error => { + options.onError(error, _fetch) + } + ) + + const resp = _fetch() + return { + abort: abortController.abort.bind(abortController), + closed: resp + } + } + subscribeEvents = ( + req: SubscribeEventsRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController => { + const abortController = new AbortController() + const abortSignal = abortController.signal + + if (options.signal) { + abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { + signal: options.signal + }) + } + + const _fetch = () => + this.fetch(this.url('SubscribeEvents'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( + async res => { + await sseResponse(res, options, _fetch) + }, + error => { + options.onError(error, _fetch) + } + ) + + const resp = _fetch() + return { + abort: abortController.abort.bind(abortController), + closed: resp + } + } + subscribeReceipts = ( + req: SubscribeReceiptsRequest, + options: WebrpcStreamOptions + ): WebrpcStreamController => { + const abortController = new AbortController() + const abortSignal = abortController.signal + + if (options.signal) { + abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { + signal: options.signal + }) + } + + const _fetch = () => + this.fetch(this.url('SubscribeReceipts'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( + async res => { + await sseResponse(res, options, _fetch) + }, + error => { + options.onError(error, _fetch) + } + ) + + const resp = _fetch() + return { + abort: abortController.abort.bind(abortController), + closed: resp + } + } + syncBalance = (req: SyncBalanceRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SyncBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'SyncBalanceResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - resumeAllWebhookListeners = ( - args: ResumeAllWebhookListenersArgs, + toggleWebhookListener = ( + req: ToggleWebhookListenerRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('ResumeAllWebhookListeners'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ToggleWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'ToggleWebhookListenerResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getOrderbookOrders = ( - args: GetOrderbookOrdersArgs, + updateWebhookListener = ( + req: UpdateWebhookListenerRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetOrderbookOrders'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - orders: >_data.orders, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('UpdateWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'UpdateWebhookListenerResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTopOrders = (args: GetTopOrdersArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('GetTopOrders'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - orders: >_data.orders, - } + version = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Version'), createHttpRequest('{}', headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'VersionResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } } @@ -1611,9 +1958,9 @@ const sseResponse = async (res: Response, options: WebrpcStreamOptions, ret onError( WebrpcBadResponseError.new({ status: res.status, - cause: 'Invalid response, missing body', + cause: 'Invalid response, missing body' }), - retryFetch, + retryFetch ) return } @@ -1643,27 +1990,22 @@ const sseResponse = async (res: Response, options: WebrpcStreamOptions, ret lastReadTime = Date.now() buffer += decoder.decode(value, { stream: true }) } catch (error) { - let message = '' - if (error instanceof Error) { - message = error.message - } - if (error instanceof DOMException && error.name === 'AbortError') { onError( - WebrpcRequestFailedError.new({ + WebrpcClientAbortedError.new({ message: 'AbortError', - cause: `AbortError: ${message}`, + cause: `AbortError: ${error instanceof Error ? error.message : String(error)}` }), () => { throw new Error('Abort signal cannot be used to reconnect') - }, + } ) } else { onError( WebrpcStreamLostError.new({ - cause: `reader.read(): ${message}`, + cause: `reader.read(): ${error instanceof Error ? error.message : String(error)}` }), - retryFetch, + retryFetch ) } return @@ -1671,12 +2013,13 @@ const sseResponse = async (res: Response, options: WebrpcStreamOptions, ret let lines = buffer.split('\n') for (let i = 0; i < lines.length - 1; i++) { - if (lines[i]!.length == 0) { + const line = lines[i] + if (line?.length === 0) { continue } let data: any try { - data = JSON.parse(lines[i]!) + data = JSON.parse(line) if (data.hasOwnProperty('webrpcError')) { const error = data.webrpcError const code: number = typeof error.code === 'number' ? error.code : 0 @@ -1690,17 +2033,17 @@ const sseResponse = async (res: Response, options: WebrpcStreamOptions, ret onError( WebrpcBadResponseError.new({ status: res.status, - // @ts-ignore - cause: `JSON.parse(): ${error.message}`, + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}` }), - retryFetch, + retryFetch ) } onMessage(data) } if (!done) { - buffer = lines[lines.length - 1]! + const lastLine = lines[lines.length - 1] + buffer = lastLine || '' continue } @@ -1709,31 +2052,24 @@ const sseResponse = async (res: Response, options: WebrpcStreamOptions, ret } } -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 => { - return res.text().then((text) => { + 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}`, + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}` }) } if (!res.ok) { @@ -1744,518 +2080,511 @@ const buildResponse = (res: Response): Promise => { }) } +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + +export interface WebrpcStreamOptions extends WebrpcOptions { + onMessage: (message: T) => void + onError: (error: WebrpcError, reconnect: () => void) => void + onOpen?: () => void + onClose?: () => void +} + +export interface WebrpcOptions { + headers?: HeadersInit + signal?: AbortSignal +} + +export interface WebrpcStreamController { + abort: (reason?: any) => void + closed: Promise +} + +export const JsonEncode = (obj: T): 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) - Object.setPrototypeOf(this, UnauthorizedError.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 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 AccessKeyMismatchError extends WebrpcError { + 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 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 AccessKeyNotFoundError extends WebrpcError { + 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 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 AtLeastOneKeyError extends WebrpcError { + 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 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 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 AbortedError extends WebrpcError { - constructor( - name: string = 'Aborted', - code: number = 1005, - message: string = 'Request aborted', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, AbortedError.prototype) +export class InvalidArgumentError extends WebrpcError { + constructor(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 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 InvalidOriginError extends WebrpcError { + 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 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 InvalidServiceError extends WebrpcError { + 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 ProjectNotFoundError extends WebrpcError { - constructor( - name: string = 'ProjectNotFound', - code: number = 1100, - message: string = 'Project not found', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, ProjectNotFoundError.prototype) +export class MaxAccessKeysError extends WebrpcError { + 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 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 MetadataCallFailedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'MetadataCallFailed' + this.code = typeof error.code === 'number' ? error.code : 3003 + this.message = error.message || `Metadata service call failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, MetadataCallFailedError.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 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 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 NoDefaultKeyError extends WebrpcError { + 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 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 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 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 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 QuotaExceededError extends WebrpcError { - constructor( - name: string = 'QuotaExceeded', - code: number = 1200, - message: string = 'Quota exceeded', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, QuotaExceededError.prototype) +export class ProjectNotFoundError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ProjectNotFound' + this.code = typeof error.code === 'number' ? error.code : 1100 + 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 RateLimitError extends WebrpcError { - constructor( - name: string = 'RateLimit', - code: number = 1201, - message: string = 'Rate limit exceeded', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, RateLimitError.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 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 QuotaExceededError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QuotaExceeded' + this.code = typeof error.code === 'number' ? error.code : 1200 + this.message = error.message || `Quota 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 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 RateLimitError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'RateLimit' + this.code = typeof error.code === 'number' ? error.code : 1201 + this.message = error.message || `Rate limit exceeded` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, RateLimitError.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 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 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 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 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 ResourceExhaustedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ResourceExhausted' + this.code = typeof error.code === 'number' ? error.code : 2004 + this.message = error.message || `Resource exhausted` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, ResourceExhaustedError.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 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 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 TimeoutError extends WebrpcError { + 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 ResourceExhaustedError extends WebrpcError { - constructor( - name: string = 'ResourceExhausted', - code: number = 2004, - message: string = 'Resource exhausted', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, ResourceExhaustedError.prototype) +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 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 UnauthorizedUserError extends WebrpcError { + 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 MetadataCallFailedError extends WebrpcError { - constructor( - name: string = 'MetadataCallFailed', - code: number = 3003, - message: string = 'Metadata service call failed', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, MetadataCallFailedError.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) } } @@ -2268,38 +2597,78 @@ 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', - AccessKeyNotFound = 'AccessKeyNotFound', AccessKeyMismatch = 'AccessKeyMismatch', + AccessKeyNotFound = 'AccessKeyNotFound', + AtLeastOneKey = 'AtLeastOneKey', + Geoblocked = 'Geoblocked', + InvalidArgument = 'InvalidArgument', InvalidOrigin = 'InvalidOrigin', InvalidService = 'InvalidService', - UnauthorizedUser = 'UnauthorizedUser', - QuotaExceeded = 'QuotaExceeded', - RateLimit = 'RateLimit', - NoDefaultKey = 'NoDefaultKey', MaxAccessKeys = 'MaxAccessKeys', - AtLeastOneKey = 'AtLeastOneKey', - Timeout = 'Timeout', - InvalidArgument = 'InvalidArgument', - Unavailable = 'Unavailable', + MetadataCallFailed = 'MetadataCallFailed', + MethodNotFound = 'MethodNotFound', + NoDefaultKey = 'NoDefaultKey', + NotFound = 'NotFound', + PermissionDenied = 'PermissionDenied', + ProjectNotFound = 'ProjectNotFound', QueryFailed = 'QueryFailed', + QuotaExceeded = 'QuotaExceeded', + RateLimit = 'RateLimit', + RateLimited = 'RateLimited', + RequestConflict = 'RequestConflict', ResourceExhausted = 'ResourceExhausted', - NotFound = 'NotFound', - MetadataCallFailed = 'MetadataCallFailed', -} - -const webrpcErrorByCode: { [code: number]: any } = { + SessionExpired = 'SessionExpired', + Timeout = 'Timeout', + Unauthorized = 'Unauthorized', + UnauthorizedUser = 'UnauthorizedUser', + Unavailable = 'Unavailable' +} + +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, + Aborted = 1005, + AccessKeyMismatch = 1102, + AccessKeyNotFound = 1101, + AtLeastOneKey = 1302, + Geoblocked = 1006, + InvalidArgument = 2001, + InvalidOrigin = 1103, + InvalidService = 1104, + MaxAccessKeys = 1301, + MetadataCallFailed = 3003, + MethodNotFound = 1003, + NoDefaultKey = 1300, + NotFound = 3000, + PermissionDenied = 1001, + ProjectNotFound = 1100, + QueryFailed = 2003, + QuotaExceeded = 1200, + RateLimit = 1201, + RateLimited = 1007, + RequestConflict = 1004, + ResourceExhausted = 2004, + SessionExpired = 1002, + Timeout = 1900, + Unauthorized = 1000, + UnauthorizedUser = 1105, + Unavailable = 2002 +} + +export const webrpcErrorByCode: { [code: number]: any } = { [0]: WebrpcEndpointError, [-1]: WebrpcRequestFailedError, [-2]: WebrpcBadRouteError, @@ -2308,46 +2677,89 @@ 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, - [1004]: RequestConflictError, [1005]: AbortedError, - [1006]: GeoblockedError, - [1007]: RateLimitedError, - [1100]: ProjectNotFoundError, - [1101]: AccessKeyNotFoundError, [1102]: AccessKeyMismatchError, + [1101]: AccessKeyNotFoundError, + [1302]: AtLeastOneKeyError, + [1006]: GeoblockedError, + [2001]: InvalidArgumentError, [1103]: InvalidOriginError, [1104]: InvalidServiceError, - [1105]: UnauthorizedUserError, - [1200]: QuotaExceededError, - [1201]: RateLimitError, - [1300]: NoDefaultKeyError, [1301]: MaxAccessKeysError, - [1302]: AtLeastOneKeyError, - [1900]: TimeoutError, - [2001]: InvalidArgumentError, - [2002]: UnavailableError, + [3003]: MetadataCallFailedError, + [1003]: MethodNotFoundError, + [1300]: NoDefaultKeyError, + [3000]: NotFoundError, + [1001]: PermissionDeniedError, + [1100]: ProjectNotFoundError, [2003]: QueryFailedError, + [1200]: QuotaExceededError, + [1201]: RateLimitError, + [1007]: RateLimitedError, + [1004]: RequestConflictError, [2004]: ResourceExhaustedError, - [3000]: NotFoundError, - [3003]: MetadataCallFailedError, + [1002]: SessionExpiredError, + [1900]: TimeoutError, + [1000]: UnauthorizedError, + [1105]: UnauthorizedUserError, + [2002]: UnavailableError } -export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise +// +// Webrpc +// -export interface WebrpcStreamOptions extends WebrpcOptions { - onMessage: (message: T) => void - onError: (error: WebrpcError, reconnect: () => void) => void - onOpen?: () => void - onClose?: () => void +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.31.2;gen-typescript@v0.23.1;sequence-indexer@v0.4.0' + +type WebrpcGenVersions = { + WebrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string } -export interface WebrpcOptions { - headers?: HeadersInit - signal?: AbortSignal + +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/indexer/src/indexergw.gen.ts b/packages/services/indexer/src/indexergw.gen.ts index 92f85b2c8..729d04cdc 100644 --- a/packages/services/indexer/src/indexergw.gen.ts +++ b/packages/services/indexer/src/indexergw.gen.ts @@ -1,79 +1,161 @@ /* eslint-disable */ -// sequence-indexer v0.4.0 5be4a3e78d9c7e0cc378c675ec01c518e83772e3 +// sequence-indexer v0.4.0 b978d153702d614d5f1b9c98ff7f2e5857cccfd6 // -- -// Code generated by webrpc-gen@v0.21.1 with typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen@v0.31.2 with typescript generator. DO NOT EDIT. // -// webrpc-gen -schema=indexer.ridl -service=IndexerGateway -target=typescript -client -out=./clients/indexergw.gen.ts +// webrpc-gen -schema=merged.gen.json -service=IndexerGateway -target=typescript -client -out=./clients/indexergw.gen.ts -export const WebrpcHeader = 'Webrpc' - -export const WebrpcHeaderValue = 'webrpc@v0.21.1;gen-typescript@v0.15.1;sequence-indexer@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 = '5be4a3e78d9c7e0cc378c675ec01c518e83772e3' +export const WebrpcSchemaHash = 'b978d153702d614d5f1b9c98ff7f2e5857cccfd6' -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 IndexerGatewayClient { + /** + * GetTokenBalances returns a balance summary/details for an specific account + * on all indexer nodes. By default if accountAddress is left empty, it will + * use the account from the jwt session. + */ + getBalanceUpdates(req: GetBalanceUpdatesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetChains returns a list of chains with their ID and name + */ + getChains(req: GetChainsRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetNativeTokenBalance queries indexer nodes for the latest native token + * account balance. + */ + getNativeTokenBalance( + req: GetNativeTokenBalanceRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalances returns a balance summary/details for a specific account + * on all indexer nodes. By default if accountAddress is left empty, it will + * use the account from the jwt session. + * + * @deprecated Use GetTokenBalancesSummary or GetTokenBalancesDetails instead. + */ + getTokenBalances(req: GetTokenBalancesRequest, headers?: object, signal?: AbortSignal): Promise + + /** + * GetTokenBalancesByContract returns a balances for specific accounts and + * contracts on all indexer nodes. The collection ERC721 & ERC1155 tokens are + * represented as individual balances. + */ + getTokenBalancesByContract( + req: GetTokenBalancesByContractRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalancesDetails returns a detailed balance summary for the given + * accounts on all indexer nodes. The collection ERC721 & ERC1155 tokens are + * represented as individual balances. + */ + getTokenBalancesDetails( + req: GetTokenBalancesDetailsRequest, + headers?: object, + signal?: AbortSignal + ): Promise + + /** + * GetTokenBalancesSummary returns a summary of token balances for the given + * accounts on all indexer nodes. The collection ERC721 & ERC1155 tokens are + * represented as a single aggregated balance. + */ + getTokenBalancesSummary( + req: GetTokenBalancesSummaryRequest, + headers?: object, + signal?: AbortSignal + ): Promise - return parseWebrpcGenVersions(headerValue) -} + getTokenPrice(req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise -function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(';') - if (versions.length < 3) { - return { - webrpcGenVersion: '', - codeGenName: '', - codeGenVersion: '', - schemaName: '', - schemaVersion: '', - } - } + getTokenPrices(req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise - const [_, webrpcGenVersion] = versions[0]!.split('@') - const [codeGenName, codeGenVersion] = versions[1]!.split('@') - const [schemaName, schemaVersion] = versions[2]!.split('@') + /** + * GetTransactionHistory returns the history of mined transactions for the + * given account on all indexer nodes, which includes a list of token transfer + * (sent/received) , and sent transactions from a Sequence wallet. + */ + getTransactionHistory( + req: GetTransactionHistoryRequest, + headers?: object, + signal?: AbortSignal + ): Promise - return { - webrpcGenVersion: webrpcGenVersion!, - codeGenName: codeGenName!, - codeGenVersion: codeGenVersion!, - schemaName: schemaName!, - schemaVersion: schemaVersion!, - } + /** + * Ping the indexer + */ + ping(headers?: object, signal?: AbortSignal): Promise + + /** + * Get the current runtime health status of the indexer gatewya + */ + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + + /** + * Get the current version of the indexer + */ + version(headers?: object, signal?: AbortSignal): Promise } // -// Types +// Schema types // -export enum ResourceStatus { - NOT_AVAILABLE = 'NOT_AVAILABLE', - REFRESHING = 'REFRESHING', - AVAILABLE = 'AVAILABLE', +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 BloomStats { + hitRatio: string + falsePositivesPercent: string + hitCount: number + missCount: number + falsePositives: number +} + +export interface BloomStatus { + enabled: boolean + initialized: boolean + bloomInitElapsedTime: string + stats: BloomStats +} + +export interface Bond { + pebble: PebbleMetrics + estimatedDiskUsagePerTable: any + estimatedDiskUsageTotal: string +} + +export interface ChainInfo { + chainId: number + chainName: string } export interface ContractInfo { @@ -93,56 +175,29 @@ export interface ContractInfo { status: ResourceStatus } -export interface ContractInfoExtensions { - link: string - description: string - categories: Array - ogImage: string - ogName: string - originChainId: number - originAddress: string - blacklist: boolean - verified: boolean - verifiedBy: string - featured: boolean - featureIndex: number +export interface ContractInfoExtensionBridgeInfo { + tokenAddress: string } -export interface TokenMetadata { - contractAddress?: string - tokenId: string - source: 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: ResourceStatus - queuedAt?: string - lastFetched?: string +export interface ContractInfoExtensionIndexingInfo { + useOnChainBalance: boolean } -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 ContractInfoExtensions { + link?: string + description?: string + categories?: Array + bridgeInfo?: { [key: string]: ContractInfoExtensionBridgeInfo } + indexingInfo?: ContractInfoExtensionIndexingInfo + ogImage?: string + ogName?: string + originChainId?: number + originAddress?: string + blacklist?: boolean + verified?: boolean + verifiedBy?: string + featured?: boolean + featureIndex?: number } export enum ContractType { @@ -156,72 +211,73 @@ export enum ContractType { ERC721_BRIDGE = 'ERC721_BRIDGE', ERC1155_BRIDGE = 'ERC1155_BRIDGE', SEQ_MARKETPLACE = 'SEQ_MARKETPLACE', + ERC6909 = 'ERC6909' } -export enum EventLogType { - UNKNOWN = 'UNKNOWN', - BLOCK_ADDED = 'BLOCK_ADDED', - BLOCK_REMOVED = 'BLOCK_REMOVED', -} - -export enum EventLogDataType { - EVENT = 'EVENT', - TOKEN_TRANSFER = 'TOKEN_TRANSFER', - NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', - SEQUENCE_TXN = 'SEQUENCE_TXN', -} - -export enum OrderStatus { - OPEN = 'OPEN', - CLOSED = 'CLOSED', - CANCELLED = 'CANCELLED', +export enum ContractVerificationStatus { + VERIFIED = 'VERIFIED', + UNVERIFIED = 'UNVERIFIED', + ALL = 'ALL' } -export enum TxnTransferType { - UNKNOWN = 'UNKNOWN', - SEND = 'SEND', - RECEIVE = 'RECEIVE', +export interface DiskUsage { + humanReadable: string + used: number + size: number + percent: number + dirs: { [key: string]: string } } -export enum TransactionStatus { - FAILED = 'FAILED', - SUCCESSFUL = 'SUCCESSFUL', +export interface EtherBalance { + accountAddress: string + balanceWei: string } -export enum TransactionType { - LegacyTxnType = 'LegacyTxnType', - AccessListTxnType = 'AccessListTxnType', - DynamicFeeTxnType = 'DynamicFeeTxnType', +export interface EventDecoded { + topicHash: string + eventSig: string + types: Array + names: Array + values: Array } -export enum SortOrder { - DESC = 'DESC', - ASC = 'ASC', +export interface EventFilter { + events?: Array + contractAddresses?: Array + accounts?: Array + tokenIDs?: Array } -export enum ContractVerificationStatus { - VERIFIED = 'VERIFIED', - UNVERIFIED = 'UNVERIFIED', - ALL = 'ALL', +export interface EventLog { + id: number + uid: string + type: EventLogType + blockNumber: number + blockHash: string + parentBlockHash: string + contractAddress: string + contractType: ContractType + txnHash: string + txnIndex: number + txnLogIndex: number + logDataType: EventLogDataType + ts: string + txnInfo?: TxnInfo + rawLog?: { [key: string]: any } + event?: EventDecoded } -export interface Version { - webrpcVersion: string - schemaVersion: string - schemaHash: string - appVersion: string +export enum EventLogDataType { + EVENT = 'EVENT', + TOKEN_TRANSFER = 'TOKEN_TRANSFER', + NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', + SEQUENCE_TXN = 'SEQUENCE_TXN' } -export interface RuntimeStatus { - healthOK: boolean - indexerEnabled: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string - chainID: number - checks: RuntimeChecks +export enum EventLogType { + UNKNOWN = 'UNKNOWN', + BLOCK_ADDED = 'BLOCK_ADDED', + BLOCK_REMOVED = 'BLOCK_REMOVED' } export interface GatewayBackendResponseTime { @@ -235,6 +291,30 @@ export interface GatewayBackendRuntimeStatus { responseTime: GatewayBackendResponseTime } +export interface GatewayEtherBalance { + chainId: number + errorReason?: string + result: EtherBalance +} + +export interface GatewayNativeTokenBalance { + chainId: number + errorReason?: string + result: NativeTokenBalance +} + +export interface GatewayNativeTokenBalances { + chainId: number + errorReason?: string + results: Array +} + +export interface GatewayPrice { + chainID: number + errorReason?: string + results: Array +} + export interface GatewayRuntimeStatus { healthOK: boolean startTime: string @@ -245,113 +325,173 @@ export interface GatewayRuntimeStatus { backends: Array } -export interface WALWriterRuntimeStatus { - healthOK: boolean - startTime: string - uptime: number - ver: string - branch: string - commitHash: string +export interface GatewayTokenBalance { + chainId: number + errorReason?: string + results: Array +} + +export interface GatewayTokenPriceQuery { chainID: number - percentWALWritten: number + queries: Array } -export interface RuntimeChecks { - running: boolean - runnables: any - cgoEnabled: boolean - quotaControlEnabled: boolean - syncMode: string - percentIndexed: number +export interface GatewayTransaction { + chainId: number + errorReason?: string + results: Array +} + +export interface IndexState { + chainId: string lastBlockNum: number - lastBlockNumWithState: number - bloomStatus: BloomStatus - bond: Bond - diskUsage: DiskUsage + lastBlockHash: string } -export interface DiskUsage { - humanReadable: string - used: number - size: number - percent: number - dirs: { [key: string]: string } +export interface IndexedBlock { + blockNumber: number + blockShortHash: string } -export interface Bond { - pebble: PebbleMetrics - estimatedDiskUsagePerTable: any - estimatedDiskUsageTotal: string +export interface IndexerMetrics { + blocksPerSecond: number + eventsPerSecond: number } -export interface PebbleMetrics { - compactionCount: number - compactionEstimatedDebt: number - compactionInProgressBytes: number - compactionNumInProgress: number - compactionMarkedFiles: number +export interface MarketplaceOrder { + orderId: string + tokenContract: string + tokenId: string + isListing: boolean + quantity: string + quantityRemaining: string + currencyAddress: string + pricePerToken: string + expiry: string + orderStatus: OrderStatus + createdBy: string + blockNumber: number + orderbookContractAddress: string + createdAt: number } -export interface BloomStatus { - enabled: boolean - initialized: boolean - bloomInitElapsedTime: string +export interface MarketplaceOrderFilter { + isListing?: boolean + userAddresses?: Array + currencyAddresses: Array + orderIds: Array + tokenIds: Array + excludeUserAddresses?: Array + blockNumberGt: number + createdAtAfter: number + orderStatuses: Array + returnExpired: boolean } -export interface EtherBalance { - accountAddress: string - balanceWei: string +export interface MarketplaceTopOrdersFilter { + currencyAddresses: Array + tokenIds: Array + isListing: boolean + priceSort: SortOrder + excludeUser?: string +} + +export interface MetadataOptions { + verifiedOnly?: boolean + unverifiedOnly?: boolean + includeContracts?: Array } export interface NativeTokenBalance { accountAddress: string chainId: number + name: string + symbol: string balance: string - error: string + balanceUSD: string + priceUSD: string + priceUpdatedAt?: string + errorReason?: string } -export interface IndexState { - chainId: string - lastBlockNum: number - lastBlockHash: string +export enum NetworkType { + MAINNETS = 'MAINNETS', + TESTNETS = 'TESTNETS', + ALL = 'ALL' } -export interface IndexedBlock { - blockNumber: number - blockShortHash: string +export enum OrderStatus { + OPEN = 'OPEN', + CLOSED = 'CLOSED', + CANCELLED = 'CANCELLED' } -export interface TxnInfo { - from: string - to: string - value: string +export interface Page { + page?: number + column?: string + before?: any + after?: any + sort?: Array + pageSize?: number + more?: boolean } -export interface EventLog { - id: number - uid: string - type: EventLogType - blockNumber: number - blockHash: string - parentBlockHash: string +export interface PebbleMetrics { + compactionCount: number + compactionEstimatedDebt: number + compactionInProgressBytes: number + compactionNumInProgress: number + compactionMarkedFiles: number +} + +export interface Price { contractAddress: string - contractType: ContractType - txnHash: string - txnIndex: number - txnLogIndex: number - logDataType: EventLogDataType - ts: string - txnInfo?: TxnInfo - rawLog?: { [key: string]: any } - event?: EventDecoded + tokenID?: string + priceUSD: string + updatedAt?: string } -export interface EventDecoded { - topicHash: string - eventSig: string - types: Array - names: Array - values: Array +export enum ResourceStatus { + NOT_AVAILABLE = 'NOT_AVAILABLE', + REFRESHING = 'REFRESHING', + AVAILABLE = 'AVAILABLE' +} + +export interface RuntimeChecks { + running: boolean + runnables: any + cgoEnabled: boolean + quotaControlEnabled: boolean + syncMode: string + percentIndexed: number + lastBlockNum: number + lastBlockNumWithState: number + bloomStatus: BloomStatus + bond: Bond + diskUsage: DiskUsage + metrics: IndexerMetrics +} + +export interface RuntimeStatus { + healthOK: boolean + indexerEnabled: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + checks: RuntimeChecks +} + +export interface SortBy { + column: string + order: SortOrder +} + +export enum SortOrder { + DESC = 'DESC', + ASC = 'ASC' } export interface TokenBalance { @@ -360,6 +500,9 @@ export interface TokenBalance { accountAddress: string tokenID?: string balance: string + balanceUSD: string + priceUSD: string + priceUpdatedAt?: string blockHash: string blockNumber: number chainId: number @@ -369,39 +512,32 @@ export interface TokenBalance { tokenMetadata?: TokenMetadata } -export interface OrderbookOrder { - orderId: string - tokenContract: string - tokenId: string - isListing: boolean - quantity: string - quantityRemaining: string - currencyAddress: string - pricePerToken: string - expiry: string - orderStatus: OrderStatus - createdBy: string - blockNumber: number - orderbookContractAddress: string - createdAt: number +export interface TokenBalanceFilter { + contractAddress: string + sinceBlockNumber: number } -export interface OrderbookOrderFilter { - isListing?: boolean - userAddresses?: Array - tokenIds: Array - excludeUserAddresses?: Array - afterBlockNumber: number - afterCreatedAt: number - beforeExpiry: number - userAddress?: string - excludeUserAddress?: string +export interface TokenBalancesByContractFilter { + contractAddresses: Array + accountAddresses?: Array + contractStatus?: ContractVerificationStatus + tokenIDs?: Array +} + +export interface TokenBalancesFilter { + accountAddresses: Array + contractStatus?: ContractVerificationStatus + contractTypes?: Array + contractWhitelist?: Array + contractBlacklist?: Array + omitNativeBalances: boolean + omitPrices?: boolean + tokenIDs?: Array } export interface TokenHistory { blockNumber: number blockHash: string - accountAddress: string contractAddress: string contractType: ContractType fromAddress: string @@ -409,12 +545,45 @@ export interface TokenHistory { txnHash: string txnIndex: number txnLogIndex: number - logData: string tokenIDs: string - Amounts: string + amounts: string ts: string } +export interface TokenIDRange { + start: string + end: string +} + +export interface TokenMetadata { + chainId?: number + contractAddress?: string + tokenId: string + source: 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: ResourceStatus + queuedAt?: string + lastFetched?: string +} + +export interface TokenPriceQuery { + contractAddress: string + tokenID?: string +} + export interface TokenSupply { tokenID: string supply: string @@ -433,17 +602,12 @@ export interface Transaction { timestamp: string } -export interface TxnTransfer { - transferType: TxnTransferType - contractAddress: string - contractType: ContractType - from: string - to: string - tokenIds?: Array - amounts: Array - logIndex: number - contractInfo?: ContractInfo - tokenMetadata?: { [key: string]: TokenMetadata } +export interface TransactionFilter { + txnHash?: string + from?: string + to?: string + contractAddress?: string + event?: string } export interface TransactionHistoryFilter { @@ -456,14 +620,14 @@ export interface TransactionHistoryFilter { fromBlock?: number toBlock?: number tokenID?: string + omitPrices?: boolean } -export interface TransactionFilter { - txnHash?: string - from?: string - to?: string - contractAddress?: string - event?: string +export interface TransactionLog { + contractAddress: string + topics: Array + data: string + index: number } export interface TransactionReceipt { @@ -482,31 +646,60 @@ export interface TransactionReceipt { reorged: boolean } -export interface TransactionLog { +export enum TransactionStatus { + FAILED = 'FAILED', + SUCCESSFUL = 'SUCCESSFUL' +} + +export enum TransactionType { + LegacyTxnType = 'LegacyTxnType', + AccessListTxnType = 'AccessListTxnType', + DynamicFeeTxnType = 'DynamicFeeTxnType' +} + +export interface TxnInfo { + from: string + to: string + value: string +} + +export interface TxnTransfer { + transferType: TxnTransferType contractAddress: string - topics: Array - data: string - index: number + contractType: ContractType + from: string + to: string + tokenIds?: Array + amounts: Array + logIndex: number + amountsUSD?: Array + pricesUSD?: Array + contractInfo?: ContractInfo + tokenMetadata?: { [key: string]: TokenMetadata } } -export interface TokenIDRange { - start: string - end: string +export enum TxnTransferType { + UNKNOWN = 'UNKNOWN', + SEND = 'SEND', + RECEIVE = 'RECEIVE' } -export interface Page { - page?: number - column?: string - before?: any - after?: any - sort?: Array - pageSize?: number - more?: boolean +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string } -export interface SortBy { - column: string - order: SortOrder +export interface WALWriterRuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + chainID: number + percentWALWritten: number } export interface WebhookListener { @@ -519,109 +712,45 @@ export interface WebhookListener { active: boolean } -export interface EventFilter { - events?: Array - contractAddresses?: Array - accounts?: Array - tokenIDs?: Array -} - -export interface TokenBalanceFilter { +export interface GetBalanceUpdatesRequest { + chainIds?: Array + networks?: Array + networkType?: NetworkType contractAddress: string - sinceBlockNumber: number -} - -export interface MetadataOptions { - verifiedOnly?: boolean - unverifiedOnly?: boolean - includeContracts?: Array -} - -export interface TokenBalancesFilter { - accountAddresses: Array - contractStatus?: ContractVerificationStatus - contractTypes?: Array - contractWhitelist?: Array - contractBlacklist?: Array - omitNativeBalances: boolean -} - -export interface TokenBalancesByContractFilter { - contractAddresses: Array - accountAddresses?: Array - contractStatus?: ContractVerificationStatus -} - -export interface GatewayEtherBalance { - chainId: number - error: string - result: EtherBalance -} - -export interface GatewayNativeTokenBalance { - chainId: number - error: string - result: NativeTokenBalance + lastBlockNumber: number + lastBlockHash?: string + page?: Page } -export interface GatewayNativeTokenBalances { - chainId: number - error: string - results: Array +export interface GetBalanceUpdatesResponse { + page: Page + balances: Array } -export interface GatewayTokenBalance { - chainId: number - error: string - results: Array +export interface GetChainsRequest { + networkType?: NetworkType } -export interface IndexerGateway { - getNativeTokenBalance( - args: GetNativeTokenBalanceArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTokenBalances(args: GetTokenBalancesArgs, headers?: object, signal?: AbortSignal): Promise - getTokenBalancesSummary( - args: GetTokenBalancesSummaryArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTokenBalancesDetails( - args: GetTokenBalancesDetailsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getTokenBalancesByContract( - args: GetTokenBalancesByContractArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - getBalanceUpdates( - args: GetBalanceUpdatesArgs, - headers?: object, - signal?: AbortSignal, - ): Promise - ping(headers?: object, signal?: AbortSignal): Promise - version(headers?: object, signal?: AbortSignal): Promise - runtimeStatus(headers?: object, signal?: AbortSignal): Promise +export interface GetChainsResponse { + chains: Array } -export interface GetNativeTokenBalanceArgs { +export interface GetNativeTokenBalanceRequest { chainIds?: Array networks?: Array - testnets?: boolean + networkType?: NetworkType accountAddress?: string + omitPrices?: boolean } -export interface GetNativeTokenBalanceReturn { +export interface GetNativeTokenBalanceResponse { balances: Array } -export interface GetTokenBalancesArgs { + +export interface GetTokenBalancesRequest { chainIds?: Array networks?: Array - testnets?: boolean + networkType?: NetworkType accountAddress?: string contractAddress?: string tokenID?: string @@ -631,85 +760,109 @@ export interface GetTokenBalancesArgs { page?: Page } -export interface GetTokenBalancesReturn { +export interface GetTokenBalancesResponse { page: Page balances: Array } -export interface GetTokenBalancesSummaryArgs { + +export interface GetTokenBalancesByContractRequest { chainIds?: Array networks?: Array - testnets?: boolean - filter: TokenBalancesFilter + networkType?: NetworkType + filter: TokenBalancesByContractFilter omitMetadata?: boolean page?: Page } -export interface GetTokenBalancesSummaryReturn { +export interface GetTokenBalancesByContractResponse { page: Page - nativeBalances: Array balances: Array } -export interface GetTokenBalancesDetailsArgs { + +export interface GetTokenBalancesDetailsRequest { chainIds?: Array networks?: Array - testnets?: boolean + networkType?: NetworkType filter: TokenBalancesFilter omitMetadata?: boolean page?: Page } -export interface GetTokenBalancesDetailsReturn { +export interface GetTokenBalancesDetailsResponse { page: Page nativeBalances: Array balances: Array } -export interface GetTokenBalancesByContractArgs { + +export interface GetTokenBalancesSummaryRequest { chainIds?: Array networks?: Array - testnets?: boolean - filter: TokenBalancesByContractFilter + networkType?: NetworkType + filter: TokenBalancesFilter omitMetadata?: boolean page?: Page } -export interface GetTokenBalancesByContractReturn { +export interface GetTokenBalancesSummaryResponse { page: Page + nativeBalances: Array balances: Array } -export interface GetBalanceUpdatesArgs { + +export interface GetTokenPriceRequest { + q: GatewayTokenPriceQuery +} + +export interface GetTokenPriceResponse { + price: GatewayPrice +} + +export interface GetTokenPricesRequest { + q: Array +} + +export interface GetTokenPricesResponse { + prices: Array +} + +export interface GetTransactionHistoryRequest { chainIds?: Array networks?: Array - testnets?: boolean - contractAddress: string - lastBlockNumber: number - lastBlockHash?: string + networkType?: NetworkType + filter: TransactionHistoryFilter + includeMetadata?: boolean + metadataOptions?: MetadataOptions page?: Page } -export interface GetBalanceUpdatesReturn { +export interface GetTransactionHistoryResponse { page: Page - balances: Array + transactions: Array } -export interface PingArgs {} -export interface PingReturn { +export interface PingRequest {} + +export interface PingResponse { status: boolean } -export interface VersionArgs {} -export interface VersionReturn { - version: Version -} -export interface RuntimeStatusArgs {} +export interface RuntimeStatusRequest {} -export interface RuntimeStatusReturn { +export interface RuntimeStatusResponse { status: GatewayRuntimeStatus } +export interface VersionRequest {} + +export interface VersionResponse { + version: Version +} + // // Client // -export class IndexerGateway implements IndexerGateway { + +export class IndexerGateway implements IndexerGatewayClient { protected hostname: string protected fetch: Fetch protected path = '/rpc/IndexerGateway/' @@ -723,198 +876,239 @@ export class IndexerGateway implements IndexerGateway { return this.hostname + this.path + name } - getNativeTokenBalance = ( - args: GetNativeTokenBalanceArgs, + queryKey = { + getBalanceUpdates: (req: GetBalanceUpdatesRequest) => ['IndexerGateway', 'getBalanceUpdates', req] as const, + getChains: (req: GetChainsRequest) => ['IndexerGateway', 'getChains', req] as const, + getNativeTokenBalance: (req: GetNativeTokenBalanceRequest) => ['IndexerGateway', 'getNativeTokenBalance', req] as const, + getTokenBalances: (req: GetTokenBalancesRequest) => ['IndexerGateway', 'getTokenBalances', req] as const, + getTokenBalancesByContract: (req: GetTokenBalancesByContractRequest) => + ['IndexerGateway', 'getTokenBalancesByContract', req] as const, + getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => ['IndexerGateway', 'getTokenBalancesDetails', req] as const, + getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => ['IndexerGateway', 'getTokenBalancesSummary', req] as const, + getTokenPrice: (req: GetTokenPriceRequest) => ['IndexerGateway', 'getTokenPrice', req] as const, + getTokenPrices: (req: GetTokenPricesRequest) => ['IndexerGateway', 'getTokenPrices', req] as const, + getTransactionHistory: (req: GetTransactionHistoryRequest) => ['IndexerGateway', 'getTransactionHistory', req] as const, + ping: () => ['IndexerGateway', 'ping'] as const, + runtimeStatus: () => ['IndexerGateway', 'runtimeStatus'] as const, + version: () => ['IndexerGateway', 'version'] as const + } + + getBalanceUpdates = ( + req: GetBalanceUpdatesRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetNativeTokenBalance'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - balances: >_data.balances, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetBalanceUpdates'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetBalanceUpdatesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getChains = (req: GetChainsRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetChains'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetChainsResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getNativeTokenBalance = ( + req: GetNativeTokenBalanceRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetNativeTokenBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetNativeTokenBalanceResponse') + }) }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getTokenBalances = ( - args: GetTokenBalancesArgs, + req: GetTokenBalancesRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalances'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesResponse') + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalancesByContract = ( + req: GetTokenBalancesByContractRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenBalances'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - balances: >_data.balances, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesByContract'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesByContractResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } + ) + } + + getTokenBalancesDetails = ( + req: GetTokenBalancesDetailsRequest, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesDetails'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesDetailsResponse') + }) }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } getTokenBalancesSummary = ( - args: GetTokenBalancesSummaryArgs, + req: GetTokenBalancesSummaryRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenBalancesSummary'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - nativeBalances: >_data.nativeBalances, - balances: >_data.balances, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenBalancesSummary'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenBalancesSummaryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTokenBalancesDetails = ( - args: GetTokenBalancesDetailsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenBalancesDetails'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - nativeBalances: >_data.nativeBalances, - balances: >_data.balances, - } + getTokenPrice = (req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenPrice'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenPriceResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getTokenBalancesByContract = ( - args: GetTokenBalancesByContractArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetTokenBalancesByContract'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - balances: >_data.balances, - } + getTokenPrices = (req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTokenPricesResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - getBalanceUpdates = ( - args: GetBalanceUpdatesArgs, + getTransactionHistory = ( + req: GetTransactionHistoryRequest, headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch(this.url('GetBalanceUpdates'), createHTTPRequest(args, headers, signal)).then( - (res) => { - return buildResponse(res).then((_data) => { - return { - page: _data.page, - balances: >_data.balances, - } + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTransactionHistory'), createHttpRequest(JsonEncode(req), headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'GetTransactionHistoryResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) + } ) } - 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, - } + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'PingResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { - return { - version: _data.version, - } + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RuntimeStatus'), createHttpRequest('{}', headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'RuntimeStatusResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + 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( - (res) => { - return buildResponse(res).then((_data) => { - return { - status: _data.status, - } + version = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Version'), createHttpRequest('{}', headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return JsonDecode(_data, 'VersionResponse') }) }, - (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }, + error => { + 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 => { - return res.text().then((text) => { + 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}`, + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}` }) } if (!res.ok) { @@ -925,518 +1119,494 @@ const buildResponse = (res: Response): Promise => { }) } +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise + +export const JsonEncode = (obj: T): 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) - Object.setPrototypeOf(this, UnauthorizedError.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 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 AccessKeyMismatchError extends WebrpcError { + 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 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 AccessKeyNotFoundError extends WebrpcError { + 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 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 AtLeastOneKeyError extends WebrpcError { + 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 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 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 AbortedError extends WebrpcError { - constructor( - name: string = 'Aborted', - code: number = 1005, - message: string = 'Request aborted', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, AbortedError.prototype) +export class InvalidArgumentError extends WebrpcError { + constructor(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 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 InvalidOriginError extends WebrpcError { + 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 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 InvalidServiceError extends WebrpcError { + 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 ProjectNotFoundError extends WebrpcError { - constructor( - name: string = 'ProjectNotFound', - code: number = 1100, - message: string = 'Project not found', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, ProjectNotFoundError.prototype) +export class MaxAccessKeysError extends WebrpcError { + 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 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 MetadataCallFailedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'MetadataCallFailed' + this.code = typeof error.code === 'number' ? error.code : 3003 + this.message = error.message || `Metadata service call failed` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, MetadataCallFailedError.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 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 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 NoDefaultKeyError extends WebrpcError { + 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 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 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 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 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 QuotaExceededError extends WebrpcError { - constructor( - name: string = 'QuotaExceeded', - code: number = 1200, - message: string = 'Quota exceeded', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, QuotaExceededError.prototype) +export class ProjectNotFoundError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ProjectNotFound' + this.code = typeof error.code === 'number' ? error.code : 1100 + 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 RateLimitError extends WebrpcError { - constructor( - name: string = 'RateLimit', - code: number = 1201, - message: string = 'Rate limit exceeded', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, RateLimitError.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 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 QuotaExceededError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'QuotaExceeded' + this.code = typeof error.code === 'number' ? error.code : 1200 + this.message = error.message || `Quota 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 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 RateLimitError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'RateLimit' + this.code = typeof error.code === 'number' ? error.code : 1201 + this.message = error.message || `Rate limit exceeded` + this.status = typeof error.status === 'number' ? error.status : 429 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, RateLimitError.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 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 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 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 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 ResourceExhaustedError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'ResourceExhausted' + this.code = typeof error.code === 'number' ? error.code : 2004 + this.message = error.message || `Resource exhausted` + this.status = typeof error.status === 'number' ? error.status : 400 + if (error.cause !== undefined) this.cause = error.cause + Object.setPrototypeOf(this, ResourceExhaustedError.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 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 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 TimeoutError extends WebrpcError { + 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 ResourceExhaustedError extends WebrpcError { - constructor( - name: string = 'ResourceExhausted', - code: number = 2004, - message: string = 'Resource exhausted', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, ResourceExhaustedError.prototype) +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 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 UnauthorizedUserError extends WebrpcError { + 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 MetadataCallFailedError extends WebrpcError { - constructor( - name: string = 'MetadataCallFailed', - code: number = 3003, - message: string = 'Metadata service call failed', - status: number = 0, - cause?: string, - ) { - super(name, code, message, status, cause) - Object.setPrototypeOf(this, MetadataCallFailedError.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) } } @@ -1449,38 +1619,78 @@ 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', - AccessKeyNotFound = 'AccessKeyNotFound', AccessKeyMismatch = 'AccessKeyMismatch', + AccessKeyNotFound = 'AccessKeyNotFound', + AtLeastOneKey = 'AtLeastOneKey', + Geoblocked = 'Geoblocked', + InvalidArgument = 'InvalidArgument', InvalidOrigin = 'InvalidOrigin', InvalidService = 'InvalidService', - UnauthorizedUser = 'UnauthorizedUser', - QuotaExceeded = 'QuotaExceeded', - RateLimit = 'RateLimit', - NoDefaultKey = 'NoDefaultKey', MaxAccessKeys = 'MaxAccessKeys', - AtLeastOneKey = 'AtLeastOneKey', - Timeout = 'Timeout', - InvalidArgument = 'InvalidArgument', - Unavailable = 'Unavailable', + MetadataCallFailed = 'MetadataCallFailed', + MethodNotFound = 'MethodNotFound', + NoDefaultKey = 'NoDefaultKey', + NotFound = 'NotFound', + PermissionDenied = 'PermissionDenied', + ProjectNotFound = 'ProjectNotFound', QueryFailed = 'QueryFailed', + QuotaExceeded = 'QuotaExceeded', + RateLimit = 'RateLimit', + RateLimited = 'RateLimited', + RequestConflict = 'RequestConflict', ResourceExhausted = 'ResourceExhausted', - NotFound = 'NotFound', - MetadataCallFailed = 'MetadataCallFailed', -} - -const webrpcErrorByCode: { [code: number]: any } = { + SessionExpired = 'SessionExpired', + Timeout = 'Timeout', + Unauthorized = 'Unauthorized', + UnauthorizedUser = 'UnauthorizedUser', + Unavailable = 'Unavailable' +} + +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, + Aborted = 1005, + AccessKeyMismatch = 1102, + AccessKeyNotFound = 1101, + AtLeastOneKey = 1302, + Geoblocked = 1006, + InvalidArgument = 2001, + InvalidOrigin = 1103, + InvalidService = 1104, + MaxAccessKeys = 1301, + MetadataCallFailed = 3003, + MethodNotFound = 1003, + NoDefaultKey = 1300, + NotFound = 3000, + PermissionDenied = 1001, + ProjectNotFound = 1100, + QueryFailed = 2003, + QuotaExceeded = 1200, + RateLimit = 1201, + RateLimited = 1007, + RequestConflict = 1004, + ResourceExhausted = 2004, + SessionExpired = 1002, + Timeout = 1900, + Unauthorized = 1000, + UnauthorizedUser = 1105, + Unavailable = 2002 +} + +export const webrpcErrorByCode: { [code: number]: any } = { [0]: WebrpcEndpointError, [-1]: WebrpcRequestFailedError, [-2]: WebrpcBadRouteError, @@ -1489,35 +1699,89 @@ 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, - [1004]: RequestConflictError, [1005]: AbortedError, - [1006]: GeoblockedError, - [1007]: RateLimitedError, - [1100]: ProjectNotFoundError, - [1101]: AccessKeyNotFoundError, [1102]: AccessKeyMismatchError, + [1101]: AccessKeyNotFoundError, + [1302]: AtLeastOneKeyError, + [1006]: GeoblockedError, + [2001]: InvalidArgumentError, [1103]: InvalidOriginError, [1104]: InvalidServiceError, - [1105]: UnauthorizedUserError, - [1200]: QuotaExceededError, - [1201]: RateLimitError, - [1300]: NoDefaultKeyError, [1301]: MaxAccessKeysError, - [1302]: AtLeastOneKeyError, - [1900]: TimeoutError, - [2001]: InvalidArgumentError, - [2002]: UnavailableError, + [3003]: MetadataCallFailedError, + [1003]: MethodNotFoundError, + [1300]: NoDefaultKeyError, + [3000]: NotFoundError, + [1001]: PermissionDeniedError, + [1100]: ProjectNotFoundError, [2003]: QueryFailedError, + [1200]: QuotaExceededError, + [1201]: RateLimitError, + [1007]: RateLimitedError, + [1004]: RequestConflictError, [2004]: ResourceExhaustedError, - [3000]: NotFoundError, - [3003]: MetadataCallFailedError, + [1002]: SessionExpiredError, + [1900]: TimeoutError, + [1000]: UnauthorizedError, + [1105]: UnauthorizedUserError, + [2002]: UnavailableError } -export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise +// +// Webrpc +// + +export const WebrpcHeader = 'Webrpc' + +export const WebrpcHeaderValue = 'webrpc@v0.31.2;gen-typescript@v0.23.1;sequence-indexer@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 ?? '' + } +} diff --git a/packages/services/indexer/tsconfig.json b/packages/services/indexer/tsconfig.json index fed9c77b4..8623be1c0 100644 --- a/packages/services/indexer/tsconfig.json +++ b/packages/services/indexer/tsconfig.json @@ -3,7 +3,9 @@ "compilerOptions": { "rootDir": "src", "outDir": "dist", - "types": ["node"] + "types": ["node"], + // TODO: enable when webrpc codegen handles noUncheckedIndexedAccess + "noUncheckedIndexedAccess": false }, "include": ["src"], "exclude": ["node_modules", "dist"] From 3bb98d9795a3fbbd717cb19cc7359a0e3086c683 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Tue, 24 Feb 2026 01:41:03 -0500 Subject: [PATCH 093/144] Ensure eslint is properly configured for all packages (#971) --- .github/workflows/tests.yml | 2 + lefthook.yml | 4 + package.json | 2 +- .../api/eslint.config.js} | 0 packages/services/api/package.json | 5 +- packages/services/api/src/index.ts | 6 +- .../builder/eslint.config.js} | 0 packages/services/builder/package.json | 5 +- packages/services/builder/src/index.ts | 6 +- .../guard/eslint.config.js} | 0 packages/services/guard/package.json | 4 +- packages/services/guard/src/local.ts | 13 +- packages/services/guard/src/sequence.ts | 2 +- packages/services/guard/test/sequence.test.ts | 8 +- .../identity-instrument/eslint.config.js | 4 + .../services/identity-instrument/package.json | 5 +- packages/services/indexer/eslint.config.js | 4 + packages/services/indexer/package.json | 5 +- packages/services/indexer/src/index.ts | 12 +- .../services/marketplace/eslint.config.js | 4 + packages/services/marketplace/package.json | 5 +- packages/services/marketplace/src/index.ts | 6 +- packages/services/metadata/eslint.config.js | 4 + packages/services/metadata/package.json | 5 +- packages/services/metadata/src/index.ts | 8 +- packages/services/relayer/eslint.config.js | 4 + packages/services/relayer/package.json | 4 +- .../relayer/src/preconditions/codec.ts | 102 +++--- .../services/relayer/src/relayer/relayer.ts | 4 +- .../relayer/src/relayer/rpc-relayer/index.ts | 54 +-- .../relayer/src/relayer/standard/eip6963.ts | 4 +- .../relayer/src/relayer/standard/local.ts | 60 ++-- .../src/relayer/standard/pk-relayer.ts | 4 +- .../relayer/src/relayer/standard/sequence.ts | 4 +- .../relayer/test/preconditions/codec.test.ts | 22 +- .../test/preconditions/preconditions.test.ts | 235 +++++-------- .../test/preconditions/selectors.test.ts | 330 ++++-------------- .../relayer/test/preconditions/types.test.ts | 12 +- .../relayer/test/relayer/relayer.test.ts | 6 +- packages/services/userdata/eslint.config.js | 4 + packages/services/userdata/package.json | 5 +- packages/services/userdata/src/index.ts | 6 +- packages/utils/abi/eslint.config.js | 4 + packages/utils/abi/package.json | 5 +- packages/utils/abi/src/index.ts | 38 +- packages/utils/abi/src/wallet/index.ts | 20 +- packages/wallet/core/eslint.config.js | 12 + packages/wallet/core/package.json | 4 +- .../core/src/bundler/bundlers/pimlico.ts | 4 +- packages/wallet/core/src/signers/index.ts | 2 +- packages/wallet/core/src/signers/passkey.ts | 2 +- packages/wallet/core/src/signers/pk/index.ts | 2 +- .../core/src/signers/session/explicit.ts | 11 +- .../core/src/signers/session/implicit.ts | 3 +- packages/wallet/core/src/state/local/index.ts | 6 +- .../wallet/core/src/state/remote/dev-http.ts | 6 +- .../wallet/core/src/state/sequence/index.ts | 11 +- packages/wallet/core/src/wallet.ts | 4 +- packages/wallet/core/test/constants.ts | 2 + packages/wallet/core/test/envelope.test.ts | 1 - packages/wallet/core/test/signers-pk.test.ts | 2 +- .../test/signers-session-implicit.test.ts | 2 - packages/wallet/core/test/state/debug.test.ts | 5 +- packages/wallet/dapp-client/eslint.config.js | 4 + packages/wallet/dapp-client/package.json | 4 +- .../dapp-client/src/ChainSessionManager.ts | 6 +- packages/wallet/dapp-client/src/DappClient.ts | 11 +- .../dapp-client/test/ethauth-proof.test.ts | 71 ++-- .../wallet/primitives-cli/eslint.config.js | 4 + packages/wallet/primitives/eslint.config.js | 12 + packages/wallet/primitives/package.json | 4 +- packages/wallet/primitives/src/attestation.ts | 20 +- packages/wallet/primitives/src/config.ts | 82 +++-- .../primitives/src/extensions/recovery.ts | 13 +- packages/wallet/primitives/src/payload.ts | 2 +- packages/wallet/primitives/src/signature.ts | 18 +- packages/wallet/primitives/src/utils.ts | 4 +- .../wallet/primitives/test/address.test.ts | 18 +- .../primitives/test/attestation.test.ts | 2 +- .../wallet/primitives/test/config.test.ts | 2 +- .../wallet/primitives/test/passkeys.test.ts | 13 +- .../wallet/primitives/test/payload.test.ts | 9 +- .../primitives/test/precondition.test.ts | 14 +- .../wallet/primitives/test/signature.test.ts | 28 +- packages/wallet/primitives/test/utils.test.ts | 8 +- packages/wallet/wdk/eslint.config.js | 12 + packages/wallet/wdk/package.json | 6 +- .../wallet/wdk/src/dbs/auth-commitments.ts | 2 +- packages/wallet/wdk/src/dbs/auth-keys.ts | 2 +- packages/wallet/wdk/src/dbs/messages.ts | 2 +- .../wallet/wdk/src/dbs/passkey-credentials.ts | 2 +- packages/wallet/wdk/src/dbs/recovery.ts | 2 +- packages/wallet/wdk/src/dbs/signatures.ts | 2 +- packages/wallet/wdk/src/dbs/transactions.ts | 2 +- packages/wallet/wdk/src/dbs/wallets.ts | 2 +- packages/wallet/wdk/src/identity/signer.ts | 6 +- .../src/sequence/handlers/authcode-pkce.ts | 2 +- .../wdk/src/sequence/handlers/devices.ts | 2 +- .../wallet/wdk/src/sequence/handlers/guard.ts | 10 +- .../wdk/src/sequence/handlers/identity.ts | 2 +- .../wdk/src/sequence/handlers/mnemonic.ts | 8 +- .../wallet/wdk/src/sequence/handlers/otp.ts | 3 +- .../wdk/src/sequence/handlers/passkeys.ts | 2 +- .../wdk/src/sequence/handlers/recovery.ts | 2 +- packages/wallet/wdk/src/sequence/manager.ts | 2 +- packages/wallet/wdk/src/sequence/messages.ts | 2 +- packages/wallet/wdk/src/sequence/signers.ts | 4 +- .../wallet/wdk/src/sequence/transactions.ts | 2 +- packages/wallet/wdk/src/sequence/wallets.ts | 39 +-- .../wallet/wdk/test/authcode-pkce.test.ts | 5 +- packages/wallet/wdk/test/authcode.test.ts | 14 +- packages/wallet/wdk/test/constants.ts | 6 +- packages/wallet/wdk/test/guard.test.ts | 10 +- .../wallet/wdk/test/identity-signer.test.ts | 2 +- packages/wallet/wdk/test/otp.test.ts | 2 +- packages/wallet/wdk/test/passkeys.test.ts | 2 +- packages/wallet/wdk/test/recovery.test.ts | 6 +- packages/wallet/wdk/test/sessions.test.ts | 2 +- ...test-ssr-safety.mjs => test-ssr-safety.js} | 280 +++++++-------- packages/wallet/wdk/test/transactions.test.ts | 6 +- packages/wallet/wdk/test/wallets.test.ts | 10 +- pnpm-lock.yaml | 42 +++ .../{eslint.config.mjs => eslint.config.js} | 0 repo/ui/package.json | 1 + turbo.json | 1 + 125 files changed, 1002 insertions(+), 981 deletions(-) rename packages/{wallet/dapp-client/eslint.config.mjs => services/api/eslint.config.js} (100%) rename packages/{wallet/primitives-cli/eslint.config.mjs => services/builder/eslint.config.js} (100%) rename packages/{wallet/primitives/eslint.config.mjs => services/guard/eslint.config.js} (100%) create mode 100644 packages/services/identity-instrument/eslint.config.js create mode 100644 packages/services/indexer/eslint.config.js create mode 100644 packages/services/marketplace/eslint.config.js create mode 100644 packages/services/metadata/eslint.config.js create mode 100644 packages/services/relayer/eslint.config.js create mode 100644 packages/services/userdata/eslint.config.js create mode 100644 packages/utils/abi/eslint.config.js create mode 100644 packages/wallet/core/eslint.config.js create mode 100644 packages/wallet/dapp-client/eslint.config.js create mode 100644 packages/wallet/primitives-cli/eslint.config.js create mode 100644 packages/wallet/primitives/eslint.config.js create mode 100644 packages/wallet/wdk/eslint.config.js rename packages/wallet/wdk/test/{test-ssr-safety.mjs => test-ssr-safety.js} (50%) rename repo/ui/{eslint.config.mjs => eslint.config.js} (100%) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 20d477729..bb22f4c72 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,6 +19,8 @@ jobs: - uses: ./.github/actions/install-dependencies - run: pnpm clean - run: pnpm build + - run: pnpm typecheck + - run: pnpm lint tests: name: Run all tests diff --git a/lefthook.yml b/lefthook.yml index 7b9926c50..5402d7dc7 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -3,6 +3,10 @@ pre-commit: prettier: glob: '**/*.{js,jsx,ts,tsx,json,md,yml,yaml}' run: pnpm prettier --write {staged_files} && git add {staged_files} + lint: + run: pnpm lint + typecheck: + run: pnpm typecheck syncpack: glob: - "package.json" diff --git a/package.json b/package.json index 26ff0147e..92559c510 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build": "pnpm build:packages", "dev": "turbo dev", "test": "turbo test --concurrency=1", - "lint": "turbo lint", + "lint": "turbo lint --continue", "format": "prettier --list-different --write \"**/*.{ts,tsx,md}\"", "typecheck": "turbo typecheck", "postinstall": "lefthook install", diff --git a/packages/wallet/dapp-client/eslint.config.mjs b/packages/services/api/eslint.config.js similarity index 100% rename from packages/wallet/dapp-client/eslint.config.mjs rename to packages/services/api/eslint.config.js diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 6cde8a324..3295c97c8 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -8,11 +8,13 @@ "publishConfig": { "access": "public" }, + "type": "module", "scripts": { "build": "tsc", "dev": "tsc --watch", "test": "echo", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -23,6 +25,7 @@ "devDependencies": { "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", + "@repo/eslint-config": "workspace:^", "typescript": "^5.9.3" } } diff --git a/packages/services/api/src/index.ts b/packages/services/api/src/index.ts index 12656d2c0..14d83d8a1 100644 --- a/packages/services/api/src/index.ts +++ b/packages/services/api/src/index.ts @@ -1,6 +1,6 @@ -export * from './api.gen' +export * from './api.gen.js' -import { API as ApiRpc } from './api.gen' +import { API as ApiRpc } from './api.gen.js' export class SequenceAPIClient extends ApiRpc { constructor( @@ -15,7 +15,7 @@ export class SequenceAPIClient extends ApiRpc { _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 headers: Record = {} const jwtAuth = this.jwtAuth const projectAccessKey = this.projectAccessKey diff --git a/packages/wallet/primitives-cli/eslint.config.mjs b/packages/services/builder/eslint.config.js similarity index 100% rename from packages/wallet/primitives-cli/eslint.config.mjs rename to packages/services/builder/eslint.config.js diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 84cc9cee3..105422139 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -8,11 +8,13 @@ "publishConfig": { "access": "public" }, + "type": "module", "scripts": { "build": "tsc", "dev": "tsc --watch", "test": "echo", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -21,6 +23,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "typescript": "^5.9.3" diff --git a/packages/services/builder/src/index.ts b/packages/services/builder/src/index.ts index 7abe21855..18f13758d 100644 --- a/packages/services/builder/src/index.ts +++ b/packages/services/builder/src/index.ts @@ -1,6 +1,6 @@ -export * from './builder.gen' +export * from './builder.gen.js' -import { Builder as BuilderRpc } from './builder.gen' +import { Builder as BuilderRpc } from './builder.gen.js' export class SequenceBuilderClient extends BuilderRpc { constructor( @@ -15,7 +15,7 @@ export class SequenceBuilderClient extends BuilderRpc { _fetch = (input: RequestInfo, init?: RequestInit): Promise => { // automatically include access key auth header to requests // if its been set on the api client - const headers: { [key: string]: any } = {} + const headers: Record = {} const projectAccessKey = this.projectAccessKey if (projectAccessKey && projectAccessKey.length > 0) { diff --git a/packages/wallet/primitives/eslint.config.mjs b/packages/services/guard/eslint.config.js similarity index 100% rename from packages/wallet/primitives/eslint.config.mjs rename to packages/services/guard/eslint.config.js diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index abaf5a0bf..42abb5114 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -15,7 +15,8 @@ "dev": "tsc --watch", "test": "vitest run", "test:coverage": "vitest run --coverage", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -24,6 +25,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "typescript": "^5.9.3", diff --git a/packages/services/guard/src/local.ts b/packages/services/guard/src/local.ts index 3ef9ac787..3eeb7b8d5 100644 --- a/packages/services/guard/src/local.ts +++ b/packages/services/guard/src/local.ts @@ -1,4 +1,4 @@ -import { Address, Hex, Bytes, Secp256k1, Hash } from 'ox' +import { Address, Hex, Bytes, Secp256k1 } from 'ox' import * as Client from './client/guard.gen.js' import * as Types from './types.js' @@ -11,12 +11,13 @@ export class Guard implements Types.Guard { } async signPayload( - wallet: Address.Address, - chainId: number, - type: Client.PayloadType, + _wallet: Address.Address, + _chainId: number, + _type: Client.PayloadType, digest: Bytes.Bytes, - message: Bytes.Bytes, - signatures?: Client.Signature[], + _message: Bytes.Bytes, + _signatures?: Client.Signature[], + _token?: Client.AuthToken, ) { return Secp256k1.sign({ privateKey: this.privateKey, payload: digest }) } diff --git a/packages/services/guard/src/sequence.ts b/packages/services/guard/src/sequence.ts index fe1a003ce..6c17b7552 100644 --- a/packages/services/guard/src/sequence.ts +++ b/packages/services/guard/src/sequence.ts @@ -1,4 +1,4 @@ -import { Address, Hex, Signature, Bytes, Hash } from 'ox' +import { Address, Hex, Signature, Bytes } from 'ox' import * as Client from './client/guard.gen.js' import * as Types from './types.js' diff --git a/packages/services/guard/test/sequence.test.ts b/packages/services/guard/test/sequence.test.ts index 5ac92a378..45612d609 100644 --- a/packages/services/guard/test/sequence.test.ts +++ b/packages/services/guard/test/sequence.test.ts @@ -1,11 +1,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { Guard } from '../src/sequence' -import { PayloadType } from '../src/client/guard.gen' +import { Guard } from '../src/sequence.js' +import { PayloadType } from '../src/client/guard.gen.js' import { Address, Bytes, Hex } from 'ox' // Mock fetch globally for guard API calls const mockFetch = vi.fn() -global.fetch = mockFetch +globalThis.fetch = mockFetch describe('Sequence', () => { describe('GuardSigner', () => { @@ -86,7 +86,7 @@ describe('Sequence', () => { ok: true, }) - await guard.signPayload(testWallet, 1, PayloadType.ConfigUpdate, testMessageDigest, testMessage) + await guard.signPayload(testWallet, customChainId, PayloadType.ConfigUpdate, testMessageDigest, testMessage) const requestBody = JSON.parse(mockFetch.mock.calls[0][1].body) expect(requestBody.request.chainId).toBe(1) diff --git a/packages/services/identity-instrument/eslint.config.js b/packages/services/identity-instrument/eslint.config.js new file mode 100644 index 000000000..cecf89b03 --- /dev/null +++ b/packages/services/identity-instrument/eslint.config.js @@ -0,0 +1,4 @@ +import { config as baseConfig } from "@repo/eslint-config/base" + +/** @type {import("eslint").Linter.Config} */ +export default baseConfig diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 60e39dd35..9c3cdc1ed 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -10,7 +10,9 @@ "scripts": { "build": "tsc", "dev": "tsc --watch", - "test": "vitest run" + "test": "vitest run", + "lint": "eslint . --max-warnings 0", + "typecheck": "tsc --noEmit" }, "exports": { ".": { @@ -19,6 +21,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "typescript": "^5.9.3", diff --git a/packages/services/indexer/eslint.config.js b/packages/services/indexer/eslint.config.js new file mode 100644 index 000000000..cecf89b03 --- /dev/null +++ b/packages/services/indexer/eslint.config.js @@ -0,0 +1,4 @@ +import { config as baseConfig } from "@repo/eslint-config/base" + +/** @type {import("eslint").Linter.Config} */ +export default baseConfig diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 34210c9ae..43ca8f194 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -8,11 +8,13 @@ "publishConfig": { "access": "public" }, + "type": "module", "scripts": { "build": "tsc", "dev": "tsc --watch", "test": "echo", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -21,6 +23,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "typescript": "^5.9.3" diff --git a/packages/services/indexer/src/index.ts b/packages/services/indexer/src/index.ts index a4588c71e..15f28c2cb 100644 --- a/packages/services/indexer/src/index.ts +++ b/packages/services/indexer/src/index.ts @@ -1,8 +1,8 @@ -export * from './indexer.gen' -export * as IndexerGateway from './indexergw.gen' +export * from './indexer.gen.js' +export * as IndexerGateway from './indexergw.gen.js' -import { Indexer as IndexerRpc } from './indexer.gen' -import { IndexerGateway as IndexerGatewayRpc } from './indexergw.gen' +import { Indexer as IndexerRpc } from './indexer.gen.js' +import { IndexerGateway as IndexerGatewayRpc } from './indexergw.gen.js' export class SequenceIndexer extends IndexerRpc { constructor( @@ -17,7 +17,7 @@ export class SequenceIndexer extends IndexerRpc { _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 headers: Record = {} const jwtAuth = this.jwtAuth const projectAccessKey = this.projectAccessKey @@ -50,7 +50,7 @@ export class SequenceIndexerGateway extends IndexerGatewayRpc { _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 headers: Record = {} const jwtAuth = this.jwtAuth const projectAccessKey = this.projectAccessKey diff --git a/packages/services/marketplace/eslint.config.js b/packages/services/marketplace/eslint.config.js new file mode 100644 index 000000000..cecf89b03 --- /dev/null +++ b/packages/services/marketplace/eslint.config.js @@ -0,0 +1,4 @@ +import { config as baseConfig } from "@repo/eslint-config/base" + +/** @type {import("eslint").Linter.Config} */ +export default baseConfig diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index d02d9a572..49660e8d0 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -8,11 +8,13 @@ "publishConfig": { "access": "public" }, + "type": "module", "scripts": { "build": "tsc", "dev": "tsc --watch", "test": "echo", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -21,6 +23,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "typescript": "^5.9.3" diff --git a/packages/services/marketplace/src/index.ts b/packages/services/marketplace/src/index.ts index f7ec2b0d3..3b67f6f2d 100644 --- a/packages/services/marketplace/src/index.ts +++ b/packages/services/marketplace/src/index.ts @@ -1,6 +1,6 @@ -export * from './marketplace.gen' +export * from './marketplace.gen.js' -import { Marketplace as MarketplaceRpc } from './marketplace.gen' +import { Marketplace as MarketplaceRpc } from './marketplace.gen.js' export class MarketplaceIndexer extends MarketplaceRpc { constructor( @@ -15,7 +15,7 @@ export class MarketplaceIndexer extends MarketplaceRpc { _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 headers: Record = {} const jwtAuth = this.jwtAuth const projectAccessKey = this.projectAccessKey diff --git a/packages/services/metadata/eslint.config.js b/packages/services/metadata/eslint.config.js new file mode 100644 index 000000000..cecf89b03 --- /dev/null +++ b/packages/services/metadata/eslint.config.js @@ -0,0 +1,4 @@ +import { config as baseConfig } from "@repo/eslint-config/base" + +/** @type {import("eslint").Linter.Config} */ +export default baseConfig diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 2ba7640a5..5ba7eb0f9 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -8,11 +8,13 @@ "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/metadata", "author": "Sequence Platforms ULC", "license": "Apache-2.0", + "type": "module", "scripts": { "build": "tsc", "dev": "tsc --watch", "test": "echo", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -21,6 +23,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "typescript": "^5.9.3" diff --git a/packages/services/metadata/src/index.ts b/packages/services/metadata/src/index.ts index 8c620b424..f9a1a600c 100644 --- a/packages/services/metadata/src/index.ts +++ b/packages/services/metadata/src/index.ts @@ -1,6 +1,6 @@ -export * from './metadata.gen' +export * from './metadata.gen.js' -import { Metadata as MetadataRpc, Collections as CollectionsRpc } from './metadata.gen' +import { Metadata as MetadataRpc, Collections as CollectionsRpc } from './metadata.gen.js' export class SequenceMetadata extends MetadataRpc { constructor( @@ -15,7 +15,7 @@ export class SequenceMetadata extends MetadataRpc { _fetch = (input: RequestInfo, init?: RequestInit): Promise => { // automatically include jwt and access key auth header to requests // if its been set on the client - const headers: { [key: string]: any } = {} + const headers: Record = {} const jwtAuth = this.jwtAuth const projectAccessKey = this.projectAccessKey @@ -47,7 +47,7 @@ export class SequenceCollections extends CollectionsRpc { _fetch = (input: RequestInfo, init?: RequestInit): Promise => { // automatically include jwt auth header to requests // if its been set on the client - const headers: { [key: string]: any } = {} + const headers: Record = {} const jwtAuth = this.jwtAuth diff --git a/packages/services/relayer/eslint.config.js b/packages/services/relayer/eslint.config.js new file mode 100644 index 000000000..cecf89b03 --- /dev/null +++ b/packages/services/relayer/eslint.config.js @@ -0,0 +1,4 @@ +import { config as baseConfig } from "@repo/eslint-config/base" + +/** @type {import("eslint").Linter.Config} */ +export default baseConfig diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 7b9d5b538..2380a8d6d 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -17,7 +17,8 @@ "old-test:file": "NODE_OPTIONS='--import tsx' mocha --timeout 60000", "old-test:concurrently": "concurrently -k --success first 'pnpm start:hardhat > /dev/null' ", "start:hardhat": "pnpm hardhat node --port 9547", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -26,6 +27,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "typescript": "^5.9.3", diff --git a/packages/services/relayer/src/preconditions/codec.ts b/packages/services/relayer/src/preconditions/codec.ts index 74f83154b..b59fae6d6 100644 --- a/packages/services/relayer/src/preconditions/codec.ts +++ b/packages/services/relayer/src/preconditions/codec.ts @@ -36,6 +36,11 @@ export function decodePrecondition(p: TransactionPrecondition): Precondition | u return undefined } + if (typeof p.minAmount !== 'bigint') { + console.warn(`Failed to decode precondition: minAmount must be a bigint`) + return undefined + } + let precondition: Precondition | undefined try { @@ -118,73 +123,92 @@ export function decodePrecondition(p: TransactionPrecondition): Precondition | u } export function encodePrecondition(p: Precondition): string { - const data: any = {} - switch (p.type()) { case 'native-balance': { const native = p as NativeBalancePrecondition - data.address = native.address.toString() - if (native.min !== undefined) data.min = native.min.toString() - if (native.max !== undefined) data.max = native.max.toString() - break + const data = { + address: native.address.toString(), + ...(native.min !== undefined && { min: native.min.toString() }), + ...(native.max !== undefined && { max: native.max.toString() }), + } + + return JSON.stringify(data) } case 'erc20-balance': { const erc20 = p as Erc20BalancePrecondition - data.address = erc20.address.toString() - data.token = erc20.token.toString() - if (erc20.min !== undefined) data.min = erc20.min.toString() - if (erc20.max !== undefined) data.max = erc20.max.toString() - break + const data = { + address: erc20.address.toString(), + token: erc20.token.toString(), + ...(erc20.min !== undefined && { min: erc20.min.toString() }), + ...(erc20.max !== undefined && { max: erc20.max.toString() }), + } + + return JSON.stringify(data) } case 'erc20-approval': { const erc20 = p as Erc20ApprovalPrecondition - data.address = erc20.address.toString() - data.token = erc20.token.toString() - data.operator = erc20.operator.toString() - data.min = erc20.min.toString() - break + const data = { + address: erc20.address.toString(), + token: erc20.token.toString(), + operator: erc20.operator.toString(), + min: erc20.min.toString(), + } + + return JSON.stringify(data) } case 'erc721-ownership': { const erc721 = p as Erc721OwnershipPrecondition - data.address = erc721.address.toString() - data.token = erc721.token.toString() - data.tokenId = erc721.tokenId.toString() - if (erc721.owned !== undefined) data.owned = erc721.owned - break + const data = { + address: erc721.address.toString(), + token: erc721.token.toString(), + tokenId: erc721.tokenId.toString(), + ...(erc721.owned !== undefined && { owned: erc721.owned }), + } + + return JSON.stringify(data) } case 'erc721-approval': { const erc721 = p as Erc721ApprovalPrecondition - data.address = erc721.address.toString() - data.token = erc721.token.toString() - data.tokenId = erc721.tokenId.toString() - data.operator = erc721.operator.toString() - break + const data = { + address: erc721.address.toString(), + token: erc721.token.toString(), + tokenId: erc721.tokenId.toString(), + operator: erc721.operator.toString(), + } + + return JSON.stringify(data) } case 'erc1155-balance': { const erc1155 = p as Erc1155BalancePrecondition - data.address = erc1155.address.toString() - data.token = erc1155.token.toString() - data.tokenId = erc1155.tokenId.toString() - if (erc1155.min !== undefined) data.min = erc1155.min.toString() - if (erc1155.max !== undefined) data.max = erc1155.max.toString() - break + const data = { + address: erc1155.address.toString(), + token: erc1155.token.toString(), + tokenId: erc1155.tokenId.toString(), + ...(erc1155.min !== undefined && { min: erc1155.min.toString() }), + ...(erc1155.max !== undefined && { max: erc1155.max.toString() }), + } + + return JSON.stringify(data) } case 'erc1155-approval': { const erc1155 = p as Erc1155ApprovalPrecondition - data.address = erc1155.address.toString() - data.token = erc1155.token.toString() - data.tokenId = erc1155.tokenId.toString() - data.operator = erc1155.operator.toString() - data.min = erc1155.min.toString() - break + const data = { + address: erc1155.address.toString(), + token: erc1155.token.toString(), + tokenId: erc1155.tokenId.toString(), + operator: erc1155.operator.toString(), + min: erc1155.min.toString(), + } + + return JSON.stringify(data) } } - return JSON.stringify(data) + return JSON.stringify({}) } diff --git a/packages/services/relayer/src/relayer/relayer.ts b/packages/services/relayer/src/relayer/relayer.ts index 0be2c92af..f68536820 100644 --- a/packages/services/relayer/src/relayer/relayer.ts +++ b/packages/services/relayer/src/relayer/relayer.ts @@ -27,8 +27,10 @@ export interface Relayer { checkPrecondition(precondition: Precondition.Precondition): Promise } -export function isRelayer(relayer: any): relayer is Relayer { +export function isRelayer(relayer: unknown): relayer is Relayer { return ( + typeof relayer === 'object' && + relayer !== null && 'isAvailable' in relayer && 'feeOptions' in relayer && 'relay' in relayer && diff --git a/packages/services/relayer/src/relayer/rpc-relayer/index.ts b/packages/services/relayer/src/relayer/rpc-relayer/index.ts index 3029126db..e045b996e 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/index.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/index.ts @@ -10,7 +10,16 @@ import { import { Address, Hex, AbiFunction } from 'ox' import { Constants, Payload, Network } from '@0xsequence/wallet-primitives' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' -import { decodePrecondition } from '../../preconditions/index.js' +import { + decodePrecondition, + Erc1155ApprovalPrecondition, + Erc1155BalancePrecondition, + Erc20ApprovalPrecondition, + Erc20BalancePrecondition, + Erc721ApprovalPrecondition, + Erc721OwnershipPrecondition, + NativeBalancePrecondition, +} from '../../preconditions/index.js' import { erc20BalanceOf, erc20Allowance, @@ -69,7 +78,9 @@ export const getChain = (chainId: number): 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) + const viemChain = Object.values(chains).find( + (c: unknown) => typeof c === 'object' && c !== null && 'id' in c && c.id === chainId, + ) if (viemChain) { return viemChain as Chain } @@ -78,7 +89,7 @@ export const getChain = (chainId: number): Chain => { } export class RpcRelayer implements Relayer { - public readonly kind: 'relayer' = 'relayer' + public readonly kind = 'relayer' public readonly type = 'rpc' public readonly id: string public readonly chainId: number @@ -239,7 +250,7 @@ export class RpcRelayer implements Relayer { return { opHash: `0x${result.txnHash}` } } - async status(opHash: Hex.Hex, chainId: number): Promise { + 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 }) @@ -291,9 +302,9 @@ export class RpcRelayer implements Relayer { switch (decoded.type()) { case 'native-balance': { - const native = decoded as any + const native = decoded as NativeBalancePrecondition try { - const balance = await this.provider.getBalance({ address: native.address.toString() as `0x${string}` }) + const balance = await this.provider.getBalance({ address: native.address }) const minWei = native.min !== undefined ? BigInt(native.min) : undefined const maxWei = native.max !== undefined ? BigInt(native.max) : undefined @@ -316,9 +327,9 @@ export class RpcRelayer implements Relayer { } case 'erc20-balance': { - const erc20 = decoded as any + const erc20 = decoded as Erc20BalancePrecondition try { - const data = AbiFunction.encodeData(erc20BalanceOf, [erc20.address.toString()]) + const data = AbiFunction.encodeData(erc20BalanceOf, [erc20.address]) const result = await this.provider.call({ to: erc20.token.toString() as `0x${string}`, data: data as `0x${string}`, @@ -345,9 +356,9 @@ export class RpcRelayer implements Relayer { } case 'erc20-approval': { - const erc20 = decoded as any + const erc20 = decoded as Erc20ApprovalPrecondition try { - const data = AbiFunction.encodeData(erc20Allowance, [erc20.address.toString(), erc20.operator.toString()]) + const data = AbiFunction.encodeData(erc20Allowance, [erc20.address, erc20.operator]) const result = await this.provider.call({ to: erc20.token.toString() as `0x${string}`, data: data as `0x${string}`, @@ -362,12 +373,12 @@ export class RpcRelayer implements Relayer { } case 'erc721-ownership': { - const erc721 = decoded as any + const erc721 = decoded as Erc721OwnershipPrecondition 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}`, + to: erc721.token, + data: data, }) const resultHex = result.toString() as `0x${string}` const owner = resultHex.slice(-40) @@ -381,7 +392,7 @@ export class RpcRelayer implements Relayer { } case 'erc721-approval': { - const erc721 = decoded as any + const erc721 = decoded as Erc721ApprovalPrecondition try { const data = AbiFunction.encodeData(erc721GetApproved, [erc721.tokenId]) const result = await this.provider.call({ @@ -398,9 +409,9 @@ export class RpcRelayer implements Relayer { } case 'erc1155-balance': { - const erc1155 = decoded as any + const erc1155 = decoded as Erc1155BalancePrecondition try { - const data = AbiFunction.encodeData(erc1155BalanceOf, [erc1155.address.toString(), erc1155.tokenId]) + const data = AbiFunction.encodeData(erc1155BalanceOf, [erc1155.address, erc1155.tokenId]) const result = await this.provider.call({ to: erc1155.token.toString() as `0x${string}`, data: data as `0x${string}`, @@ -427,15 +438,12 @@ export class RpcRelayer implements Relayer { } case 'erc1155-approval': { - const erc1155 = decoded as any + const erc1155 = decoded as Erc1155ApprovalPrecondition try { - const data = AbiFunction.encodeData(erc1155IsApprovedForAll, [ - erc1155.address.toString(), - erc1155.operator.toString(), - ]) + const data = AbiFunction.encodeData(erc1155IsApprovedForAll, [erc1155.address, erc1155.operator]) const result = await this.provider.call({ - to: erc1155.token.toString() as `0x${string}`, - data: data as `0x${string}`, + to: erc1155.token, + data: data, }) return BigInt(result.toString()) === 1n } catch (error) { diff --git a/packages/services/relayer/src/relayer/standard/eip6963.ts b/packages/services/relayer/src/relayer/standard/eip6963.ts index 285ad498c..a290b2c6f 100644 --- a/packages/services/relayer/src/relayer/standard/eip6963.ts +++ b/packages/services/relayer/src/relayer/standard/eip6963.ts @@ -6,7 +6,7 @@ import { Payload } from '@0xsequence/wallet-primitives' import { FeeToken, TransactionPrecondition } from '../rpc-relayer/relayer.gen.js' export class EIP6963Relayer implements Relayer { - public readonly kind: 'relayer' = 'relayer' + public readonly kind = 'relayer' public readonly type = 'eip6963' public readonly id: string public readonly info: EIP6963ProviderInfo @@ -59,7 +59,7 @@ export function getEIP6963Store() { return store } -let relayers: Map = new Map() +const relayers: Map = new Map() export function getRelayers(): EIP6963Relayer[] { const store = getEIP6963Store() diff --git a/packages/services/relayer/src/relayer/standard/local.ts b/packages/services/relayer/src/relayer/standard/local.ts index 15453a774..4135af3b3 100644 --- a/packages/services/relayer/src/relayer/standard/local.ts +++ b/packages/services/relayer/src/relayer/standard/local.ts @@ -1,9 +1,18 @@ -import { Constants, Payload } from '@0xsequence/wallet-primitives' +import { Payload } from '@0xsequence/wallet-primitives' import { EIP1193Provider } from 'mipd' -import { AbiFunction, Address, Bytes, Hex, TransactionReceipt } from 'ox' +import { AbiFunction, Address, Hex, TransactionReceipt } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' import { FeeToken, TransactionPrecondition } from '../rpc-relayer/relayer.gen.js' -import { decodePrecondition } from '../../preconditions/index.js' +import { + decodePrecondition, + Erc1155ApprovalPrecondition, + Erc1155BalancePrecondition, + Erc20ApprovalPrecondition, + Erc20BalancePrecondition, + Erc721ApprovalPrecondition, + Erc721OwnershipPrecondition, + NativeBalancePrecondition, +} from '../../preconditions/index.js' import { erc20BalanceOf, erc20Allowance, @@ -23,7 +32,7 @@ export interface GenericProvider { } export class LocalRelayer implements Relayer { - public readonly kind: 'relayer' = 'relayer' + public readonly kind = 'relayer' public readonly type = 'local' public readonly id = 'local' @@ -34,7 +43,7 @@ export class LocalRelayer implements Relayer { } static createFromWindow(window: Window): LocalRelayer | undefined { - const eth = (window as any).ethereum + const eth = (window as { ethereum?: EIP1193Provider }).ethereum if (!eth) { console.warn('Window.ethereum not found, skipping local relayer') return undefined @@ -164,8 +173,8 @@ export class LocalRelayer implements Relayer { switch (decoded.type()) { case 'native-balance': { - const native = decoded as any - const balance = await this.provider.getBalance(native.address.toString()) + const native = decoded as NativeBalancePrecondition + const balance = await this.provider.getBalance(native.address) if (native.min !== undefined && balance < native.min) { return false } @@ -176,10 +185,10 @@ export class LocalRelayer implements Relayer { } case 'erc20-balance': { - const erc20 = decoded as any - const data = AbiFunction.encodeData(erc20BalanceOf, [erc20.address.toString()]) + const erc20 = decoded as Erc20BalancePrecondition + const data = AbiFunction.encodeData(erc20BalanceOf, [erc20.address]) const result = await this.provider.call({ - to: erc20.token.toString(), + to: erc20.token, data, }) const balance = BigInt(result) @@ -193,10 +202,10 @@ export class LocalRelayer implements Relayer { } case 'erc20-approval': { - const erc20 = decoded as any - const data = AbiFunction.encodeData(erc20Allowance, [erc20.address.toString(), erc20.operator.toString()]) + const erc20 = decoded as Erc20ApprovalPrecondition + const data = AbiFunction.encodeData(erc20Allowance, [erc20.address, erc20.operator]) const result = await this.provider.call({ - to: erc20.token.toString(), + to: erc20.token, data, }) const allowance = BigInt(result) @@ -204,10 +213,10 @@ export class LocalRelayer implements Relayer { } case 'erc721-ownership': { - const erc721 = decoded as any + const erc721 = decoded as Erc721OwnershipPrecondition const data = AbiFunction.encodeData(erc721OwnerOf, [erc721.tokenId]) const result = await this.provider.call({ - to: erc721.token.toString(), + to: erc721.token, data, }) const owner = '0x' + result.slice(26) @@ -216,10 +225,10 @@ export class LocalRelayer implements Relayer { } case 'erc721-approval': { - const erc721 = decoded as any + const erc721 = decoded as Erc721ApprovalPrecondition const data = AbiFunction.encodeData(erc721GetApproved, [erc721.tokenId]) const result = await this.provider.call({ - to: erc721.token.toString(), + to: erc721.token, data, }) const approved = '0x' + result.slice(26) @@ -227,10 +236,10 @@ export class LocalRelayer implements Relayer { } case 'erc1155-balance': { - const erc1155 = decoded as any - const data = AbiFunction.encodeData(erc1155BalanceOf, [erc1155.address.toString(), erc1155.tokenId]) + const erc1155 = decoded as Erc1155BalancePrecondition + const data = AbiFunction.encodeData(erc1155BalanceOf, [erc1155.address, erc1155.tokenId]) const result = await this.provider.call({ - to: erc1155.token.toString(), + to: erc1155.token, data, }) const balance = BigInt(result) @@ -244,13 +253,10 @@ export class LocalRelayer implements Relayer { } case 'erc1155-approval': { - const erc1155 = decoded as any - const data = AbiFunction.encodeData(erc1155IsApprovedForAll, [ - erc1155.address.toString(), - erc1155.operator.toString(), - ]) + const erc1155 = decoded as Erc1155ApprovalPrecondition + const data = AbiFunction.encodeData(erc1155IsApprovedForAll, [erc1155.address, erc1155.operator]) const result = await this.provider.call({ - to: erc1155.token.toString(), + to: erc1155.token, data, }) return BigInt(result) === 1n @@ -327,7 +333,7 @@ export class EIP1193ProviderAdapter implements GenericProvider { const rpcReceipt = await this.provider.request({ method: 'eth_getTransactionReceipt', params: [txHash] }) if (rpcReceipt) { - const receipt = TransactionReceipt.fromRpc(rpcReceipt as any) + const receipt = TransactionReceipt.fromRpc(rpcReceipt as Parameters[0]) if (receipt?.status === 'success') { return 'success' } else if (receipt?.status === 'reverted') { diff --git a/packages/services/relayer/src/relayer/standard/pk-relayer.ts b/packages/services/relayer/src/relayer/standard/pk-relayer.ts index 452d23554..b1d420a58 100644 --- a/packages/services/relayer/src/relayer/standard/pk-relayer.ts +++ b/packages/services/relayer/src/relayer/standard/pk-relayer.ts @@ -5,7 +5,7 @@ import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' import { FeeToken } from '../rpc-relayer/relayer.gen.js' export class PkRelayer implements Relayer { - public readonly kind: 'relayer' = 'relayer' + public readonly kind = 'relayer' public readonly type = 'pk' public readonly id = 'pk' private readonly relayer: LocalRelayer @@ -132,7 +132,7 @@ export class PkRelayer implements Relayer { return this.relayer.status(opHash, chainId) } - async checkPrecondition(precondition: Precondition.Precondition): Promise { + async checkPrecondition(_precondition: Precondition.Precondition): Promise { // TODO: Implement precondition check return true } diff --git a/packages/services/relayer/src/relayer/standard/sequence.ts b/packages/services/relayer/src/relayer/standard/sequence.ts index 500d6ecf6..bb55a9726 100644 --- a/packages/services/relayer/src/relayer/standard/sequence.ts +++ b/packages/services/relayer/src/relayer/standard/sequence.ts @@ -3,7 +3,7 @@ import { Payload } from '@0xsequence/wallet-primitives' import { AbiFunction, Address, Bytes, Hex } from 'ox' import { FeeOption, FeeQuote, OperationStatus, Relayer } from '../index.js' export class SequenceRelayer implements Relayer { - public readonly kind: 'relayer' = 'relayer' + public readonly kind = 'relayer' public readonly type = 'sequence' readonly id = 'sequence' @@ -52,7 +52,7 @@ export class SequenceRelayer implements Relayer { } } - async checkPrecondition(precondition: TransactionPrecondition): 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 88d442510..a5ba279d3 100644 --- a/packages/services/relayer/test/preconditions/codec.test.ts +++ b/packages/services/relayer/test/preconditions/codec.test.ts @@ -36,8 +36,8 @@ describe('Preconditions Codec', () => { describe('decodePrecondition', () => { it('should return undefined for null/undefined input', () => { - expect(decodePrecondition(null as any)).toBeUndefined() - expect(decodePrecondition(undefined as any)).toBeUndefined() + expect(decodePrecondition(null as unknown as TransactionPrecondition)).toBeUndefined() + expect(decodePrecondition(undefined as unknown as TransactionPrecondition)).toBeUndefined() }) it('should decode native balance precondition with only min', () => { @@ -231,8 +231,8 @@ describe('Preconditions Codec', () => { it('should handle malformed addresses gracefully', () => { const intent: TransactionPrecondition = { type: 'native-balance', - ownerAddress: 'invalid-address' as any, - tokenAddress: NATIVE_TOKEN_ADDRESS, + ownerAddress: 'invalid-address', + tokenAddress: NATIVE_TOKEN_ADDRESS.toString(), chainId: ARBITRUM_CHAIN_ID, minAmount: BigInt('1000000000000000000'), } @@ -243,13 +243,13 @@ describe('Preconditions Codec', () => { }) it('should handle malformed BigInt values gracefully', () => { - const intent: TransactionPrecondition = { + const intent = { type: 'native-balance', - ownerAddress: TEST_ADDRESS, - tokenAddress: NATIVE_TOKEN_ADDRESS, + ownerAddress: TEST_ADDRESS.toString(), + tokenAddress: NATIVE_TOKEN_ADDRESS.toString(), chainId: ARBITRUM_CHAIN_ID, - minAmount: 'not-a-number' as any, - } + minAmount: 'not-a-number', + } as unknown as TransactionPrecondition const result = decodePrecondition(intent) expect(result).toBeUndefined() @@ -316,8 +316,8 @@ describe('Preconditions Codec', () => { }, { type: 'native-balance', - ownerAddress: 'invalid-address' as any, - tokenAddress: NATIVE_TOKEN_ADDRESS, + ownerAddress: 'invalid-address', + tokenAddress: NATIVE_TOKEN_ADDRESS.toString(), chainId: ARBITRUM_CHAIN_ID, minAmount: BigInt('1000000000000000000'), }, diff --git a/packages/services/relayer/test/preconditions/preconditions.test.ts b/packages/services/relayer/test/preconditions/preconditions.test.ts index e4975daaf..0fd12b7f7 100644 --- a/packages/services/relayer/test/preconditions/preconditions.test.ts +++ b/packages/services/relayer/test/preconditions/preconditions.test.ts @@ -1,4 +1,4 @@ -import { Address, Provider, RpcTransport, Secp256k1 } from 'ox' +import { Address, Hex, Secp256k1 } from 'ox' import { describe, expect, it, vi } from 'vitest' import { Erc1155ApprovalPrecondition, @@ -9,49 +9,50 @@ import { Erc721OwnershipPrecondition, NativeBalancePrecondition, } from '../../src/preconditions/types.js' -import { LocalRelayer } from '../../src/standard/local.js' -import { CAN_RUN_LIVE, RPC_URL } from '../../../../wallet/core/test/constants' +import { + LocalRelayer, + type GenericProvider, +} from '../../src/relayer/standard/local.js' import { Network } from '@0xsequence/wallet-primitives' +const CAN_RUN_LIVE = false +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' const ERC20_IMPLICIT_MINT_CONTRACT = '0x041E0CDC028050519C8e6485B2d9840caf63773F' function randomAddress(): Address.Address { return Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: Secp256k1.randomPrivateKey() })) } +function createMockProvider(): GenericProvider { + return { + sendTransaction: vi.fn(), + getBalance: vi.fn(), + call: vi.fn(), + getTransactionReceipt: vi.fn(), + } +} + describe('Preconditions', () => { - const getProvider = async (): Promise<{ provider: Provider.Provider; chainId: number }> => { - let provider: Provider.Provider - let chainId: number = Network.ChainId.MAINNET + const getProvider = async (): Promise<{ provider: GenericProvider; chainId: number }> => { + const chainId = Network.ChainId.MAINNET if (CAN_RUN_LIVE) { - provider = Provider.from(RpcTransport.fromHttp(RPC_URL!!)) - chainId = Number(await provider.request({ method: 'eth_chainId' })) - } else { - provider = { - request: vi.fn(), - on: vi.fn(), - removeListener: vi.fn(), - call: vi.fn(), - sendTransaction: vi.fn(), - getBalance: vi.fn(), - } as unknown as Provider.Provider + throw new Error('Live tests not configured: set up RPC and GenericProvider adapter') } - - return { provider: provider!, chainId } + const provider = createMockProvider() + return { provider, chainId } } const testWalletAddress = randomAddress() - const requireContractDeployed = async (provider: Provider.Provider, contract: Address.Address) => { - const code = await provider.request({ method: 'eth_getCode', params: [contract, 'latest'] }) - if (code === '0x') { - throw new Error(`Contract ${contract} not deployed`) + const requireContractDeployed = async (_provider: GenericProvider, _contract: Address.Address) => { + if (CAN_RUN_LIVE) { + throw new Error('Live contract check not implemented') } } it('should create and check native balance precondition', async () => { const { provider, chainId } = await getProvider() - const relayer = new LocalRelayer(provider as any) + const relayer = new LocalRelayer(provider) const precondition = new NativeBalancePrecondition( testWalletAddress, @@ -59,225 +60,183 @@ describe('Preconditions', () => { 2000000000000000000n, // 2 ETH max ) - const intentPrecondition = { + const transactionPrecondition = { type: precondition.type(), - chainId: chainId.toString(), - data: JSON.stringify({ - address: precondition.address.toString(), - min: precondition.min?.toString(), - max: precondition.max?.toString(), - }), + chainId, + ownerAddress: precondition.address.toString(), + tokenAddress: ZERO_ADDRESS, + minAmount: precondition.min ?? 0n, } - if (!CAN_RUN_LIVE) { - // Mock the balance check - ;(provider as any).request.mockResolvedValue('0x16345785d8a0000') // 1.5 ETH in hex - } + vi.mocked(provider.getBalance).mockResolvedValue(1500000000000000000n) // 1.5 ETH - const isValid = await relayer.checkPrecondition(intentPrecondition) + const isValid = await relayer.checkPrecondition(transactionPrecondition) expect(isValid).toBe(true) }) it('should create and check ERC20 balance precondition', async () => { const { provider, chainId } = await getProvider() - const relayer = new LocalRelayer(provider as any) - await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + const relayer = new LocalRelayer(provider) + await requireContractDeployed(provider, Address.from(ERC20_IMPLICIT_MINT_CONTRACT)) const precondition = new Erc20BalancePrecondition( testWalletAddress, - ERC20_IMPLICIT_MINT_CONTRACT, + Address.from(ERC20_IMPLICIT_MINT_CONTRACT), 1000000n, // 1 token min 2000000n, // 2 tokens max ) - const intentPrecondition = { + const transactionPrecondition = { type: precondition.type(), - chainId: chainId.toString(), - data: JSON.stringify({ - address: precondition.address.toString(), - token: precondition.token.toString(), - min: precondition.min?.toString(), - max: precondition.max?.toString(), - }), + chainId, + ownerAddress: precondition.address.toString(), + tokenAddress: precondition.token.toString(), + minAmount: precondition.min ?? 0n, } - if (!CAN_RUN_LIVE) { - // Mock the balanceOf call - ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens in hex - } + vi.mocked(provider.call).mockResolvedValue('0x1e8480' as Hex.Hex) // 1.5 tokens in hex - const isValid = await relayer.checkPrecondition(intentPrecondition) + const isValid = await relayer.checkPrecondition(transactionPrecondition) expect(isValid).toBe(true) }) it('should create and check ERC20 approval precondition', async () => { const { provider, chainId } = await getProvider() - const relayer = new LocalRelayer(provider as any) - await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + const relayer = new LocalRelayer(provider) + await requireContractDeployed(provider, Address.from(ERC20_IMPLICIT_MINT_CONTRACT)) const operator = randomAddress() const precondition = new Erc20ApprovalPrecondition( testWalletAddress, - ERC20_IMPLICIT_MINT_CONTRACT, + Address.from(ERC20_IMPLICIT_MINT_CONTRACT), operator, 1000000n, // 1 token min approval ) - const intentPrecondition = { + const transactionPrecondition = { type: precondition.type(), - chainId: chainId.toString(), - data: JSON.stringify({ - address: precondition.address.toString(), - token: precondition.token.toString(), - operator: precondition.operator.toString(), - min: precondition.min.toString(), - }), + chainId, + ownerAddress: precondition.address.toString(), + tokenAddress: precondition.token.toString(), + minAmount: precondition.min, } - if (!CAN_RUN_LIVE) { - // Mock the allowance call - ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens in hex - } + vi.mocked(provider.call).mockResolvedValue('0x1e8480' as Hex.Hex) // 1.5 tokens in hex - const isValid = await relayer.checkPrecondition(intentPrecondition) + const isValid = await relayer.checkPrecondition(transactionPrecondition) expect(isValid).toBe(true) }) it('should create and check ERC721 ownership precondition', async () => { const { provider, chainId } = await getProvider() - const relayer = new LocalRelayer(provider as any) - await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + const relayer = new LocalRelayer(provider) + await requireContractDeployed(provider, Address.from(ERC20_IMPLICIT_MINT_CONTRACT)) const precondition = new Erc721OwnershipPrecondition( testWalletAddress, - ERC20_IMPLICIT_MINT_CONTRACT, + Address.from(ERC20_IMPLICIT_MINT_CONTRACT), 1n, // tokenId true, // must own ) - const intentPrecondition = { + const transactionPrecondition = { type: precondition.type(), - chainId: chainId.toString(), - data: JSON.stringify({ - address: precondition.address.toString(), - token: precondition.token.toString(), - tokenId: precondition.tokenId.toString(), - owned: precondition.owned, - }), + chainId, + ownerAddress: precondition.address.toString(), + tokenAddress: precondition.token.toString(), + minAmount: 0n, } - if (!CAN_RUN_LIVE) { - // Mock the ownerOf call - ;(provider as any).call.mockResolvedValue( - '0x000000000000000000000000' + testWalletAddress.toString().slice(2).toLowerCase(), - ) - } + vi.mocked(provider.call).mockResolvedValue( + ('0x000000000000000000000000' + testWalletAddress.toString().slice(2).toLowerCase()) as Hex.Hex, + ) - const isValid = await relayer.checkPrecondition(intentPrecondition) + const isValid = await relayer.checkPrecondition(transactionPrecondition) expect(isValid).toBe(true) }) it('should create and check ERC721 approval precondition', async () => { const { provider, chainId } = await getProvider() - const relayer = new LocalRelayer(provider as any) - await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + const relayer = new LocalRelayer(provider) + await requireContractDeployed(provider, Address.from(ERC20_IMPLICIT_MINT_CONTRACT)) const operator = randomAddress() const precondition = new Erc721ApprovalPrecondition( testWalletAddress, - ERC20_IMPLICIT_MINT_CONTRACT, + Address.from(ERC20_IMPLICIT_MINT_CONTRACT), 1n, // tokenId operator, ) - const intentPrecondition = { + const transactionPrecondition = { type: precondition.type(), - chainId: chainId.toString(), - data: JSON.stringify({ - address: precondition.address.toString(), - token: precondition.token.toString(), - tokenId: precondition.tokenId.toString(), - operator: precondition.operator.toString(), - }), + chainId, + ownerAddress: precondition.address.toString(), + tokenAddress: precondition.token.toString(), + minAmount: 0n, } - if (!CAN_RUN_LIVE) { - // Mock the getApproved call - ;(provider as any).call.mockResolvedValue( - '0x000000000000000000000000' + operator.toString().slice(2).toLowerCase(), - ) - } + // getApproved returns 32-byte word: 12 zero bytes + 20-byte address. Codec uses ownerAddress as operator. + const approvedHex = + '0x' + '0'.repeat(24) + testWalletAddress.toString().slice(2).toLowerCase() + vi.mocked(provider.call).mockResolvedValue(approvedHex as Hex.Hex) - const isValid = await relayer.checkPrecondition(intentPrecondition) + const isValid = await relayer.checkPrecondition(transactionPrecondition) expect(isValid).toBe(true) }) it('should create and check ERC1155 balance precondition', async () => { const { provider, chainId } = await getProvider() - const relayer = new LocalRelayer(provider as any) - await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + const relayer = new LocalRelayer(provider) + await requireContractDeployed(provider, Address.from(ERC20_IMPLICIT_MINT_CONTRACT)) const precondition = new Erc1155BalancePrecondition( testWalletAddress, - ERC20_IMPLICIT_MINT_CONTRACT, + Address.from(ERC20_IMPLICIT_MINT_CONTRACT), 1n, // tokenId 1000000n, // 1 token min 2000000n, // 2 tokens max ) - const intentPrecondition = { + const transactionPrecondition = { type: precondition.type(), - chainId: chainId.toString(), - data: JSON.stringify({ - address: precondition.address.toString(), - token: precondition.token.toString(), - tokenId: precondition.tokenId.toString(), - min: precondition.min?.toString(), - max: precondition.max?.toString(), - }), + chainId, + ownerAddress: precondition.address.toString(), + tokenAddress: precondition.token.toString(), + minAmount: precondition.min ?? 0n, } - if (!CAN_RUN_LIVE) { - // Mock the balanceOf call - ;(provider as any).call.mockResolvedValue('0x1e8480') // 1.5 tokens in hex - } + vi.mocked(provider.call).mockResolvedValue('0x1e8480' as Hex.Hex) // 1.5 tokens in hex - const isValid = await relayer.checkPrecondition(intentPrecondition) + const isValid = await relayer.checkPrecondition(transactionPrecondition) expect(isValid).toBe(true) }) it('should create and check ERC1155 approval precondition', async () => { const { provider, chainId } = await getProvider() - const relayer = new LocalRelayer(provider as any) - await requireContractDeployed(provider, ERC20_IMPLICIT_MINT_CONTRACT) + const relayer = new LocalRelayer(provider) + await requireContractDeployed(provider, Address.from(ERC20_IMPLICIT_MINT_CONTRACT)) const operator = randomAddress() const precondition = new Erc1155ApprovalPrecondition( testWalletAddress, - ERC20_IMPLICIT_MINT_CONTRACT, + Address.from(ERC20_IMPLICIT_MINT_CONTRACT), 1n, // tokenId operator, 1000000n, // 1 token min approval ) - const intentPrecondition = { + const transactionPrecondition = { type: precondition.type(), - chainId: chainId.toString(), - data: JSON.stringify({ - address: precondition.address.toString(), - token: precondition.token.toString(), - tokenId: precondition.tokenId.toString(), - operator: precondition.operator.toString(), - min: precondition.min.toString(), - }), + chainId, + ownerAddress: precondition.address.toString(), + tokenAddress: precondition.token.toString(), + minAmount: precondition.min, } - if (!CAN_RUN_LIVE) { - // Mock the isApprovedForAll call - ;(provider as any).call.mockResolvedValue('0x1') // true - } + vi.mocked(provider.call).mockResolvedValue('0x1' as Hex.Hex) // true - const isValid = await relayer.checkPrecondition(intentPrecondition) + const isValid = await relayer.checkPrecondition(transactionPrecondition) expect(isValid).toBe(true) }) }) diff --git a/packages/services/relayer/test/preconditions/selectors.test.ts b/packages/services/relayer/test/preconditions/selectors.test.ts index 7fdc008ad..0cacc0e28 100644 --- a/packages/services/relayer/test/preconditions/selectors.test.ts +++ b/packages/services/relayer/test/preconditions/selectors.test.ts @@ -15,104 +15,71 @@ import { } from '../../src/preconditions/types.js' import { Network } from '@0xsequence/wallet-primitives' -// Test addresses -const TEST_ADDRESS = Address.from('0x1234567890123456789012345678901234567890') -const TOKEN_ADDRESS = Address.from('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd') +// Test addresses (strings for TransactionPrecondition) +const TEST_ADDRESS = '0x1234567890123456789012345678901234567890' +const TOKEN_ADDRESS = '0xabcdefabcdefabcdefabcdefabcdefabcdefabcd' +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + +function nativePrecondition(overrides: Partial = {}): TransactionPrecondition { + return { + type: 'native-balance', + chainId: Network.ChainId.MAINNET, + ownerAddress: TEST_ADDRESS, + tokenAddress: ZERO_ADDRESS, + minAmount: 1000000000000000000n, + ...overrides, + } +} + +function erc20Precondition(overrides: Partial = {}): TransactionPrecondition { + return { + type: 'erc20-balance', + chainId: Network.ChainId.MAINNET, + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + minAmount: 1000000n, + ...overrides, + } +} + +function erc721OwnershipPrecondition(overrides: Partial = {}): TransactionPrecondition { + return { + type: 'erc721-ownership', + chainId: Network.ChainId.MAINNET, + ownerAddress: TEST_ADDRESS, + tokenAddress: TOKEN_ADDRESS, + minAmount: 0n, + ...overrides, + } +} describe('Preconditions Selectors', () => { describe('extractChainID', () => { it('should extract chainID from valid precondition data', () => { - const precondition: TransactionPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - chainID: '1', - min: '1000000000000000000', - }), - } - + const precondition = nativePrecondition({ chainId: Network.ChainId.MAINNET }) const chainId = extractChainID(precondition) expect(chainId).toBe(Network.ChainId.MAINNET) }) it('should extract large chainID values', () => { - const precondition: TransactionPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - chainID: '42161', // Arbitrum chainID - }), - } - + const precondition = nativePrecondition({ chainId: Network.ChainId.ARBITRUM }) const chainId = extractChainID(precondition) expect(chainId).toBe(Network.ChainId.ARBITRUM) }) it('should return undefined when chainID is not present', () => { - const precondition: TransactionPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), - } - - const chainId = extractChainID(precondition) - expect(chainId).toBeUndefined() - }) - - it('should return undefined when chainID is falsy', () => { - const precondition: TransactionPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - chainID: '', - min: '1000000000000000000', - }), - } - - const chainId = extractChainID(precondition) - expect(chainId).toBeUndefined() - }) - - it('should return undefined when chainID is null', () => { - const precondition: TransactionPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - chainID: null, - min: '1000000000000000000', - }), - } - + const precondition = { type: 'native-balance', ownerAddress: TEST_ADDRESS, tokenAddress: ZERO_ADDRESS, minAmount: 1n } as TransactionPrecondition const chainId = extractChainID(precondition) expect(chainId).toBeUndefined() }) it('should return undefined for null/undefined precondition', () => { - expect(extractChainID(null as any)).toBeUndefined() - expect(extractChainID(undefined as any)).toBeUndefined() - }) - - it('should return undefined for invalid JSON', () => { - const precondition: TransactionPrecondition = { - type: 'native-balance', - data: 'invalid json', - } - - const chainId = extractChainID(precondition) - expect(chainId).toBeUndefined() + expect(extractChainID(null as unknown as TransactionPrecondition)).toBeUndefined() + expect(extractChainID(undefined as unknown as TransactionPrecondition)).toBeUndefined() }) it('should handle chainID with value 0', () => { - const precondition: TransactionPrecondition = { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - chainID: '0', - }), - } - + const precondition = nativePrecondition({ chainId: 0 }) const chainId = extractChainID(precondition) expect(chainId).toBe(0) }) @@ -121,21 +88,8 @@ describe('Preconditions Selectors', () => { describe('extractSupportedPreconditions', () => { it('should extract valid preconditions', () => { const intents: TransactionPrecondition[] = [ - { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), - }, - { - type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - min: '1000000', - }), - }, + nativePrecondition(), + erc20Precondition(), ] const results = extractSupportedPreconditions(intents) @@ -146,21 +100,9 @@ describe('Preconditions Selectors', () => { it('should filter out invalid preconditions', () => { const intents: TransactionPrecondition[] = [ - { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), - }, - { - type: 'unknown-type', - data: JSON.stringify({ address: TEST_ADDRESS }), - }, - { - type: 'native-balance', - data: 'invalid json', - }, + nativePrecondition(), + { type: 'unknown-type', chainId: 1, ownerAddress: TEST_ADDRESS, tokenAddress: ZERO_ADDRESS, minAmount: 0n } as TransactionPrecondition, + nativePrecondition({ ownerAddress: '' }), ] const results = extractSupportedPreconditions(intents) @@ -169,8 +111,8 @@ describe('Preconditions Selectors', () => { }) it('should return empty array for null/undefined input', () => { - expect(extractSupportedPreconditions(null as any)).toEqual([]) - expect(extractSupportedPreconditions(undefined as any)).toEqual([]) + expect(extractSupportedPreconditions(null as unknown as TransactionPrecondition[])).toEqual([]) + expect(extractSupportedPreconditions(undefined as unknown as TransactionPrecondition[])).toEqual([]) }) it('should return empty array for empty input', () => { @@ -180,25 +122,9 @@ describe('Preconditions Selectors', () => { it('should handle mixed valid and invalid preconditions', () => { const intents: TransactionPrecondition[] = [ - { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), - }, - { - type: 'erc721-ownership', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - }), - }, - { - type: 'invalid-type', - data: JSON.stringify({ address: TEST_ADDRESS }), - }, + nativePrecondition(), + erc721OwnershipPrecondition(), + { type: 'invalid-type', chainId: 1, ownerAddress: TEST_ADDRESS, tokenAddress: ZERO_ADDRESS, minAmount: 0n } as TransactionPrecondition, ] const results = extractSupportedPreconditions(intents) @@ -211,58 +137,23 @@ describe('Preconditions Selectors', () => { describe('extractNativeBalancePreconditions', () => { it('should extract only native balance preconditions', () => { const intents: TransactionPrecondition[] = [ - { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), - }, - { - type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - min: '1000000', - }), - }, - { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - max: '2000000000000000000', - }), - }, + nativePrecondition({ minAmount: 1000000000000000000n }), + erc20Precondition(), + nativePrecondition({ minAmount: 2000000000000000000n }), ] const results = extractNativeBalancePreconditions(intents) expect(results).toHaveLength(2) expect(results[0]).toBeInstanceOf(NativeBalancePrecondition) expect(results[1]).toBeInstanceOf(NativeBalancePrecondition) - - // Verify the specific properties expect(results[0].min).toBe(1000000000000000000n) - expect(results[1].max).toBe(2000000000000000000n) + expect(results[1].min).toBe(2000000000000000000n) }) it('should return empty array when no native balance preconditions exist', () => { const intents: TransactionPrecondition[] = [ - { - type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - min: '1000000', - }), - }, - { - type: 'erc721-ownership', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - }), - }, + erc20Precondition(), + erc721OwnershipPrecondition(), ] const results = extractNativeBalancePreconditions(intents) @@ -270,8 +161,8 @@ describe('Preconditions Selectors', () => { }) it('should return empty array for null/undefined input', () => { - expect(extractNativeBalancePreconditions(null as any)).toEqual([]) - expect(extractNativeBalancePreconditions(undefined as any)).toEqual([]) + expect(extractNativeBalancePreconditions(null as unknown as TransactionPrecondition[])).toEqual([]) + expect(extractNativeBalancePreconditions(undefined as unknown as TransactionPrecondition[])).toEqual([]) }) it('should return empty array for empty input', () => { @@ -281,24 +172,8 @@ describe('Preconditions Selectors', () => { it('should filter out invalid native balance preconditions', () => { const intents: TransactionPrecondition[] = [ - { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), - }, - { - type: 'native-balance', - data: 'invalid json', // This will be filtered out - }, - { - type: 'native-balance', - data: JSON.stringify({ - // Missing address - this will be filtered out - min: '1000000000000000000', - }), - }, + nativePrecondition({ minAmount: 1000000000000000000n }), + nativePrecondition({ ownerAddress: '' }), ] const results = extractNativeBalancePreconditions(intents) @@ -311,60 +186,25 @@ describe('Preconditions Selectors', () => { describe('extractERC20BalancePreconditions', () => { it('should extract only ERC20 balance preconditions', () => { const intents: TransactionPrecondition[] = [ - { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), - }, - { - type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - min: '1000000', - }), - }, - { - type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - max: '2000000', - }), - }, + nativePrecondition(), + erc20Precondition({ minAmount: 1000000n }), + erc20Precondition({ minAmount: 2000000n }), ] const results = extractERC20BalancePreconditions(intents) expect(results).toHaveLength(2) expect(results[0]).toBeInstanceOf(Erc20BalancePrecondition) expect(results[1]).toBeInstanceOf(Erc20BalancePrecondition) - - // Verify the specific properties expect(results[0].min).toBe(1000000n) - expect(results[1].max).toBe(2000000n) - expect(results[0].token).toBe(TOKEN_ADDRESS) - expect(results[1].token).toBe(TOKEN_ADDRESS) + expect(results[1].min).toBe(2000000n) + expect(results[0].token).toEqual(Address.from(TOKEN_ADDRESS)) + expect(results[1].token).toEqual(Address.from(TOKEN_ADDRESS)) }) it('should return empty array when no ERC20 balance preconditions exist', () => { const intents: TransactionPrecondition[] = [ - { - type: 'native-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - min: '1000000000000000000', - }), - }, - { - type: 'erc721-ownership', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - tokenId: '123', - }), - }, + nativePrecondition(), + erc721OwnershipPrecondition(), ] const results = extractERC20BalancePreconditions(intents) @@ -372,8 +212,8 @@ describe('Preconditions Selectors', () => { }) it('should return empty array for null/undefined input', () => { - expect(extractERC20BalancePreconditions(null as any)).toEqual([]) - expect(extractERC20BalancePreconditions(undefined as any)).toEqual([]) + expect(extractERC20BalancePreconditions(null as unknown as TransactionPrecondition[])).toEqual([]) + expect(extractERC20BalancePreconditions(undefined as unknown as TransactionPrecondition[])).toEqual([]) }) it('should return empty array for empty input', () => { @@ -383,33 +223,15 @@ describe('Preconditions Selectors', () => { it('should filter out invalid ERC20 balance preconditions', () => { const intents: TransactionPrecondition[] = [ - { - type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - token: TOKEN_ADDRESS, - min: '1000000', - }), - }, - { - type: 'erc20-balance', - data: 'invalid json', // This will be filtered out - }, - { - type: 'erc20-balance', - data: JSON.stringify({ - address: TEST_ADDRESS, - // Missing token address - this will be filtered out - min: '1000000', - }), - }, + erc20Precondition({ minAmount: 1000000n }), + erc20Precondition({ tokenAddress: '' }), ] const results = extractERC20BalancePreconditions(intents) expect(results).toHaveLength(1) expect(results[0]).toBeInstanceOf(Erc20BalancePrecondition) expect(results[0].min).toBe(1000000n) - expect(results[0].token).toBe(TOKEN_ADDRESS) + expect(results[0].token).toEqual(Address.from(TOKEN_ADDRESS)) }) }) }) diff --git a/packages/services/relayer/test/preconditions/types.test.ts b/packages/services/relayer/test/preconditions/types.test.ts index a4ecda1d9..a479676b5 100644 --- a/packages/services/relayer/test/preconditions/types.test.ts +++ b/packages/services/relayer/test/preconditions/types.test.ts @@ -179,7 +179,7 @@ describe('Preconditions Types', () => { TEST_ADDRESS, TOKEN_ADDRESS, OPERATOR_ADDRESS, - undefined as any, + undefined as unknown as bigint, ) const error = precondition.isValid() @@ -224,7 +224,7 @@ describe('Preconditions Types', () => { }) it('should validate tokenId is required', () => { - const precondition = new Erc721OwnershipPrecondition(TEST_ADDRESS, TOKEN_ADDRESS, undefined as any) + const precondition = new Erc721OwnershipPrecondition(TEST_ADDRESS, TOKEN_ADDRESS, undefined as unknown as bigint) const error = precondition.isValid() expect(error).toBeInstanceOf(Error) @@ -271,7 +271,7 @@ describe('Preconditions Types', () => { const precondition = new Erc721ApprovalPrecondition( TEST_ADDRESS, TOKEN_ADDRESS, - undefined as any, + undefined as unknown as bigint, OPERATOR_ADDRESS, ) @@ -319,7 +319,7 @@ describe('Preconditions Types', () => { }) it('should validate tokenId is required', () => { - const precondition = new Erc1155BalancePrecondition(TEST_ADDRESS, TOKEN_ADDRESS, undefined as any) + const precondition = new Erc1155BalancePrecondition(TEST_ADDRESS, TOKEN_ADDRESS, undefined as unknown as bigint) const error = precondition.isValid() expect(error).toBeInstanceOf(Error) @@ -402,7 +402,7 @@ describe('Preconditions Types', () => { const precondition = new Erc1155ApprovalPrecondition( TEST_ADDRESS, TOKEN_ADDRESS, - undefined as any, + undefined as unknown as bigint, OPERATOR_ADDRESS, 1000000n, ) @@ -432,7 +432,7 @@ describe('Preconditions Types', () => { TOKEN_ADDRESS, 123n, OPERATOR_ADDRESS, - undefined as any, + undefined as unknown as bigint, ) const error = precondition.isValid() diff --git a/packages/services/relayer/test/relayer/relayer.test.ts b/packages/services/relayer/test/relayer/relayer.test.ts index e06d0e6a3..716cd11d6 100644 --- a/packages/services/relayer/test/relayer/relayer.test.ts +++ b/packages/services/relayer/test/relayer/relayer.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi, beforeEach } from 'vitest' import { Address, Hex } from 'ox' import { Network, Payload } from '@0xsequence/wallet-primitives' -import { Relayer, RelayerGen } from '@0xsequence/relayer' +import { Relayer, RpcRelayerGen } from '@0xsequence/relayer' // Test addresses and data const TEST_WALLET_ADDRESS = Address.from('0x1234567890123456789012345678901234567890') @@ -127,7 +127,7 @@ describe('Relayer', () => { symbol: 'ETH', decimals: 18, logoURL: 'https://example.com/eth.png', - type: 'NATIVE' as RelayerGen.FeeTokenType, + type: 'NATIVE' as RpcRelayerGen.FeeTokenType, contractAddress: undefined, }, to: TEST_TO_ADDRESS, @@ -319,7 +319,7 @@ describe('Relayer', () => { const statusResult = await mockRelayer.status(TEST_OP_HASH, TEST_CHAIN_ID) expect(statusResult.status).toBe('confirmed') - const preconditionResult = await mockRelayer.checkPrecondition({} as any) + const preconditionResult = await mockRelayer.checkPrecondition({} as { type: string }) expect(preconditionResult).toBe(true) }) }) diff --git a/packages/services/userdata/eslint.config.js b/packages/services/userdata/eslint.config.js new file mode 100644 index 000000000..cecf89b03 --- /dev/null +++ b/packages/services/userdata/eslint.config.js @@ -0,0 +1,4 @@ +import { config as baseConfig } from "@repo/eslint-config/base" + +/** @type {import("eslint").Linter.Config} */ +export default baseConfig diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index d1b84a0f0..a05293399 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -8,11 +8,13 @@ "publishConfig": { "access": "public" }, + "type": "module", "scripts": { "build": "tsc", "dev": "tsc --watch", "test": "echo", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -21,6 +23,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "typescript": "^5.9.3" diff --git a/packages/services/userdata/src/index.ts b/packages/services/userdata/src/index.ts index af76930fc..63b855967 100644 --- a/packages/services/userdata/src/index.ts +++ b/packages/services/userdata/src/index.ts @@ -1,6 +1,6 @@ -export * from './userdata.gen' +export * from './userdata.gen.js' -import { UserData as UserdataRpc } from './userdata.gen' +import { UserData as UserdataRpc } from './userdata.gen.js' export class SequenceUserdataClient extends UserdataRpc { constructor( @@ -15,7 +15,7 @@ export class SequenceUserdataClient extends UserdataRpc { _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 headers: Record = {} const jwtAuth = this.jwtAuth const projectAccessKey = this.projectAccessKey diff --git a/packages/utils/abi/eslint.config.js b/packages/utils/abi/eslint.config.js new file mode 100644 index 000000000..cecf89b03 --- /dev/null +++ b/packages/utils/abi/eslint.config.js @@ -0,0 +1,4 @@ +import { config as baseConfig } from "@repo/eslint-config/base" + +/** @type {import("eslint").Linter.Config} */ +export default baseConfig diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 56afc3980..5f7498b1f 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -8,11 +8,13 @@ "publishConfig": { "access": "public" }, + "type": "module", "scripts": { "build": "tsc", "dev": "tsc --watch", "test": "echo", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -21,6 +23,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "typescript": "^5.9.3" diff --git a/packages/utils/abi/src/index.ts b/packages/utils/abi/src/index.ts index db6dfa292..39336c543 100644 --- a/packages/utils/abi/src/index.ts +++ b/packages/utils/abi/src/index.ts @@ -1,22 +1,22 @@ -export { abi as erc5719Abi } from './wallet/erc5719' -export { abi as erc1271Abi } from './wallet/erc1271' -export { abi as erc6492Abi } from './wallet/erc6492' -export { abi as factoryAbi } from './wallet/factory' -export { abi as mainModuleAbi } from './wallet/mainModule' -export { abi as mainModuleUpgradableAbi } from './wallet/mainModuleUpgradable' -export { abi as moduleHooksAbi } from './wallet/moduleHooks' -export { abi as sequenceUtilsAbi } from './wallet/sequenceUtils' -export { abi as requireFreshSignerAbi } from './wallet/libs/requireFreshSigners' -export { abi as walletProxyHookAbi } from './wallet/walletProxyHook' +export { abi as erc5719Abi } from './wallet/erc5719.js' +export { abi as erc1271Abi } from './wallet/erc1271.js' +export { abi as erc6492Abi } from './wallet/erc6492.js' +export { abi as factoryAbi } from './wallet/factory.js' +export { abi as mainModuleAbi } from './wallet/mainModule.js' +export { abi as mainModuleUpgradableAbi } from './wallet/mainModuleUpgradable.js' +export { abi as moduleHooksAbi } from './wallet/moduleHooks.js' +export { abi as sequenceUtilsAbi } from './wallet/sequenceUtils.js' +export { abi as requireFreshSignerAbi } from './wallet/libs/requireFreshSigners.js' +export { abi as walletProxyHookAbi } from './wallet/walletProxyHook.js' -export { walletContracts } from './wallet' +export { walletContracts } from './wallet/index.js' -export { ERC1155_ABI } from './tokens/erc1155' -export { ERC1155_ITEMS_ABI } from './tokens/erc1155Items' -export { ERC20_ABI } from './tokens/erc20' -export { ERC6909_ABI } from './tokens/erc6909' -export { ERC721_ABI } from './tokens/erc721' -export { ERC721_ITEMS_ABI } from './tokens/erc721Items' +export { ERC1155_ABI } from './tokens/erc1155.js' +export { ERC1155_ITEMS_ABI } from './tokens/erc1155Items.js' +export { ERC20_ABI } from './tokens/erc20.js' +export { ERC6909_ABI } from './tokens/erc6909.js' +export { ERC721_ABI } from './tokens/erc721.js' +export { ERC721_ITEMS_ABI } from './tokens/erc721Items.js' -export { ERC1155_SALE_ABI } from './sale/erc1155Sale' -export { ERC721_SALE_ABI } from './sale/erc721Sale' +export { ERC1155_SALE_ABI } from './sale/erc1155Sale.js' +export { ERC721_SALE_ABI } from './sale/erc721Sale.js' diff --git a/packages/utils/abi/src/wallet/index.ts b/packages/utils/abi/src/wallet/index.ts index 0ceae0a35..50b567e71 100644 --- a/packages/utils/abi/src/wallet/index.ts +++ b/packages/utils/abi/src/wallet/index.ts @@ -1,13 +1,13 @@ -import * as erc5719 from './erc5719' -import * as erc1271 from './erc1271' -import * as erc6492 from './erc6492' -import * as factory from './factory' -import * as mainModule from './mainModule' -import * as mainModuleUpgradable from './mainModuleUpgradable' -import * as moduleHooks from './moduleHooks' -import * as sequenceUtils from './sequenceUtils' -import * as requireFreshSigner from './libs/requireFreshSigners' -import * as walletProxyHook from './walletProxyHook' +import * as erc5719 from './erc5719.js' +import * as erc1271 from './erc1271.js' +import * as erc6492 from './erc6492.js' +import * as factory from './factory.js' +import * as mainModule from './mainModule.js' +import * as mainModuleUpgradable from './mainModuleUpgradable.js' +import * as moduleHooks from './moduleHooks.js' +import * as sequenceUtils from './sequenceUtils.js' +import * as requireFreshSigner from './libs/requireFreshSigners.js' +import * as walletProxyHook from './walletProxyHook.js' /** * @deprecated import directly from @0xsequence/abi/* instead, omitting "walletContracts" diff --git a/packages/wallet/core/eslint.config.js b/packages/wallet/core/eslint.config.js new file mode 100644 index 000000000..d10bbd1e9 --- /dev/null +++ b/packages/wallet/core/eslint.config.js @@ -0,0 +1,12 @@ +import { config as baseConfig } from '@repo/eslint-config/base' + +/** @type {import("eslint").Linter.Config} */ +export default [ + ...baseConfig, + { + // files: ['**/*.{test,spec}.ts'], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + }, + }, +] diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 79ed68524..061debb92 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -13,7 +13,8 @@ "test": "vitest run", "test:coverage": "vitest run --coverage", "typecheck": "tsc --noEmit", - "clean": "rimraf dist" + "clean": "rimraf dist", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -22,6 +23,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "@vitest/coverage-v8": "^4.0.18", diff --git a/packages/wallet/core/src/bundler/bundlers/pimlico.ts b/packages/wallet/core/src/bundler/bundlers/pimlico.ts index cc28079a6..4837babee 100644 --- a/packages/wallet/core/src/bundler/bundlers/pimlico.ts +++ b/packages/wallet/core/src/bundler/bundlers/pimlico.ts @@ -16,7 +16,7 @@ type PimlicoGasPrice = { } export class PimlicoBundler implements Bundler { - public readonly kind: 'bundler' = 'bundler' + public readonly kind = 'bundler' public readonly id: string public readonly provider: Provider.Provider @@ -119,7 +119,7 @@ export class PimlicoBundler implements Bundler { let pimlico: PimlicoStatusResp | undefined try { pimlico = await this.bundlerRpc('pimlico_getUserOperationStatus', [opHash]) - } catch (_) { + } catch { /* ignore - not Pimlico or endpoint down */ } diff --git a/packages/wallet/core/src/signers/index.ts b/packages/wallet/core/src/signers/index.ts index 80ccc07f1..28a8815b2 100644 --- a/packages/wallet/core/src/signers/index.ts +++ b/packages/wallet/core/src/signers/index.ts @@ -31,7 +31,7 @@ export interface SapientSigner { } export interface Witnessable { - witness: (stateWriter: State.Writer, wallet: Address.Address, extra?: Object) => Promise + witness: (stateWriter: State.Writer, wallet: Address.Address, extra?: object) => Promise } type MaybePromise = T | Promise diff --git a/packages/wallet/core/src/signers/passkey.ts b/packages/wallet/core/src/signers/passkey.ts index 62c6d1886..770b6b181 100644 --- a/packages/wallet/core/src/signers/passkey.ts +++ b/packages/wallet/core/src/signers/passkey.ts @@ -276,7 +276,7 @@ export class Passkey implements SapientSigner, Witnessable { } } - async witness(stateWriter: State.Writer, wallet: Address.Address, extra?: Object): Promise { + async witness(stateWriter: State.Writer, wallet: Address.Address, extra?: object): Promise { const payload = Payload.fromMessage( Hex.fromString( JSON.stringify({ diff --git a/packages/wallet/core/src/signers/pk/index.ts b/packages/wallet/core/src/signers/pk/index.ts index 5c26b1dcb..b15fb3ecb 100644 --- a/packages/wallet/core/src/signers/pk/index.ts +++ b/packages/wallet/core/src/signers/pk/index.ts @@ -52,7 +52,7 @@ export class Pk implements SignerInterface, Witnessable { return { ...signature, type: 'hash' } } - async witness(stateWriter: State.Writer, wallet: Address.Address, extra?: Object): Promise { + async witness(stateWriter: State.Writer, wallet: Address.Address, extra?: object): Promise { const payload = Payload.fromMessage( Hex.fromString( JSON.stringify({ diff --git a/packages/wallet/core/src/signers/session/explicit.ts b/packages/wallet/core/src/signers/session/explicit.ts index cd72b2256..b7ad087b4 100644 --- a/packages/wallet/core/src/signers/session/explicit.ts +++ b/packages/wallet/core/src/signers/session/explicit.ts @@ -1,11 +1,4 @@ -import { - Constants, - Extensions, - Payload, - Permission, - SessionConfig, - SessionSignature, -} from '@0xsequence/wallet-primitives' +import { Constants, Payload, Permission, SessionConfig, SessionSignature } from '@0xsequence/wallet-primitives' import { AbiFunction, AbiParameters, Address, Bytes, Hash, Hex, Provider } from 'ox' import { MemoryPkStore, PkStore } from '../pk/index.js' import { ExplicitSessionSigner, SessionSignerValidity, UsageLimit } from './session.js' @@ -323,7 +316,7 @@ export class Explicit implements ExplicitSessionSigner { Bytes.fromHex(call.data).slice(Number(rule.offset), Number(rule.offset) + 32), 32, ) - let value: Bytes.Bytes = callDataValue.map((b, i) => b & rule.mask[i]!) + const value: Bytes.Bytes = callDataValue.map((b, i) => b & rule.mask[i]!) if (Bytes.toBigInt(value) === 0n) continue // Add to list diff --git a/packages/wallet/core/src/signers/session/implicit.ts b/packages/wallet/core/src/signers/session/implicit.ts index 71b112865..8eb765808 100644 --- a/packages/wallet/core/src/signers/session/implicit.ts +++ b/packages/wallet/core/src/signers/session/implicit.ts @@ -1,6 +1,5 @@ import { Attestation, - Extensions, Payload, Signature as SequenceSignature, SessionConfig, @@ -96,7 +95,7 @@ export class Implicit implements ImplicitSessionSigner { ) const expectedResult = Bytes.toHex(Attestation.generateImplicitRequestMagic(this._attestation, wallet)) return acceptImplicitRequest === expectedResult - } catch (error) { + } catch { // console.log('implicit signer unsupported call', call, error) return false } diff --git a/packages/wallet/core/src/state/local/index.ts b/packages/wallet/core/src/state/local/index.ts index b3200c844..282de20e0 100644 --- a/packages/wallet/core/src/state/local/index.ts +++ b/packages/wallet/core/src/state/local/index.ts @@ -203,7 +203,7 @@ export class Provider implements ProviderInterface { fromImageHash: Hex.Hex, options?: { allUpdates?: boolean }, ): Promise<{ imageHash: Hex.Hex; signature: Signature.RawSignature }[]> { - let fromConfig = await this.store.loadConfig(fromImageHash) + const fromConfig = await this.store.loadConfig(fromImageHash) if (!fromConfig) { return [] } @@ -384,7 +384,7 @@ export class Provider implements ProviderInterface { if (Signature.isSignatureOfSapientSignerLeaf(topology.signature)) { switch (topology.signature.address.toLowerCase()) { - case this.extensions.passkeys.toLowerCase(): + case this.extensions.passkeys.toLowerCase(): { const decoded = Extensions.Passkeys.decode(Bytes.fromHex(topology.signature.data)) if (!Extensions.Passkeys.isValidSignature(subdigest, decoded)) { @@ -397,6 +397,8 @@ export class Provider implements ProviderInterface { Extensions.Passkeys.rootFor(decoded.publicKey), topology.signature, ) + } + default: throw new Error(`Unsupported sapient signer: ${topology.signature.address}`) } diff --git a/packages/wallet/core/src/state/remote/dev-http.ts b/packages/wallet/core/src/state/remote/dev-http.ts index 357263711..7c288e050 100644 --- a/packages/wallet/core/src/state/remote/dev-http.ts +++ b/packages/wallet/core/src/state/remote/dev-http.ts @@ -44,12 +44,12 @@ export class DevHttpProvider implements Provider { const errorText = await response.text() const errorJson = await Utils.fromJSON(errorText) errorPayload = { ...errorPayload, ...errorJson } - } catch (e) { + } catch { try { // If JSON parsing fails, try getting text for better error message const errorText = await response.text() errorPayload.body = errorText - } catch (textErr) { + } catch { // Ignore if reading text also fails } } @@ -105,7 +105,7 @@ export class DevHttpProvider implements Provider { throw new Error( `Failed to parse JSON response from server. Status: ${response.status}. Body: "${text}". Original error: ${error instanceof Error ? error.message : String(error)}`, ) - } catch (readError) { + } catch { throw new Error( `Failed to parse JSON response from server and could not read response body as text. Status: ${response.status}. Original error: ${error instanceof Error ? error.message : String(error)}`, ) diff --git a/packages/wallet/core/src/state/sequence/index.ts b/packages/wallet/core/src/state/sequence/index.ts index a016e640d..084211153 100644 --- a/packages/wallet/core/src/state/sequence/index.ts +++ b/packages/wallet/core/src/state/sequence/index.ts @@ -190,7 +190,9 @@ export class Provider implements ProviderInterface { case SignatureType.SapientCompact: throw new Error(`unexpected compact sapient signature by ${signer}`) } - } catch {} + } catch { + // ignore + } } async getWitnessForSapient( @@ -225,7 +227,9 @@ export class Provider implements ProviderInterface { signature: { type: 'sapient_compact', address: signer, data: witness.signature }, } } - } catch {} + } catch { + // ignore + } } async getConfigurationUpdates( @@ -384,7 +388,7 @@ const recoverSapientSignatureCompactFunction = AbiFunction.from(recoverSapientSi class PasskeySignatureValidator implements oxProvider.Provider { request: oxProvider.Provider['request'] = (async (request) => { switch (request.method) { - case 'eth_call': + case 'eth_call': { if (!request.params || !Array.isArray(request.params) || request.params.length === 0) { throw new Error('eth_call requires transaction parameters') } @@ -410,6 +414,7 @@ class PasskeySignatureValidator implements oxProvider.Provider { } else { throw new Error(`invalid passkey signature ${signature} for digest ${digest}`) } + } default: throw new Error(`method ${request.method} not implemented`) diff --git a/packages/wallet/core/src/wallet.ts b/packages/wallet/core/src/wallet.ts index 05a02da09..0377dd336 100644 --- a/packages/wallet/core/src/wallet.ts +++ b/packages/wallet/core/src/wallet.ts @@ -355,7 +355,7 @@ export class Wallet { throw new Error('4337 is not enabled in this wallet') } - const noncePromise = this.get4337Nonce(provider, status.context.capabilities?.erc4337?.entrypoint!, space) + const noncePromise = this.get4337Nonce(provider, status.context.capabilities.erc4337.entrypoint, space) // If the wallet is not deployed, then we need to include the initCode on // the 4337 transaction @@ -570,7 +570,7 @@ export class Wallet { if (typeof message !== 'string') { encodedMessage = TypedData.encode(message) } else { - let hexMessage = Hex.validate(message) ? message : Hex.fromString(message) + const hexMessage = Hex.validate(message) ? message : Hex.fromString(message) const messageSize = Hex.size(hexMessage) encodedMessage = Hex.concat(Hex.fromString(`${`\x19Ethereum Signed Message:\n${messageSize}`}`), hexMessage) } diff --git a/packages/wallet/core/test/constants.ts b/packages/wallet/core/test/constants.ts index 493bf6bf2..63e862f38 100644 --- a/packages/wallet/core/test/constants.ts +++ b/packages/wallet/core/test/constants.ts @@ -1,6 +1,7 @@ import { config as dotenvConfig } from 'dotenv' import { Abi, AbiEvent, Address } from 'ox' +// eslint-disable-next-line turbo/no-undeclared-env-vars const envFile = process.env.CI ? '.env.test' : '.env.test.local' dotenvConfig({ path: envFile }) @@ -16,4 +17,5 @@ export const EMITTER_EVENT_TOPICS = [ export const USDC_ADDRESS: Address.Address = '0xaf88d065e77c8cc2239327c5edb3a432268e5831' // Environment variables +// eslint-disable-next-line turbo/no-undeclared-env-vars export const LOCAL_RPC_URL = process.env.LOCAL_RPC_URL || 'http://localhost:8545' diff --git a/packages/wallet/core/test/envelope.test.ts b/packages/wallet/core/test/envelope.test.ts index 8ecc0e282..c92cf900e 100644 --- a/packages/wallet/core/test/envelope.test.ts +++ b/packages/wallet/core/test/envelope.test.ts @@ -6,7 +6,6 @@ import * as Envelope from '../src/envelope.js' // Test addresses and data const TEST_ADDRESS_1 = Address.from('0x1234567890123456789012345678901234567890') -const TEST_ADDRESS_2 = Address.from('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd') const TEST_ADDRESS_3 = Address.from('0x9876543210987654321098765432109876543210') const TEST_WALLET = Address.from('0xfedcbafedcbafedcbafedcbafedcbafedcbafe00') const TEST_IMAGE_HASH = Hex.from('0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef') diff --git a/packages/wallet/core/test/signers-pk.test.ts b/packages/wallet/core/test/signers-pk.test.ts index 4121ffb68..7a696cf6c 100644 --- a/packages/wallet/core/test/signers-pk.test.ts +++ b/packages/wallet/core/test/signers-pk.test.ts @@ -143,7 +143,7 @@ describe('Private Key Signers', () => { await pk.witness(mockStateWriter, testWallet) expect(mockStateWriter.saveWitnesses).toHaveBeenCalledTimes(1) - const [wallet, chainId, payload, witness] = vi.mocked(mockStateWriter.saveWitnesses).mock.calls[0] + const [wallet, chainId, _payload, witness] = vi.mocked(mockStateWriter.saveWitnesses).mock.calls[0] expect(wallet).toBe(testWallet) expect(chainId).toBe(0) diff --git a/packages/wallet/core/test/signers-session-implicit.test.ts b/packages/wallet/core/test/signers-session-implicit.test.ts index ed66a50af..5b0a37082 100644 --- a/packages/wallet/core/test/signers-session-implicit.test.ts +++ b/packages/wallet/core/test/signers-session-implicit.test.ts @@ -236,7 +236,6 @@ describe('Implicit Session', () => { }, } const identitySignature = createValidIdentitySignature(attestation) - const topology = createValidTopology() // This should throw an error during construction due to future issued time expect(() => { @@ -250,7 +249,6 @@ describe('Implicit Session', () => { approvedSigner: randomAddress(), // Different approved signer } const identitySignature = createValidIdentitySignature(attestation) - const topology = createValidTopology() // This should throw an error during construction due to mismatched approved signer expect(() => { diff --git a/packages/wallet/core/test/state/debug.test.ts b/packages/wallet/core/test/state/debug.test.ts index 4824297ab..6882f45a2 100644 --- a/packages/wallet/core/test/state/debug.test.ts +++ b/packages/wallet/core/test/state/debug.test.ts @@ -5,7 +5,6 @@ import { multiplex } from '../../src/state/debug.js' // Test data const TEST_ADDRESS = Address.from('0x1234567890123456789012345678901234567890') -const TEST_HEX = Hex.from('0xabcdef123456') const TEST_UINT8ARRAY = new Uint8Array([171, 205, 239, 18, 52, 86]) describe('State Debug', () => { @@ -241,13 +240,13 @@ describe('State Debug', () => { } const complexRef: ComplexInterface = { - async complexMethod(data) { + async complexMethod() { return 'complex-ref' }, } const complexCand: ComplexInterface = { - async complexMethod(data) { + async complexMethod() { return 'complex-cand' }, } diff --git a/packages/wallet/dapp-client/eslint.config.js b/packages/wallet/dapp-client/eslint.config.js new file mode 100644 index 000000000..cecf89b03 --- /dev/null +++ b/packages/wallet/dapp-client/eslint.config.js @@ -0,0 +1,4 @@ +import { config as baseConfig } from "@repo/eslint-config/base" + +/** @type {import("eslint").Linter.Config} */ +export default baseConfig diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index bb1c8f8d5..8661be53f 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -11,7 +11,8 @@ "build": "tsc", "dev": "tsc --watch", "typecheck": "tsc --noEmit", - "clean": "rimraf dist" + "clean": "rimraf dist", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -20,6 +21,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "@vitest/coverage-v8": "^4.0.18", diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index 095d07107..a57e2c232 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -158,11 +158,11 @@ export class ChainSessionManager { listener: ChainSessionManagerEventMap[K], ): () => void { if (!this.eventListeners[event]) { - this.eventListeners[event] = new Set() as any + this.eventListeners[event] = new Set() } - ;(this.eventListeners[event] as any).add(listener) + this.eventListeners[event].add(listener) return () => { - ;(this.eventListeners[event] as any)?.delete(listener) + this.eventListeners[event]?.delete(listener) } } diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index a2b73afd7..e580bd912 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -32,7 +32,7 @@ import { KEYMACHINE_URL, NODES_URL, RELAYER_URL } from './utils/constants.js' import { getRelayerUrl, getRpcUrl } from './utils/index.js' import { Relayer } from '@0xsequence/relayer' -export type DappClientEventListener = (data?: any) => void +export type DappClientEventListener = (data?: unknown) => void interface DappClientEventMap { sessionsUpdated: () => void @@ -182,11 +182,12 @@ export class DappClient { */ public on(event: K, listener: DappClientEventMap[K]): () => void { if (!this.eventListeners[event]) { - this.eventListeners[event] = new Set() as any + // @ts-expect-error - indexing into evenListeners will improperly create a union of all the possible types + this.eventListeners[event] = new Set() } - ;(this.eventListeners[event] as any).add(listener) + this.eventListeners[event].add(listener) return () => { - ;(this.eventListeners[event] as any)?.delete(listener) + this.eventListeners[event]?.delete(listener) } } @@ -976,8 +977,6 @@ export class DappClient { async disconnect(options?: { keepSessionlessConnection?: boolean }): Promise { const keepSessionlessConnection = options?.keepSessionlessConnection ?? true - const transportMode = this.transportMode - if (this.transport) { this.transport.destroy() } diff --git a/packages/wallet/dapp-client/test/ethauth-proof.test.ts b/packages/wallet/dapp-client/test/ethauth-proof.test.ts index 9d26306b7..93273f0d6 100644 --- a/packages/wallet/dapp-client/test/ethauth-proof.test.ts +++ b/packages/wallet/dapp-client/test/ethauth-proof.test.ts @@ -11,34 +11,33 @@ describe('ETHAuth proof persistence', () => { vi.unstubAllGlobals() }) - const createSequenceStorageMock = () => - ({ - setPendingRedirectRequest: vi.fn().mockResolvedValue(undefined), - isRedirectRequestPending: vi.fn().mockResolvedValue(false), - saveTempSessionPk: vi.fn().mockResolvedValue(undefined), - getAndClearTempSessionPk: vi.fn().mockResolvedValue(null), - savePendingRequest: vi.fn().mockResolvedValue(undefined), - getAndClearPendingRequest: vi.fn().mockResolvedValue(null), - peekPendingRequest: vi.fn().mockResolvedValue(null), - saveExplicitSession: vi.fn().mockResolvedValue(undefined), - getExplicitSessions: vi.fn().mockResolvedValue([]), - clearExplicitSessions: vi.fn().mockResolvedValue(undefined), - saveImplicitSession: vi.fn().mockResolvedValue(undefined), - getImplicitSession: vi.fn().mockResolvedValue(null), - clearImplicitSession: vi.fn().mockResolvedValue(undefined), - saveSessionlessConnection: vi.fn().mockResolvedValue(undefined), - getSessionlessConnection: vi.fn().mockResolvedValue(null), - clearSessionlessConnection: vi.fn().mockResolvedValue(undefined), - saveEthAuthProof: vi.fn().mockResolvedValue(undefined), - getEthAuthProof: vi.fn().mockResolvedValue(null), - clearEthAuthProof: vi.fn().mockResolvedValue(undefined), - clearAllData: vi.fn().mockResolvedValue(undefined), - }) as any + const createSequenceStorageMock = () => ({ + setPendingRedirectRequest: vi.fn().mockResolvedValue(undefined), + isRedirectRequestPending: vi.fn().mockResolvedValue(false), + saveTempSessionPk: vi.fn().mockResolvedValue(undefined), + getAndClearTempSessionPk: vi.fn().mockResolvedValue(null), + savePendingRequest: vi.fn().mockResolvedValue(undefined), + getAndClearPendingRequest: vi.fn().mockResolvedValue(null), + peekPendingRequest: vi.fn().mockResolvedValue(null), + saveExplicitSession: vi.fn().mockResolvedValue(undefined), + getExplicitSessions: vi.fn().mockResolvedValue([]), + clearExplicitSessions: vi.fn().mockResolvedValue(undefined), + saveImplicitSession: vi.fn().mockResolvedValue(undefined), + getImplicitSession: vi.fn().mockResolvedValue(null), + clearImplicitSession: vi.fn().mockResolvedValue(undefined), + saveSessionlessConnection: vi.fn().mockResolvedValue(undefined), + getSessionlessConnection: vi.fn().mockResolvedValue(null), + clearSessionlessConnection: vi.fn().mockResolvedValue(undefined), + saveEthAuthProof: vi.fn().mockResolvedValue(undefined), + getEthAuthProof: vi.fn().mockResolvedValue(null), + clearEthAuthProof: vi.fn().mockResolvedValue(undefined), + clearAllData: vi.fn().mockResolvedValue(undefined), + }) it('persists ETHAuth proof when connect requests ethAuth in redirect mode', async () => { const fetchMock = vi.fn() vi.stubGlobal('fetch', fetchMock) - vi.stubGlobal('window', { fetch: fetchMock } as any) + vi.stubGlobal('window', { fetch: fetchMock }) const ethAuthProof = { typedData: { @@ -47,13 +46,13 @@ describe('ETHAuth proof persistence', () => { message: {}, }, ewtString: 'proof-string', - } as any + } const sequenceStorage = createSequenceStorageMock() const sendRequestMock = vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ walletAddress: '0x1111111111111111111111111111111111111111', ethAuthProof, - } as any) + }) const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { sequenceStorage, @@ -84,8 +83,8 @@ describe('ETHAuth proof persistence', () => { it('persists ETHAuth proof when connect requests ethAuth in popup mode', async () => { const fetchMock = vi.fn() vi.stubGlobal('fetch', fetchMock) - vi.stubGlobal('window', { fetch: fetchMock } as any) - vi.stubGlobal('document', {} as any) + vi.stubGlobal('window', { fetch: fetchMock }) + vi.stubGlobal('document', {}) const ethAuthProof = { typedData: { @@ -94,13 +93,13 @@ describe('ETHAuth proof persistence', () => { message: {}, }, ewtString: 'proof-string', - } as any + } const sequenceStorage = createSequenceStorageMock() const sendRequestMock = vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ walletAddress: '0x1111111111111111111111111111111111111111', ethAuthProof, - } as any) + }) const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { sequenceStorage, @@ -130,7 +129,7 @@ describe('ETHAuth proof persistence', () => { it('does not persist ETHAuth proof when connect does not request ethAuth', async () => { const fetchMock = vi.fn() vi.stubGlobal('fetch', fetchMock) - vi.stubGlobal('window', { fetch: fetchMock } as any) + vi.stubGlobal('window', { fetch: fetchMock }) const ethAuthProof = { typedData: { @@ -139,13 +138,13 @@ describe('ETHAuth proof persistence', () => { message: {}, }, ewtString: 'proof-string', - } as any + } const sequenceStorage = createSequenceStorageMock() const sendRequestMock = vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ walletAddress: '0x1111111111111111111111111111111111111111', ethAuthProof, - } as any) + }) const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { sequenceStorage, @@ -170,7 +169,7 @@ describe('ETHAuth proof persistence', () => { it('clears ETHAuth proof on disconnect', async () => { const fetchMock = vi.fn() vi.stubGlobal('fetch', fetchMock) - vi.stubGlobal('window', { fetch: fetchMock } as any) + vi.stubGlobal('window', { fetch: fetchMock }) const ethAuthProof = { typedData: { @@ -179,12 +178,12 @@ describe('ETHAuth proof persistence', () => { message: {}, }, ewtString: 'proof-string', - } as any + } vi.spyOn(DappTransport.prototype, 'sendRequest').mockResolvedValue({ walletAddress: '0x1111111111111111111111111111111111111111', ethAuthProof, - } as any) + }) const client = new DappClient('https://wallet.example', 'https://dapp.example', 'test-project-access-key', { sequenceStorage: new WebStorage(), diff --git a/packages/wallet/primitives-cli/eslint.config.js b/packages/wallet/primitives-cli/eslint.config.js new file mode 100644 index 000000000..cecf89b03 --- /dev/null +++ b/packages/wallet/primitives-cli/eslint.config.js @@ -0,0 +1,4 @@ +import { config as baseConfig } from "@repo/eslint-config/base" + +/** @type {import("eslint").Linter.Config} */ +export default baseConfig diff --git a/packages/wallet/primitives/eslint.config.js b/packages/wallet/primitives/eslint.config.js new file mode 100644 index 000000000..d10bbd1e9 --- /dev/null +++ b/packages/wallet/primitives/eslint.config.js @@ -0,0 +1,12 @@ +import { config as baseConfig } from '@repo/eslint-config/base' + +/** @type {import("eslint").Linter.Config} */ +export default [ + ...baseConfig, + { + // files: ['**/*.{test,spec}.ts'], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + }, + }, +] diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 03df5e248..e25aa0791 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -13,7 +13,8 @@ "test": "vitest run", "test:coverage": "vitest run --coverage", "typecheck": "tsc --noEmit", - "clean": "rimraf dist" + "clean": "rimraf dist", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -22,6 +23,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@vitest/coverage-v8": "^4.0.18", "typescript": "^5.9.3", diff --git a/packages/wallet/primitives/src/attestation.ts b/packages/wallet/primitives/src/attestation.ts index 78795862e..4f576f7a0 100644 --- a/packages/wallet/primitives/src/attestation.ts +++ b/packages/wallet/primitives/src/attestation.ts @@ -1,4 +1,4 @@ -import { Address, Bytes, Hash } from 'ox' +import { Address, Bytes, Hash, Hex } from 'ox' export type Attestation = { approvedSigner: Address.Address @@ -14,6 +14,18 @@ export type AuthData = { issuedAt: bigint // uint64 } +type EncodedAttestation = { + approvedSigner: Address.Address + identityType: Hex.Hex + issuerHash: Hex.Hex + audienceHash: Hex.Hex + applicationData: Hex.Hex + authData: { + redirectUrl: string + issuedAt: string + } +} + // Encoding and decoding export function encode(attestation: Attestation): Bytes.Bytes { @@ -76,9 +88,9 @@ export function toJson(attestation: Attestation, indent?: number): string { return JSON.stringify(encodeForJson(attestation), null, indent) } -export function encodeForJson(attestation: Attestation): any { +export function encodeForJson(attestation: Attestation): EncodedAttestation { return { - approvedSigner: attestation.approvedSigner.toString(), + approvedSigner: attestation.approvedSigner, identityType: Bytes.toHex(attestation.identityType), issuerHash: Bytes.toHex(attestation.issuerHash), audienceHash: Bytes.toHex(attestation.audienceHash), @@ -94,7 +106,7 @@ export function fromJson(json: string): Attestation { return fromParsed(JSON.parse(json)) } -export function fromParsed(parsed: any): Attestation { +export function fromParsed(parsed: EncodedAttestation): Attestation { return { approvedSigner: Address.from(parsed.approvedSigner), identityType: Bytes.fromHex(parsed.identityType), diff --git a/packages/wallet/primitives/src/config.ts b/packages/wallet/primitives/src/config.ts index 27bb7f032..20c54dc49 100644 --- a/packages/wallet/primitives/src/config.ts +++ b/packages/wallet/primitives/src/config.ts @@ -2,7 +2,6 @@ import { Address, Bytes, Hash, Hex } from 'ox' import { isRawConfig, isRawNestedLeaf, - isRawNode, isRawSignerLeaf, isSignedSapientSignerLeaf, isSignedSignerLeaf, @@ -55,6 +54,49 @@ export type Leaf = SignerLeaf | SapientSignerLeaf | SubdigestLeaf | AnyAddressSu export type Topology = Node | Leaf +/** Encoded topology types for JSON serialization */ +type EncodedSignerLeaf = { + type: 'signer' + address: Address.Address + weight: string +} + +type EncodedSapientSignerLeaf = { + type: 'sapient-signer' + address: Address.Address + weight: string + imageHash: Hex.Hex +} + +type EncodedSubdigestLeaf = { + type: 'subdigest' + digest: Hex.Hex +} + +type EncodedAnyAddressSubdigestLeaf = { + type: 'any-address-subdigest' + digest: Hex.Hex +} + +type EncodedNestedLeaf = { + type: 'nested' + tree: EncodedTopology + weight: string + threshold: string +} + +type EncodedNodeLeaf = Hex.Hex + +export type EncodedLeaf = + | EncodedSignerLeaf + | EncodedSapientSignerLeaf + | EncodedSubdigestLeaf + | EncodedAnyAddressSubdigestLeaf + | EncodedNestedLeaf + | EncodedNodeLeaf +export type EncodedNode = [EncodedTopology, EncodedTopology] +export type EncodedTopology = EncodedNode | EncodedLeaf + export type Config = { threshold: bigint checkpoint: bigint @@ -62,39 +104,39 @@ export type Config = { checkpointer?: Address.Address } -export function isSignerLeaf(cand: any): cand is SignerLeaf { - return typeof cand === 'object' && cand !== null && cand.type === 'signer' +export function isSignerLeaf(cand: unknown): cand is SignerLeaf { + return typeof cand === 'object' && cand !== null && 'type' in cand && cand.type === 'signer' } -export function isSapientSignerLeaf(cand: any): cand is SapientSignerLeaf { - return typeof cand === 'object' && cand !== null && cand.type === 'sapient-signer' +export function isSapientSignerLeaf(cand: unknown): cand is SapientSignerLeaf { + return typeof cand === 'object' && cand !== null && 'type' in cand && cand.type === 'sapient-signer' } -export function isSubdigestLeaf(cand: any): cand is SubdigestLeaf { - return typeof cand === 'object' && cand !== null && cand.type === 'subdigest' +export function isSubdigestLeaf(cand: unknown): cand is SubdigestLeaf { + return typeof cand === 'object' && cand !== null && 'type' in cand && cand.type === 'subdigest' } -export function isAnyAddressSubdigestLeaf(cand: any): cand is AnyAddressSubdigestLeaf { - return typeof cand === 'object' && cand !== null && cand.type === 'any-address-subdigest' +export function isAnyAddressSubdigestLeaf(cand: unknown): cand is AnyAddressSubdigestLeaf { + return typeof cand === 'object' && cand !== null && 'type' in cand && cand.type === 'any-address-subdigest' } -export function isNodeLeaf(cand: any): cand is NodeLeaf { - return Hex.validate(cand) && cand.length === 66 +export function isNodeLeaf(cand: unknown): cand is NodeLeaf { + return typeof cand === 'string' && Hex.validate(cand) && cand.length === 66 } -export function isNestedLeaf(cand: any): cand is NestedLeaf { - return typeof cand === 'object' && cand !== null && cand.type === 'nested' +export function isNestedLeaf(cand: unknown): cand is NestedLeaf { + return typeof cand === 'object' && cand !== null && 'type' in cand && cand.type === 'nested' } -export function isNode(cand: any): cand is Node { +export function isNode(cand: unknown): cand is Node { return Array.isArray(cand) && cand.length === 2 && isTopology(cand[0]) && isTopology(cand[1]) } -export function isConfig(cand: any): cand is Config { - return typeof cand === 'object' && 'threshold' in cand && 'checkpoint' in cand && 'topology' in cand +export function isConfig(cand: unknown): cand is Config { + return typeof cand === 'object' && cand !== null && 'threshold' in cand && 'checkpoint' in cand && 'topology' in cand } -export function isLeaf(cand: Topology): cand is Leaf { +export function isLeaf(cand: unknown): cand is Leaf { return ( isSignerLeaf(cand) || isSapientSignerLeaf(cand) || @@ -105,7 +147,7 @@ export function isLeaf(cand: Topology): cand is Leaf { ) } -export function isTopology(cand: any): cand is Topology { +export function isTopology(cand: unknown): cand is Topology { return isNode(cand) || isLeaf(cand) } @@ -310,7 +352,7 @@ export function configFromJson(json: string): Config { } } -function encodeTopology(top: Topology): any { +function encodeTopology(top: Topology): EncodedTopology { if (isNode(top)) { return [encodeTopology(top[0]), encodeTopology(top[1])] } else if (isSignerLeaf(top)) { @@ -350,7 +392,7 @@ function encodeTopology(top: Topology): any { throw new Error('Invalid topology') } -function decodeTopology(obj: any): Topology { +function decodeTopology(obj: EncodedTopology): Topology { if (Array.isArray(obj)) { if (obj.length !== 2) { throw new Error('Invalid node structure in JSON') diff --git a/packages/wallet/primitives/src/extensions/recovery.ts b/packages/wallet/primitives/src/extensions/recovery.ts index cb8c93868..43cd05b9c 100644 --- a/packages/wallet/primitives/src/extensions/recovery.ts +++ b/packages/wallet/primitives/src/extensions/recovery.ts @@ -1,7 +1,6 @@ import { Abi, AbiFunction, Address, Bytes, Hex, Provider } from 'ox' import * as GenericTree from '../generic-tree.js' import { Signature } from '../index.js' -import * as Network from '../network.js' import * as Payload from '../payload.js' import { packRSY } from '../utils.js' @@ -56,21 +55,21 @@ export type Tree = Branch | GenericTree.Node | RecoveryLeaf /** * Type guard to check if a value is a RecoveryLeaf */ -export function isRecoveryLeaf(cand: any): cand is RecoveryLeaf { - return typeof cand === 'object' && cand !== null && cand.type === 'leaf' +export function isRecoveryLeaf(cand: unknown): cand is RecoveryLeaf { + return typeof cand === 'object' && cand !== null && 'type' in cand && cand.type === 'leaf' } /** * Type guard to check if a value is a Node (pair of subtrees) */ -export function isBranch(cand: any): cand is Branch { +export function isBranch(cand: unknown): cand is Branch { return Array.isArray(cand) && cand.length === 2 && isTree(cand[0]) && isTree(cand[1]) } /** * Type guard to check if a value is a Topology */ -export function isTree(cand: any): cand is Tree { +export function isTree(cand: unknown): cand is Tree { return isRecoveryLeaf(cand) || GenericTree.isNode(cand) || isBranch(cand) } @@ -437,10 +436,10 @@ export function fromGenericTree(tree: GenericTree.Tree): Tree { */ export function encodeCalldata( wallet: Address.Address, - payload: Payload.Recovery, + payload: Payload.Recovery, signer: Address.Address, signature: Signature.SignatureOfSignerLeaf, -) { +): Hex.Hex { let signatureBytes: Hex.Hex if (signature.type === 'erc1271') { diff --git a/packages/wallet/primitives/src/payload.ts b/packages/wallet/primitives/src/payload.ts index 1359abdbe..c933a6118 100644 --- a/packages/wallet/primitives/src/payload.ts +++ b/packages/wallet/primitives/src/payload.ts @@ -1,7 +1,7 @@ import { AbiFunction, AbiParameters, Address, Bytes, Hash, Hex } from 'ox' import { getSignPayload } from 'ox/TypedData' import { EXECUTE_USER_OP, RECOVER_SAPIENT_SIGNATURE } from './constants.js' -import { Attestation, Network } from './index.js' +import { Attestation } from './index.js' import { minBytesFor } from './utils.js' import { UserOperation } from 'ox/erc4337' diff --git a/packages/wallet/primitives/src/signature.ts b/packages/wallet/primitives/src/signature.ts index 2e5d3212c..6ba93f9c1 100644 --- a/packages/wallet/primitives/src/signature.ts +++ b/packages/wallet/primitives/src/signature.ts @@ -1,4 +1,4 @@ -import { AbiFunction, AbiParameters, Address, Bytes, Hash, Hex, Provider, Secp256k1, Signature } from 'ox' +import { AbiFunction, AbiParameters, Address, Bytes, Hash, Hex, Provider, Secp256k1 } from 'ox' import { Config, Leaf, @@ -22,7 +22,7 @@ import { RECOVER_SAPIENT_SIGNATURE, RECOVER_SAPIENT_SIGNATURE_COMPACT, IS_VALID_ import { wrap, decode } from './erc-6492.js' import { fromConfigUpdate, hash, Parented } from './payload.js' import { minBytesFor, packRSY, unpackRSY } from './utils.js' -import { Constants, Network } from './index.js' +import { Constants } from './index.js' export const FLAG_SIGNATURE_HASH = 0 export const FLAG_ADDRESS = 1 @@ -618,7 +618,7 @@ export function fillLeaves( export function encodeChainedSignature(signatures: RawSignature[]): Uint8Array { let flag = 0x01 - let sigForCheckpointer = signatures[signatures.length - 1] + const sigForCheckpointer = signatures[signatures.length - 1] if (sigForCheckpointer?.configuration.checkpointer) { flag |= 0x40 @@ -723,7 +723,7 @@ export function encodeTopology( const isBranching = isNode(topology[1]!) || isRawNode(topology[1]!) if (isBranching) { - let encoded1Size = minBytesFor(BigInt(encoded1.length)) + const encoded1Size = minBytesFor(BigInt(encoded1.length)) if (encoded1Size > 15) { throw new Error('Branch too large') } @@ -799,7 +799,7 @@ export function encodeTopology( } else if (topology.signature.type === 'erc1271') { let flag = FLAG_SIGNATURE_ERC1271 << 4 - let bytesForSignatureSize = minBytesFor(BigInt(topology.signature.data.length)) + const bytesForSignatureSize = minBytesFor(BigInt(topology.signature.data.length)) if (bytesForSignatureSize > 3) { throw new Error('Signature too large') } @@ -826,7 +826,7 @@ export function encodeTopology( let flag = (topology.signature.type === 'sapient' ? FLAG_SIGNATURE_SAPIENT : FLAG_SIGNATURE_SAPIENT_COMPACT) << 4 const signatureBytes = Bytes.fromHex(topology.signature.data) - let bytesForSignatureSize = minBytesFor(BigInt(signatureBytes.length)) + const bytesForSignatureSize = minBytesFor(BigInt(signatureBytes.length)) if (bytesForSignatureSize > 3) { throw new Error('Signature too large') } @@ -1218,7 +1218,7 @@ async function recoverTopology( weight: topology.weight, } - default: + default: { const provider = 'provider' in options!.provider ? options!.provider.provider : options!.provider const block = 'block' in options!.provider ? options!.provider.block : undefined @@ -1254,6 +1254,7 @@ async function recoverTopology( } } } + } } case 'sapient': @@ -1264,7 +1265,7 @@ async function recoverTopology( case 'assume-valid': throw new Error(`unable to validate sapient signer ${topology.signature.address} signature`) - default: + default: { const provider = 'provider' in options!.provider ? options!.provider.provider : options!.provider const block = 'block' in options!.provider ? options!.provider.block : undefined @@ -1298,6 +1299,7 @@ async function recoverTopology( }, weight: topology.weight, } + } } } } else if (isRawNestedLeaf(topology)) { diff --git a/packages/wallet/primitives/src/utils.ts b/packages/wallet/primitives/src/utils.ts index 7a70fb087..3a2b28d46 100644 --- a/packages/wallet/primitives/src/utils.ts +++ b/packages/wallet/primitives/src/utils.ts @@ -1,4 +1,4 @@ -import { AbiParameters, Bytes, Hash, Hex } from 'ox' +import { Bytes } from 'ox' export function minBytesFor(val: bigint): number { return Math.ceil(val.toString(16).length / 2) @@ -7,7 +7,7 @@ export function minBytesFor(val: bigint): number { // ERC-2098 export function packRSY({ r, s, yParity }: { r: bigint; s: bigint; yParity: number }): Bytes.Bytes { const rBytes = Bytes.padLeft(Bytes.fromNumber(r), 32) - let sBytes = Bytes.padLeft(Bytes.fromNumber(s), 32) + const sBytes = Bytes.padLeft(Bytes.fromNumber(s), 32) if (yParity % 2 === 1) { sBytes[0]! |= 0x80 } diff --git a/packages/wallet/primitives/test/address.test.ts b/packages/wallet/primitives/test/address.test.ts index 38ac16ccc..b004dc96d 100644 --- a/packages/wallet/primitives/test/address.test.ts +++ b/packages/wallet/primitives/test/address.test.ts @@ -88,7 +88,7 @@ describe('Address', () => { }) it('should work with Dev1 context', () => { - const { stage2, ...dev1Context } = Dev1 + const { stage2: _, ...dev1Context } = Dev1 const address = from(sampleConfig, dev1Context) expect(() => Address.assert(address)).not.toThrow() @@ -96,53 +96,53 @@ describe('Address', () => { }) it('should work with Dev2 context', () => { - const { stage2, ...dev2Context } = Dev2 + const { stage2: _stage2_1, ...dev2Context } = Dev2 const address = from(sampleConfig, dev2Context) expect(() => Address.assert(address)).not.toThrow() expect(address).toMatch(/^0x[a-fA-F0-9]{40}$/) // Should be different from Dev1 - const { stage2: _, ...dev1Context } = Dev1 + const { stage2: _stage2_2, ...dev1Context } = Dev1 const dev1Address = from(sampleConfig, dev1Context) expect(address).not.toBe(dev1Address) }) it('should work with Rc3 context', () => { - const { stage2, ...rc3Context } = Rc3 + const { stage2: _stage2_1, ...rc3Context } = Rc3 const address = from(sampleConfig, rc3Context) 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 { stage2: _stage2_2, ...dev2Context } = Dev2 const dev2Address = from(sampleConfig, dev2Context) expect(address).not.toBe(dev2Address) }) it('should work with Rc4 context', () => { - const { stage2, ...rc4Context } = Rc4 + const { stage2: _stage2_1, ...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 { stage2: _stage2_2, ...dev2Context } = Dev2 const dev2Address = from(sampleConfig, dev2Context) expect(address).not.toBe(dev2Address) }) it('should work with Rc5 context', () => { - const { stage2, ...rc5Context } = Rc5 + const { stage2: _stage2_1, ...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 { stage2: _stage2_2, ...dev2Context } = Dev2 const dev2Address = from(sampleConfig, dev2Context) expect(address).not.toBe(dev2Address) }) diff --git a/packages/wallet/primitives/test/attestation.test.ts b/packages/wallet/primitives/test/attestation.test.ts index 41a75da07..3708132a7 100644 --- a/packages/wallet/primitives/test/attestation.test.ts +++ b/packages/wallet/primitives/test/attestation.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { Address, Bytes, Hash, Hex } from 'ox' +import { Bytes, Hash } from 'ox' import { Attestation, diff --git a/packages/wallet/primitives/test/config.test.ts b/packages/wallet/primitives/test/config.test.ts index 4dbaa0f84..b4ff8e6d9 100644 --- a/packages/wallet/primitives/test/config.test.ts +++ b/packages/wallet/primitives/test/config.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { Address, Bytes, Hash, Hex } from 'ox' +import { Bytes } from 'ox' import { Config, diff --git a/packages/wallet/primitives/test/passkeys.test.ts b/packages/wallet/primitives/test/passkeys.test.ts index b6aa0990f..ddfd59b9e 100644 --- a/packages/wallet/primitives/test/passkeys.test.ts +++ b/packages/wallet/primitives/test/passkeys.test.ts @@ -104,13 +104,6 @@ describe('Passkeys', () => { y: testPublicKeyY, } - const samplePublicKeyWithHashMetadata: PublicKey = { - requireUserVerification: true, - x: testPublicKeyX, - y: testPublicKeyY, - metadata: testMetadataHash, - } - // Realistic authenticator data based on WebAuthn spec and ox patterns // This represents actual WebAuthn authenticator data structure const sampleAuthenticatorData = Bytes.fromHex( @@ -196,7 +189,7 @@ describe('Passkeys', () => { { name: 'special chars', credentialId: '!@#$%^&*()_+{}|:"<>?[]\\;\',./' }, ] - testCases.forEach(({ name, credentialId }) => { + testCases.forEach(({ credentialId }) => { const metadata: PasskeyMetadata = { credentialId } const tree = metadataTree(metadata) expect(GenericTree.isLeaf(tree)).toBe(true) @@ -709,7 +702,7 @@ describe('Passkeys', () => { }, ] - specialCharTests.forEach(({ name, credentialId, clientData }) => { + specialCharTests.forEach(({ credentialId, clientData }) => { if (credentialId) { const unicodeMetadata: PasskeyMetadata = { credentialId } const tree = metadataTree(unicodeMetadata) @@ -787,7 +780,7 @@ describe('Passkeys', () => { { userVerification: true, metadata: true, description: 'User verification with metadata' }, ] - testCombinations.forEach(({ userVerification, metadata, description }) => { + testCombinations.forEach(({ userVerification, metadata }) => { const pubKey = createValidPublicKey({ requireUserVerification: userVerification, ...(metadata && { metadata: samplePasskeyMetadata }), diff --git a/packages/wallet/primitives/test/payload.test.ts b/packages/wallet/primitives/test/payload.test.ts index 72b831d22..33884dbdb 100644 --- a/packages/wallet/primitives/test/payload.test.ts +++ b/packages/wallet/primitives/test/payload.test.ts @@ -1,6 +1,5 @@ -import { describe, expect, it, vi } from 'vitest' -import { Address, Bytes, Hash, Hex } from 'ox' -import { UserOperation } from 'ox/erc4337' +import { describe, expect, it } from 'vitest' +import { Address, Bytes, Hex } from 'ox' import { KIND_TRANSACTIONS, @@ -17,11 +16,7 @@ import { Digest, SessionImplicitAuthorize, Calls4337_07, - Recovery, - MayRecoveryPayload, - Payload, Parented, - TypedDataToSign, SolidityDecoded, fromMessage, fromConfigUpdate, diff --git a/packages/wallet/primitives/test/precondition.test.ts b/packages/wallet/primitives/test/precondition.test.ts index c994e8a52..84f919d62 100644 --- a/packages/wallet/primitives/test/precondition.test.ts +++ b/packages/wallet/primitives/test/precondition.test.ts @@ -1,7 +1,6 @@ import { describe, expect, it } from 'vitest' import { - Precondition, NativeBalancePrecondition, Erc20BalancePrecondition, Erc20ApprovalPrecondition, @@ -10,7 +9,6 @@ import { Erc1155BalancePrecondition, Erc1155ApprovalPrecondition, AnyPrecondition, - IntentPrecondition, isValidPreconditionType, createPrecondition, createIntentPrecondition, @@ -225,13 +223,13 @@ describe('Precondition', () => { }) it('should throw for null precondition', () => { - expect(() => createPrecondition(null as any)).toThrow( + expect(() => createPrecondition(null as unknown as AnyPrecondition)).toThrow( "Invalid precondition object: missing or invalid 'type' property.", ) }) it('should throw for undefined precondition', () => { - expect(() => createPrecondition(undefined as any)).toThrow( + expect(() => createPrecondition(undefined as unknown as AnyPrecondition)).toThrow( "Invalid precondition object: missing or invalid 'type' property.", ) }) @@ -240,7 +238,7 @@ describe('Precondition', () => { const invalidPrecondition = { address: testAddress, min: testMinAmount, - } as any + } as unknown as AnyPrecondition expect(() => createPrecondition(invalidPrecondition)).toThrow( "Invalid precondition object: missing or invalid 'type' property.", ) @@ -250,7 +248,7 @@ describe('Precondition', () => { const invalidPrecondition = { type: 'invalid-type', address: testAddress, - } as any + } as unknown as AnyPrecondition expect(() => createPrecondition(invalidPrecondition)).toThrow( "Invalid precondition object: missing or invalid 'type' property.", ) @@ -260,7 +258,7 @@ describe('Precondition', () => { const invalidPrecondition = { type: 123, address: testAddress, - } as any + } as unknown as AnyPrecondition expect(() => createPrecondition(invalidPrecondition)).toThrow( "Invalid precondition object: missing or invalid 'type' property.", ) @@ -386,7 +384,7 @@ describe('Precondition', () => { const invalidPrecondition = { type: 'invalid-type', address: testAddress, - } as any + } as unknown as AnyPrecondition expect(() => createIntentPrecondition(invalidPrecondition)).toThrow('Invalid precondition type: invalid-type') }) diff --git a/packages/wallet/primitives/test/signature.test.ts b/packages/wallet/primitives/test/signature.test.ts index 8738b9bcf..e3261948a 100644 --- a/packages/wallet/primitives/test/signature.test.ts +++ b/packages/wallet/primitives/test/signature.test.ts @@ -14,7 +14,6 @@ import { FLAG_SIGNATURE_SAPIENT, FLAG_SIGNATURE_SAPIENT_COMPACT, RSY, - SignatureOfSignerLeafEthSign, SignatureOfSignerLeafHash, SignatureOfSignerLeafErc1271, SignatureOfSapientSignerLeaf, @@ -42,7 +41,7 @@ import { recover, } from '../src/signature.js' import { packRSY } from '../src/utils.js' -import { Config, SignerLeaf, SapientSignerLeaf } from '../src/config.js' +import { SignerLeaf, SapientSignerLeaf, SubdigestLeaf, Topology, NestedLeaf } from '../src/config.js' import * as Payload from '../src/payload.js' import { ChainId } from '../src/network.js' @@ -63,11 +62,6 @@ describe('Signature', () => { ...sampleRSY, } - const sampleEthSignSignature: SignatureOfSignerLeafEthSign = { - type: 'eth_sign', - ...sampleRSY, - } - const sampleErc1271Signature: SignatureOfSignerLeafErc1271 = { type: 'erc1271', address: testAddress, @@ -377,7 +371,7 @@ describe('Signature', () => { expect(result.nodes).toHaveLength(1) expect(result.leftover).toHaveLength(0) - const node = result.nodes[0] as any + const node = result.nodes[0] as SubdigestLeaf expect(node.type).toBe('subdigest') expect(node.digest).toBe(digest) }) @@ -517,7 +511,7 @@ describe('Signature', () => { }) it('should throw for invalid topology', () => { - expect(() => encodeTopology({} as any)).toThrow('Invalid topology') + expect(() => encodeTopology({} as Topology)).toThrow('Invalid topology') }) }) @@ -696,9 +690,9 @@ describe('Signature', () => { const signatureProvider = () => sampleHashSignature - const result = fillLeaves(nestedTopology, signatureProvider) - expect((result as any).type).toBe('nested') - expect((result as any).tree).toHaveProperty('signature') + const result = fillLeaves(nestedTopology, signatureProvider) as NestedLeaf + expect(result.type).toBe('nested') + expect(result.tree).toHaveProperty('signature') }) it('should handle topology without signatures', () => { @@ -751,12 +745,12 @@ describe('Signature', () => { const result = fillLeaves(binaryTree, signatureProvider) expect(Array.isArray(result)).toBe(true) - expect((result as any)[0]).toHaveProperty('signature') - expect((result as any)[1]).toHaveProperty('signature') + expect(result[0]).toHaveProperty('signature') + expect(result[1]).toHaveProperty('signature') }) it('should throw for invalid topology', () => { - expect(() => fillLeaves({} as any, () => undefined)).toThrow('Invalid topology') + expect(() => fillLeaves({} as Topology, () => undefined)).toThrow('Invalid topology') }) }) }) @@ -917,7 +911,7 @@ describe('Signature', () => { }, ] - signatures.forEach(({ topology, name }) => { + signatures.forEach(({ topology }) => { const signature = { noChainId: false, configuration: { @@ -1760,7 +1754,7 @@ describe('Signature', () => { }, ] - for (const { name, payload } of payloadTypes) { + for (const { payload } of payloadTypes) { const sapientSignature: RawSignature = { noChainId: false, configuration: { diff --git a/packages/wallet/primitives/test/utils.test.ts b/packages/wallet/primitives/test/utils.test.ts index 76ba462f0..dc8392c32 100644 --- a/packages/wallet/primitives/test/utils.test.ts +++ b/packages/wallet/primitives/test/utils.test.ts @@ -248,7 +248,7 @@ describe('Utils', () => { it('should revive Uint8Array values', () => { const reviver = createJSONReviver() - const result = reviver('test', { __uint8array: [1, 2, 3, 255] }) + const result = reviver('test', { __uint8array: [1, 2, 3, 255] }) as Uint8Array expect(result).toBeInstanceOf(Uint8Array) expect(Array.from(result)).toEqual([1, 2, 3, 255]) @@ -314,7 +314,7 @@ describe('Utils', () => { it('should handle empty Uint8Array', () => { const reviver = createJSONReviver() - const result = reviver('test', { __uint8array: [] }) + const result = reviver('test', { __uint8array: [] }) as Uint8Array expect(result).toBeInstanceOf(Uint8Array) expect(result.length).toBe(0) @@ -401,7 +401,7 @@ describe('Utils', () => { it('should deserialize objects with BigInt', () => { const json = '{"value":{"__bigint":"0x75bcd15"},"name":"test"}' - const result = fromJSON(json) + const result = fromJSON(json) as { value: bigint; name: string } expect(result.value).toBe(123456789n) expect(result.name).toBe('test') @@ -409,7 +409,7 @@ describe('Utils', () => { it('should deserialize objects with Uint8Array', () => { const json = '{"data":{"__uint8array":[1,2,3]},"name":"test"}' - const result = fromJSON(json) + const result = fromJSON(json) as { data: Uint8Array; name: string } expect(result.data).toBeInstanceOf(Uint8Array) expect(Array.from(result.data)).toEqual([1, 2, 3]) diff --git a/packages/wallet/wdk/eslint.config.js b/packages/wallet/wdk/eslint.config.js new file mode 100644 index 000000000..d10bbd1e9 --- /dev/null +++ b/packages/wallet/wdk/eslint.config.js @@ -0,0 +1,12 @@ +import { config as baseConfig } from '@repo/eslint-config/base' + +/** @type {import("eslint").Linter.Config} */ +export default [ + ...baseConfig, + { + // files: ['**/*.{test,spec}.ts'], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + }, + }, +] diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index d421f90e6..e1a3f330c 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -12,9 +12,10 @@ "dev": "tsc --watch", "test": "vitest run && npm run test:ssr", "test:coverage": "vitest run --coverage", - "test:ssr": "node test/test-ssr-safety.mjs", + "test:ssr": "node test/test-ssr-safety.js", "typecheck": "tsc --noEmit", - "clean": "rimraf dist" + "clean": "rimraf dist", + "lint": "eslint . --max-warnings 0" }, "exports": { ".": { @@ -23,6 +24,7 @@ } }, "devDependencies": { + "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "@vitest/coverage-v8": "^4.0.18", diff --git a/packages/wallet/wdk/src/dbs/auth-commitments.ts b/packages/wallet/wdk/src/dbs/auth-commitments.ts index a3f360639..721d73619 100644 --- a/packages/wallet/wdk/src/dbs/auth-commitments.ts +++ b/packages/wallet/wdk/src/dbs/auth-commitments.ts @@ -1,4 +1,4 @@ -import { Generic, Migration } from './generic.js' +import { Generic } from './generic.js' import { IDBPDatabase, IDBPTransaction } from 'idb' const TABLE_NAME = 'auth-commitments' diff --git a/packages/wallet/wdk/src/dbs/auth-keys.ts b/packages/wallet/wdk/src/dbs/auth-keys.ts index 4f851f0b3..690d18cd9 100644 --- a/packages/wallet/wdk/src/dbs/auth-keys.ts +++ b/packages/wallet/wdk/src/dbs/auth-keys.ts @@ -1,4 +1,4 @@ -import { Generic, Migration } from './generic.js' +import { Generic } from './generic.js' import { IDBPDatabase, IDBPTransaction } from 'idb' import type { WdkEnv } from '../env.js' diff --git a/packages/wallet/wdk/src/dbs/messages.ts b/packages/wallet/wdk/src/dbs/messages.ts index 8a076ea05..54459f06f 100644 --- a/packages/wallet/wdk/src/dbs/messages.ts +++ b/packages/wallet/wdk/src/dbs/messages.ts @@ -1,5 +1,5 @@ import { Message } from '../sequence/types/message-request.js' -import { Generic, Migration } from './generic.js' +import { Generic } from './generic.js' import { IDBPDatabase, IDBPTransaction } from 'idb' const TABLE_NAME = 'messages' diff --git a/packages/wallet/wdk/src/dbs/passkey-credentials.ts b/packages/wallet/wdk/src/dbs/passkey-credentials.ts index 9fdb2abc4..5e9e6bc31 100644 --- a/packages/wallet/wdk/src/dbs/passkey-credentials.ts +++ b/packages/wallet/wdk/src/dbs/passkey-credentials.ts @@ -1,4 +1,4 @@ -import { Generic, Migration } from './generic.js' +import { Generic } from './generic.js' import { IDBPDatabase, IDBPTransaction } from 'idb' import { Address } from 'ox' import { Extensions } from '@0xsequence/wallet-primitives' diff --git a/packages/wallet/wdk/src/dbs/recovery.ts b/packages/wallet/wdk/src/dbs/recovery.ts index 164c7082b..e035825f3 100644 --- a/packages/wallet/wdk/src/dbs/recovery.ts +++ b/packages/wallet/wdk/src/dbs/recovery.ts @@ -1,4 +1,4 @@ -import { Generic, Migration } from './generic.js' +import { Generic } from './generic.js' import { QueuedRecoveryPayload } from '../sequence/types/recovery.js' import { IDBPDatabase, IDBPTransaction } from 'idb' diff --git a/packages/wallet/wdk/src/dbs/signatures.ts b/packages/wallet/wdk/src/dbs/signatures.ts index a108d113c..3f7328187 100644 --- a/packages/wallet/wdk/src/dbs/signatures.ts +++ b/packages/wallet/wdk/src/dbs/signatures.ts @@ -1,5 +1,5 @@ import { BaseSignatureRequest } from '../sequence/index.js' -import { Generic, Migration } from './generic.js' +import { Generic } from './generic.js' import { IDBPDatabase, IDBPTransaction } from 'idb' const TABLE_NAME = 'envelopes' diff --git a/packages/wallet/wdk/src/dbs/transactions.ts b/packages/wallet/wdk/src/dbs/transactions.ts index d9019702d..48f7680c8 100644 --- a/packages/wallet/wdk/src/dbs/transactions.ts +++ b/packages/wallet/wdk/src/dbs/transactions.ts @@ -1,5 +1,5 @@ import { Transaction } from '../sequence/types/transaction-request.js' -import { Generic, Migration } from './generic.js' +import { Generic } from './generic.js' import { IDBPDatabase, IDBPTransaction } from 'idb' const TABLE_NAME = 'transactions' diff --git a/packages/wallet/wdk/src/dbs/wallets.ts b/packages/wallet/wdk/src/dbs/wallets.ts index bd9829eb5..4b1777610 100644 --- a/packages/wallet/wdk/src/dbs/wallets.ts +++ b/packages/wallet/wdk/src/dbs/wallets.ts @@ -1,4 +1,4 @@ -import { Generic, Migration } from './generic.js' +import { Generic } from './generic.js' import { Wallet } from '../sequence/types/wallet.js' import { IDBPDatabase, IDBPTransaction } from 'idb' diff --git a/packages/wallet/wdk/src/identity/signer.ts b/packages/wallet/wdk/src/identity/signer.ts index 0bd7162c9..0cb74bbbd 100644 --- a/packages/wallet/wdk/src/identity/signer.ts +++ b/packages/wallet/wdk/src/identity/signer.ts @@ -1,6 +1,6 @@ -import { Address, Signature, Hex, Bytes, PersonalMessage } from 'ox' +import { Address, Signature, Hex, Bytes } from 'ox' import { Signers, State, type CryptoLike } from '@0xsequence/wallet-core' -import { IdentityInstrument, KeyType } from '@0xsequence/identity-instrument' +import { IdentityInstrument } from '@0xsequence/identity-instrument' import { AuthKey } from '../dbs/auth-keys.js' import { Payload, Signature as SequenceSignature } from '@0xsequence/wallet-primitives' import * as Identity from '@0xsequence/identity-instrument' @@ -61,7 +61,7 @@ export class IdentitySigner implements Signers.Signer { } } - async witness(stateWriter: State.Writer, wallet: Address.Address, extra?: Object): Promise { + async witness(stateWriter: State.Writer, wallet: Address.Address, extra?: object): Promise { const payload = Payload.fromMessage( Hex.fromString( JSON.stringify({ diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts index 94d456d3e..f8f86d5af 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts @@ -1,4 +1,4 @@ -import { Hex, Address, Bytes } from 'ox' +import { Hex, Bytes } from 'ox' import { Handler } from './handler.js' import * as Db from '../../dbs/index.js' import { Signatures } from '../signatures.js' diff --git a/packages/wallet/wdk/src/sequence/handlers/devices.ts b/packages/wallet/wdk/src/sequence/handlers/devices.ts index 9da0f8971..4d525d37e 100644 --- a/packages/wallet/wdk/src/sequence/handlers/devices.ts +++ b/packages/wallet/wdk/src/sequence/handlers/devices.ts @@ -13,7 +13,7 @@ export class DevicesHandler implements Handler { private readonly devices: Devices, ) {} - onStatusChange(cb: () => void): () => void { + onStatusChange(_cb: () => void): () => void { return () => {} } diff --git a/packages/wallet/wdk/src/sequence/handlers/guard.ts b/packages/wallet/wdk/src/sequence/handlers/guard.ts index bbe8c2698..b495c95d8 100644 --- a/packages/wallet/wdk/src/sequence/handlers/guard.ts +++ b/packages/wallet/wdk/src/sequence/handlers/guard.ts @@ -35,7 +35,7 @@ export class GuardHandler implements Handler { this.onPromptCode = undefined } - onStatusChange(cb: () => void): () => void { + onStatusChange(_cb: () => void): () => void { return () => {} } @@ -87,8 +87,9 @@ export class GuardHandler implements Handler { address, handler: this, status: 'ready', - handle: () => - new Promise(async (resolve, reject) => { + handle: () => { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve, reject) => { try { const signature = await guard.signEnvelope(request.envelope) await this.signatures.addSignature(request.id, signature) @@ -106,7 +107,8 @@ export class GuardHandler implements Handler { reject(e) } } - }), + }) + }, } } } diff --git a/packages/wallet/wdk/src/sequence/handlers/identity.ts b/packages/wallet/wdk/src/sequence/handlers/identity.ts index 815c4d385..f03876a5b 100644 --- a/packages/wallet/wdk/src/sequence/handlers/identity.ts +++ b/packages/wallet/wdk/src/sequence/handlers/identity.ts @@ -1,4 +1,4 @@ -import { Hex, Bytes } from 'ox' +import { Hex } from 'ox' import * as Db from '../../dbs/index.js' import * as Identity from '@0xsequence/identity-instrument' import { Signatures } from '../signatures.js' diff --git a/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts b/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts index 143edc0cd..3d932a533 100644 --- a/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts +++ b/packages/wallet/wdk/src/sequence/handlers/mnemonic.ts @@ -93,8 +93,9 @@ export class MnemonicHandler implements Handler { handler: this, status: 'actionable', message: 'enter-mnemonic', - handle: () => - new Promise(async (resolve, reject) => { + handle: () => { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve, reject) => { const respond: RespondFn = async (mnemonic) => { const signer = MnemonicHandler.toSigner(mnemonic) if (!signer) { @@ -117,7 +118,8 @@ export class MnemonicHandler implements Handler { resolve(true) } await onPromptMnemonic(respond) - }), + }) + }, } } } diff --git a/packages/wallet/wdk/src/sequence/handlers/otp.ts b/packages/wallet/wdk/src/sequence/handlers/otp.ts index a4e7b750b..42bf85c9e 100644 --- a/packages/wallet/wdk/src/sequence/handlers/otp.ts +++ b/packages/wallet/wdk/src/sequence/handlers/otp.ts @@ -85,7 +85,7 @@ export class OtpHandler extends IdentityHandler implements Handler { try { await this.handleAuth(challenge, onPromptOtp) return true - } catch (e) { + } catch { return false } }, @@ -96,6 +96,7 @@ export class OtpHandler extends IdentityHandler implements Handler { challenge: Identity.OtpChallenge, onPromptOtp: PromptOtpHandler, ): Promise<{ signer: Signers.Signer & Signers.Witnessable; email: string }> { + // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { try { const { loginHint, challenge: codeChallenge } = await this.nitroCommitVerifier(challenge) diff --git a/packages/wallet/wdk/src/sequence/handlers/passkeys.ts b/packages/wallet/wdk/src/sequence/handlers/passkeys.ts index 7f1e5050a..17c3196ca 100644 --- a/packages/wallet/wdk/src/sequence/handlers/passkeys.ts +++ b/packages/wallet/wdk/src/sequence/handlers/passkeys.ts @@ -18,7 +18,7 @@ export class PasskeysHandler implements Handler { private readonly passkeyProvider: PasskeyProvider, ) {} - onStatusChange(cb: () => void): () => void { + onStatusChange(_cb: () => void): () => void { return () => {} } diff --git a/packages/wallet/wdk/src/sequence/handlers/recovery.ts b/packages/wallet/wdk/src/sequence/handlers/recovery.ts index 57921de72..9c0ca654d 100644 --- a/packages/wallet/wdk/src/sequence/handlers/recovery.ts +++ b/packages/wallet/wdk/src/sequence/handlers/recovery.ts @@ -76,7 +76,7 @@ export class RecoveryHandler implements Handler { return true }, } - } catch (e) { + } catch { return { address, handler: this, diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 783dfc201..5418dd65b 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -561,7 +561,7 @@ export class Manager { const ops = applyManagerOptionsDefaults(options) // Build relayers list - let relayers: Relayer.Relayer[] = [] + const relayers: Relayer.Relayer[] = [] // Add EIP-6963 relayers if enabled if (ops.multiInjectedProviderDiscovery) { diff --git a/packages/wallet/wdk/src/sequence/messages.ts b/packages/wallet/wdk/src/sequence/messages.ts index 131aae3b1..d8fe480c2 100644 --- a/packages/wallet/wdk/src/sequence/messages.ts +++ b/packages/wallet/wdk/src/sequence/messages.ts @@ -242,7 +242,7 @@ export class Messages implements MessagesInterface { const message = await this.getByMessageOrSignatureId(messageOrSignatureId) await this.shared.databases.signatures.del(message.signatureId) await this.shared.databases.messages.del(message.id) - } catch (error) { + } catch { // Ignore } } diff --git a/packages/wallet/wdk/src/sequence/signers.ts b/packages/wallet/wdk/src/sequence/signers.ts index c2002d2d9..64f9ff669 100644 --- a/packages/wallet/wdk/src/sequence/signers.ts +++ b/packages/wallet/wdk/src/sequence/signers.ts @@ -81,7 +81,9 @@ export class Signers { if (isWitnessExtraSignerKind(message)) { return toKnownKind(message.signerKind) } - } catch {} + } catch { + // ignore + } return undefined } diff --git a/packages/wallet/wdk/src/sequence/transactions.ts b/packages/wallet/wdk/src/sequence/transactions.ts index b06fadf76..26bf21d34 100644 --- a/packages/wallet/wdk/src/sequence/transactions.ts +++ b/packages/wallet/wdk/src/sequence/transactions.ts @@ -496,7 +496,7 @@ export class Transactions implements TransactionsInterface { let tx: Transaction | undefined try { tx = await this.get(transactionOrSignatureId) - } catch (e) { + } catch { // If not found, it might be a signature ID const signature = await this.shared.modules.signatures.get(transactionOrSignatureId) if (!signature) { diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index 04fb9586a..6cc4f9492 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -1,17 +1,16 @@ import { Wallet as CoreWallet, Envelope, Signers, State } from '@0xsequence/wallet-core' -import { Config, Constants, GenericTree, Payload, SessionConfig } from '@0xsequence/wallet-primitives' +import { Config, Constants, Payload } from '@0xsequence/wallet-primitives' import { Address, Hex, Provider, RpcTransport } from 'ox' import { AuthCommitment } from '../dbs/auth-commitments.js' import { AuthCodeHandler } from './handlers/authcode.js' import { MnemonicHandler } from './handlers/mnemonic.js' import { OtpHandler } from './handlers/otp.js' -import { ManagerOptionsDefaults, Shared } from './manager.js' +import { Shared } from './manager.js' import { Device } from './types/device.js' import { Action, Module } from './types/index.js' import { Kinds, SignerWithKind, WitnessExtraSignerKind } from './types/signer.js' import { Wallet, WalletSelectionUiHandler } from './types/wallet.js' import { PasskeysHandler } from './handlers/passkeys.js' -import { GuardRole } from './guards.js' import type { PasskeySigner } from './passkeys-provider.js' export type StartSignUpWithRedirectArgs = { @@ -418,17 +417,17 @@ function buildCappedTree(members: { address: Address.Address; imageHash?: Hex.He } as Config.NestedLeaf } -function buildCappedTreeFromTopology(weight: bigint, topology: Config.Topology): Config.Topology { - // We may optimize this for some topology types - // but it is not worth it, because the topology - // that we will use for prod won't be optimizable - return { - type: 'nested', - weight: weight, - threshold: weight, - tree: topology, - } -} +// function buildCappedTreeFromTopology(weight: bigint, topology: Config.Topology): Config.Topology { +// // We may optimize this for some topology types +// // but it is not worth it, because the topology +// // that we will use for prod won't be optimizable +// return { +// type: 'nested', +// weight: weight, +// threshold: weight, +// tree: topology, +// } +// } function toConfig( checkpoint: bigint, @@ -626,7 +625,7 @@ export class Wallets implements WalletsInterface { loginEmail?: string }> { switch (args.kind) { - case 'passkey': + case 'passkey': { const passkeySigner = await this.shared.passkeyProvider.create(this.shared.sequence.extensions, { stateProvider: this.shared.sequence.stateProvider, credentialName: args.name, @@ -639,8 +638,9 @@ export class Wallets implements WalletsInterface { signerKind: Kinds.LoginPasskey, }, } + } - case 'mnemonic': + case 'mnemonic': { const mnemonicSigner = MnemonicHandler.toSigner(args.mnemonic) if (!mnemonicSigner) { throw new Error('invalid-mnemonic') @@ -654,6 +654,7 @@ export class Wallets implements WalletsInterface { signerKind: Kinds.LoginMnemonic, }, } + } case 'email-otp': { const handler = this.shared.handlers.get(Kinds.LoginEmailOtp) as OtpHandler @@ -835,7 +836,7 @@ export class Wallets implements WalletsInterface { const sessionsGuardTopology = args.noGuard ? undefined : this.shared.modules.guards.topology('sessions') // Add modules - let modules: Module[] = [] + const modules: Module[] = [] if (!args.noSessionManager) { const identitySigners = [device.address] @@ -1044,8 +1045,6 @@ export class Wallets implements WalletsInterface { }) return requestId - } catch (error) { - throw error } finally { this.pendingMnemonicOrPasskeyLogin = undefined } @@ -1235,7 +1234,7 @@ export class Wallets implements WalletsInterface { return requestId } - async completeLogout(requestId: string, options?: { skipValidateSave?: boolean }) { + async completeLogout(requestId: string, _options?: { skipValidateSave?: boolean }) { const request = await this.shared.modules.signatures.get(requestId) const walletEntry = await this.shared.databases.manager.get(request.wallet) if (!walletEntry) { diff --git a/packages/wallet/wdk/test/authcode-pkce.test.ts b/packages/wallet/wdk/test/authcode-pkce.test.ts index c69e66d71..99e197c7f 100644 --- a/packages/wallet/wdk/test/authcode-pkce.test.ts +++ b/packages/wallet/wdk/test/authcode-pkce.test.ts @@ -1,5 +1,4 @@ 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.js' import { Signatures } from '../src/sequence/signatures.js' @@ -68,7 +67,7 @@ describe('AuthCodePkceHandler', () => { handler.setRedirectUri('https://example.com/auth/callback') // Mock inherited methods - vi.spyOn(handler as any, 'nitroCommitVerifier').mockImplementation(async (challenge) => { + vi.spyOn(handler as any, 'nitroCommitVerifier').mockImplementation(async () => { return { verifier: 'mock-verifier-code', loginHint: 'user@example.com', @@ -76,7 +75,7 @@ describe('AuthCodePkceHandler', () => { } }) - vi.spyOn(handler as any, 'nitroCompleteAuth').mockImplementation(async (challenge) => { + vi.spyOn(handler as any, 'nitroCompleteAuth').mockImplementation(async () => { return { signer: mockIdentitySigner, email: 'user@example.com', diff --git a/packages/wallet/wdk/test/authcode.test.ts b/packages/wallet/wdk/test/authcode.test.ts index f5930894d..a1c3be0e8 100644 --- a/packages/wallet/wdk/test/authcode.test.ts +++ b/packages/wallet/wdk/test/authcode.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { Address, Hex, Bytes } from 'ox' +import { Address, Hex } 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.js' @@ -45,8 +45,8 @@ class MockURLSearchParams { } } -// @ts-ignore - Override global URLSearchParams for testing -global.URLSearchParams = MockURLSearchParams as any +// Override global URLSearchParams for testing +globalThis.URLSearchParams = MockURLSearchParams as any // Mock dependencies with proper vi.fn() types const mockCommitVerifier = vi.fn() @@ -285,8 +285,7 @@ describe('AuthCodeHandler', () => { }) it('Should generate random state when not provided', async () => { - const result = await authCodeHandler.commitAuth('/target', false) - + await authCodeHandler.commitAuth('/target', false) const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.id).toBeDefined() expect(typeof commitmentCall.id).toBe('string') @@ -316,8 +315,7 @@ describe('AuthCodeHandler', () => { }) it('Should create commitment without signer', async () => { - const result = await authCodeHandler.commitAuth('/target', true) - + await authCodeHandler.commitAuth('/target', true) const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.signer).toBeUndefined() expect(commitmentCall.isSignUp).toBe(true) @@ -329,7 +327,7 @@ describe('AuthCodeHandler', () => { describe('completeAuth()', () => { it('Should complete auth flow with code and return signer', async () => { const authCode = 'test-auth-code-123' - const mockSigner = {} as IdentitySigner + // const mockSigner = {} as IdentitySigner const mockEmail = 'test@example.com' mockCommitVerifier.mockResolvedValueOnce(undefined) diff --git a/packages/wallet/wdk/test/constants.ts b/packages/wallet/wdk/test/constants.ts index 01dff3b50..855884c8b 100644 --- a/packages/wallet/wdk/test/constants.ts +++ b/packages/wallet/wdk/test/constants.ts @@ -7,6 +7,7 @@ import { Relayer } from '@0xsequence/relayer' import * as Db from '../src/dbs/index.js' import { Network } from '@0xsequence/wallet-primitives' +// eslint-disable-next-line turbo/no-undeclared-env-vars const envFile = process.env.CI ? '.env.test' : '.env.test.local' dotenvConfig({ path: envFile }) @@ -14,6 +15,7 @@ export const EMITTER_ADDRESS: Address.Address = '0xb7bE532959236170064cf099e1a33 export const EMITTER_ABI = Abi.from(['function explicitEmit()', 'function implicitEmit()']) // Environment variables +// eslint-disable-next-line turbo/no-undeclared-env-vars export const LOCAL_RPC_URL = process.env.LOCAL_RPC_URL || 'http://localhost:8545' let testIdCounter = 0 @@ -81,8 +83,8 @@ export function newRemoteManager( ? `_${remoteManagerOptions.tag}_testrun_${testIdCounter}` : `_testrun_${testIdCounter}` - let relayers: Relayer.Relayer[] = [] - let bundlers: Bundler.Bundler[] = [] + const relayers: Relayer.Relayer[] = [] + const bundlers: Bundler.Bundler[] = [] if (remoteManagerOptions.network.relayerPk) { const provider = 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 8614de6c2..ffb117c3f 100644 --- a/packages/wallet/wdk/test/guard.test.ts +++ b/packages/wallet/wdk/test/guard.test.ts @@ -5,7 +5,7 @@ import { Address, Bytes, Hex, TypedData } from 'ox' import { Config, Constants, Network, Payload } from '@0xsequence/wallet-primitives' import { Kinds } from '../src/sequence/types/signer.js' import { newManager } from './constants.js' -import { GuardRole, Guards } from '../src/sequence/guards.js' +import { Guards } from '../src/sequence/guards.js' // Mock fetch globally for guard API calls const mockFetch = vi.fn() @@ -16,8 +16,8 @@ describe('GuardHandler', () => { let guards: Guards let testWallet: Address.Address let testPayload: Payload.Payload - let testMessageDigest: Bytes.Bytes - let testMessage: Hex.Hex + let _testMessageDigest: Bytes.Bytes + let _testMessage: Hex.Hex beforeEach(async () => { vi.clearAllMocks() @@ -28,8 +28,8 @@ describe('GuardHandler', () => { testWallet = '0x1234567890123456789012345678901234567890' as Address.Address testPayload = Payload.fromMessage(Hex.fromString('Test message')) - testMessage = TypedData.encode(Payload.toTyped(testWallet, Network.ChainId.ARBITRUM, testPayload)) - testMessageDigest = Payload.hash(testWallet, Network.ChainId.ARBITRUM, testPayload) + _testMessage = TypedData.encode(Payload.toTyped(testWallet, Network.ChainId.ARBITRUM, testPayload)) + _testMessageDigest = Payload.hash(testWallet, Network.ChainId.ARBITRUM, testPayload) }) afterEach(async () => { diff --git a/packages/wallet/wdk/test/identity-signer.test.ts b/packages/wallet/wdk/test/identity-signer.test.ts index 9d62f5719..29403b028 100644 --- a/packages/wallet/wdk/test/identity-signer.test.ts +++ b/packages/wallet/wdk/test/identity-signer.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest' -import { Address, Bytes, Hex } from 'ox' +import { Address, Hex } from 'ox' import { Network, Payload } from '@0xsequence/wallet-primitives' import { IdentityInstrument, KeyType } from '@0xsequence/identity-instrument' import { State } from '@0xsequence/wallet-core' diff --git a/packages/wallet/wdk/test/otp.test.ts b/packages/wallet/wdk/test/otp.test.ts index f3ae45209..8229dd761 100644 --- a/packages/wallet/wdk/test/otp.test.ts +++ b/packages/wallet/wdk/test/otp.test.ts @@ -1,7 +1,7 @@ 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 { IdentityInstrument, IdentityType, KeyType } from '@0xsequence/identity-instrument' import { OtpHandler, PromptOtpHandler } from '../src/sequence/handlers/otp.js' import { Signatures } from '../src/sequence/signatures.js' import * as Db from '../src/dbs/index.js' diff --git a/packages/wallet/wdk/test/passkeys.test.ts b/packages/wallet/wdk/test/passkeys.test.ts index 199265822..e73d0f4e3 100644 --- a/packages/wallet/wdk/test/passkeys.test.ts +++ b/packages/wallet/wdk/test/passkeys.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { Address, Hex } from 'ox' import { Network, Payload } from '@0xsequence/wallet-primitives' -import { Signers, State } from '@0xsequence/wallet-core' +import { State } from '@0xsequence/wallet-core' import { Extensions } from '@0xsequence/wallet-primitives' import { PasskeysHandler } from '../src/sequence/handlers/passkeys.js' import { Signatures } from '../src/sequence/signatures.js' diff --git a/packages/wallet/wdk/test/recovery.test.ts b/packages/wallet/wdk/test/recovery.test.ts index 3ca6da075..ebaab9d3a 100644 --- a/packages/wallet/wdk/test/recovery.test.ts +++ b/packages/wallet/wdk/test/recovery.test.ts @@ -174,7 +174,7 @@ describe('Recovery', () => { const recoverySigner = request4.signers.find((s) => s.handler?.kind === 'recovery-extension') expect(recoverySigner).toBeDefined() expect(recoverySigner!.status).toBe('ready') - 1 + // Handle the recovery signer const result4 = await (recoverySigner as SignerReady).handle() expect(result4).toBeDefined() @@ -303,9 +303,9 @@ describe('Recovery', () => { }) // Set up mnemonic handler and sign the payload - let handledMnemonic2 = 0 + let _handledMnemonic2 = 0 const unregisterHandler = manager.registerMnemonicUI(async (respond) => { - handledMnemonic2++ + _handledMnemonic2++ await respond(mnemonic2) }) diff --git a/packages/wallet/wdk/test/sessions.test.ts b/packages/wallet/wdk/test/sessions.test.ts index 98a762d3e..aa6ad05b8 100644 --- a/packages/wallet/wdk/test/sessions.test.ts +++ b/packages/wallet/wdk/test/sessions.test.ts @@ -358,7 +358,7 @@ for (const extension of ALL_EXTENSIONS) { throw new Error('Failed to create pk store') } // Create the initial permissions - let explicitSession: ExplicitSession = { + const explicitSession: ExplicitSession = { type: 'explicit', sessionAddress: e.address, chainId, diff --git a/packages/wallet/wdk/test/test-ssr-safety.mjs b/packages/wallet/wdk/test/test-ssr-safety.js similarity index 50% rename from packages/wallet/wdk/test/test-ssr-safety.mjs rename to packages/wallet/wdk/test/test-ssr-safety.js index 55ef7723d..71eb36170 100644 --- a/packages/wallet/wdk/test/test-ssr-safety.mjs +++ b/packages/wallet/wdk/test/test-ssr-safety.js @@ -1,12 +1,13 @@ #!/usr/bin/env node +/* global console, process */ /** * 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 */ @@ -52,24 +53,25 @@ 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')) { + 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:') @@ -81,7 +83,7 @@ try { 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 @@ -98,83 +100,84 @@ 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)) { + 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 propValue = accessed[prop] - if (typeof propValue === 'object' && propValue !== null && depth < 2) { - await testExports(propValue, `${currentPath}.${prop}`, depth + 1) + 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}.${prop}: ${err.message}`) + errors.push(`${currentPath}[${i}]: ${err.message}`) } } } - } - } catch (err) { - if (err.message.includes('window') || err.message.includes('document')) { - errors.push(`${currentPath}: ${err.message}`) + } else { + // Test object properties recursively + await testExports(accessed, currentPath, depth + 1) } } - } 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') || + } 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}`) + 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...') @@ -191,43 +194,46 @@ if (!wdk) { } 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}`) + 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}`) + }) + } + } 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) { + // 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}`) } @@ -244,37 +250,37 @@ if (!wdk) { } 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}`) + 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}`) } @@ -290,7 +296,7 @@ if (errors.length === 0) { 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}`)) + warnings.slice(0, 5).forEach((warn) => console.log(` - ${warn}`)) if (warnings.length > 5) { console.log(` ... and ${warnings.length - 5} more`) } @@ -298,11 +304,11 @@ if (errors.length === 0) { process.exit(0) } else { console.log('\n❌ ERRORS FOUND:') - errors.forEach(err => console.log(` - ${err}`)) + 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}`)) + warnings.slice(0, 5).forEach((warn) => console.log(` - ${warn}`)) } process.exit(1) } diff --git a/packages/wallet/wdk/test/transactions.test.ts b/packages/wallet/wdk/test/transactions.test.ts index 910511e7a..cf31c973c 100644 --- a/packages/wallet/wdk/test/transactions.test.ts +++ b/packages/wallet/wdk/test/transactions.test.ts @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, it, vi } from 'vitest' +import { afterEach, describe, expect, it } from 'vitest' import { Manager, SignerActionable, @@ -522,12 +522,12 @@ describe('Transactions', () => { }) let transactionsList: Transaction[] = [] - let updateCount = 0 + let _updateCount = 0 // Use onTransactionsUpdate to verify list functionality const unsubscribe = manager.transactions.onTransactionsUpdate((txs) => { transactionsList = txs - updateCount++ + _updateCount++ }) // Initially should be empty diff --git a/packages/wallet/wdk/test/wallets.test.ts b/packages/wallet/wdk/test/wallets.test.ts index 99e71d73d..a5b26843c 100644 --- a/packages/wallet/wdk/test/wallets.test.ts +++ b/packages/wallet/wdk/test/wallets.test.ts @@ -73,9 +73,9 @@ describe('Wallets', () => { it('Should register and unregister wallet selector', async () => { manager = newManager() - let selectorCalls = 0 + let _selectorCalls = 0 const mockSelector = async () => { - selectorCalls++ + _selectorCalls++ return 'create-new' as const } @@ -160,7 +160,7 @@ describe('Wallets', () => { const mnemonic = Mnemonic.random(Mnemonic.english) // Create initial wallet - const firstWallet = await manager!.wallets.signUp({ + const _firstWallet = await manager!.wallets.signUp({ mnemonic, kind: 'mnemonic', noGuard: true, @@ -705,8 +705,8 @@ describe('Wallets', () => { it('Should trigger an update when a wallet is logged in', async () => { const manager = newManager() - - let wallet: any | undefined + // eslint-disable-next-line + let wallet: Address.Address | undefined let callbackCalls = 0 let unregisterCallback: (() => void) | undefined diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dedfa2290..f3a0e9843 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,6 +109,9 @@ importers: packages/services/api: devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -121,6 +124,9 @@ importers: packages/services/builder: devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -137,6 +143,9 @@ importers: specifier: ^0.9.17 version: 0.9.17(typescript@5.9.3)(zod@4.2.0) devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -162,6 +171,9 @@ importers: specifier: ^0.9.17 version: 0.9.17(typescript@5.9.3)(zod@4.2.0) devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -177,6 +189,9 @@ importers: packages/services/indexer: devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -189,6 +204,9 @@ importers: packages/services/marketplace: devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -201,6 +219,9 @@ importers: packages/services/metadata: devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -226,6 +247,9 @@ importers: specifier: ^2.40.3 version: 2.42.1(typescript@5.9.3)(zod@4.2.0) devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -241,6 +265,9 @@ importers: packages/services/userdata: devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -253,6 +280,9 @@ importers: packages/utils/abi: devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -284,6 +314,9 @@ importers: specifier: ^2.40.3 version: 2.42.1(typescript@5.9.3)(zod@4.2.0) devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -324,6 +357,9 @@ importers: specifier: ^0.9.17 version: 0.9.17(typescript@5.9.3)(zod@4.2.0) devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -355,6 +391,9 @@ importers: specifier: ^0.9.17 version: 0.9.17(typescript@5.9.3)(zod@4.2.0) devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config @@ -438,6 +477,9 @@ importers: specifier: ^13.0.0 version: 13.0.0 devDependencies: + '@repo/eslint-config': + specifier: workspace:^ + version: link:../../../repo/eslint-config '@repo/typescript-config': specifier: workspace:^ version: link:../../../repo/typescript-config diff --git a/repo/ui/eslint.config.mjs b/repo/ui/eslint.config.js similarity index 100% rename from repo/ui/eslint.config.mjs rename to repo/ui/eslint.config.js diff --git a/repo/ui/package.json b/repo/ui/package.json index f12625d46..670a81635 100644 --- a/repo/ui/package.json +++ b/repo/ui/package.json @@ -2,6 +2,7 @@ "name": "@repo/ui", "version": "0.0.1-beta.1", "private": true, + "type": "module", "exports": { "./button": "./src/button.tsx", "./card": "./src/card.tsx", diff --git a/turbo.json b/turbo.json index bf7b4423d..139d2ea57 100644 --- a/turbo.json +++ b/turbo.json @@ -26,6 +26,7 @@ "repo/**/*.tsx", "test/**/*.ts", "test/**/*.tsx", + "test/**/*.js", "test/**/*.mjs" ], "outputs": [] From 24a5fab68507e3988623d6d02531e92c046378e8 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 24 Feb 2026 12:30:16 +0100 Subject: [PATCH 094/144] 3.0.0-beta.19 --- .changeset/modern-views-write.md | 18 ++++++++++++ .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 +- 30 files changed, 148 insertions(+), 28 deletions(-) create mode 100644 .changeset/modern-views-write.md diff --git a/.changeset/modern-views-write.md b/.changeset/modern-views-write.md new file mode 100644 index 000000000..a70d6c154 --- /dev/null +++ b/.changeset/modern-views-write.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 +--- + +Final RC before 3.0.0 diff --git a/.changeset/pre.json b/.changeset/pre.json index 996831db9..e6c3e91ee 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -4,20 +4,20 @@ "initialVersions": { "docs": "0.1.0", "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.17", - "@0xsequence/builder": "3.0.0-beta.17", - "@0xsequence/guard": "3.0.0-beta.17", - "@0xsequence/identity-instrument": "3.0.0-beta.17", - "@0xsequence/indexer": "3.0.0-beta.17", - "@0xsequence/marketplace": "3.0.0-beta.17", - "@0xsequence/metadata": "3.0.0-beta.17", - "@0xsequence/relayer": "3.0.0-beta.17", - "@0xsequence/userdata": "3.0.0-beta.17", - "@0xsequence/abi": "3.0.0-beta.17", - "@0xsequence/wallet-core": "3.0.0-beta.17", - "@0xsequence/dapp-client": "3.0.0-beta.17", - "@0xsequence/wallet-primitives": "3.0.0-beta.17", - "@0xsequence/wallet-wdk": "3.0.0-beta.17", + "@0xsequence/api": "3.0.0-beta.18", + "@0xsequence/builder": "3.0.0-beta.18", + "@0xsequence/guard": "3.0.0-beta.18", + "@0xsequence/identity-instrument": "3.0.0-beta.18", + "@0xsequence/indexer": "3.0.0-beta.18", + "@0xsequence/marketplace": "3.0.0-beta.18", + "@0xsequence/metadata": "3.0.0-beta.18", + "@0xsequence/relayer": "3.0.0-beta.18", + "@0xsequence/userdata": "3.0.0-beta.18", + "@0xsequence/abi": "3.0.0-beta.18", + "@0xsequence/wallet-core": "3.0.0-beta.18", + "@0xsequence/dapp-client": "3.0.0-beta.18", + "@0xsequence/wallet-primitives": "3.0.0-beta.18", + "@0xsequence/wallet-wdk": "3.0.0-beta.18", "@repo/eslint-config": "0.0.1-beta.1", "@repo/typescript-config": "0.0.1-beta.1", "@repo/ui": "0.0.1-beta.1" @@ -32,6 +32,7 @@ "four-beds-stare", "free-tips-switch", "goofy-laws-serve", + "modern-views-write", "new-turkeys-double", "nice-tips-slide", "nine-areas-fall", diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 75c0ca6ca..761d84cf9 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 3295c97c8..698af864c 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.18", + "version": "3.0.0-beta.19", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 12c908ebf..ee715b236 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 105422139..07eca6023 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.18", + "version": "3.0.0-beta.19", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 21d8e5c44..931bccffe 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 42abb5114..5a9cf373d 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.18", + "version": "3.0.0-beta.19", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 9dca35590..4f193f9d2 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.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 9c3cdc1ed..b695e4710 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.18", + "version": "3.0.0-beta.19", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 94df6781f..1091b1777 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 43ca8f194..03dc328cd 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.18", + "version": "3.0.0-beta.19", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index b625d5ae0..0af122d3e 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 49660e8d0..cced49f58 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.18", + "version": "3.0.0-beta.19", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index ce2207ecb..efff94d5b 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 5ba7eb0f9..52583541a 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.18", + "version": "3.0.0-beta.19", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 1651e8c78..8f4fbbf98 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.0-beta.19 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 2380a8d6d..079fe9979 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.18", + "version": "3.0.0-beta.19", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index c9bb0b53b..2fad59d85 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index a05293399..60483871d 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.18", + "version": "3.0.0-beta.19", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 9adb0382f..d7f258669 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 5f7498b1f..b5b00a94b 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.18", + "version": "3.0.0-beta.19", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 5796907e8..9d4dd02b2 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.19 + - @0xsequence/relayer@3.0.0-beta.19 + - @0xsequence/wallet-primitives@3.0.0-beta.19 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 061debb92..fec693b90 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.18", + "version": "3.0.0-beta.19", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 7fc8f313d..fd18e0bf4 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.19 + +### Patch Changes + +- Final RC before 3.0.0 +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.19 + - @0xsequence/relayer@3.0.0-beta.19 + - @0xsequence/wallet-core@3.0.0-beta.19 + - @0xsequence/wallet-primitives@3.0.0-beta.19 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 8661be53f..9f2447102 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.18", + "version": "3.0.0-beta.19", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index d6f800a8c..8ecc6df9b 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index e25aa0791..71fcf20cb 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.18", + "version": "3.0.0-beta.19", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 07e91e3b7..2d4d5eaa5 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.0-beta.19 + +### Patch Changes + +- Final RC before 3.0.0 +- Updated dependencies + - @0xsequence/guard@3.0.0-beta.19 + - @0xsequence/identity-instrument@3.0.0-beta.19 + - @0xsequence/relayer@3.0.0-beta.19 + - @0xsequence/wallet-core@3.0.0-beta.19 + - @0xsequence/wallet-primitives@3.0.0-beta.19 + ## 3.0.0-beta.18 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index e1a3f330c..44997822a 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.18", + "version": "3.0.0-beta.19", "license": "Apache-2.0", "type": "module", "publishConfig": { From 18f771000878c5e568cdb86c578bb8c82cb010a9 Mon Sep 17 00:00:00 2001 From: 0xsequence-bot <50996415+0xsequence-bot@users.noreply.github.com> Date: Tue, 3 Mar 2026 14:59:26 -0500 Subject: [PATCH 095/144] [AUTOMATED] Update: proto/clients/indexer*.gen.ts (#973) Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> --- packages/services/indexer/src/indexer.gen.ts | 9 +++++++-- packages/services/indexer/src/indexergw.gen.ts | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/services/indexer/src/indexer.gen.ts b/packages/services/indexer/src/indexer.gen.ts index 97d3d2472..354ce47e2 100644 --- a/packages/services/indexer/src/indexer.gen.ts +++ b/packages/services/indexer/src/indexer.gen.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// sequence-indexer v0.4.0 caf5c4c3677ac2dce41858dce7cd727a7810845f +// sequence-indexer v0.4.0 2bca559c4c590bce7d70c33df115a58399efec82 // -- // Code generated by Webrpc-gen@v0.31.2 with typescript generator. DO NOT EDIT. // @@ -12,7 +12,7 @@ export const WebrpcVersion = 'v1' export const WebrpcSchemaVersion = 'v0.4.0' // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = 'caf5c4c3677ac2dce41858dce7cd727a7810845f' +export const WebrpcSchemaHash = '2bca559c4c590bce7d70c33df115a58399efec82' // // Client interface @@ -359,6 +359,11 @@ export interface Asset { updatedAt?: string } +export enum BackupMode { + INCREMENTAL = 'INCREMENTAL', + COMPLETE = 'COMPLETE' +} + export interface BloomStats { hitRatio: string falsePositivesPercent: string diff --git a/packages/services/indexer/src/indexergw.gen.ts b/packages/services/indexer/src/indexergw.gen.ts index 729d04cdc..618a50217 100644 --- a/packages/services/indexer/src/indexergw.gen.ts +++ b/packages/services/indexer/src/indexergw.gen.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// sequence-indexer v0.4.0 b978d153702d614d5f1b9c98ff7f2e5857cccfd6 +// sequence-indexer v0.4.0 212120aad9a46e88ead9a2183c5717e9902d8c2b // -- // Code generated by Webrpc-gen@v0.31.2 with typescript generator. DO NOT EDIT. // @@ -12,7 +12,7 @@ export const WebrpcVersion = 'v1' export const WebrpcSchemaVersion = 'v0.4.0' // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = 'b978d153702d614d5f1b9c98ff7f2e5857cccfd6' +export const WebrpcSchemaHash = '212120aad9a46e88ead9a2183c5717e9902d8c2b' // // Client interface @@ -132,6 +132,11 @@ export interface Asset { updatedAt?: string } +export enum BackupMode { + INCREMENTAL = 'INCREMENTAL', + COMPLETE = 'COMPLETE' +} + export interface BloomStats { hitRatio: string falsePositivesPercent: string From 9e8ed384beef78bec31632e4eeb22764cafa8736 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Wed, 4 Mar 2026 16:01:53 +0100 Subject: [PATCH 096/144] 3.0.0 --- .changeset/all-rings-bow.md | 18 ------- .changeset/brave-papayas-join.md | 18 ------- .changeset/bright-pots-hope.md | 18 ------- .changeset/chilly-hands-carry.md | 18 ------- .changeset/crisp-zoos-retire.md | 18 ------- .changeset/cyan-radios-relax.md | 18 ------- .changeset/four-beds-stare.md | 18 ------- .changeset/free-tips-switch.md | 18 ------- .changeset/goofy-laws-serve.md | 21 -------- .changeset/modern-views-write.md | 18 ------- .changeset/new-turkeys-double.md | 18 ------- .changeset/nice-tips-slide.md | 18 ------- .changeset/nine-areas-fall.md | 18 ------- .changeset/open-toes-marry.md | 20 -------- .changeset/plain-feet-stare.md | 17 ------- .changeset/pre.json | 46 ----------------- .changeset/smart-cups-exist.md | 18 ------- .changeset/tiny-files-chew.md | 18 ------- .changeset/wild-feet-carry.md | 17 ------- .changeset/wise-heads-buy.md | 17 ------- packages/services/api/CHANGELOG.md | 25 ++++++++++ packages/services/api/package.json | 2 +- packages/services/builder/CHANGELOG.md | 25 ++++++++++ packages/services/builder/package.json | 2 +- packages/services/guard/CHANGELOG.md | 25 ++++++++++ packages/services/guard/package.json | 2 +- .../services/identity-instrument/CHANGELOG.md | 25 ++++++++++ .../services/identity-instrument/package.json | 2 +- packages/services/indexer/CHANGELOG.md | 25 ++++++++++ packages/services/indexer/package.json | 2 +- packages/services/marketplace/CHANGELOG.md | 25 ++++++++++ packages/services/marketplace/package.json | 2 +- packages/services/metadata/CHANGELOG.md | 25 ++++++++++ packages/services/metadata/package.json | 2 +- packages/services/relayer/CHANGELOG.md | 46 +++++++++++++++++ packages/services/relayer/package.json | 2 +- packages/services/userdata/CHANGELOG.md | 21 ++++++++ packages/services/userdata/package.json | 2 +- packages/utils/abi/CHANGELOG.md | 25 ++++++++++ packages/utils/abi/package.json | 2 +- packages/wallet/core/CHANGELOG.md | 48 ++++++++++++++++++ packages/wallet/core/package.json | 2 +- packages/wallet/dapp-client/CHANGELOG.md | 49 ++++++++++++++++++ packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives/CHANGELOG.md | 25 ++++++++++ packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/CHANGELOG.md | 50 +++++++++++++++++++ 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 +- 54 files changed, 477 insertions(+), 407 deletions(-) delete mode 100644 .changeset/all-rings-bow.md delete mode 100644 .changeset/brave-papayas-join.md delete mode 100644 .changeset/bright-pots-hope.md delete mode 100644 .changeset/chilly-hands-carry.md delete mode 100644 .changeset/crisp-zoos-retire.md delete mode 100644 .changeset/cyan-radios-relax.md delete mode 100644 .changeset/four-beds-stare.md delete mode 100644 .changeset/free-tips-switch.md delete mode 100644 .changeset/goofy-laws-serve.md delete mode 100644 .changeset/modern-views-write.md delete mode 100644 .changeset/new-turkeys-double.md delete mode 100644 .changeset/nice-tips-slide.md delete mode 100644 .changeset/nine-areas-fall.md delete mode 100644 .changeset/open-toes-marry.md delete mode 100644 .changeset/plain-feet-stare.md delete mode 100644 .changeset/pre.json delete mode 100644 .changeset/smart-cups-exist.md delete mode 100644 .changeset/tiny-files-chew.md delete mode 100644 .changeset/wild-feet-carry.md delete mode 100644 .changeset/wise-heads-buy.md diff --git a/.changeset/all-rings-bow.md b/.changeset/all-rings-bow.md deleted file mode 100644 index 402bc8aee..000000000 --- a/.changeset/all-rings-bow.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@0xsequence/api': patch -'@0xsequence/builder': patch -'@0xsequence/guard': patch -'@0xsequence/identity-instrument': patch -'@0xsequence/indexer': patch -'@0xsequence/marketplace': patch -'@0xsequence/metadata': patch -'@0xsequence/relayer': patch -'@0xsequence/userdata': patch -'@0xsequence/abi': patch -'@0xsequence/wallet-core': patch -'@0xsequence/dapp-client': patch -'@0xsequence/wallet-primitives': patch -'@0xsequence/wallet-wdk': patch ---- - -ethauth support diff --git a/.changeset/brave-papayas-join.md b/.changeset/brave-papayas-join.md deleted file mode 100644 index bd37b6ba8..000000000 --- a/.changeset/brave-papayas-join.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@0xsequence/api': patch -'@0xsequence/builder': patch -'@0xsequence/guard': patch -'@0xsequence/identity-instrument': patch -'@0xsequence/indexer': patch -'@0xsequence/marketplace': patch -'@0xsequence/metadata': patch -'@0xsequence/relayer': patch -'@0xsequence/userdata': patch -'@0xsequence/abi': patch -'@0xsequence/wallet-core': patch -'@0xsequence/dapp-client': patch -'@0xsequence/wallet-primitives': patch -'@0xsequence/wallet-wdk': patch ---- - -New chains, minor fixes diff --git a/.changeset/bright-pots-hope.md b/.changeset/bright-pots-hope.md deleted file mode 100644 index 6bd9a887c..000000000 --- a/.changeset/bright-pots-hope.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -Beta release with dapp connector fixes diff --git a/.changeset/chilly-hands-carry.md b/.changeset/chilly-hands-carry.md deleted file mode 100644 index 82086927c..000000000 --- a/.changeset/chilly-hands-carry.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@0xsequence/api': patch -'@0xsequence/builder': patch -'@0xsequence/guard': patch -'@0xsequence/identity-instrument': patch -'@0xsequence/indexer': patch -'@0xsequence/marketplace': patch -'@0xsequence/metadata': patch -'@0xsequence/relayer': patch -'@0xsequence/userdata': patch -'@0xsequence/abi': patch -'@0xsequence/wallet-core': patch -'@0xsequence/dapp-client': patch -'@0xsequence/wallet-primitives': patch -'@0xsequence/wallet-wdk': patch ---- - -New chains, relayer rpc fix diff --git a/.changeset/crisp-zoos-retire.md b/.changeset/crisp-zoos-retire.md deleted file mode 100644 index 84fd2a25c..000000000 --- a/.changeset/crisp-zoos-retire.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -dapp-client updates diff --git a/.changeset/cyan-radios-relax.md b/.changeset/cyan-radios-relax.md deleted file mode 100644 index ec408d6cd..000000000 --- a/.changeset/cyan-radios-relax.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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/four-beds-stare.md b/.changeset/four-beds-stare.md deleted file mode 100644 index 05d79c07d..000000000 --- a/.changeset/four-beds-stare.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -multicall3 optimization diff --git a/.changeset/free-tips-switch.md b/.changeset/free-tips-switch.md deleted file mode 100644 index 0921b6d35..000000000 --- a/.changeset/free-tips-switch.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -3.0.0 beta diff --git a/.changeset/goofy-laws-serve.md b/.changeset/goofy-laws-serve.md deleted file mode 100644 index 690a5f76b..000000000 --- a/.changeset/goofy-laws-serve.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -'@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/modern-views-write.md b/.changeset/modern-views-write.md deleted file mode 100644 index a70d6c154..000000000 --- a/.changeset/modern-views-write.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -Final RC before 3.0.0 diff --git a/.changeset/new-turkeys-double.md b/.changeset/new-turkeys-double.md deleted file mode 100644 index 72f26beb9..000000000 --- a/.changeset/new-turkeys-double.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -Apple auth fixes diff --git a/.changeset/nice-tips-slide.md b/.changeset/nice-tips-slide.md deleted file mode 100644 index 1595123e7..000000000 --- a/.changeset/nice-tips-slide.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -Apple auth fix diff --git a/.changeset/nine-areas-fall.md b/.changeset/nine-areas-fall.md deleted file mode 100644 index 8495b8a5c..000000000 --- a/.changeset/nine-areas-fall.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -Userdata service updates diff --git a/.changeset/open-toes-marry.md b/.changeset/open-toes-marry.md deleted file mode 100644 index ec5bf3217..000000000 --- a/.changeset/open-toes-marry.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -'@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/plain-feet-stare.md b/.changeset/plain-feet-stare.md deleted file mode 100644 index c99c82026..000000000 --- a/.changeset/plain-feet-stare.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@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 deleted file mode 100644 index e6c3e91ee..000000000 --- a/.changeset/pre.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "mode": "exit", - "tag": "beta", - "initialVersions": { - "docs": "0.1.0", - "web": "0.1.0", - "@0xsequence/api": "3.0.0-beta.18", - "@0xsequence/builder": "3.0.0-beta.18", - "@0xsequence/guard": "3.0.0-beta.18", - "@0xsequence/identity-instrument": "3.0.0-beta.18", - "@0xsequence/indexer": "3.0.0-beta.18", - "@0xsequence/marketplace": "3.0.0-beta.18", - "@0xsequence/metadata": "3.0.0-beta.18", - "@0xsequence/relayer": "3.0.0-beta.18", - "@0xsequence/userdata": "3.0.0-beta.18", - "@0xsequence/abi": "3.0.0-beta.18", - "@0xsequence/wallet-core": "3.0.0-beta.18", - "@0xsequence/dapp-client": "3.0.0-beta.18", - "@0xsequence/wallet-primitives": "3.0.0-beta.18", - "@0xsequence/wallet-wdk": "3.0.0-beta.18", - "@repo/eslint-config": "0.0.1-beta.1", - "@repo/typescript-config": "0.0.1-beta.1", - "@repo/ui": "0.0.1-beta.1" - }, - "changesets": [ - "all-rings-bow", - "brave-papayas-join", - "bright-pots-hope", - "chilly-hands-carry", - "crisp-zoos-retire", - "cyan-radios-relax", - "four-beds-stare", - "free-tips-switch", - "goofy-laws-serve", - "modern-views-write", - "new-turkeys-double", - "nice-tips-slide", - "nine-areas-fall", - "open-toes-marry", - "plain-feet-stare", - "smart-cups-exist", - "tiny-files-chew", - "wild-feet-carry", - "wise-heads-buy" - ] -} diff --git a/.changeset/smart-cups-exist.md b/.changeset/smart-cups-exist.md deleted file mode 100644 index 556adcbbd..000000000 --- a/.changeset/smart-cups-exist.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -Relayer fee options fix diff --git a/.changeset/tiny-files-chew.md b/.changeset/tiny-files-chew.md deleted file mode 100644 index 672546fd0..000000000 --- a/.changeset/tiny-files-chew.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@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 ---- - -dapp client updates for EOA login diff --git a/.changeset/wild-feet-carry.md b/.changeset/wild-feet-carry.md deleted file mode 100644 index 962942831..000000000 --- a/.changeset/wild-feet-carry.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@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/.changeset/wise-heads-buy.md b/.changeset/wise-heads-buy.md deleted file mode 100644 index 1c35a4d35..000000000 --- a/.changeset/wise-heads-buy.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@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 761d84cf9..61bd11b9a 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,30 @@ # @0xsequence/api +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 698af864c..0d4b988b2 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.19", + "version": "3.0.0", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index ee715b236..a7a4c60d7 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,30 @@ # @0xsequence/builder +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 07eca6023..1aae80372 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.19", + "version": "3.0.0", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 931bccffe..4aa7f3b08 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,30 @@ # @0xsequence/guard +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 5a9cf373d..e9e66b91e 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.19", + "version": "3.0.0", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 4f193f9d2..46667619b 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,30 @@ # @0xsequence/identity-instrument +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index b695e4710..db656ed54 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.19", + "version": "3.0.0", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 1091b1777..17f499fa5 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,30 @@ # @0xsequence/indexer +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 03dc328cd..c8629dc36 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.19", + "version": "3.0.0", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 0af122d3e..321e03b85 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,30 @@ # @0xsequence/marketplace +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index cced49f58..39c6be2b6 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.19", + "version": "3.0.0", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index efff94d5b..ca7f29c5d 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,30 @@ # @0xsequence/metadata +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 52583541a..d700c0630 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.19", + "version": "3.0.0", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 8f4fbbf98..c718a845d 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,51 @@ # @0xsequence/relayer +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade +- Updated dependencies [f68be62] +- Updated dependencies [49d8a2f] +- Updated dependencies [3411232] +- Updated dependencies [23cb9e9] +- Updated dependencies [f5f6a7a] +- Updated dependencies [e7de3b1] +- Updated dependencies [493836f] +- Updated dependencies [30e1f1a] +- Updated dependencies [d5017e8] +- Updated dependencies [24a5fab] +- Updated dependencies [e5e1a03] +- Updated dependencies [0b63113] +- Updated dependencies [a89134a] +- Updated dependencies [7c6c811] +- Updated dependencies +- Updated dependencies [98ce38b] +- Updated dependencies [747e6b5] +- Updated dependencies [40c19ff] +- Updated dependencies [6d5de25] +- Updated dependencies [934acd1] + - @0xsequence/wallet-primitives@3.0.0 + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 079fe9979..ab7f8d8cb 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.19", + "version": "3.0.0", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 2fad59d85..abea2c174 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,26 @@ # @0xsequence/userdata +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 3.0.0 release +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 60483871d..6cef1fe59 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.19", + "version": "3.0.0", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index d7f258669..25e7590b4 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,30 @@ # @0xsequence/abi +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index b5b00a94b..4efa48abe 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.19", + "version": "3.0.0", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 9d4dd02b2..be05bec0b 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,53 @@ # @0xsequence/wallet-core +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade +- Updated dependencies [f68be62] +- Updated dependencies [49d8a2f] +- Updated dependencies [3411232] +- Updated dependencies [23cb9e9] +- Updated dependencies [f5f6a7a] +- Updated dependencies [e7de3b1] +- Updated dependencies [493836f] +- Updated dependencies [30e1f1a] +- Updated dependencies [d5017e8] +- Updated dependencies [24a5fab] +- Updated dependencies [e5e1a03] +- Updated dependencies [0b63113] +- Updated dependencies [a89134a] +- Updated dependencies [7c6c811] +- Updated dependencies +- Updated dependencies [98ce38b] +- Updated dependencies [747e6b5] +- Updated dependencies [40c19ff] +- Updated dependencies [6d5de25] +- Updated dependencies [934acd1] + - @0xsequence/guard@3.0.0 + - @0xsequence/relayer@3.0.0 + - @0xsequence/wallet-primitives@3.0.0 + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index fec693b90..a5ced0086 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.19", + "version": "3.0.0", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index fd18e0bf4..92d9641ed 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,54 @@ # @0xsequence/dapp-client +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade +- Updated dependencies [f68be62] +- Updated dependencies [49d8a2f] +- Updated dependencies [3411232] +- Updated dependencies [23cb9e9] +- Updated dependencies [f5f6a7a] +- Updated dependencies [e7de3b1] +- Updated dependencies [493836f] +- Updated dependencies [30e1f1a] +- Updated dependencies [d5017e8] +- Updated dependencies [24a5fab] +- Updated dependencies [e5e1a03] +- Updated dependencies [0b63113] +- Updated dependencies [a89134a] +- Updated dependencies [7c6c811] +- Updated dependencies +- Updated dependencies [98ce38b] +- Updated dependencies [747e6b5] +- Updated dependencies [40c19ff] +- Updated dependencies [6d5de25] +- Updated dependencies [934acd1] + - @0xsequence/guard@3.0.0 + - @0xsequence/relayer@3.0.0 + - @0xsequence/wallet-core@3.0.0 + - @0xsequence/wallet-primitives@3.0.0 + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 9f2447102..afe59a0bc 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.19", + "version": "3.0.0", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 8ecc6df9b..200be5102 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,30 @@ # @0xsequence/wallet-primitives +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 71fcf20cb..df6e52100 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.19", + "version": "3.0.0", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 2d4d5eaa5..81522e3a4 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,55 @@ # @0xsequence/wallet-wdk +## 3.0.0 + +### Patch Changes + +- f68be62: ethauth support +- 49d8a2f: New chains, minor fixes +- 3411232: Beta release with dapp connector fixes +- 23cb9e9: New chains, relayer rpc fix +- f5f6a7a: dapp-client updates +- e7de3b1: Fix signer 404 error, minor fixes +- 493836f: multicall3 optimization +- 30e1f1a: 3.0.0 beta +- d5017e8: Beta release for v3 +- 24a5fab: Final RC before 3.0.0 +- e5e1a03: Apple auth fixes +- 0b63113: Apple auth fix +- a89134a: Userdata service updates +- 7c6c811: 3.0.0-beta.3 with fixes +- 3.0.0 release +- 98ce38b: 3.0.0-beta.2 with identity instrument updates +- 747e6b5: Relayer fee options fix +- 40c19ff: dapp client updates for EOA login +- 6d5de25: 3.0.0-beta.1 +- 934acd1: RC5 upgrade +- Updated dependencies [f68be62] +- Updated dependencies [49d8a2f] +- Updated dependencies [3411232] +- Updated dependencies [23cb9e9] +- Updated dependencies [f5f6a7a] +- Updated dependencies [e7de3b1] +- Updated dependencies [493836f] +- Updated dependencies [30e1f1a] +- Updated dependencies [d5017e8] +- Updated dependencies [24a5fab] +- Updated dependencies [e5e1a03] +- Updated dependencies [0b63113] +- Updated dependencies [a89134a] +- Updated dependencies [7c6c811] +- Updated dependencies +- Updated dependencies [98ce38b] +- Updated dependencies [747e6b5] +- Updated dependencies [40c19ff] +- Updated dependencies [6d5de25] +- Updated dependencies [934acd1] + - @0xsequence/guard@3.0.0 + - @0xsequence/identity-instrument@3.0.0 + - @0xsequence/relayer@3.0.0 + - @0xsequence/wallet-core@3.0.0 + - @0xsequence/wallet-primitives@3.0.0 + ## 3.0.0-beta.19 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 44997822a..15a8a75cc 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.19", + "version": "3.0.0", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/repo/eslint-config/CHANGELOG.md b/repo/eslint-config/CHANGELOG.md index ddc6085a8..2df72f2e7 100644 --- a/repo/eslint-config/CHANGELOG.md +++ b/repo/eslint-config/CHANGELOG.md @@ -1,5 +1,12 @@ # @repo/eslint-config +## 0.0.1 + +### Patch Changes + +- d5017e8: Beta release for v3 +- 7c6c811: 3.0.0-beta.3 with fixes + ## 0.0.1-beta.1 ### Patch Changes diff --git a/repo/eslint-config/package.json b/repo/eslint-config/package.json index 5625bc699..9c38b6988 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.1", + "version": "0.0.1", "type": "module", "private": true, "exports": { diff --git a/repo/typescript-config/CHANGELOG.md b/repo/typescript-config/CHANGELOG.md index 611dc70b2..3e5ecbabf 100644 --- a/repo/typescript-config/CHANGELOG.md +++ b/repo/typescript-config/CHANGELOG.md @@ -1,5 +1,12 @@ # @repo/typescript-config +## 0.0.1 + +### Patch Changes + +- d5017e8: Beta release for v3 +- 7c6c811: 3.0.0-beta.3 with fixes + ## 0.0.1-beta.1 ### Patch Changes diff --git a/repo/typescript-config/package.json b/repo/typescript-config/package.json index cb34e9260..ed931bce6 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.1", + "version": "0.0.1", "private": true, "license": "MIT", "publishConfig": { diff --git a/repo/ui/CHANGELOG.md b/repo/ui/CHANGELOG.md index 8994e0294..232f9accb 100644 --- a/repo/ui/CHANGELOG.md +++ b/repo/ui/CHANGELOG.md @@ -1,5 +1,12 @@ # @repo/ui +## 0.0.1 + +### Patch Changes + +- d5017e8: Beta release for v3 +- 7c6c811: 3.0.0-beta.3 with fixes + ## 0.0.1-beta.1 ### Patch Changes diff --git a/repo/ui/package.json b/repo/ui/package.json index 670a81635..f0045e54d 100644 --- a/repo/ui/package.json +++ b/repo/ui/package.json @@ -1,6 +1,6 @@ { "name": "@repo/ui", - "version": "0.0.1-beta.1", + "version": "0.0.1", "private": true, "type": "module", "exports": { From 09bd0aa2184509e8157f9cc3926c51f65242daed Mon Sep 17 00:00:00 2001 From: Tolgahan Date: Thu, 5 Mar 2026 14:01:38 +0300 Subject: [PATCH 097/144] fix: Base network title --- packages/wallet/primitives/src/network.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index b176db084..4f1e8a8de 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -457,7 +457,7 @@ export const ALL: Network[] = [ chainId: ChainId.BASE, type: NetworkType.MAINNET, name: 'base', - title: 'Base (Coinbase)', + title: 'Base', rpcUrl: getRpcUrl('base'), logoUrl: getLogoUrl(ChainId.BASE), blockExplorer: { @@ -1173,7 +1173,6 @@ export const ALL: Network[] = [ decimals: 18, }, }, - ] function getRpcUrl(networkName: string): string { From 6da5f9b80874fa5ef11827cfb5dec16318873841 Mon Sep 17 00:00:00 2001 From: Michael Standen Date: Sat, 7 Mar 2026 00:20:30 +1300 Subject: [PATCH 098/144] Fix handling for multiple explicit signers (#975) * Update test names * Fix handling for multiple explicit signers --- .../core/src/signers/session-manager.ts | 107 +++++-- .../core/src/signers/session/explicit.ts | 8 +- .../core/src/signers/session/session.ts | 12 +- packages/wallet/core/test/constants.ts | 2 + .../wallet/core/test/session-manager.test.ts | 294 +++++++++++++++++- 5 files changed, 387 insertions(+), 36 deletions(-) diff --git a/packages/wallet/core/src/signers/session-manager.ts b/packages/wallet/core/src/signers/session-manager.ts index ef3d81b3a..6b23cb7a6 100644 --- a/packages/wallet/core/src/signers/session-manager.ts +++ b/packages/wallet/core/src/signers/session-manager.ts @@ -18,6 +18,7 @@ import { SessionSigner, SessionSignerInvalidReason, isImplicitSessionSigner, + isIncrementCall, UsageLimit, } from './session/index.js' @@ -130,21 +131,16 @@ 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 identitySigners = SessionConfig.getIdentitySigners(topology) - if (identitySigners.length === 0) { - throw new Error('Identity signers not found') - } - - // Prioritize implicit signers - const availableSigners = [...this._implicitSigners, ...this._explicitSigners] - if (availableSigners.length === 0) { - throw new Error('No signers match the topology') - } - - // Find supported signers for each call + /** + * Find one signer per call from the given candidate list (first that supports each call). + */ + private async findSignersForCallsWithCandidates( + wallet: Address.Address, + chainId: number, + calls: Payload.Call[], + topology: SessionConfig.SessionsTopology, + availableSigners: SessionSigner[], + ): Promise { const signers: SessionSigner[] = [] for (const call of calls) { let supported = false @@ -173,9 +169,67 @@ 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. ` + `Call: to=${call.to}, data=${call.data}, value=${call.value}, `, - ) + throw new Error(`No signer supported for call. Call: to=${call.to}, data=${call.data}, value=${call.value}, `) + } + } + return signers + } + + async findSignersForCalls(wallet: Address.Address, chainId: number, calls: Payload.Call[]): Promise { + const topology = await this.topology + const identitySigners = SessionConfig.getIdentitySigners(topology) + if (identitySigners.length === 0) { + throw new Error('Identity signers not found') + } + + const availableSigners = [...this._implicitSigners, ...this._explicitSigners] + if (availableSigners.length === 0) { + throw new Error('No signers match the topology') + } + + const nonIncrementCalls: Payload.Call[] = [] + const incrementCalls: Payload.Call[] = [] + for (const call of calls) { + if (isIncrementCall(call, this.address)) { + incrementCalls.push(call) + } else { + nonIncrementCalls.push(call) + } + } + + // Find signers for non-increment calls + const nonIncrementSigners = + nonIncrementCalls.length > 0 + ? await this.findSignersForCallsWithCandidates(wallet, chainId, nonIncrementCalls, topology, availableSigners) + : [] + + let incrementSigners: SessionSigner[] = [] + if (incrementCalls.length > 0) { + // Find signers for increment calls, preferring signers that signed non-increment calls + const incrementCandidates = [ + ...nonIncrementSigners, + ...availableSigners.filter((s) => !nonIncrementSigners.includes(s)), + ] + incrementSigners = await this.findSignersForCallsWithCandidates( + wallet, + chainId, + incrementCalls, + topology, + incrementCandidates, + ) + } + + // Merge back in original call order + const signers: SessionSigner[] = [] + let nonIncrementIndex = 0 + let incrementIndex = 0 + for (const call of calls) { + if (isIncrementCall(call, this.address)) { + signers.push(incrementSigners[incrementIndex]!) + incrementIndex++ + } else { + signers.push(nonIncrementSigners[nonIncrementIndex]!) + nonIncrementIndex++ } } return signers @@ -191,20 +245,23 @@ export class SessionManager implements SapientSigner { } const signers = await this.findSignersForCalls(wallet, chainId, calls) - // Create a map of signers to their associated calls - const signerToCalls = new Map() + // Map each signer to only their non-increment calls + const signerToNonIncrementCalls = new Map() signers.forEach((signer, index) => { const call = calls[index]! - const existingCalls = signerToCalls.get(signer) || [] - signerToCalls.set(signer, [...existingCalls, call]) + if (isIncrementCall(call, this.address)) { + return + } + const existing = signerToNonIncrementCalls.get(signer) || [] + signerToNonIncrementCalls.set(signer, [...existing, call]) }) - // Prepare increments for each explicit signer with their associated calls + // Prepare increments for each explicit signer from their non-increment calls only const increments: UsageLimit[] = ( await Promise.all( - Array.from(signerToCalls.entries()).map(async ([signer, associatedCalls]) => { + Array.from(signerToNonIncrementCalls.entries()).map(async ([signer, nonIncrementCalls]) => { if (isExplicitSessionSigner(signer)) { - return signer.prepareIncrements(wallet, chainId, associatedCalls, this.address, this._provider!) + return signer.prepareIncrements(wallet, chainId, nonIncrementCalls, this.address, this._provider!) } return [] }), diff --git a/packages/wallet/core/src/signers/session/explicit.ts b/packages/wallet/core/src/signers/session/explicit.ts index b7ad087b4..86395fe70 100644 --- a/packages/wallet/core/src/signers/session/explicit.ts +++ b/packages/wallet/core/src/signers/session/explicit.ts @@ -1,7 +1,7 @@ import { Constants, Payload, Permission, SessionConfig, SessionSignature } from '@0xsequence/wallet-primitives' import { AbiFunction, AbiParameters, Address, Bytes, Hash, Hex, Provider } from 'ox' import { MemoryPkStore, PkStore } from '../pk/index.js' -import { ExplicitSessionSigner, SessionSignerValidity, UsageLimit } from './session.js' +import { ExplicitSessionSigner, isIncrementCall, SessionSignerValidity, UsageLimit } from './session.js' export type ExplicitParams = Omit @@ -208,11 +208,7 @@ export class Explicit implements ExplicitSessionSigner { sessionManagerAddress: Address.Address, provider?: Provider.Provider, ): Promise { - if ( - Address.isEqual(call.to, sessionManagerAddress) && - Hex.size(call.data) > 4 && - Hex.isEqual(Hex.slice(call.data, 0, 4), AbiFunction.getSelector(Constants.INCREMENT_USAGE_LIMIT)) - ) { + if (isIncrementCall(call, sessionManagerAddress)) { // Can sign increment usage calls return true } diff --git a/packages/wallet/core/src/signers/session/session.ts b/packages/wallet/core/src/signers/session/session.ts index 4bcc5bb77..08b2ade81 100644 --- a/packages/wallet/core/src/signers/session/session.ts +++ b/packages/wallet/core/src/signers/session/session.ts @@ -1,5 +1,5 @@ -import { Payload, SessionConfig, SessionSignature } from '@0xsequence/wallet-primitives' -import { Address, Hex, Provider } from 'ox' +import { Constants, Payload, SessionConfig, SessionSignature } from '@0xsequence/wallet-primitives' +import { AbiFunction, Address, Hex, Provider } from 'ox' export type SessionSignerInvalidReason = | 'Expired' @@ -68,3 +68,11 @@ export function isExplicitSessionSigner(signer: SessionSigner): signer is Explic export function isImplicitSessionSigner(signer: SessionSigner): signer is ImplicitSessionSigner { return 'identitySigner' in signer } + +export function isIncrementCall(call: Payload.Call, sessionManagerAddress: Address.Address): boolean { + return ( + Address.isEqual(call.to, sessionManagerAddress) && + Hex.size(call.data) >= 4 && + Hex.isEqual(Hex.slice(call.data, 0, 4), AbiFunction.getSelector(Constants.INCREMENT_USAGE_LIMIT)) + ) +} diff --git a/packages/wallet/core/test/constants.ts b/packages/wallet/core/test/constants.ts index 63e862f38..42b51d49b 100644 --- a/packages/wallet/core/test/constants.ts +++ b/packages/wallet/core/test/constants.ts @@ -5,6 +5,8 @@ import { Abi, AbiEvent, Address } from 'ox' const envFile = process.env.CI ? '.env.test' : '.env.test.local' dotenvConfig({ path: envFile }) +// Contracts are deployed on Arbitrum + // Requires https://example.com redirectUrl export const EMITTER_ADDRESS1: Address.Address = '0xad90eB52BC180Bd9f66f50981E196f3E996278D3' // Requires https://another-example.com redirectUrl diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index 93a69ed89..adf36fb89 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -1,4 +1,4 @@ -import { Extensions } from '@0xsequence/wallet-primitives' +import { Constants, 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' @@ -731,7 +731,7 @@ for (const extension of ALL_EXTENSIONS) { ) it( - 'signs a payload using an explicit session', + 'signs a payload using an explicit session with allowAll and value limit', async () => { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) @@ -804,7 +804,7 @@ for (const extension of ALL_EXTENSIONS) { ) it( - 'signs a payload using an explicit session', + 'signs using explicit session with onlyOnce, consumes usage and rejects second call', async () => { const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) const chainId = Number(await provider.request({ method: 'eth_chainId' })) @@ -1357,5 +1357,293 @@ for (const extension of ALL_EXTENSIONS) { }, timeout, ) + + it( + 'two explicit sessions with same value limit: exhaust first then second send uses second session (increment from non-increment calls only)', + async () => { + const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) + const chainId = Number(await provider.request({ method: 'eth_chainId' })) + + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + + const targetAddress = randomAddress() + const valueLimit = 500000000000000000n // 0.5 ETH per session + + const sessionPermission: ExplicitSessionConfig = { + chainId, + valueLimit, + deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), + permissions: [PermissionBuilder.for(targetAddress).allowAll().build()], + } + + const explicitPrivateKey1 = Secp256k1.randomPrivateKey() + const explicitSigner1 = new Signers.Session.Explicit(explicitPrivateKey1, { + ...sessionPermission, + }) + + const explicitPrivateKey2 = Secp256k1.randomPrivateKey() + const explicitSigner2 = new Signers.Session.Explicit(explicitPrivateKey2, { + ...sessionPermission, + }) + + let sessionTopology = SessionConfig.addExplicitSession(SessionConfig.emptySessionsTopology(identityAddress), { + ...sessionPermission, + signer: explicitSigner1.address, + }) + sessionTopology = SessionConfig.addExplicitSession(sessionTopology, { + ...sessionPermission, + signer: explicitSigner2.address, + }) + await stateProvider.saveTree(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + const imageHash = GenericTree.hash(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + + const wallet = await Wallet.fromConfiguration( + { + threshold: 1n, + checkpoint: 0n, + topology: [{ type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, Hex.random(32)], + }, + { stateProvider }, + ) + // Fund wallet with 2 ETH so we can send 0.5 ETH twice (each tx needs value + gas) + await provider.request({ + method: 'anvil_setBalance', + params: [wallet.address, Hex.fromNumber(2n * 1000000000000000000n)], + }) + + const sessionManager = new Signers.SessionManager(wallet, { + provider, + sessionManagerAddress: extension.sessions, + explicitSigners: [explicitSigner1, explicitSigner2], + }) + + const call: Payload.Call = { + to: targetAddress, + value: valueLimit, // one full limit + data: '0x' as Hex.Hex, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + } + + // First send: uses first session (exhausts it) + const increment1 = await sessionManager.prepareIncrement(wallet.address, chainId, [call]) + expect(increment1).not.toBeNull() + const calls1 = includeIncrement([call], increment1!, extension.sessions) + const tx1 = await buildAndSignCall(wallet, sessionManager, calls1, provider, chainId) + await simulateTransaction(provider, tx1) + + // Second send: same call. First session is exhausted so findSignersForCalls picks second session. + // Payload is [call, increment] (or [increment, call]). signSapient must derive expectedIncrement + // from non-increment calls only so it matches the increment we built for the second session. + const increment2 = await sessionManager.prepareIncrement(wallet.address, chainId, [call]) + expect(increment2).not.toBeNull() + const calls2 = includeIncrement([call], increment2!, extension.sessions) + const tx2 = await buildAndSignCall(wallet, sessionManager, calls2, provider, chainId) + await simulateTransaction(provider, tx2) + }, + timeout, + ) + + describe('increment built from non-increment calls only', () => { + it( + 'prepareIncrement returns null when calls contain only an increment call (no non-increment calls)', + async () => { + const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) + const chainId = Number(await provider.request({ method: 'eth_chainId' })) + + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + + const sessionPermission: ExplicitSessionConfig = { + chainId, + valueLimit: 0n, + deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), + permissions: [PermissionBuilder.for(EMITTER_ADDRESS1).allowAll().build()], + } + const explicitSigner = new Signers.Session.Explicit(Secp256k1.randomPrivateKey(), sessionPermission) + const sessionTopology = SessionConfig.addExplicitSession( + SessionConfig.emptySessionsTopology(identityAddress), + { + ...sessionPermission, + signer: explicitSigner.address, + }, + ) + await stateProvider.saveTree(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + const imageHash = GenericTree.hash(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + + const wallet = await Wallet.fromConfiguration( + { + threshold: 1n, + checkpoint: 0n, + topology: [ + { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + Hex.random(32), + ], + }, + { stateProvider }, + ) + const sessionManager = new Signers.SessionManager(wallet, { + provider, + sessionManagerAddress: extension.sessions, + explicitSigners: [explicitSigner], + }) + + // Only an increment call (no non-increment calls). Contract would reject payload with only self-call; we return null. + const incrementOnlyCall: Payload.Call = { + to: extension.sessions, + data: AbiFunction.encodeData(Constants.INCREMENT_USAGE_LIMIT, [[]]), + value: 0n, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + } + const result = await sessionManager.prepareIncrement(wallet.address, chainId, [incrementOnlyCall]) + expect(result).toBeNull() + }, + timeout, + ) + + it( + 'prepareIncrement([increment, nonIncrementCall]) produces same increment data as prepareIncrement([nonIncrementCall])', + async () => { + const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) + const chainId = Number(await provider.request({ method: 'eth_chainId' })) + + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + + const sessionPermission: ExplicitSessionConfig = { + chainId, + valueLimit: 0n, + deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), + permissions: [PermissionBuilder.for(EMITTER_ADDRESS1).forFunction(EMITTER_FUNCTIONS[0]).onlyOnce().build()], + } + const explicitSigner = new Signers.Session.Explicit(Secp256k1.randomPrivateKey(), sessionPermission) + const sessionTopology = SessionConfig.addExplicitSession( + SessionConfig.emptySessionsTopology(identityAddress), + { + ...sessionPermission, + signer: explicitSigner.address, + }, + ) + await stateProvider.saveTree(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + const imageHash = GenericTree.hash(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + + const wallet = await Wallet.fromConfiguration( + { + threshold: 1n, + checkpoint: 0n, + topology: [ + { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + Hex.random(32), + ], + }, + { stateProvider }, + ) + const sessionManager = new Signers.SessionManager(wallet, { + provider, + sessionManagerAddress: extension.sessions, + explicitSigners: [explicitSigner], + }) + + const nonIncrementCall: Payload.Call = { + to: EMITTER_ADDRESS1, + value: 0n, + data: AbiFunction.encodeData(EMITTER_FUNCTIONS[0]), + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + } + + const fromNonIncrementOnly = await sessionManager.prepareIncrement(wallet.address, chainId, [ + nonIncrementCall, + ]) + expect(fromNonIncrementOnly).not.toBeNull() + + // Pass [staleIncrement, nonIncrementCall] — increment is ignored when building; result should match + const withStaleIncrement = await sessionManager.prepareIncrement(wallet.address, chainId, [ + fromNonIncrementOnly!, + nonIncrementCall, + ]) + expect(withStaleIncrement).not.toBeNull() + expect(withStaleIncrement!.data).toEqual(fromNonIncrementOnly!.data) + }, + timeout, + ) + + it( + 'payload with implicit and explicit: increment built only from explicit non-increment call', + async () => { + const provider = Provider.from(RpcTransport.fromHttp(LOCAL_RPC_URL)) + const chainId = Number(await provider.request({ method: 'eth_chainId' })) + + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + + const redirectUrl = 'https://example.com' + const implicitSigner = await createImplicitSigner(redirectUrl, identityPrivateKey) + const sessionPermission: ExplicitSessionConfig = { + chainId, + valueLimit: 0n, + deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), + permissions: [PermissionBuilder.for(EMITTER_ADDRESS1).forFunction(EMITTER_FUNCTIONS[0]).onlyOnce().build()], + } + const explicitSigner = new Signers.Session.Explicit(Secp256k1.randomPrivateKey(), sessionPermission) + + // Topology: identity + blacklist (implicit) + explicit session + let sessionTopology = SessionConfig.emptySessionsTopology(identityAddress) + sessionTopology = SessionConfig.addExplicitSession(sessionTopology, { + ...sessionPermission, + signer: explicitSigner.address, + }) + await stateProvider.saveTree(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + const imageHash = GenericTree.hash(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + + const wallet = await Wallet.fromConfiguration( + { + threshold: 1n, + checkpoint: 0n, + topology: [ + { type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, + Hex.random(32), + ], + }, + { stateProvider }, + ) + const sessionManager = new Signers.SessionManager(wallet, { + provider, + sessionManagerAddress: extension.sessions, + implicitSigners: [implicitSigner], + explicitSigners: [explicitSigner], + }) + + // Explicit call only (onlyOnce produces an increment; implicit does not match this target) + const call: Payload.Call = { + to: EMITTER_ADDRESS1, + value: 0n, + data: AbiFunction.encodeData(EMITTER_FUNCTIONS[0]), + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + } + const increment = await sessionManager.prepareIncrement(wallet.address, chainId, [call]) + expect(increment).not.toBeNull() + const calls = includeIncrement([call], increment!, extension.sessions) + const transaction = await buildAndSignCall(wallet, sessionManager, calls, provider, chainId) + await simulateTransaction(provider, transaction, EMITTER_EVENT_TOPICS[0]) + }, + timeout, + ) + }) }) } From 86b75c0e33afe71237282545a665dea604b3481c Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 6 Mar 2026 12:33:53 +0100 Subject: [PATCH 099/144] Add Incentiv mainnet --- packages/wallet/primitives/src/network.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index 4f1e8a8de..69f40ae4f 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -128,6 +128,7 @@ export const ChainId = { SOMNIA: 5031, // INCENTIV + INCENTIV: 24101, INCENTIV_TESTNET_V2: 28802, // KATANA @@ -1036,6 +1037,27 @@ export const ALL: Network[] = [ }, }, + { + chainId: ChainId.INCENTIV, + type: NetworkType.MAINNET, + name: 'incentiv', + title: 'Incentiv', + rpcUrl: getRpcUrl('incentiv'), + logoUrl: getLogoUrl(ChainId.INCENTIV), + blockExplorer: { + name: 'Incentiv Explorer', + url: 'https://explorer.incentiv.io/', + }, + nativeCurrency: { + symbol: 'CENT', + name: 'CENT', + decimals: 18, + }, + contracts: { + multicall3: DEFAULT_MULTICALL3_ADDRESS, + }, + }, + { chainId: ChainId.INCENTIV_TESTNET_V2, type: NetworkType.TESTNET, From 948321f268d7792f88c57b805b4b21499206fec5 Mon Sep 17 00:00:00 2001 From: agusx1211 Date: Fri, 6 Mar 2026 15:44:34 +0000 Subject: [PATCH 100/144] use isIncrementCall in signCall --- .../core/src/signers/session/explicit.ts | 6 +-- .../wallet/core/test/session-manager.test.ts | 54 +++++++++++++++++++ 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/packages/wallet/core/src/signers/session/explicit.ts b/packages/wallet/core/src/signers/session/explicit.ts index 86395fe70..ef78c554a 100644 --- a/packages/wallet/core/src/signers/session/explicit.ts +++ b/packages/wallet/core/src/signers/session/explicit.ts @@ -230,11 +230,7 @@ export class Explicit implements ExplicitSessionSigner { ): Promise { const call = payload.calls[callIdx]! let permissionIndex: number - if ( - Address.isEqual(call.to, sessionManagerAddress) && - Hex.size(call.data) > 4 && - Hex.isEqual(Hex.slice(call.data, 0, 4), AbiFunction.getSelector(Constants.INCREMENT_USAGE_LIMIT)) - ) { + if (isIncrementCall(call, sessionManagerAddress)) { // Permission check not required. Use the first permission permissionIndex = 0 } else { diff --git a/packages/wallet/core/test/session-manager.test.ts b/packages/wallet/core/test/session-manager.test.ts index adf36fb89..7ba342ebc 100644 --- a/packages/wallet/core/test/session-manager.test.ts +++ b/packages/wallet/core/test/session-manager.test.ts @@ -1644,6 +1644,60 @@ for (const extension of ALL_EXTENSIONS) { }, timeout, ) + + it('signSapient handles selector-only self increment call consistently', async () => { + const identityPrivateKey = Secp256k1.randomPrivateKey() + const identityAddress = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey: identityPrivateKey })) + const stateProvider = new State.Local.Provider() + + const explicitSigner = new Signers.Session.Explicit(Secp256k1.randomPrivateKey(), { + chainId: 0, + valueLimit: 0n, + deadline: BigInt(Math.floor(Date.now() / 1000) + 3600), + permissions: [PermissionBuilder.for(EMITTER_ADDRESS1).allowAll().build()], + }) + + const sessionTopology = SessionConfig.addExplicitSession(SessionConfig.emptySessionsTopology(identityAddress), { + ...explicitSigner.sessionPermissions, + signer: explicitSigner.address, + }) + await stateProvider.saveTree(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + const imageHash = GenericTree.hash(SessionConfig.sessionsTopologyToConfigurationTree(sessionTopology)) + + const wallet = await Wallet.fromConfiguration( + { + threshold: 1n, + checkpoint: 0n, + topology: [{ type: 'sapient-signer', address: extension.sessions, weight: 1n, imageHash }, Hex.random(32)], + }, + { stateProvider }, + ) + const sessionManager = new Signers.SessionManager(wallet, { + sessionManagerAddress: extension.sessions, + explicitSigners: [explicitSigner], + }) + + const payload: Payload.Parented = { + type: 'call', + nonce: 0n, + space: 0n, + calls: [ + { + to: extension.sessions, + data: AbiFunction.getSelector(Constants.INCREMENT_USAGE_LIMIT), + value: 0n, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }, + ], + parentWallets: [wallet.address], + } + + const signature = await sessionManager.signSapient(wallet.address, 0, payload, imageHash) + expect(signature.type).toBe('sapient') + }) }) }) } From 5e2ad39ad5f75bb3188ddfec55cbdd5de3c9f33a Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 9 Mar 2026 14:30:13 +0100 Subject: [PATCH 101/144] 3.0.1 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 61bd11b9a..93d25b9d2 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 0d4b988b2..08d7c67c4 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.1", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index a7a4c60d7..9a7adf5f5 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 1aae80372..e7bd7b836 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.1", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 4aa7f3b08..9231c81c5 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index e9e66b91e..e3eb538a0 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.1", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 46667619b..946470638 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index db656ed54..6d951ee90 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", + "version": "3.0.1", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 17f499fa5..b188695e3 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index c8629dc36..9410ce59e 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.1", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 321e03b85..f9423182e 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 39c6be2b6..910c7503d 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.1", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index ca7f29c5d..dbc9ca295 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index d700c0630..be283deb0 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.1", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index c718a845d..a45a11fe9 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.1 + +### Patch Changes + +- Network and session fixes +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.1 + ## 3.0.0 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index ab7f8d8cb..5863a5eca 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.1", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index abea2c174..06b3628fb 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 6cef1fe59..a1e3f1b6d 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.0", + "version": "3.0.1", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 25e7590b4..edf3ef780 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 4efa48abe..218134723 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.1", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index be05bec0b..f2ed0c461 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.1 + +### Patch Changes + +- Network and session fixes +- Updated dependencies + - @0xsequence/guard@3.0.1 + - @0xsequence/relayer@3.0.1 + - @0xsequence/wallet-primitives@3.0.1 + ## 3.0.0 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index a5ced0086..196b25c68 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", + "version": "3.0.1", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 92d9641ed..a71394363 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.1 + +### Patch Changes + +- Network and session fixes +- Updated dependencies + - @0xsequence/guard@3.0.1 + - @0xsequence/relayer@3.0.1 + - @0xsequence/wallet-core@3.0.1 + - @0xsequence/wallet-primitives@3.0.1 + ## 3.0.0 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index afe59a0bc..0b0d9ce14 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", + "version": "3.0.1", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 200be5102..10f46a0cd 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.1 + +### Patch Changes + +- Network and session fixes + ## 3.0.0 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index df6e52100..aa0581ecb 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", + "version": "3.0.1", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 81522e3a4..3e6a8714f 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.1 + +### Patch Changes + +- Network and session fixes +- Updated dependencies + - @0xsequence/guard@3.0.1 + - @0xsequence/identity-instrument@3.0.1 + - @0xsequence/relayer@3.0.1 + - @0xsequence/wallet-core@3.0.1 + - @0xsequence/wallet-primitives@3.0.1 + ## 3.0.0 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 15a8a75cc..2160b0596 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", + "version": "3.0.1", "license": "Apache-2.0", "type": "module", "publishConfig": { From 43d8e0ae67bd310cd4eed3098ba7933ed9d8a53c Mon Sep 17 00:00:00 2001 From: William Hua Date: Fri, 13 Mar 2026 15:28:40 -0400 Subject: [PATCH 102/144] core: allow native self transfer (#978) --- packages/wallet/core/src/wallet.ts | 4 ++-- packages/wallet/wdk/test/transactions.test.ts | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/wallet/core/src/wallet.ts b/packages/wallet/core/src/wallet.ts index 0377dd336..d89d5b2b9 100644 --- a/packages/wallet/core/src/wallet.ts +++ b/packages/wallet/core/src/wallet.ts @@ -342,7 +342,7 @@ export class Wallet { if (call.delegateCall) { throw new Error('delegate calls are not allowed in safe mode') } - if (Address.isEqual(call.to, this.address)) { + if (Address.isEqual(call.to, this.address) && call.data !== '0x') { throw new Error('calls to the wallet contract itself are not allowed in safe mode') } } @@ -455,7 +455,7 @@ export class Wallet { if (call.delegateCall) { throw new Error('delegate calls are not allowed in safe mode') } - if (Address.isEqual(call.to, this.address)) { + if (Address.isEqual(call.to, this.address) && call.data !== '0x') { throw new Error('calls to the wallet contract itself are not allowed in safe mode') } } diff --git a/packages/wallet/wdk/test/transactions.test.ts b/packages/wallet/wdk/test/transactions.test.ts index cf31c973c..295d00d01 100644 --- a/packages/wallet/wdk/test/transactions.test.ts +++ b/packages/wallet/wdk/test/transactions.test.ts @@ -481,12 +481,31 @@ describe('Transactions', () => { const txId1 = manager.transactions.request(wallet!, Network.ChainId.ARBITRUM, [ { to: wallet!, + data: '0x1234', }, ]) await expect(txId1).rejects.toThrow() }) + it('Should allow native token transfer to self in safe mode', async () => { + const manager = newManager() + const wallet = await manager.wallets.signUp({ + mnemonic: Mnemonic.random(Mnemonic.english), + kind: 'mnemonic', + noGuard: true, + }) + + const txId1 = await manager.transactions.request(wallet!, Network.ChainId.ARBITRUM, [ + { + to: wallet!, + value: 1n, + }, + ]) + + expect(txId1).toBeDefined() + }) + it('Should allow transactions to self in unsafe mode', async () => { const manager = newManager() const wallet = await manager.wallets.signUp({ From 79bf317b4882607fd88b59b8c72cb564f00536c9 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 16 Mar 2026 09:44:13 +0100 Subject: [PATCH 103/144] 3.0.2 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 93d25b9d2..0e8eaad7e 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 08d7c67c4..ecb3f5ab8 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.1", + "version": "3.0.2", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 9a7adf5f5..08a102605 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index e7bd7b836..160072e47 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.1", + "version": "3.0.2", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 9231c81c5..b9574b5e1 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index e3eb538a0..947a441f3 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.1", + "version": "3.0.2", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 946470638..bfdd435ca 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 6d951ee90..680c4b434 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.1", + "version": "3.0.2", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index b188695e3..54cee7353 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 9410ce59e..c6e4abae8 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.1", + "version": "3.0.2", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index f9423182e..0c8767f4d 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 910c7503d..308ba5ba4 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.1", + "version": "3.0.2", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index dbc9ca295..86b5873be 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index be283deb0..5419b31dc 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.1", + "version": "3.0.2", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index a45a11fe9..2574b94e8 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.2 + +### Patch Changes + +- allow native self transfer +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.2 + ## 3.0.1 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 5863a5eca..3dec76338 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.1", + "version": "3.0.2", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 06b3628fb..7387d6298 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index a1e3f1b6d..dbb1e4a28 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.1", + "version": "3.0.2", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index edf3ef780..b5828b596 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 218134723..a8b28ead8 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.1", + "version": "3.0.2", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index f2ed0c461..139e7f0f2 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.2 + +### Patch Changes + +- allow native self transfer +- Updated dependencies + - @0xsequence/guard@3.0.2 + - @0xsequence/relayer@3.0.2 + - @0xsequence/wallet-primitives@3.0.2 + ## 3.0.1 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 196b25c68..771cf687d 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.1", + "version": "3.0.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 a71394363..5b96e92d6 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.2 + +### Patch Changes + +- allow native self transfer +- Updated dependencies + - @0xsequence/guard@3.0.2 + - @0xsequence/relayer@3.0.2 + - @0xsequence/wallet-core@3.0.2 + - @0xsequence/wallet-primitives@3.0.2 + ## 3.0.1 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 0b0d9ce14..2904d51ef 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.1", + "version": "3.0.2", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 10f46a0cd..85c1e85ad 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.2 + +### Patch Changes + +- allow native self transfer + ## 3.0.1 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index aa0581ecb..fbff60f80 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 3e6a8714f..62c220728 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.2 + +### Patch Changes + +- allow native self transfer +- Updated dependencies + - @0xsequence/guard@3.0.2 + - @0xsequence/identity-instrument@3.0.2 + - @0xsequence/relayer@3.0.2 + - @0xsequence/wallet-core@3.0.2 + - @0xsequence/wallet-primitives@3.0.2 + ## 3.0.1 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 2160b0596..277fdf7a6 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.1", + "version": "3.0.2", "license": "Apache-2.0", "type": "module", "publishConfig": { From 9685e535f911a7a1f6cbf7d9289cda31a133bc91 Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Mon, 16 Mar 2026 12:13:51 +0300 Subject: [PATCH 104/144] Add WDK Google ID token auth flow (#977) * Add WDK Google ID token auth flow * Unify Google WDK auth kinds * Refine WDK Google id token flow * Fix id-token auth key cleanup on signer mismatch * Restore guard error logging * Unify Google WDK signer kind * Fix WDK auth flow cleanup and implicit session metadata --- packages/services/guard/src/sequence.ts | 2 +- packages/services/guard/test/sequence.test.ts | 15 + .../wdk/src/sequence/handlers/authcode.ts | 6 + .../wdk/src/sequence/handlers/identity.ts | 4 + .../wdk/src/sequence/handlers/idtoken.ts | 140 ++++++++ .../wallet/wdk/src/sequence/handlers/index.ts | 1 + packages/wallet/wdk/src/sequence/manager.ts | 107 ++++-- packages/wallet/wdk/src/sequence/sessions.ts | 8 +- packages/wallet/wdk/src/sequence/signers.ts | 5 + .../wallet/wdk/src/sequence/types/signer.ts | 2 +- .../wallet/wdk/src/sequence/types/wallet.ts | 2 +- packages/wallet/wdk/src/sequence/wallets.ts | 97 +++++- .../wallet/wdk/test/authcode-pkce.test.ts | 2 +- packages/wallet/wdk/test/authcode.test.ts | 4 +- .../wallet/wdk/test/identity-auth-dbs.test.ts | 88 ++++- .../wallet/wdk/test/identity-signer.test.ts | 2 +- packages/wallet/wdk/test/idtoken.test.ts | 327 ++++++++++++++++++ .../wallet/wdk/test/sessions-idtoken.test.ts | 97 ++++++ .../wallet/wdk/test/signers-kindof.test.ts | 22 ++ packages/wallet/wdk/test/wallets.test.ts | 142 +++++++- 20 files changed, 1024 insertions(+), 49 deletions(-) create mode 100644 packages/wallet/wdk/src/sequence/handlers/idtoken.ts create mode 100644 packages/wallet/wdk/test/idtoken.test.ts create mode 100644 packages/wallet/wdk/test/sessions-idtoken.test.ts diff --git a/packages/services/guard/src/sequence.ts b/packages/services/guard/src/sequence.ts index 6c17b7552..b2acc812a 100644 --- a/packages/services/guard/src/sequence.ts +++ b/packages/services/guard/src/sequence.ts @@ -50,7 +50,7 @@ export class Guard implements Types.Guard { throw new Types.AuthRequiredError('PIN') } console.error(error) - throw new Error('Error signing with guard') + throw new Error('Error signing with guard', { cause: error }) } } } diff --git a/packages/services/guard/test/sequence.test.ts b/packages/services/guard/test/sequence.test.ts index 45612d609..ebc9a47b7 100644 --- a/packages/services/guard/test/sequence.test.ts +++ b/packages/services/guard/test/sequence.test.ts @@ -116,6 +116,21 @@ describe('Sequence', () => { ).rejects.toThrow('Error signing with guard') }) + it('Should preserve the original guard failure as cause', async () => { + mockFetch.mockRejectedValueOnce(new Error('Network error')) + + try { + await guard.signPayload(testWallet, 42161, PayloadType.ConfigUpdate, testMessageDigest, testMessage) + throw new Error('Expected signPayload to throw') + } catch (error) { + expect(error).toBeInstanceOf(Error) + expect((error as Error).message).toBe('Error signing with guard') + expect((error as Error & { cause?: unknown }).cause).toBeInstanceOf(Error) + expect((error as Error & { cause?: Error }).cause?.name).toBe('WebrpcRequestFailed') + expect((error as Error & { cause?: Error }).cause?.message).toBe('request failed') + } + }) + it('Should include proper headers and signer address in request', async () => { const mockGuardAddress = '0x9876543210987654321098765432109876543210' as Address.Address const customGuard = new Guard('https://guard.sequence.app', mockGuardAddress, fetch) diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode.ts b/packages/wallet/wdk/src/sequence/handlers/authcode.ts index 8e98745e8..699d72bc4 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode.ts @@ -6,6 +6,7 @@ import * as Identity from '@0xsequence/identity-instrument' import { SignerUnavailable, SignerReady, SignerActionable, BaseSignatureRequest } from '../types/signature-request.js' import { IdentitySigner } from '../../identity/signer.js' import { IdentityHandler } from './identity.js' +import { Kinds } from '../types/signer.js' import type { NavigationLike, WdkEnv } from '../../env.js' export class AuthCodeHandler extends IdentityHandler implements Handler { @@ -26,6 +27,11 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { } public get kind() { + if (this.signupKind === 'google-pkce') { + // Keep Google PKCE on the canonical kind so Google signers created before + // canonicalization still resolve as `login-google`. + return Kinds.LoginGoogle + } return 'login-' + this.signupKind } diff --git a/packages/wallet/wdk/src/sequence/handlers/identity.ts b/packages/wallet/wdk/src/sequence/handlers/identity.ts index f03876a5b..a991e8863 100644 --- a/packages/wallet/wdk/src/sequence/handlers/identity.ts +++ b/packages/wallet/wdk/src/sequence/handlers/identity.ts @@ -81,6 +81,10 @@ export class IdentityHandler { return new IdentitySigner(this.nitro, authKey, this.env.crypto) } + protected async clearAuthKeySigner(address: string): Promise { + await this.authKeys.delBySigner(address) + } + private async getAuthKey(signer: string): Promise { let authKey = await this.authKeys.getBySigner(signer) if (!signer && !authKey) { diff --git a/packages/wallet/wdk/src/sequence/handlers/idtoken.ts b/packages/wallet/wdk/src/sequence/handlers/idtoken.ts new file mode 100644 index 000000000..5a8bcac53 --- /dev/null +++ b/packages/wallet/wdk/src/sequence/handlers/idtoken.ts @@ -0,0 +1,140 @@ +import { Address, Hex } from 'ox' +import { Signers } from '@0xsequence/wallet-core' +import { Handler } from './handler.js' +import * as Identity from '@0xsequence/identity-instrument' +import * as Db from '../../dbs/index.js' +import { Signatures } from '../signatures.js' +import { SignerActionable, SignerReady, SignerUnavailable, BaseSignatureRequest } from '../types/signature-request.js' +import { IdentitySigner } from '../../identity/signer.js' +import { IdentityHandler } from './identity.js' +import { Kinds } from '../types/signer.js' +import type { WdkEnv } from '../../env.js' + +type RespondFn = (idToken: string) => Promise + +export type PromptIdTokenHandler = (kind: 'google-id-token' | `custom-${string}`, respond: RespondFn) => Promise + +export class IdTokenHandler extends IdentityHandler implements Handler { + private onPromptIdToken: undefined | PromptIdTokenHandler + + constructor( + public readonly signupKind: 'google-id-token' | `custom-${string}`, + public readonly issuer: string, + public readonly audience: string, + nitro: Identity.IdentityInstrument, + signatures: Signatures, + authKeys: Db.AuthKeys, + env?: WdkEnv, + ) { + super(nitro, authKeys, signatures, Identity.IdentityType.OIDC, env) + } + + public get kind() { + if (this.signupKind === 'google-id-token') { + return Kinds.LoginGoogle + } + return 'login-' + this.signupKind + } + + public registerUI(onPromptIdToken: PromptIdTokenHandler) { + this.onPromptIdToken = onPromptIdToken + return () => { + this.onPromptIdToken = undefined + } + } + + public unregisterUI() { + this.onPromptIdToken = undefined + } + + public async completeAuth(idToken: string): Promise<[IdentitySigner, { [key: string]: string }]> { + const challenge = new Identity.IdTokenChallenge(this.issuer, this.audience, idToken) + await this.nitroCommitVerifier(challenge) + const { signer: identitySigner, email } = await this.nitroCompleteAuth(challenge) + + return [identitySigner, { email }] + } + + public async getSigner(): Promise<{ signer: Signers.Signer & Signers.Witnessable; email: string }> { + const onPromptIdToken = this.onPromptIdToken + if (!onPromptIdToken) { + throw new Error('id-token-handler-ui-not-registered') + } + + return await this.handleAuth(onPromptIdToken) + } + + async status( + address: Address.Address, + _imageHash: Hex.Hex | undefined, + request: BaseSignatureRequest, + ): Promise { + const signer = await this.getAuthKeySigner(address) + if (signer) { + return { + address, + handler: this, + status: 'ready', + handle: async () => { + await this.sign(signer, request) + return true + }, + } + } + + const onPromptIdToken = this.onPromptIdToken + if (!onPromptIdToken) { + return { + address, + handler: this, + reason: 'ui-not-registered', + status: 'unavailable', + } + } + + return { + address, + handler: this, + status: 'actionable', + message: 'request-id-token', + handle: async () => { + try { + const { signer } = await this.handleAuth(onPromptIdToken) + const signerAddress = (await signer.address) as Address.Address + if (!Address.isEqual(signerAddress, address)) { + // ID-token auth prompts are keyed by provider kind, not the requested signer address. + // For example, a user can pick a different Google account in the account picker and + // return a token for a different identity than this request expects. + await this.clearAuthKeySigner(signerAddress) + throw new Error('id-token-signer-mismatch') + } + return true + } catch { + return false + } + }, + } + } + + private handleAuth( + onPromptIdToken: PromptIdTokenHandler, + ): Promise<{ signer: Signers.Signer & Signers.Witnessable; email: string }> { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve, reject) => { + try { + const respond: RespondFn = async (idToken) => { + try { + const [signer, metadata] = await this.completeAuth(idToken) + resolve({ signer, email: metadata.email || '' }) + } catch (error) { + reject(error) + } + } + + await onPromptIdToken(this.signupKind, respond) + } catch (error) { + reject(error) + } + }) + } +} diff --git a/packages/wallet/wdk/src/sequence/handlers/index.ts b/packages/wallet/wdk/src/sequence/handlers/index.ts index 0cac943b9..9c1b1f0f5 100644 --- a/packages/wallet/wdk/src/sequence/handlers/index.ts +++ b/packages/wallet/wdk/src/sequence/handlers/index.ts @@ -3,4 +3,5 @@ export { DevicesHandler } from './devices.js' export { PasskeysHandler } from './passkeys.js' export { OtpHandler } from './otp.js' export { AuthCodePkceHandler } from './authcode-pkce.js' +export { IdTokenHandler } from './idtoken.js' export { MnemonicHandler } from './mnemonic.js' diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 5418dd65b..8e32c4e5e 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -14,6 +14,7 @@ import { AuthCodePkceHandler, DevicesHandler, Handler, + IdTokenHandler, MnemonicHandler, OtpHandler, PasskeysHandler, @@ -31,9 +32,25 @@ import { Wallets, WalletsInterface } from './wallets.js' import { GuardHandler, PromptCodeHandler } from './handlers/guard.js' import { PasskeyCredential } from '../dbs/index.js' import { PromptMnemonicHandler } from './handlers/mnemonic.js' +import { PromptIdTokenHandler } from './handlers/idtoken.js' import { PromptOtpHandler } from './handlers/otp.js' import { defaultPasskeyProvider, type PasskeyProvider } from './passkeys-provider.js' +type CustomIdentityProvider = + | { + kind: `custom-${string}` + authMethod: 'id-token' + issuer: string + clientId: string + } + | { + kind: `custom-${string}` + authMethod: 'authcode' | 'authcode-pkce' + issuer: string + oauthUrl: string + clientId: string + } + export type ManagerOptions = { verbose?: boolean @@ -85,18 +102,13 @@ export type ManagerOptions = { google?: { enabled: boolean clientId: string + authMethod?: 'authcode-pkce' | 'id-token' } apple?: { enabled: boolean clientId: string } - customProviders?: { - kind: `custom-${string}` - authMethod: 'id-token' | 'authcode' | 'authcode-pkce' - issuer: string - oauthUrl: string - clientId: string - }[] + customProviders?: CustomIdentityProvider[] } } @@ -112,18 +124,13 @@ export type ResolvedIdentityOptions = { google: { enabled: boolean clientId: string + authMethod: 'authcode-pkce' | 'id-token' } apple: { enabled: boolean clientId: string } - customProviders?: { - kind: `custom-${string}` - authMethod: 'id-token' | 'authcode' | 'authcode-pkce' - issuer: string - oauthUrl: string - clientId: string - }[] + customProviders?: CustomIdentityProvider[] } export type ResolvedManagerOptions = { @@ -248,6 +255,7 @@ export const ManagerOptionsDefaults = { google: { enabled: false, clientId: '', + authMethod: 'authcode-pkce' as const, }, apple: { enabled: false, @@ -677,20 +685,35 @@ export class Manager { shared.handlers.set(Kinds.LoginEmailOtp, this.otpHandler) } if (ops.identity.google?.enabled) { - shared.handlers.set( - Kinds.LoginGooglePkce, - new AuthCodePkceHandler( - 'google-pkce', - 'https://accounts.google.com', - 'https://accounts.google.com/o/oauth2/v2/auth', - ops.identity.google.clientId, - identityInstrument, - modules.signatures, - shared.databases.authCommitments, - shared.databases.authKeys, - shared.env, - ), - ) + if (ops.identity.google.authMethod === 'id-token') { + shared.handlers.set( + Kinds.LoginGoogle, + new IdTokenHandler( + 'google-id-token', + 'https://accounts.google.com', + ops.identity.google.clientId, + identityInstrument, + modules.signatures, + shared.databases.authKeys, + shared.env, + ), + ) + } else { + shared.handlers.set( + Kinds.LoginGoogle, + new AuthCodePkceHandler( + 'google-pkce', + 'https://accounts.google.com', + 'https://accounts.google.com/o/oauth2/v2/auth', + ops.identity.google.clientId, + identityInstrument, + modules.signatures, + shared.databases.authCommitments, + shared.databases.authKeys, + shared.env, + ), + ) + } } if (ops.identity.apple?.enabled) { shared.handlers.set( @@ -712,7 +735,19 @@ export class Manager { for (const provider of ops.identity.customProviders) { switch (provider.authMethod) { case 'id-token': - throw new Error('id-token is not supported yet') + shared.handlers.set( + provider.kind, + new IdTokenHandler( + provider.kind, + provider.issuer, + provider.clientId, + identityInstrument, + modules.signatures, + shared.databases.authKeys, + shared.env, + ), + ) + break case 'authcode': shared.handlers.set( provider.kind, @@ -770,6 +805,20 @@ export class Manager { return this.otpHandler?.registerUI(onPromptOtp) || (() => {}) } + public registerIdTokenUI(onPromptIdToken: PromptIdTokenHandler) { + const unregisters: (() => void)[] = [] + + this.shared.handlers.forEach((handler) => { + if (handler instanceof IdTokenHandler) { + unregisters.push(handler.registerUI(onPromptIdToken)) + } + }) + + return () => { + unregisters.forEach((unregister) => unregister()) + } + } + public registerGuardUI(onPromptCode: PromptCodeHandler) { return this.guardHandler?.registerUI(onPromptCode) || (() => {}) } diff --git a/packages/wallet/wdk/src/sequence/sessions.ts b/packages/wallet/wdk/src/sequence/sessions.ts index 70c2d85ed..198258279 100644 --- a/packages/wallet/wdk/src/sequence/sessions.ts +++ b/packages/wallet/wdk/src/sequence/sessions.ts @@ -9,7 +9,9 @@ import { SessionConfig, } from '@0xsequence/wallet-primitives' import { Address, Bytes, Hash, Hex } from 'ox' +import { AuthCodeHandler } from './handlers/authcode.js' import { AuthCodePkceHandler } from './handlers/authcode-pkce.js' +import { IdTokenHandler } from './handlers/idtoken.js' import { IdentityHandler, identityTypeToHex } from './handlers/identity.js' import { Handler } from './handlers/index.js' import { ManagerOptionsDefaults, Shared } from './manager.js' @@ -362,7 +364,11 @@ export class Sessions implements SessionsInterface { let audienceHash: Hex.Hex = '0x' if (handler instanceof IdentityHandler) { identityType = handler.identityType - if (handler instanceof AuthCodePkceHandler) { + if ( + handler instanceof AuthCodeHandler || + handler instanceof AuthCodePkceHandler || + handler instanceof IdTokenHandler + ) { issuerHash = Hash.keccak256(Hex.fromString(handler.issuer)) audienceHash = Hash.keccak256(Hex.fromString(handler.audience)) } diff --git a/packages/wallet/wdk/src/sequence/signers.ts b/packages/wallet/wdk/src/sequence/signers.ts index 64f9ff669..ecb43cab7 100644 --- a/packages/wallet/wdk/src/sequence/signers.ts +++ b/packages/wallet/wdk/src/sequence/signers.ts @@ -12,6 +12,11 @@ function toKnownKind(kind: string): Kind { return kind as Kind } + if (kind === 'login-google-pkce') { + // Normalize legacy Google PKCE witnesses while the canonical signer kind is `login-google`. + return Kinds.LoginGoogle + } + 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 30a2a5073..eb46db52f 100644 --- a/packages/wallet/wdk/src/sequence/types/signer.ts +++ b/packages/wallet/wdk/src/sequence/types/signer.ts @@ -5,7 +5,7 @@ export const Kinds = { LoginPasskey: 'login-passkey', LoginMnemonic: 'login-mnemonic', // Todo: do not name it login-mnemonic, just mnemonic LoginEmailOtp: 'login-email-otp', - LoginGooglePkce: 'login-google-pkce', + LoginGoogle: 'login-google', LoginApple: 'login-apple', Recovery: 'recovery-extension', Guard: 'guard-extension', diff --git a/packages/wallet/wdk/src/sequence/types/wallet.ts b/packages/wallet/wdk/src/sequence/types/wallet.ts index dd754a05b..c1e12a990 100644 --- a/packages/wallet/wdk/src/sequence/types/wallet.ts +++ b/packages/wallet/wdk/src/sequence/types/wallet.ts @@ -36,7 +36,7 @@ export interface Wallet { /** * A string identifier for the authentication method used for this session. - * Examples: 'login-mnemonic', 'login-passkey', 'login-google-pkce'. + * Examples: 'login-mnemonic', 'login-passkey', 'login-google'. * @property */ loginType: string diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index 6cc4f9492..1d8f17a4b 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -3,6 +3,7 @@ import { Config, Constants, Payload } from '@0xsequence/wallet-primitives' import { Address, Hex, Provider, RpcTransport } from 'ox' import { AuthCommitment } from '../dbs/auth-commitments.js' import { AuthCodeHandler } from './handlers/authcode.js' +import { IdTokenHandler } from './handlers/idtoken.js' import { MnemonicHandler } from './handlers/mnemonic.js' import { OtpHandler } from './handlers/otp.js' import { Shared } from './manager.js' @@ -13,6 +14,37 @@ import { Wallet, WalletSelectionUiHandler } from './types/wallet.js' import { PasskeysHandler } from './handlers/passkeys.js' import type { PasskeySigner } from './passkeys-provider.js' +function getSignupHandlerKey(kind: SignupArgs['kind'] | StartSignUpWithRedirectArgs['kind'] | AuthCommitment['kind']) { + if (kind === 'google-pkce') { + return Kinds.LoginGoogle + } + if (kind.startsWith('custom-')) { + return kind + } + return 'login-' + kind +} + +function getSignerKindForSignup(kind: SignupArgs['kind'] | AuthCommitment['kind']) { + if (kind === 'google-id-token' || kind === 'google-pkce') { + return Kinds.LoginGoogle + } + if (kind.startsWith('custom-')) { + return kind + } + return ('login-' + kind) as string +} + +function getIdTokenSignupHandler(shared: Shared, kind: typeof Kinds.LoginGoogle | `custom-${string}`): IdTokenHandler { + const handler = shared.handlers.get(kind) + if (!handler) { + throw new Error('handler-not-registered') + } + if (!(handler instanceof IdTokenHandler)) { + throw new Error('handler-does-not-support-id-token') + } + return handler +} + export type StartSignUpWithRedirectArgs = { kind: 'google-pkce' | 'apple' | `custom-${string}` target: string @@ -49,6 +81,11 @@ export type EmailOtpSignupArgs = CommonSignupArgs & { email: string } +export type IdTokenSignupArgs = CommonSignupArgs & { + kind: 'google-id-token' | `custom-${string}` + idToken: string +} + export type CompleteRedirectArgs = CommonSignupArgs & { state: string code: string @@ -62,7 +99,12 @@ export type AuthCodeSignupArgs = CommonSignupArgs & { isRedirect: boolean } -export type SignupArgs = PasskeySignupArgs | MnemonicSignupArgs | EmailOtpSignupArgs | AuthCodeSignupArgs +export type SignupArgs = + | PasskeySignupArgs + | MnemonicSignupArgs + | EmailOtpSignupArgs + | IdTokenSignupArgs + | AuthCodeSignupArgs export type LoginToWalletArgs = { wallet: Address.Address @@ -180,6 +222,7 @@ export interface WalletsInterface { * - `kind: 'mnemonic'`: Uses a mnemonic phrase as the login credential. * - `kind: 'passkey'`: Prompts the user to create a WebAuthn passkey. * - `kind: 'email-otp'`: Initiates an OTP flow to the user's email. + * - `kind: 'google-id-token'`: Completes an OIDC ID token flow when Google is configured with `authMethod: 'id-token'`. * - `kind: 'google-pkce' | 'apple'`: Completes an OAuth redirect flow. * Common options like `noGuard` or `noRecovery` can customize the wallet's security features. * @returns A promise that resolves to the address of the newly created wallet, or `undefined` if the sign-up was aborted. @@ -361,7 +404,11 @@ export function isLoginToPasskeyArgs(args: LoginArgs): args is LoginToPasskeyArg } export function isAuthCodeArgs(args: SignupArgs): args is AuthCodeSignupArgs { - return 'kind' in args && (args.kind === 'google-pkce' || args.kind === 'apple') + return 'code' in args && 'commitment' in args +} + +export function isIdTokenArgs(args: SignupArgs): args is IdTokenSignupArgs { + return 'idToken' in args } function buildCappedTree(members: { address: Address.Address; imageHash?: Hex.Hex }[]): Config.Topology { @@ -674,9 +721,24 @@ export class Wallets implements WalletsInterface { } } + case 'google-id-token': { + const handler = getIdTokenSignupHandler(this.shared, Kinds.LoginGoogle) + const [signer, metadata] = await handler.completeAuth(args.idToken) + const loginEmail = metadata.email + this.shared.modules.logger.log('Created new id token signer:', signer.address) + + return { + signer, + extra: { + signerKind: Kinds.LoginGoogle, + }, + loginEmail, + } + } + case 'google-pkce': case 'apple': { - const handler = this.shared.handlers.get('login-' + args.kind) as AuthCodeHandler + const handler = this.shared.handlers.get(getSignupHandlerKey(args.kind)) as AuthCodeHandler if (!handler) { throw new Error('handler-not-registered') } @@ -688,7 +750,7 @@ export class Wallets implements WalletsInterface { return { signer, extra: { - signerKind: 'login-' + args.kind, + signerKind: getSignerKindForSignup(args.kind), }, loginEmail, } @@ -696,7 +758,18 @@ export class Wallets implements WalletsInterface { } if (args.kind.startsWith('custom-')) { - // TODO: support other custom auth methods (e.g. id-token) + if (isIdTokenArgs(args)) { + const handler = getIdTokenSignupHandler(this.shared, args.kind) + const [signer, metadata] = await handler.completeAuth(args.idToken) + return { + signer, + extra: { + signerKind: args.kind, + }, + loginEmail: metadata.email, + } + } + const handler = this.shared.handlers.get(args.kind) as AuthCodeHandler if (!handler) { throw new Error('handler-not-registered') @@ -716,11 +789,14 @@ export class Wallets implements WalletsInterface { } async startSignUpWithRedirect(args: StartSignUpWithRedirectArgs) { - const kind = args.kind.startsWith('custom-') ? args.kind : 'login-' + args.kind - const handler = this.shared.handlers.get(kind) as AuthCodeHandler + const kind = getSignupHandlerKey(args.kind) + const handler = this.shared.handlers.get(kind) if (!handler) { throw new Error('handler-not-registered') } + if (!(handler instanceof AuthCodeHandler)) { + throw new Error('handler-does-not-support-redirect') + } return handler.commitAuth(args.target, true) } @@ -742,11 +818,14 @@ export class Wallets implements WalletsInterface { use4337: args.use4337, }) } else { - const kind = commitment.kind.startsWith('custom-') ? commitment.kind : 'login-' + commitment.kind - const handler = this.shared.handlers.get(kind) as AuthCodeHandler + const handlerKind = getSignupHandlerKey(commitment.kind) + const handler = this.shared.handlers.get(handlerKind) if (!handler) { throw new Error('handler-not-registered') } + if (!(handler instanceof AuthCodeHandler)) { + throw new Error('handler-does-not-support-redirect') + } await handler.completeAuth(commitment, args.code) } diff --git a/packages/wallet/wdk/test/authcode-pkce.test.ts b/packages/wallet/wdk/test/authcode-pkce.test.ts index 99e197c7f..e30e8607f 100644 --- a/packages/wallet/wdk/test/authcode-pkce.test.ts +++ b/packages/wallet/wdk/test/authcode-pkce.test.ts @@ -326,7 +326,7 @@ describe('AuthCodePkceHandler', () => { describe('Integration and Edge Cases', () => { it('Should have correct kind property', () => { - expect(handler.kind).toBe('login-google-pkce') + expect(handler.kind).toBe('login-google') }) it('Should handle redirect URI configuration', () => { diff --git a/packages/wallet/wdk/test/authcode.test.ts b/packages/wallet/wdk/test/authcode.test.ts index a1c3be0e8..66c2eca4f 100644 --- a/packages/wallet/wdk/test/authcode.test.ts +++ b/packages/wallet/wdk/test/authcode.test.ts @@ -188,7 +188,7 @@ describe('AuthCodeHandler', () => { // === KIND GETTER === describe('kind getter', () => { - it('Should return login-google-pkce for Google PKCE handler', () => { + it('Should return login-google for Google PKCE handler', () => { const googleHandler = new AuthCodeHandler( 'google-pkce', 'https://accounts.google.com', @@ -200,7 +200,7 @@ describe('AuthCodeHandler', () => { mockAuthKeys, ) - expect(googleHandler.kind).toBe('login-google-pkce') + expect(googleHandler.kind).toBe('login-google') }) it('Should return login-apple for Apple handler', () => { diff --git a/packages/wallet/wdk/test/identity-auth-dbs.test.ts b/packages/wallet/wdk/test/identity-auth-dbs.test.ts index eccc8b885..ae5525120 100644 --- a/packages/wallet/wdk/test/identity-auth-dbs.test.ts +++ b/packages/wallet/wdk/test/identity-auth-dbs.test.ts @@ -351,9 +351,48 @@ describe('Identity Authentication Databases', () => { }, }) - // Verify that Google handler is registered and uses our databases + // Verify that Google is registered under the canonical signer kind while + // still using the PKCE flow by default. const handlers = (manager as any).shared.handlers - expect(handlers.has('login-google-pkce')).toBe(true) + expect(handlers.has('login-google')).toBe(true) + expect(handlers.has('login-google-pkce')).toBe(false) + }) + + it('Should register the Google ID token handler when configured explicitly', async () => { + manager = new Manager({ + stateProvider: new State.Local.Provider(new State.Local.IndexedDbStore(`manager-google-idtoken-${Date.now()}`)), + networks: [ + { + name: 'Test Network', + type: Network.NetworkType.MAINNET, + rpcUrl: LOCAL_RPC_URL, + chainId: Network.ChainId.ARBITRUM, + blockExplorer: { url: 'https://arbiscan.io' }, + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + }, + ], + relayers: [], + authCommitmentsDb, + authKeysDb, + identity: { + url: 'https://dev-identity.sequence-dev.app', + fetch: window.fetch, + google: { + enabled: true, + clientId: 'test-google-client-id', + authMethod: 'id-token', + }, + }, + }) + + const handlers = (manager as any).shared.handlers + expect(handlers.has('login-google-id-token')).toBe(false) + expect(handlers.has('login-google')).toBe(true) + expect(handlers.has('login-google-pkce')).toBe(false) }) it('Should use auth databases when email authentication is enabled', async () => { @@ -424,5 +463,50 @@ describe('Identity Authentication Databases', () => { const handlers = (manager as any).shared.handlers expect(handlers.has('login-apple')).toBe(true) }) + + it('Should register custom ID token providers without enabling redirect flow for them', async () => { + manager = new Manager({ + stateProvider: new State.Local.Provider(new State.Local.IndexedDbStore(`manager-custom-idtoken-${Date.now()}`)), + networks: [ + { + name: 'Test Network', + type: Network.NetworkType.MAINNET, + rpcUrl: LOCAL_RPC_URL, + chainId: Network.ChainId.ARBITRUM, + blockExplorer: { url: 'https://arbiscan.io' }, + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + }, + ], + relayers: [], + authCommitmentsDb, + authKeysDb, + identity: { + url: 'https://dev-identity.sequence-dev.app', + fetch: window.fetch, + customProviders: [ + { + kind: 'custom-google-native', + authMethod: 'id-token', + issuer: 'https://accounts.google.com', + clientId: 'test-google-client-id', + }, + ], + }, + }) + + const handlers = (manager as any).shared.handlers + expect(handlers.has('custom-google-native')).toBe(true) + await expect( + manager.wallets.startSignUpWithRedirect({ + kind: 'custom-google-native', + target: '/home', + metadata: {}, + }), + ).rejects.toThrow('handler-does-not-support-redirect') + }) }) }) diff --git a/packages/wallet/wdk/test/identity-signer.test.ts b/packages/wallet/wdk/test/identity-signer.test.ts index 29403b028..526177aa8 100644 --- a/packages/wallet/wdk/test/identity-signer.test.ts +++ b/packages/wallet/wdk/test/identity-signer.test.ts @@ -13,7 +13,7 @@ const mockCryptoSubtle = { exportKey: vi.fn(), } -Object.defineProperty(global, 'window', { +Object.defineProperty(globalThis, 'window', { value: { crypto: { subtle: mockCryptoSubtle, diff --git a/packages/wallet/wdk/test/idtoken.test.ts b/packages/wallet/wdk/test/idtoken.test.ts new file mode 100644 index 000000000..deeff401f --- /dev/null +++ b/packages/wallet/wdk/test/idtoken.test.ts @@ -0,0 +1,327 @@ +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 } from '@0xsequence/identity-instrument' +import { IdTokenHandler, PromptIdTokenHandler } from '../src/sequence/handlers/idtoken.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' + +describe('IdTokenHandler', () => { + let idTokenHandler: IdTokenHandler + let mockNitroInstrument: IdentityInstrument + let mockSignatures: Signatures + let mockAuthKeys: Db.AuthKeys + let mockIdentitySigner: IdentitySigner + let testWallet: Address.Address + let testRequest: BaseSignatureRequest + let mockPromptIdToken: Mock + + beforeEach(() => { + vi.clearAllMocks() + + testWallet = '0x1234567890123456789012345678901234567890' as Address.Address + + mockNitroInstrument = { + commitVerifier: vi.fn(), + completeAuth: vi.fn(), + } as unknown as IdentityInstrument + + mockSignatures = { + addSignature: vi.fn(), + } as unknown as Signatures + + mockAuthKeys = { + set: vi.fn(), + get: vi.fn(), + del: vi.fn(), + delBySigner: vi.fn(), + getBySigner: vi.fn(), + addListener: vi.fn(), + } as unknown as Db.AuthKeys + + mockIdentitySigner = { + address: testWallet, + sign: vi.fn(), + } as unknown as IdentitySigner + + testRequest = { + id: 'test-request-id', + envelope: { + wallet: testWallet, + chainId: Network.ChainId.ARBITRUM, + payload: Payload.fromMessage(Hex.fromString('Test message')), + }, + } as BaseSignatureRequest + + mockPromptIdToken = vi.fn() + + idTokenHandler = new IdTokenHandler( + 'google-id-token', + 'https://accounts.google.com', + 'test-google-client-id', + mockNitroInstrument, + mockSignatures, + mockAuthKeys, + ) + + vi.spyOn(idTokenHandler as any, 'nitroCommitVerifier').mockResolvedValue({ + verifier: 'unused-verifier', + loginHint: '', + challenge: '', + }) + + vi.spyOn(idTokenHandler as any, 'nitroCompleteAuth').mockResolvedValue({ + signer: mockIdentitySigner, + email: 'user@example.com', + }) + }) + + afterEach(() => { + vi.resetAllMocks() + }) + + describe('Constructor', () => { + it('Should create IdTokenHandler with correct properties', () => { + const handler = new IdTokenHandler( + 'google-id-token', + 'https://accounts.google.com', + 'test-google-client-id', + mockNitroInstrument, + mockSignatures, + mockAuthKeys, + ) + + expect(handler.signupKind).toBe('google-id-token') + expect(handler.issuer).toBe('https://accounts.google.com') + expect(handler.audience).toBe('test-google-client-id') + expect(handler.identityType).toBe(IdentityType.OIDC) + expect(handler.kind).toBe(Kinds.LoginGoogle) + }) + + it('Should initialize without a registered UI callback', () => { + expect(idTokenHandler['onPromptIdToken']).toBeUndefined() + }) + }) + + describe('UI Registration', () => { + it('Should register ID token UI callback', () => { + const unregister = idTokenHandler.registerUI(mockPromptIdToken) + + expect(idTokenHandler['onPromptIdToken']).toBe(mockPromptIdToken) + expect(typeof unregister).toBe('function') + }) + + it('Should unregister UI callback when returned function is called', () => { + const unregister = idTokenHandler.registerUI(mockPromptIdToken) + expect(idTokenHandler['onPromptIdToken']).toBe(mockPromptIdToken) + + unregister() + + expect(idTokenHandler['onPromptIdToken']).toBeUndefined() + }) + + it('Should unregister UI callback directly', () => { + idTokenHandler.registerUI(mockPromptIdToken) + expect(idTokenHandler['onPromptIdToken']).toBe(mockPromptIdToken) + + idTokenHandler.unregisterUI() + + expect(idTokenHandler['onPromptIdToken']).toBeUndefined() + }) + + it('Should allow multiple registrations by overwriting the previous callback', () => { + const secondCallback = vi.fn() + + idTokenHandler.registerUI(mockPromptIdToken) + expect(idTokenHandler['onPromptIdToken']).toBe(mockPromptIdToken) + + idTokenHandler.registerUI(secondCallback) + + expect(idTokenHandler['onPromptIdToken']).toBe(secondCallback) + }) + }) + + describe('completeAuth()', () => { + it('Should complete auth using an OIDC ID token challenge', async () => { + const idToken = 'eyJhbGciOiJub25lIn0.eyJleHAiOjQxMDI0NDQ4MDB9.' + + const [signer, metadata] = await idTokenHandler.completeAuth(idToken) + + expect(idTokenHandler['nitroCommitVerifier']).toHaveBeenCalledWith( + expect.objectContaining({ + issuer: 'https://accounts.google.com', + audience: 'test-google-client-id', + idToken, + }), + ) + expect(idTokenHandler['nitroCompleteAuth']).toHaveBeenCalledWith( + expect.objectContaining({ + issuer: 'https://accounts.google.com', + audience: 'test-google-client-id', + idToken, + }), + ) + expect(signer).toBe(mockIdentitySigner) + expect(metadata).toEqual({ email: 'user@example.com' }) + }) + }) + + describe('getSigner()', () => { + it('Should throw when UI is not registered', async () => { + await expect(idTokenHandler.getSigner()).rejects.toThrow('id-token-handler-ui-not-registered') + }) + + it('Should acquire a signer by prompting for a fresh ID token', async () => { + const idToken = 'header.payload.signature' + const completeAuthSpy = vi + .spyOn(idTokenHandler, 'completeAuth') + .mockResolvedValue([mockIdentitySigner, { email: 'user@example.com' }]) + + mockPromptIdToken.mockImplementation(async (kind, respond) => { + expect(kind).toBe('google-id-token') + await respond(idToken) + }) + + idTokenHandler.registerUI(mockPromptIdToken) + + const result = await idTokenHandler.getSigner() + + expect(result).toEqual({ + signer: mockIdentitySigner, + email: 'user@example.com', + }) + expect(completeAuthSpy).toHaveBeenCalledWith(idToken) + expect(mockPromptIdToken).toHaveBeenCalledWith('google-id-token', expect.any(Function)) + }) + + it('Should surface authentication failures from completeAuth', async () => { + const error = new Error('Authentication failed') + vi.spyOn(idTokenHandler, 'completeAuth').mockRejectedValue(error) + + mockPromptIdToken.mockImplementation(async (_kind, respond) => { + await respond('header.payload.signature') + }) + + idTokenHandler.registerUI(mockPromptIdToken) + + await expect(idTokenHandler.getSigner()).rejects.toThrow('Authentication failed') + }) + + it('Should surface UI callback errors', async () => { + mockPromptIdToken.mockRejectedValue(new Error('UI callback failed')) + idTokenHandler.registerUI(mockPromptIdToken) + + await expect(idTokenHandler.getSigner()).rejects.toThrow('UI callback failed') + }) + }) + + describe('status()', () => { + it('Should return ready status when an auth key signer is available', async () => { + vi.spyOn(idTokenHandler as any, 'getAuthKeySigner').mockResolvedValue(mockIdentitySigner) + + const status = await idTokenHandler.status(testWallet, undefined, testRequest) + + expect(status.status).toBe('ready') + expect(status.handler).toBe(idTokenHandler) + }) + + it('Should sign the request when ready handle is invoked', async () => { + vi.spyOn(idTokenHandler as any, 'getAuthKeySigner').mockResolvedValue(mockIdentitySigner) + const signSpy = vi.spyOn(idTokenHandler as any, 'sign').mockResolvedValue(undefined) + + const status = await idTokenHandler.status(testWallet, undefined, testRequest) + const handled = await (status as any).handle() + + expect(handled).toBe(true) + expect(signSpy).toHaveBeenCalledWith(mockIdentitySigner, testRequest) + }) + + it('Should return unavailable when no auth key signer exists and UI is not registered', async () => { + vi.spyOn(idTokenHandler as any, 'getAuthKeySigner').mockResolvedValue(undefined) + + const status = await idTokenHandler.status(testWallet, undefined, testRequest) + + expect(status).toMatchObject({ + address: testWallet, + handler: idTokenHandler, + status: 'unavailable', + reason: 'ui-not-registered', + }) + }) + + it('Should return actionable when no auth key signer exists and UI is registered', async () => { + vi.spyOn(idTokenHandler as any, 'getAuthKeySigner').mockResolvedValue(undefined) + idTokenHandler.registerUI(mockPromptIdToken) + + const status = await idTokenHandler.status(testWallet, undefined, testRequest) + + expect(status.status).toBe('actionable') + expect(status.address).toBe(testWallet) + expect(status.handler).toBe(idTokenHandler) + expect((status as any).message).toBe('request-id-token') + expect(typeof (status as any).handle).toBe('function') + }) + + it('Should reacquire the signer when actionable handle is invoked', async () => { + vi.spyOn(idTokenHandler as any, 'getAuthKeySigner').mockResolvedValue(undefined) + const completeAuthSpy = vi + .spyOn(idTokenHandler, 'completeAuth') + .mockResolvedValue([mockIdentitySigner, { email: 'user@example.com' }]) + + mockPromptIdToken.mockImplementation(async (_kind, respond) => { + await respond('header.payload.signature') + }) + + idTokenHandler.registerUI(mockPromptIdToken) + + const status = await idTokenHandler.status(testWallet, undefined, testRequest) + const handled = await (status as any).handle() + + expect(handled).toBe(true) + expect(completeAuthSpy).toHaveBeenCalledWith('header.payload.signature') + }) + + it('Should return false when actionable handle authentication fails', async () => { + vi.spyOn(idTokenHandler as any, 'getAuthKeySigner').mockResolvedValue(undefined) + vi.spyOn(idTokenHandler, 'completeAuth').mockRejectedValue(new Error('Authentication failed')) + + mockPromptIdToken.mockImplementation(async (_kind, respond) => { + await respond('header.payload.signature') + }) + + idTokenHandler.registerUI(mockPromptIdToken) + + const status = await idTokenHandler.status(testWallet, undefined, testRequest) + const handled = await (status as any).handle() + + expect(handled).toBe(false) + }) + + it('Should return false when actionable handle authenticates the wrong signer', async () => { + vi.spyOn(idTokenHandler as any, 'getAuthKeySigner').mockResolvedValue(undefined) + const wrongSigner = '0x9999999999999999999999999999999999999999' as Address.Address + vi.spyOn(idTokenHandler, 'completeAuth').mockResolvedValue([ + { + ...mockIdentitySigner, + address: wrongSigner, + } as unknown as IdentitySigner, + { email: 'other-user@example.com' }, + ]) + + mockPromptIdToken.mockImplementation(async (_kind, respond) => { + await respond('header.payload.signature') + }) + + idTokenHandler.registerUI(mockPromptIdToken) + + const status = await idTokenHandler.status(testWallet, undefined, testRequest) + const handled = await (status as any).handle() + + expect(handled).toBe(false) + expect(mockAuthKeys.delBySigner).toHaveBeenCalledWith(wrongSigner) + }) + }) +}) diff --git a/packages/wallet/wdk/test/sessions-idtoken.test.ts b/packages/wallet/wdk/test/sessions-idtoken.test.ts new file mode 100644 index 000000000..7249728b9 --- /dev/null +++ b/packages/wallet/wdk/test/sessions-idtoken.test.ts @@ -0,0 +1,97 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' +import { Hash, Hex, Mnemonic, Secp256k1, Address as OxAddress } from 'ox' +import { Payload } from '@0xsequence/wallet-primitives' +import { newManager } from './constants.js' +import { Manager } from '../src/sequence/index.js' +import { Kinds } from '../src/sequence/types/signer.js' + +describe('Sessions ID token attestation', () => { + let manager: Manager | undefined + + afterEach(async () => { + await manager?.stop() + }) + + it('Should include issuer and audience hashes for google-id-token implicit session authorization', async () => { + manager = newManager({ + identity: { + google: { + enabled: true, + clientId: 'test-google-client-id', + authMethod: 'id-token', + }, + }, + }) + + const wallet = await manager.wallets.signUp({ + mnemonic: Mnemonic.random(Mnemonic.english), + kind: 'mnemonic', + noGuard: true, + }) + expect(wallet).toBeDefined() + + const signersModule = (manager as any).shared.modules.signers + vi.spyOn(signersModule, 'kindOf').mockResolvedValue(Kinds.LoginGoogle) + + const sessionAddress = OxAddress.fromPublicKey(Secp256k1.getPublicKey({ privateKey: Secp256k1.randomPrivateKey() })) + const requestId = await manager.sessions.prepareAuthorizeImplicitSession(wallet!, sessionAddress, { + target: 'https://example.com', + applicationData: '0x1234', + }) + + const request = await manager.signatures.get(requestId) + expect(request.action).toBe('session-implicit-authorize') + expect(Payload.isSessionImplicitAuthorize(request.envelope.payload)).toBe(true) + + if (!Payload.isSessionImplicitAuthorize(request.envelope.payload)) { + throw new Error('Expected session implicit authorize payload') + } + + const attestation = request.envelope.payload.attestation + expect(Hex.fromBytes(attestation.issuerHash)).toBe(Hash.keccak256(Hex.fromString('https://accounts.google.com'))) + expect(Hex.fromBytes(attestation.audienceHash)).toBe(Hash.keccak256(Hex.fromString('test-google-client-id'))) + expect(Hex.fromBytes(attestation.applicationData)).toBe('0x1234') + expect(Hex.fromBytes(attestation.identityType)).toBe('0x00000002') + }) + + it('Should include issuer and audience hashes for apple implicit session authorization', async () => { + manager = newManager({ + identity: { + apple: { + enabled: true, + clientId: 'test-apple-client-id', + }, + }, + }) + + const wallet = await manager.wallets.signUp({ + mnemonic: Mnemonic.random(Mnemonic.english), + kind: 'mnemonic', + noGuard: true, + }) + expect(wallet).toBeDefined() + + const signersModule = (manager as any).shared.modules.signers + vi.spyOn(signersModule, 'kindOf').mockResolvedValue(Kinds.LoginApple) + + const sessionAddress = OxAddress.fromPublicKey(Secp256k1.getPublicKey({ privateKey: Secp256k1.randomPrivateKey() })) + const requestId = await manager.sessions.prepareAuthorizeImplicitSession(wallet!, sessionAddress, { + target: 'https://example.com', + applicationData: '0x1234', + }) + + const request = await manager.signatures.get(requestId) + expect(request.action).toBe('session-implicit-authorize') + expect(Payload.isSessionImplicitAuthorize(request.envelope.payload)).toBe(true) + + if (!Payload.isSessionImplicitAuthorize(request.envelope.payload)) { + throw new Error('Expected session implicit authorize payload') + } + + const attestation = request.envelope.payload.attestation + expect(Hex.fromBytes(attestation.issuerHash)).toBe(Hash.keccak256(Hex.fromString('https://appleid.apple.com'))) + expect(Hex.fromBytes(attestation.audienceHash)).toBe(Hash.keccak256(Hex.fromString('test-apple-client-id'))) + expect(Hex.fromBytes(attestation.applicationData)).toBe('0x1234') + expect(Hex.fromBytes(attestation.identityType)).toBe('0x00000002') + }) +}) diff --git a/packages/wallet/wdk/test/signers-kindof.test.ts b/packages/wallet/wdk/test/signers-kindof.test.ts index 4e5f83aad..06b01cb78 100644 --- a/packages/wallet/wdk/test/signers-kindof.test.ts +++ b/packages/wallet/wdk/test/signers-kindof.test.ts @@ -37,4 +37,26 @@ describe('Signers.kindOf', () => { await signers.kindOf(wallet, '0x2222222222222222222222222222222222222222') expect(getWitnessFor).toHaveBeenCalledTimes(1) }) + + it('normalizes legacy Google PKCE signer kind to the canonical Google signer kind', async () => { + const getWitnessFor = vi.fn().mockResolvedValue({ + payload: { + type: 'message', + message: '0x' + Buffer.from(JSON.stringify({ signerKind: 'login-google-pkce' }), 'utf8').toString('hex'), + }, + }) + + const manager = newManager({ + stateProvider: { + getWitnessFor, + getWitnessForSapient: vi.fn(), + } as any, + }) + + const signers = (manager as any).shared.modules.signers + const wallet = '0x1111111111111111111111111111111111111111' + const signer = '0x2222222222222222222222222222222222222222' + + await expect(signers.kindOf(wallet, signer)).resolves.toBe(Kinds.LoginGoogle) + }) }) diff --git a/packages/wallet/wdk/test/wallets.test.ts b/packages/wallet/wdk/test/wallets.test.ts index a5b26843c..dc3f2728e 100644 --- a/packages/wallet/wdk/test/wallets.test.ts +++ b/packages/wallet/wdk/test/wallets.test.ts @@ -1,8 +1,13 @@ -import { afterEach, describe, expect, it } from 'vitest' +import { afterEach, describe, expect, it, vi } from 'vitest' import { Manager, SignerActionable, SignerReady } from '../src/sequence/index.js' import { Mnemonic, Address } from 'ox' import { newManager } from './constants.js' import { Config, Constants, Network } from '@0xsequence/wallet-primitives' +import { AuthCodePkceHandler } from '../src/sequence/handlers/authcode-pkce.js' +import { IdTokenHandler } from '../src/sequence/handlers/idtoken.js' +import { IdentitySigner } from '../src/identity/signer.js' +import { MnemonicHandler } from '../src/sequence/handlers/mnemonic.js' +import { Kinds } from '../src/sequence/types/signer.js' describe('Wallets', () => { let manager: Manager | undefined @@ -24,6 +29,141 @@ describe('Wallets', () => { await expect(manager.wallets.has(wallet!)).resolves.toBeTruthy() }) + it('Should create a new wallet using google-id-token when Google ID token auth is enabled', async () => { + manager = newManager({ + identity: { + google: { + enabled: true, + clientId: 'test-google-client-id', + authMethod: 'id-token', + }, + }, + }) + + const handler = (manager as any).shared.handlers.get(Kinds.LoginGoogle) as IdTokenHandler + const loginMnemonic = Mnemonic.random(Mnemonic.english) + const loginSigner = MnemonicHandler.toSigner(loginMnemonic) + if (!loginSigner) { + throw new Error('Failed to create login signer for test') + } + + const completeAuthSpy = vi + .spyOn(handler, 'completeAuth') + .mockResolvedValue([loginSigner as unknown as IdentitySigner, { email: 'google-user@example.com' }]) + + const wallet = await manager.wallets.signUp({ + kind: 'google-id-token', + idToken: 'eyJhbGciOiJub25lIn0.eyJleHAiOjQxMDI0NDQ4MDB9.', + noGuard: true, + }) + + expect(wallet).toBeDefined() + expect(completeAuthSpy).toHaveBeenCalledWith('eyJhbGciOiJub25lIn0.eyJleHAiOjQxMDI0NDQ4MDB9.') + await expect(manager.wallets.has(wallet!)).resolves.toBeTruthy() + + const walletEntry = await manager.wallets.get(wallet!) + expect(walletEntry).toBeDefined() + expect(walletEntry!.loginType).toBe(Kinds.LoginGoogle) + expect(walletEntry!.loginEmail).toBe('google-user@example.com') + + const configuration = await manager.wallets.getConfiguration(wallet!) + expect(configuration.login).toHaveLength(1) + expect(configuration.login[0]!.kind).toBe(Kinds.LoginGoogle) + }) + + it('Should register and unregister Google ID token UI callbacks through the manager', async () => { + manager = newManager({ + identity: { + google: { + enabled: true, + clientId: 'test-google-client-id', + authMethod: 'id-token', + }, + }, + }) + + const handler = (manager as any).shared.handlers.get(Kinds.LoginGoogle) as IdTokenHandler + const promptIdToken = vi.fn() + + const unregister = manager.registerIdTokenUI(promptIdToken) + + expect(handler['onPromptIdToken']).toBe(promptIdToken) + + unregister() + + expect(handler['onPromptIdToken']).toBeUndefined() + }) + + it('Should keep Google PKCE redirect flow as the default when authMethod is not specified', async () => { + manager = newManager({ + identity: { + google: { + enabled: true, + clientId: 'test-google-client-id', + }, + }, + }) + + const handler = (manager as any).shared.handlers.get(Kinds.LoginGoogle) as AuthCodePkceHandler + expect(handler).toBeInstanceOf(AuthCodePkceHandler) + + const commitAuthSpy = vi + .spyOn(handler, 'commitAuth') + .mockResolvedValue('https://accounts.google.com/o/oauth2/v2/auth?state=test-state') + + const url = await manager.wallets.startSignUpWithRedirect({ + kind: 'google-pkce', + target: '/auth/return', + metadata: {}, + }) + + expect(url).toBe('https://accounts.google.com/o/oauth2/v2/auth?state=test-state') + expect(commitAuthSpy).toHaveBeenCalledWith('/auth/return', true) + }) + + it('Should reject google-id-token signup when Google is configured for redirect auth', async () => { + manager = newManager({ + identity: { + google: { + enabled: true, + clientId: 'test-google-client-id', + }, + }, + }) + + await expect( + manager.wallets.signUp({ + kind: 'google-id-token', + idToken: 'eyJhbGciOiJub25lIn0.eyJleHAiOjQxMDI0NDQ4MDB9.', + noGuard: true, + }), + ).rejects.toThrow('handler-does-not-support-id-token') + }) + + it('Should reject custom ID token signup when the provider uses redirect auth', async () => { + manager = newManager({ + identity: { + customProviders: [ + { + kind: 'custom-oidc', + authMethod: 'authcode', + issuer: 'https://issuer.example.com', + oauthUrl: 'https://issuer.example.com/oauth/authorize', + clientId: 'test-custom-client-id', + }, + ], + }, + }) + + await expect( + manager.wallets.signUp({ + kind: 'custom-oidc', + idToken: 'eyJhbGciOiJub25lIn0.eyJleHAiOjQxMDI0NDQ4MDB9.', + noGuard: true, + }), + ).rejects.toThrow('handler-does-not-support-id-token') + }) + it('Should get a specific wallet by address', async () => { manager = newManager() const mnemonic = Mnemonic.random(Mnemonic.english) From 695705d714a52cc487172c6e58451abffd5e83f2 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 16 Mar 2026 11:58:14 +0100 Subject: [PATCH 105/144] 3.0.3 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 0e8eaad7e..587820fa3 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index ecb3f5ab8..e5efc1603 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.2", + "version": "3.0.3", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 08a102605..e1b41fe2e 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 160072e47..ef999f3cd 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.2", + "version": "3.0.3", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index b9574b5e1..ba703fb8b 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 947a441f3..b52799f51 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.2", + "version": "3.0.3", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index bfdd435ca..798331cfd 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 680c4b434..d531475f4 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.2", + "version": "3.0.3", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 54cee7353..a6f4539d7 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index c6e4abae8..4504f7dcc 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.2", + "version": "3.0.3", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 0c8767f4d..abac41900 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 308ba5ba4..5706be6b9 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.2", + "version": "3.0.3", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 86b5873be..389399679 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 5419b31dc..7945989f4 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.2", + "version": "3.0.3", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 2574b94e8..056fdca06 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.3 + +### Patch Changes + +- 3.0.3 +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 3dec76338..007dd8ade 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.2", + "version": "3.0.3", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 7387d6298..30c3eb85b 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index dbb1e4a28..90b85d932 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.2", + "version": "3.0.3", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index b5828b596..5fc6db3e0 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index a8b28ead8..8353ef38e 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.2", + "version": "3.0.3", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 139e7f0f2..613594e4e 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.3 + +### Patch Changes + +- 3.0.3 +- Updated dependencies + - @0xsequence/guard@3.0.3 + - @0xsequence/relayer@3.0.3 + - @0xsequence/wallet-primitives@3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 771cf687d..2fb61f424 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.2", + "version": "3.0.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 5b96e92d6..26eafb458 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.3 + +### Patch Changes + +- 3.0.3 +- Updated dependencies + - @0xsequence/guard@3.0.3 + - @0xsequence/relayer@3.0.3 + - @0xsequence/wallet-core@3.0.3 + - @0xsequence/wallet-primitives@3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 2904d51ef..300ab8fcd 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.2", + "version": "3.0.3", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 85c1e85ad..a8c38b8f3 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.3 + +### Patch Changes + +- 3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index fbff60f80..25f07053e 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.2", + "version": "3.0.3", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 62c220728..e226e9321 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.3 + +### Patch Changes + +- 3.0.3 +- Updated dependencies + - @0xsequence/guard@3.0.3 + - @0xsequence/identity-instrument@3.0.3 + - @0xsequence/relayer@3.0.3 + - @0xsequence/wallet-core@3.0.3 + - @0xsequence/wallet-primitives@3.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 277fdf7a6..0e46d9330 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.2", + "version": "3.0.3", "license": "Apache-2.0", "type": "module", "publishConfig": { From 169a216bbacf9f21f776f330099484a10429286b Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Mon, 16 Mar 2026 18:46:16 +0300 Subject: [PATCH 106/144] Add Apple ID token support to wallet WDK (#979) --- .../wdk/src/sequence/handlers/idtoken.ts | 10 ++- packages/wallet/wdk/src/sequence/manager.ts | 46 +++++++++----- packages/wallet/wdk/src/sequence/wallets.ts | 22 +++++-- .../wallet/wdk/test/identity-auth-dbs.test.ts | 36 +++++++++++ packages/wallet/wdk/test/idtoken.test.ts | 16 +++++ .../wallet/wdk/test/sessions-idtoken.test.ts | 1 + packages/wallet/wdk/test/wallets.test.ts | 61 +++++++++++++++++++ 7 files changed, 170 insertions(+), 22 deletions(-) diff --git a/packages/wallet/wdk/src/sequence/handlers/idtoken.ts b/packages/wallet/wdk/src/sequence/handlers/idtoken.ts index 5a8bcac53..58d5b5df9 100644 --- a/packages/wallet/wdk/src/sequence/handlers/idtoken.ts +++ b/packages/wallet/wdk/src/sequence/handlers/idtoken.ts @@ -12,13 +12,16 @@ import type { WdkEnv } from '../../env.js' type RespondFn = (idToken: string) => Promise -export type PromptIdTokenHandler = (kind: 'google-id-token' | `custom-${string}`, respond: RespondFn) => Promise +export type PromptIdTokenHandler = ( + kind: 'google-id-token' | 'apple-id-token' | `custom-${string}`, + respond: RespondFn, +) => Promise export class IdTokenHandler extends IdentityHandler implements Handler { private onPromptIdToken: undefined | PromptIdTokenHandler constructor( - public readonly signupKind: 'google-id-token' | `custom-${string}`, + public readonly signupKind: 'google-id-token' | 'apple-id-token' | `custom-${string}`, public readonly issuer: string, public readonly audience: string, nitro: Identity.IdentityInstrument, @@ -33,6 +36,9 @@ export class IdTokenHandler extends IdentityHandler implements Handler { if (this.signupKind === 'google-id-token') { return Kinds.LoginGoogle } + if (this.signupKind === 'apple-id-token') { + return Kinds.LoginApple + } return 'login-' + this.signupKind } diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts index 8e32c4e5e..c7eecf329 100644 --- a/packages/wallet/wdk/src/sequence/manager.ts +++ b/packages/wallet/wdk/src/sequence/manager.ts @@ -107,6 +107,7 @@ export type ManagerOptions = { apple?: { enabled: boolean clientId: string + authMethod?: 'authcode' | 'id-token' } customProviders?: CustomIdentityProvider[] } @@ -129,6 +130,7 @@ export type ResolvedIdentityOptions = { apple: { enabled: boolean clientId: string + authMethod: 'authcode' | 'id-token' } customProviders?: CustomIdentityProvider[] } @@ -260,6 +262,7 @@ export const ManagerOptionsDefaults = { apple: { enabled: false, clientId: '', + authMethod: 'authcode' as const, }, }, } @@ -716,20 +719,35 @@ export class Manager { } } if (ops.identity.apple?.enabled) { - shared.handlers.set( - Kinds.LoginApple, - new AuthCodeHandler( - 'apple', - 'https://appleid.apple.com', - 'https://appleid.apple.com/auth/authorize', - ops.identity.apple.clientId, - identityInstrument, - modules.signatures, - shared.databases.authCommitments, - shared.databases.authKeys, - shared.env, - ), - ) + if (ops.identity.apple.authMethod === 'id-token') { + shared.handlers.set( + Kinds.LoginApple, + new IdTokenHandler( + 'apple-id-token', + 'https://appleid.apple.com', + ops.identity.apple.clientId, + identityInstrument, + modules.signatures, + shared.databases.authKeys, + shared.env, + ), + ) + } else { + shared.handlers.set( + Kinds.LoginApple, + new AuthCodeHandler( + 'apple', + 'https://appleid.apple.com', + 'https://appleid.apple.com/auth/authorize', + ops.identity.apple.clientId, + identityInstrument, + modules.signatures, + shared.databases.authCommitments, + shared.databases.authKeys, + shared.env, + ), + ) + } } if (ops.identity.customProviders?.length) { for (const provider of ops.identity.customProviders) { diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index 1d8f17a4b..f9f65b58e 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -28,13 +28,19 @@ function getSignerKindForSignup(kind: SignupArgs['kind'] | AuthCommitment['kind' if (kind === 'google-id-token' || kind === 'google-pkce') { return Kinds.LoginGoogle } + if (kind === 'apple-id-token' || kind === 'apple') { + return Kinds.LoginApple + } if (kind.startsWith('custom-')) { return kind } return ('login-' + kind) as string } -function getIdTokenSignupHandler(shared: Shared, kind: typeof Kinds.LoginGoogle | `custom-${string}`): IdTokenHandler { +function getIdTokenSignupHandler( + shared: Shared, + kind: typeof Kinds.LoginGoogle | typeof Kinds.LoginApple | `custom-${string}`, +): IdTokenHandler { const handler = shared.handlers.get(kind) if (!handler) { throw new Error('handler-not-registered') @@ -82,7 +88,7 @@ export type EmailOtpSignupArgs = CommonSignupArgs & { } export type IdTokenSignupArgs = CommonSignupArgs & { - kind: 'google-id-token' | `custom-${string}` + kind: 'google-id-token' | 'apple-id-token' | `custom-${string}` idToken: string } @@ -222,7 +228,7 @@ export interface WalletsInterface { * - `kind: 'mnemonic'`: Uses a mnemonic phrase as the login credential. * - `kind: 'passkey'`: Prompts the user to create a WebAuthn passkey. * - `kind: 'email-otp'`: Initiates an OTP flow to the user's email. - * - `kind: 'google-id-token'`: Completes an OIDC ID token flow when Google is configured with `authMethod: 'id-token'`. + * - `kind: 'google-id-token' | 'apple-id-token'`: Completes an OIDC ID token flow when the provider is configured with `authMethod: 'id-token'`. * - `kind: 'google-pkce' | 'apple'`: Completes an OAuth redirect flow. * Common options like `noGuard` or `noRecovery` can customize the wallet's security features. * @returns A promise that resolves to the address of the newly created wallet, or `undefined` if the sign-up was aborted. @@ -721,8 +727,12 @@ export class Wallets implements WalletsInterface { } } - case 'google-id-token': { - const handler = getIdTokenSignupHandler(this.shared, Kinds.LoginGoogle) + case 'google-id-token': + case 'apple-id-token': { + const handler = getIdTokenSignupHandler( + this.shared, + args.kind === 'google-id-token' ? Kinds.LoginGoogle : Kinds.LoginApple, + ) const [signer, metadata] = await handler.completeAuth(args.idToken) const loginEmail = metadata.email this.shared.modules.logger.log('Created new id token signer:', signer.address) @@ -730,7 +740,7 @@ export class Wallets implements WalletsInterface { return { signer, extra: { - signerKind: Kinds.LoginGoogle, + signerKind: getSignerKindForSignup(args.kind), }, loginEmail, } diff --git a/packages/wallet/wdk/test/identity-auth-dbs.test.ts b/packages/wallet/wdk/test/identity-auth-dbs.test.ts index ae5525120..4062e0c26 100644 --- a/packages/wallet/wdk/test/identity-auth-dbs.test.ts +++ b/packages/wallet/wdk/test/identity-auth-dbs.test.ts @@ -395,6 +395,42 @@ describe('Identity Authentication Databases', () => { expect(handlers.has('login-google-pkce')).toBe(false) }) + it('Should register the Apple ID token handler when configured explicitly', async () => { + manager = new Manager({ + stateProvider: new State.Local.Provider(new State.Local.IndexedDbStore(`manager-apple-idtoken-${Date.now()}`)), + networks: [ + { + name: 'Test Network', + type: Network.NetworkType.MAINNET, + rpcUrl: LOCAL_RPC_URL, + chainId: Network.ChainId.ARBITRUM, + blockExplorer: { url: 'https://arbiscan.io' }, + nativeCurrency: { + name: 'Ether', + symbol: 'ETH', + decimals: 18, + }, + }, + ], + relayers: [], + authCommitmentsDb, + authKeysDb, + identity: { + url: 'https://dev-identity.sequence-dev.app', + fetch: window.fetch, + apple: { + enabled: true, + clientId: 'test-apple-client-id', + authMethod: 'id-token', + }, + }, + }) + + const handlers = (manager as any).shared.handlers + expect(handlers.has('login-apple-id-token')).toBe(false) + expect(handlers.has('login-apple')).toBe(true) + }) + it('Should use auth databases when email authentication is enabled', async () => { manager = new Manager({ stateProvider: new State.Local.Provider(new State.Local.IndexedDbStore(`manager-email-${Date.now()}`)), diff --git a/packages/wallet/wdk/test/idtoken.test.ts b/packages/wallet/wdk/test/idtoken.test.ts index deeff401f..7badcb89a 100644 --- a/packages/wallet/wdk/test/idtoken.test.ts +++ b/packages/wallet/wdk/test/idtoken.test.ts @@ -101,6 +101,22 @@ describe('IdTokenHandler', () => { expect(handler.kind).toBe(Kinds.LoginGoogle) }) + it('Should normalize apple-id-token handlers to login-apple', () => { + const handler = new IdTokenHandler( + 'apple-id-token', + 'https://appleid.apple.com', + 'test-apple-client-id', + mockNitroInstrument, + mockSignatures, + mockAuthKeys, + ) + + expect(handler.signupKind).toBe('apple-id-token') + expect(handler.issuer).toBe('https://appleid.apple.com') + expect(handler.audience).toBe('test-apple-client-id') + expect(handler.kind).toBe(Kinds.LoginApple) + }) + it('Should initialize without a registered UI callback', () => { expect(idTokenHandler['onPromptIdToken']).toBeUndefined() }) diff --git a/packages/wallet/wdk/test/sessions-idtoken.test.ts b/packages/wallet/wdk/test/sessions-idtoken.test.ts index 7249728b9..7c080af5c 100644 --- a/packages/wallet/wdk/test/sessions-idtoken.test.ts +++ b/packages/wallet/wdk/test/sessions-idtoken.test.ts @@ -60,6 +60,7 @@ describe('Sessions ID token attestation', () => { apple: { enabled: true, clientId: 'test-apple-client-id', + authMethod: 'id-token', }, }, }) diff --git a/packages/wallet/wdk/test/wallets.test.ts b/packages/wallet/wdk/test/wallets.test.ts index dc3f2728e..f97b3bf92 100644 --- a/packages/wallet/wdk/test/wallets.test.ts +++ b/packages/wallet/wdk/test/wallets.test.ts @@ -71,6 +71,48 @@ describe('Wallets', () => { expect(configuration.login[0]!.kind).toBe(Kinds.LoginGoogle) }) + it('Should create a new wallet using apple-id-token when Apple ID token auth is enabled', async () => { + manager = newManager({ + identity: { + apple: { + enabled: true, + clientId: 'test-apple-client-id', + authMethod: 'id-token', + }, + }, + }) + + const handler = (manager as any).shared.handlers.get(Kinds.LoginApple) as IdTokenHandler + const loginMnemonic = Mnemonic.random(Mnemonic.english) + const loginSigner = MnemonicHandler.toSigner(loginMnemonic) + if (!loginSigner) { + throw new Error('Failed to create login signer for test') + } + + const completeAuthSpy = vi + .spyOn(handler, 'completeAuth') + .mockResolvedValue([loginSigner as unknown as IdentitySigner, { email: 'apple-user@example.com' }]) + + const wallet = await manager.wallets.signUp({ + kind: 'apple-id-token', + idToken: 'eyJhbGciOiJub25lIn0.eyJleHAiOjQxMDI0NDQ4MDB9.', + noGuard: true, + }) + + expect(wallet).toBeDefined() + expect(completeAuthSpy).toHaveBeenCalledWith('eyJhbGciOiJub25lIn0.eyJleHAiOjQxMDI0NDQ4MDB9.') + await expect(manager.wallets.has(wallet!)).resolves.toBeTruthy() + + const walletEntry = await manager.wallets.get(wallet!) + expect(walletEntry).toBeDefined() + expect(walletEntry!.loginType).toBe(Kinds.LoginApple) + expect(walletEntry!.loginEmail).toBe('apple-user@example.com') + + const configuration = await manager.wallets.getConfiguration(wallet!) + expect(configuration.login).toHaveLength(1) + expect(configuration.login[0]!.kind).toBe(Kinds.LoginApple) + }) + it('Should register and unregister Google ID token UI callbacks through the manager', async () => { manager = newManager({ identity: { @@ -140,6 +182,25 @@ describe('Wallets', () => { ).rejects.toThrow('handler-does-not-support-id-token') }) + it('Should reject apple-id-token signup when Apple is configured for redirect auth', async () => { + manager = newManager({ + identity: { + apple: { + enabled: true, + clientId: 'test-apple-client-id', + }, + }, + }) + + await expect( + manager.wallets.signUp({ + kind: 'apple-id-token', + idToken: 'eyJhbGciOiJub25lIn0.eyJleHAiOjQxMDI0NDQ4MDB9.', + noGuard: true, + }), + ).rejects.toThrow('handler-does-not-support-id-token') + }) + it('Should reject custom ID token signup when the provider uses redirect auth', async () => { manager = newManager({ identity: { From ac996d4100c1f3fde2960b62a971e4dfc2037c17 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Mon, 16 Mar 2026 17:42:05 +0100 Subject: [PATCH 107/144] 3.0.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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 587820fa3..918bad822 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index e5efc1603..451ef58d0 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.3", + "version": "3.0.4", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index e1b41fe2e..2643797ce 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index ef999f3cd..ffc88e246 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.3", + "version": "3.0.4", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index ba703fb8b..f1d8b7552 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index b52799f51..84d0bc3de 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.3", + "version": "3.0.4", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 798331cfd..a266bf802 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index d531475f4..ddb68338b 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.3", + "version": "3.0.4", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index a6f4539d7..ac5f89be5 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 4504f7dcc..7b2b6c2fb 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.3", + "version": "3.0.4", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index abac41900..359c4e344 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 5706be6b9..213124ae8 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.3", + "version": "3.0.4", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 389399679..f194e094f 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 7945989f4..460686f75 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.3", + "version": "3.0.4", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 056fdca06..c781762ac 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.4 + +### Patch Changes + +- id-token login support +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.4 + ## 3.0.3 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 007dd8ade..6d5f306e0 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.3", + "version": "3.0.4", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 30c3eb85b..3d914bb90 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 90b85d932..73cee886f 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.3", + "version": "3.0.4", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 5fc6db3e0..4a755c767 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 8353ef38e..dfb4d80c3 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.3", + "version": "3.0.4", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 613594e4e..d952d05be 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.4 + +### Patch Changes + +- id-token login support +- Updated dependencies + - @0xsequence/guard@3.0.4 + - @0xsequence/relayer@3.0.4 + - @0xsequence/wallet-primitives@3.0.4 + ## 3.0.3 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 2fb61f424..056f84a65 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.3", + "version": "3.0.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 26eafb458..3beac386c 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.4 + +### Patch Changes + +- id-token login support +- Updated dependencies + - @0xsequence/guard@3.0.4 + - @0xsequence/relayer@3.0.4 + - @0xsequence/wallet-core@3.0.4 + - @0xsequence/wallet-primitives@3.0.4 + ## 3.0.3 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 300ab8fcd..2b6c069f9 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.3", + "version": "3.0.4", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index a8c38b8f3..cc25319ad 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.4 + +### Patch Changes + +- id-token login support + ## 3.0.3 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 25f07053e..2fc8c4c47 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.3", + "version": "3.0.4", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index e226e9321..c4b6b370a 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.4 + +### Patch Changes + +- id-token login support +- Updated dependencies + - @0xsequence/guard@3.0.4 + - @0xsequence/identity-instrument@3.0.4 + - @0xsequence/relayer@3.0.4 + - @0xsequence/wallet-core@3.0.4 + - @0xsequence/wallet-primitives@3.0.4 + ## 3.0.3 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 0e46d9330..b08a0cfc9 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.3", + "version": "3.0.4", "license": "Apache-2.0", "type": "module", "publishConfig": { From 849566b2ef9b639a4b75e412032c6d908b3ecc7a Mon Sep 17 00:00:00 2001 From: Patryk Kalinowski Date: Thu, 19 Mar 2026 18:03:33 +0100 Subject: [PATCH 108/144] wdk: account federation (#980) * wdk: account federation * wdk: address review comments; refactor auth commitments * wdk: update tests * fix test --- .../wallet/wdk/src/dbs/auth-commitments.ts | 9 +- packages/wallet/wdk/src/dbs/index.ts | 2 +- .../src/sequence/handlers/authcode-pkce.ts | 26 +- .../wdk/src/sequence/handlers/authcode.ts | 31 +- packages/wallet/wdk/src/sequence/index.ts | 3 + .../src/sequence/types/signature-request.ts | 4 + packages/wallet/wdk/src/sequence/wallets.ts | 320 ++++++++++++++++-- .../wallet/wdk/test/authcode-pkce.test.ts | 45 ++- packages/wallet/wdk/test/authcode.test.ts | 43 +-- .../wallet/wdk/test/identity-auth-dbs.test.ts | 15 +- packages/wallet/wdk/test/wallets.test.ts | 2 +- 11 files changed, 409 insertions(+), 91 deletions(-) diff --git a/packages/wallet/wdk/src/dbs/auth-commitments.ts b/packages/wallet/wdk/src/dbs/auth-commitments.ts index 721d73619..613d4bd57 100644 --- a/packages/wallet/wdk/src/dbs/auth-commitments.ts +++ b/packages/wallet/wdk/src/dbs/auth-commitments.ts @@ -3,6 +3,11 @@ import { IDBPDatabase, IDBPTransaction } from 'idb' const TABLE_NAME = 'auth-commitments' +export type CommitAuthArgs = + | { type: 'auth'; state?: string } + | { type: 'reauth'; state: string; signer: string } + | { type: 'add-signer'; wallet: string; state?: string } + export type AuthCommitment = { id: string kind: 'google-pkce' | 'apple' | `custom-${string}` @@ -10,9 +15,7 @@ export type AuthCommitment = { verifier?: string challenge?: string target: string - isSignUp: boolean - signer?: string -} +} & ({ type: 'auth' } | { type: 'reauth'; signer: string } | { type: 'add-signer'; wallet: string }) export class AuthCommitments extends Generic { constructor(dbName: string = 'sequence-auth-commitments') { diff --git a/packages/wallet/wdk/src/dbs/index.ts b/packages/wallet/wdk/src/dbs/index.ts index 797997b94..1cf7f30f0 100644 --- a/packages/wallet/wdk/src/dbs/index.ts +++ b/packages/wallet/wdk/src/dbs/index.ts @@ -1,4 +1,4 @@ -export type { AuthCommitment } from './auth-commitments.js' +export type { AuthCommitment, CommitAuthArgs } from './auth-commitments.js' export { AuthCommitments } from './auth-commitments.js' export type { AuthKey } from './auth-keys.js' diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts index f8f86d5af..308e2809f 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode-pkce.ts @@ -6,6 +6,7 @@ import * as Identity from '@0xsequence/identity-instrument' import { IdentitySigner } from '../../identity/signer.js' import { AuthCodeHandler } from './authcode.js' import type { WdkEnv } from '../../env.js' +import type { CommitAuthArgs } from '../../dbs/auth-commitments.js' export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { constructor( @@ -22,25 +23,30 @@ export class AuthCodePkceHandler extends AuthCodeHandler implements Handler { super(signupKind, issuer, oauthUrl, audience, nitro, signatures, commitments, authKeys, env) } - public async commitAuth(target: string, isSignUp: boolean, state?: string, signer?: string) { + public async commitAuth(target: string, args: CommitAuthArgs) { let challenge = new Identity.AuthCodePkceChallenge(this.issuer, this.audience, this.redirectUri) - if (signer) { - challenge = challenge.withSigner({ address: signer, keyType: Identity.KeyType.Ethereum_Secp256k1 }) + if (args.type === 'reauth') { + challenge = challenge.withSigner({ address: args.signer, keyType: Identity.KeyType.Ethereum_Secp256k1 }) } const { verifier, loginHint, challenge: codeChallenge } = await this.nitroCommitVerifier(challenge) - if (!state) { - state = Hex.fromBytes(Bytes.random(32)) - } + const state = args.state ?? Hex.fromBytes(Bytes.random(32)) - await this.commitments.set({ + const base = { id: state, - kind: this.signupKind, + kind: this.signupKind as Db.AuthCommitment['kind'], verifier, challenge: codeChallenge, target, metadata: {}, - isSignUp, - }) + } + + if (args.type === 'reauth') { + await this.commitments.set({ ...base, type: 'reauth', signer: args.signer }) + } else if (args.type === 'add-signer') { + await this.commitments.set({ ...base, type: 'add-signer', wallet: args.wallet }) + } else { + await this.commitments.set({ ...base, type: 'auth' }) + } const searchParams = this.serializeQuery({ code_challenge: codeChallenge, diff --git a/packages/wallet/wdk/src/sequence/handlers/authcode.ts b/packages/wallet/wdk/src/sequence/handlers/authcode.ts index 699d72bc4..4b5d5922b 100644 --- a/packages/wallet/wdk/src/sequence/handlers/authcode.ts +++ b/packages/wallet/wdk/src/sequence/handlers/authcode.ts @@ -8,6 +8,7 @@ import { IdentitySigner } from '../../identity/signer.js' import { IdentityHandler } from './identity.js' import { Kinds } from '../types/signer.js' import type { NavigationLike, WdkEnv } from '../../env.js' +import type { CommitAuthArgs } from '../../dbs/auth-commitments.js' export class AuthCodeHandler extends IdentityHandler implements Handler { protected redirectUri: string = '' @@ -39,19 +40,23 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { this.redirectUri = redirectUri } - public async commitAuth(target: string, isSignUp: boolean, state?: string, signer?: string) { - if (!state) { - state = Hex.fromBytes(Bytes.random(32)) - } + public async commitAuth(target: string, args: CommitAuthArgs) { + const state = args.state ?? Hex.fromBytes(Bytes.random(32)) - await this.commitments.set({ + const base = { id: state, - kind: this.signupKind, - signer, + kind: this.signupKind as Db.AuthCommitment['kind'], target, metadata: {}, - isSignUp, - }) + } + + if (args.type === 'reauth') { + await this.commitments.set({ ...base, type: 'reauth', signer: args.signer }) + } else if (args.type === 'add-signer') { + await this.commitments.set({ ...base, type: 'add-signer', wallet: args.wallet }) + } else { + await this.commitments.set({ ...base, type: 'auth' }) + } const searchParams = this.serializeQuery({ client_id: this.audience, @@ -69,7 +74,7 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { code: string, ): Promise<[IdentitySigner, { [key: string]: string }]> { let challenge = new Identity.AuthCodeChallenge(this.issuer, this.audience, this.redirectUri, code) - if (commitment.signer) { + if (commitment.type === 'reauth') { challenge = challenge.withSigner({ address: commitment.signer, keyType: Identity.KeyType.Ethereum_Secp256k1 }) } await this.nitroCommitVerifier(challenge) @@ -103,7 +108,11 @@ export class AuthCodeHandler extends IdentityHandler implements Handler { message: 'request-redirect', handle: async () => { const navigation = this.getNavigation() - const url = await this.commitAuth(navigation.getPathname(), false, request.id, address) + const url = await this.commitAuth(navigation.getPathname(), { + type: 'reauth', + state: request.id, + signer: address, + }) navigation.redirect(url) return true }, diff --git a/packages/wallet/wdk/src/sequence/index.ts b/packages/wallet/wdk/src/sequence/index.ts index ed2f9e440..d2afe15a3 100644 --- a/packages/wallet/wdk/src/sequence/index.ts +++ b/packages/wallet/wdk/src/sequence/index.ts @@ -9,12 +9,15 @@ export { Sessions } from './sessions.js' export { Signatures } from './signatures.js' export type { StartSignUpWithRedirectArgs, + StartAddLoginSignerWithRedirectArgs, CommonSignupArgs, PasskeySignupArgs, MnemonicSignupArgs, EmailOtpSignupArgs, CompleteRedirectArgs, SignupArgs, + AddLoginSignerArgs, + RemoveLoginSignerArgs, LoginToWalletArgs, LoginToMnemonicArgs, LoginToPasskeyArgs, diff --git a/packages/wallet/wdk/src/sequence/types/signature-request.ts b/packages/wallet/wdk/src/sequence/types/signature-request.ts index cbce933da..e3cb1b787 100644 --- a/packages/wallet/wdk/src/sequence/types/signature-request.ts +++ b/packages/wallet/wdk/src/sequence/types/signature-request.ts @@ -13,6 +13,8 @@ export type ActionToPayload = { [Actions.Recovery]: Payload.Recovery [Actions.AddRecoverySigner]: Payload.ConfigUpdate [Actions.RemoveRecoverySigner]: Payload.ConfigUpdate + [Actions.AddLoginSigner]: Payload.ConfigUpdate + [Actions.RemoveLoginSigner]: Payload.ConfigUpdate [Actions.SessionImplicitAuthorize]: Payload.SessionImplicitAuthorize } @@ -26,6 +28,8 @@ export const Actions = { Recovery: 'recovery', AddRecoverySigner: 'add-recovery-signer', RemoveRecoverySigner: 'remove-recovery-signer', + AddLoginSigner: 'add-login-signer', + RemoveLoginSigner: 'remove-login-signer', SessionImplicitAuthorize: 'session-implicit-authorize', } as const diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index f9f65b58e..5746f7a83 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -8,7 +8,7 @@ import { MnemonicHandler } from './handlers/mnemonic.js' import { OtpHandler } from './handlers/otp.js' import { Shared } from './manager.js' import { Device } from './types/device.js' -import { Action, Module } from './types/index.js' +import { Action, Actions, Module } from './types/index.js' import { Kinds, SignerWithKind, WitnessExtraSignerKind } from './types/signer.js' import { Wallet, WalletSelectionUiHandler } from './types/wallet.js' import { PasskeysHandler } from './handlers/passkeys.js' @@ -57,6 +57,12 @@ export type StartSignUpWithRedirectArgs = { metadata: { [key: string]: string } } +export type StartAddLoginSignerWithRedirectArgs = { + wallet: Address.Address + kind: 'google-pkce' | 'apple' | `custom-${string}` + target: string +} + export type SignupStatus = | { type: 'login-signer-created'; address: Address.Address } | { type: 'device-signer-created'; address: Address.Address } @@ -112,6 +118,19 @@ export type SignupArgs = | IdTokenSignupArgs | AuthCodeSignupArgs +export type AddLoginSignerArgs = { + wallet: Address.Address +} & ( + | { kind: 'mnemonic'; mnemonic: string } + | { kind: 'email-otp'; email: string } + | { kind: 'google-id-token' | 'apple-id-token' | `custom-${string}`; idToken: string } +) + +export type RemoveLoginSignerArgs = { + wallet: Address.Address + signerAddress: Address.Address +} + export type LoginToWalletArgs = { wallet: Address.Address } @@ -292,6 +311,66 @@ export interface WalletsInterface { */ completeLogin(requestId: string): Promise + /** + * Adds a new login signer to an existing wallet, enabling account federation. + * + * This allows a user to link a new login method (e.g., Google, email OTP, mnemonic) to a wallet + * that was originally created with a different credential. After federation, the wallet can be + * discovered and accessed via any of its linked login methods. + * + * @param args The arguments specifying the wallet and the new login credential to add. + * @returns A promise that resolves to a `requestId` for the configuration update signature request. + * @see {completeAddLoginSigner} + */ + addLoginSigner(args: AddLoginSignerArgs): Promise + + /** + * Completes the add-login-signer process after the configuration update has been signed. + * + * @param requestId The ID of the completed signature request returned by `addLoginSigner`. + * @returns A promise that resolves when the configuration update has been submitted. + */ + completeAddLoginSigner(requestId: string): Promise + + /** + * Initiates an add-login-signer process that involves an OAuth redirect. + * + * This is the first step for adding a social login signer (e.g., Google, Apple) to an existing wallet + * via a redirect-based OAuth flow. It validates the wallet, generates the necessary challenges and state, + * stores them locally, and returns a URL. Your application should redirect the user to this URL. + * + * After the redirect callback, call `completeRedirect` with the returned state and code. This will + * create a pending `AddLoginSigner` signature request internally. The caller can then discover + * the pending request through the signatures module and call `completeAddLoginSigner` with the requestId + * once it has been signed. + * + * @param args Arguments specifying the wallet, provider (`kind`), and the `target` URL for the redirect callback. + * @returns A promise that resolves to the full OAuth URL to which the user should be redirected. + * @see {completeRedirect} for the second step of this flow. + * @see {completeAddLoginSigner} to finalize after signing. + */ + startAddLoginSignerWithRedirect(args: StartAddLoginSignerWithRedirectArgs): Promise + + /** + * Removes a login signer from an existing wallet, enabling account defederation. + * + * This allows a user to unlink a login method from a wallet. A safety guard ensures + * at least one login signer always remains. + * + * @param args The arguments specifying the wallet and the signer address to remove. + * @returns A promise that resolves to a `requestId` for the configuration update signature request. + * @see {completeRemoveLoginSigner} + */ + removeLoginSigner(args: RemoveLoginSignerArgs): Promise + + /** + * Completes the remove-login-signer process after the configuration update has been signed. + * + * @param requestId The ID of the completed signature request returned by `removeLoginSigner`. + * @returns A promise that resolves when the configuration update has been submitted. + */ + completeRemoveLoginSigner(requestId: string): Promise + /** * Logs out from a given wallet, ending the current session. * @@ -417,6 +496,20 @@ export function isIdTokenArgs(args: SignupArgs): args is IdTokenSignupArgs { return 'idToken' in args } +function addLoginSignerToSignupArgs(args: AddLoginSignerArgs): SignupArgs { + switch (args.kind) { + case 'mnemonic': + return { kind: 'mnemonic', mnemonic: args.mnemonic } + case 'email-otp': + return { kind: 'email-otp', email: args.email } + default: { + // google-id-token, apple-id-token, custom-* + const _args = args as { kind: string; idToken: string } + return { kind: _args.kind as IdTokenSignupArgs['kind'], idToken: _args.idToken } + } + } +} + function buildCappedTree(members: { address: Address.Address; imageHash?: Hex.Hex }[]): Config.Topology { const loginMemberWeight = 1n @@ -807,7 +900,27 @@ export class Wallets implements WalletsInterface { if (!(handler instanceof AuthCodeHandler)) { throw new Error('handler-does-not-support-redirect') } - return handler.commitAuth(args.target, true) + return handler.commitAuth(args.target, { type: 'auth' }) + } + + async startAddLoginSignerWithRedirect(args: StartAddLoginSignerWithRedirectArgs) { + const walletEntry = await this.get(args.wallet) + if (!walletEntry) { + throw new Error('wallet-not-found') + } + if (walletEntry.status !== 'ready') { + throw new Error('wallet-not-ready') + } + + const kind = getSignupHandlerKey(args.kind) + const handler = this.shared.handlers.get(kind) + if (!handler) { + throw new Error('handler-not-registered') + } + if (!(handler instanceof AuthCodeHandler)) { + throw new Error('handler-does-not-support-redirect') + } + return handler.commitAuth(args.target, { type: 'add-signer', wallet: args.wallet }) } async completeRedirect(args: CompleteRedirectArgs): Promise { @@ -816,28 +929,62 @@ export class Wallets implements WalletsInterface { throw new Error('invalid-state') } - // commitment.isSignUp and signUp also mean 'signIn' from wallet's perspective - if (commitment.isSignUp) { - await this.signUp({ - kind: commitment.kind, - commitment, - code: args.code, - noGuard: args.noGuard, - target: commitment.target, - isRedirect: true, - use4337: args.use4337, - }) - } else { - const handlerKind = getSignupHandlerKey(commitment.kind) - const handler = this.shared.handlers.get(handlerKind) - if (!handler) { - throw new Error('handler-not-registered') + switch (commitment.type) { + case 'add-signer': { + const handlerKind = getSignupHandlerKey(commitment.kind) + const handler = this.shared.handlers.get(handlerKind) + if (!handler) { + throw new Error('handler-not-registered') + } + if (!(handler instanceof AuthCodeHandler)) { + throw new Error('handler-does-not-support-redirect') + } + + const walletAddress = commitment.wallet as Address.Address + const walletEntry = await this.get(walletAddress) + if (!walletEntry) { + throw new Error('wallet-not-found') + } + if (walletEntry.status !== 'ready') { + throw new Error('wallet-not-ready') + } + + const [signer] = await handler.completeAuth(commitment, args.code) + const signerKind = getSignerKindForSignup(commitment.kind) + + await this.addLoginSignerFromPrepared(walletAddress, { + signer, + extra: { signerKind }, + }) + break } - if (!(handler instanceof AuthCodeHandler)) { - throw new Error('handler-does-not-support-redirect') + + case 'auth': { + await this.signUp({ + kind: commitment.kind, + commitment, + code: args.code, + noGuard: args.noGuard, + target: commitment.target, + isRedirect: true, + use4337: args.use4337, + }) + break } - await handler.completeAuth(commitment, args.code) + case 'reauth': { + const handlerKind = getSignupHandlerKey(commitment.kind) + const handler = this.shared.handlers.get(handlerKind) + if (!handler) { + throw new Error('handler-not-registered') + } + if (!(handler instanceof AuthCodeHandler)) { + throw new Error('handler-does-not-support-redirect') + } + + await handler.completeAuth(commitment, args.code) + break + } } if (!commitment.target) { @@ -1273,6 +1420,87 @@ export class Wallets implements WalletsInterface { }) } + async addLoginSigner(args: AddLoginSignerArgs): Promise { + const walletEntry = await this.get(args.wallet) + if (!walletEntry) { + throw new Error('wallet-not-found') + } + if (walletEntry.status !== 'ready') { + throw new Error('wallet-not-ready') + } + + const signupArgs = addLoginSignerToSignupArgs(args) + const loginSigner = await this.prepareSignUp(signupArgs) + return this.addLoginSignerFromPrepared(args.wallet, loginSigner) + } + + async completeAddLoginSigner(requestId: string): Promise { + const request = await this.shared.modules.signatures.get(requestId) + if (request.action !== Actions.AddLoginSigner) { + throw new Error('invalid-request-action') + } + await this.completeConfigurationUpdate(requestId) + } + + async removeLoginSigner(args: RemoveLoginSignerArgs): Promise { + const walletEntry = await this.get(args.wallet) + if (!walletEntry) { + throw new Error('wallet-not-found') + } + if (walletEntry.status !== 'ready') { + throw new Error('wallet-not-ready') + } + + const { loginTopology, modules } = await this.getConfigurationParts(args.wallet) + + const existingSigners = Config.getSigners(loginTopology) + const allExistingAddresses = [...existingSigners.signers, ...existingSigners.sapientSigners.map((s) => s.address)] + + if (!allExistingAddresses.some((addr) => Address.isEqual(addr, args.signerAddress))) { + throw new Error('signer-not-found') + } + + const remainingMembers = [ + ...existingSigners.signers + .filter((x) => x !== Constants.ZeroAddress && !Address.isEqual(x, args.signerAddress)) + .map((x) => ({ address: x })), + ...existingSigners.sapientSigners + .filter((x) => !Address.isEqual(x.address, args.signerAddress)) + .map((x) => ({ address: x.address, imageHash: x.imageHash })), + ] + + if (remainingMembers.length < 1) { + throw new Error('cannot-remove-last-login-signer') + } + + const nextLoginTopology = buildCappedTree(remainingMembers) + + if (this.shared.modules.sessions.hasSessionModule(modules)) { + await this.shared.modules.sessions.removeIdentitySignerFromModules(modules, args.signerAddress) + } + + if (this.shared.modules.recovery.hasRecoveryModule(modules)) { + await this.shared.modules.recovery.removeRecoverySignerFromModules(modules, args.signerAddress) + } + + const requestId = await this.requestConfigurationUpdate( + args.wallet, + { loginTopology: nextLoginTopology, modules }, + Actions.RemoveLoginSigner, + 'wallet-webapp', + ) + + return requestId + } + + async completeRemoveLoginSigner(requestId: string): Promise { + const request = await this.shared.modules.signatures.get(requestId) + if (request.action !== Actions.RemoveLoginSigner) { + throw new Error('invalid-request-action') + } + await this.completeConfigurationUpdate(requestId) + } + async logout( wallet: Address.Address, options?: T, @@ -1503,4 +1731,54 @@ export class Wallets implements WalletsInterface { return requestId } + + private async addLoginSignerFromPrepared( + wallet: Address.Address, + loginSigner: { + signer: (Signers.Signer | Signers.SapientSigner) & Signers.Witnessable + extra: WitnessExtraSignerKind + }, + ): Promise { + const newSignerAddress = await loginSigner.signer.address + + const { loginTopology, modules } = await this.getConfigurationParts(wallet) + + // Check for duplicate signer + const existingSigners = Config.getSigners(loginTopology) + const allExistingAddresses = [...existingSigners.signers, ...existingSigners.sapientSigners.map((s) => s.address)] + if (allExistingAddresses.some((addr) => Address.isEqual(addr, newSignerAddress))) { + throw new Error('signer-already-exists') + } + + // Build new login topology with the additional signer + const existingMembers = [ + ...existingSigners.signers.filter((x) => x !== Constants.ZeroAddress).map((x) => ({ address: x })), + ...existingSigners.sapientSigners.map((x) => ({ address: x.address, imageHash: x.imageHash })), + ] + const newMember = { + address: newSignerAddress, + imageHash: Signers.isSapientSigner(loginSigner.signer) ? await loginSigner.signer.imageHash : undefined, + } + const nextLoginTopology = buildCappedTree([...existingMembers, newMember]) + + // Add non-sapient login signer to sessions module identity signers + if (!Signers.isSapientSigner(loginSigner.signer) && this.shared.modules.sessions.hasSessionModule(modules)) { + await this.shared.modules.sessions.addIdentitySignerToModules(modules, newSignerAddress) + } + + // Add to recovery module if present + if (this.shared.modules.recovery.hasRecoveryModule(modules)) { + await this.shared.modules.recovery.addRecoverySignerToModules(modules, newSignerAddress) + } + + // Witness so the wallet becomes discoverable via the new credential + await loginSigner.signer.witness(this.shared.sequence.stateProvider, wallet, loginSigner.extra) + + return this.requestConfigurationUpdate( + wallet, + { loginTopology: nextLoginTopology, modules }, + Actions.AddLoginSigner, + 'wallet-webapp', + ) + } } diff --git a/packages/wallet/wdk/test/authcode-pkce.test.ts b/packages/wallet/wdk/test/authcode-pkce.test.ts index e30e8607f..d9b46bd87 100644 --- a/packages/wallet/wdk/test/authcode-pkce.test.ts +++ b/packages/wallet/wdk/test/authcode-pkce.test.ts @@ -90,9 +90,8 @@ describe('AuthCodePkceHandler', () => { describe('commitAuth', () => { it('Should create Google PKCE auth commitment and return OAuth URL', async () => { const target = 'https://example.com/success' - const isSignUp = true - const result = await handler.commitAuth(target, isSignUp) + const result = await handler.commitAuth(target, { type: 'auth' }) // Verify nitroCommitVerifier was called with correct challenge expect(handler['nitroCommitVerifier']).toHaveBeenCalledWith( @@ -110,7 +109,7 @@ describe('AuthCodePkceHandler', () => { challenge: 'mock-challenge-hash', target, metadata: {}, - isSignUp, + type: 'auth', }) // Verify OAuth URL is constructed correctly @@ -127,10 +126,13 @@ describe('AuthCodePkceHandler', () => { it('Should use provided state instead of generating random one', async () => { const target = 'https://example.com/success' - const isSignUp = false const customState = 'custom-state-123' - const result = await handler.commitAuth(target, isSignUp, customState) + const result = await handler.commitAuth(target, { + type: 'reauth', + state: customState, + signer: '0x1234567890123456789012345678901234567890', + }) // Verify commitment was saved with custom state expect(mockCommitments.set).toHaveBeenCalledWith({ @@ -140,7 +142,8 @@ describe('AuthCodePkceHandler', () => { challenge: 'mock-challenge-hash', target, metadata: {}, - isSignUp, + type: 'reauth', + signer: '0x1234567890123456789012345678901234567890', }) // Verify URL contains custom state @@ -149,10 +152,9 @@ describe('AuthCodePkceHandler', () => { it('Should include signer in challenge when provided', async () => { const target = 'https://example.com/success' - const isSignUp = true const signer = '0x9876543210987654321098765432109876543210' - await handler.commitAuth(target, isSignUp, undefined, signer) + await handler.commitAuth(target, { type: 'reauth', state: 'test-state', signer }) // Verify nitroCommitVerifier was called with signer in challenge expect(handler['nitroCommitVerifier']).toHaveBeenCalledWith( @@ -164,9 +166,8 @@ describe('AuthCodePkceHandler', () => { it('Should generate random state when not provided', async () => { const target = 'https://example.com/success' - const isSignUp = true - const result = await handler.commitAuth(target, isSignUp) + const result = await handler.commitAuth(target, { type: 'auth' }) // Verify that a state parameter is present and looks like a hex string expect(result).toMatch(/state=0x[a-f0-9]+/) @@ -181,18 +182,22 @@ describe('AuthCodePkceHandler', () => { const target = 'https://example.com/success' // Test signup - await handler.commitAuth(target, true) + await handler.commitAuth(target, { type: 'auth' }) expect(mockCommitments.set).toHaveBeenLastCalledWith( expect.objectContaining({ - isSignUp: true, + type: 'auth', }), ) // Test login - await handler.commitAuth(target, false) + await handler.commitAuth(target, { + type: 'reauth', + state: 'test-state', + signer: '0x1234567890123456789012345678901234567890', + }) expect(mockCommitments.set).toHaveBeenLastCalledWith( expect.objectContaining({ - isSignUp: false, + type: 'reauth', }), ) }) @@ -200,13 +205,17 @@ describe('AuthCodePkceHandler', () => { it('Should handle errors from nitroCommitVerifier', async () => { vi.spyOn(handler as any, 'nitroCommitVerifier').mockRejectedValue(new Error('Nitro service unavailable')) - await expect(handler.commitAuth('https://example.com/success', true)).rejects.toThrow('Nitro service unavailable') + await expect(handler.commitAuth('https://example.com/success', { type: 'auth' })).rejects.toThrow( + 'Nitro service unavailable', + ) }) it('Should handle database errors during commitment storage', async () => { vi.mocked(mockCommitments.set).mockRejectedValue(new Error('Database write failed')) - await expect(handler.commitAuth('https://example.com/success', true)).rejects.toThrow('Database write failed') + await expect(handler.commitAuth('https://example.com/success', { type: 'auth' })).rejects.toThrow( + 'Database write failed', + ) }) }) @@ -221,7 +230,7 @@ describe('AuthCodePkceHandler', () => { challenge: 'test-challenge-hash', target: 'https://example.com/success', metadata: { scope: 'openid profile email' }, - isSignUp: true, + type: 'auth', } }) @@ -333,7 +342,7 @@ describe('AuthCodePkceHandler', () => { const newRedirectUri = 'https://newdomain.com/callback' handler.setRedirectUri(newRedirectUri) - return handler.commitAuth('https://example.com/success', true).then((result) => { + return handler.commitAuth('https://example.com/success', { type: 'auth' }).then((result) => { expect(result).toContain(`redirect_uri=${encodeURIComponent(newRedirectUri)}`) }) }) diff --git a/packages/wallet/wdk/test/authcode.test.ts b/packages/wallet/wdk/test/authcode.test.ts index 66c2eca4f..f673f8d42 100644 --- a/packages/wallet/wdk/test/authcode.test.ts +++ b/packages/wallet/wdk/test/authcode.test.ts @@ -113,7 +113,7 @@ describe('AuthCodeHandler', () => { kind: 'google-pkce', metadata: {}, target: '/test-target', - isSignUp: false, + type: 'reauth', signer: testWallet, } @@ -247,20 +247,17 @@ describe('AuthCodeHandler', () => { it('Should create auth commitment and return OAuth URL', async () => { const target = '/test-target' - const isSignUp = true - const signer = testWallet - const result = await authCodeHandler.commitAuth(target, isSignUp, undefined, signer) + const result = await authCodeHandler.commitAuth(target, { type: 'auth' }) // Verify commitment was saved expect(mockAuthCommitmentsSet).toHaveBeenCalledOnce() const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.kind).toBe('google-pkce') - expect(commitmentCall.signer).toBe(signer) expect(commitmentCall.target).toBe(target) expect(commitmentCall.metadata).toEqual({}) - expect(commitmentCall.isSignUp).toBe(isSignUp) + expect(commitmentCall.type).toBe('auth') expect(commitmentCall.id).toBeDefined() expect(typeof commitmentCall.id).toBe('string') @@ -276,7 +273,11 @@ describe('AuthCodeHandler', () => { it('Should use provided state parameter', async () => { const customState = 'custom-state-123' - const result = await authCodeHandler.commitAuth('/target', false, customState) + const result = await authCodeHandler.commitAuth('/target', { + type: 'reauth', + state: customState, + signer: testWallet, + }) // Verify commitment uses custom state const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! @@ -285,7 +286,7 @@ describe('AuthCodeHandler', () => { }) it('Should generate random state when not provided', async () => { - await authCodeHandler.commitAuth('/target', false) + await authCodeHandler.commitAuth('/target', { type: 'auth' }) const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.id).toBeDefined() expect(typeof commitmentCall.id).toBe('string') @@ -306,7 +307,7 @@ describe('AuthCodeHandler', () => { ) appleHandler.setRedirectUri('https://example.com/callback') - const result = await appleHandler.commitAuth('/target', false) + const result = await appleHandler.commitAuth('/target', { type: 'auth' }) expect(result).toContain('https://appleid.apple.com/auth/authorize?') expect(result).toContain('client_id=apple-client-id') @@ -315,10 +316,10 @@ describe('AuthCodeHandler', () => { }) it('Should create commitment without signer', async () => { - await authCodeHandler.commitAuth('/target', true) + await authCodeHandler.commitAuth('/target', { type: 'auth' }) const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.signer).toBeUndefined() - expect(commitmentCall.isSignUp).toBe(true) + expect(commitmentCall.type).toBe('auth') }) }) @@ -492,7 +493,7 @@ describe('AuthCodeHandler', () => { const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]! expect(commitmentCall.target).toBe(window.location.pathname) - expect(commitmentCall.isSignUp).toBe(false) + expect(commitmentCall.type).toBe('reauth') expect(commitmentCall.signer).toBe(testWallet) }) }) @@ -654,7 +655,7 @@ describe('AuthCodeHandler', () => { it('Should handle auth commitments database errors', async () => { mockAuthCommitmentsSet.mockRejectedValueOnce(new Error('Database error')) - await expect(authCodeHandler.commitAuth('/target', false)).rejects.toThrow('Database error') + await expect(authCodeHandler.commitAuth('/target', { type: 'auth' })).rejects.toThrow('Database error') }) it('Should handle auth keys database errors', async () => { @@ -671,7 +672,11 @@ describe('AuthCodeHandler', () => { authCodeHandler.setRedirectUri('https://example.com/callback') // Step 1: Commit auth - const commitUrl = await authCodeHandler.commitAuth('/test-target', false, 'test-state', testWallet) + const commitUrl = await authCodeHandler.commitAuth('/test-target', { + type: 'reauth', + state: 'test-state', + signer: testWallet, + }) expect(commitUrl).toContain('state=test-state') expect(mockAuthCommitmentsSet).toHaveBeenCalledWith( @@ -679,7 +684,7 @@ describe('AuthCodeHandler', () => { id: 'test-state', kind: 'google-pkce', target: '/test-target', - isSignUp: false, + type: 'reauth', signer: testWallet, }), ) @@ -709,17 +714,17 @@ describe('AuthCodeHandler', () => { authCodeHandler.setRedirectUri('https://example.com/callback') // Test signup flow - await authCodeHandler.commitAuth('/signup-target', true, 'signup-state') + await authCodeHandler.commitAuth('/signup-target', { type: 'auth', state: 'signup-state' }) const signupCall = mockAuthCommitmentsSet.mock.calls[0]![0]! - expect(signupCall.isSignUp).toBe(true) + expect(signupCall.type).toBe('auth') expect(signupCall.target).toBe('/signup-target') // Test login flow - await authCodeHandler.commitAuth('/login-target', false, 'login-state') + await authCodeHandler.commitAuth('/login-target', { type: 'reauth', state: 'login-state', signer: testWallet }) const loginCall = mockAuthCommitmentsSet.mock.calls[1]![0]! - expect(loginCall.isSignUp).toBe(false) + expect(loginCall.type).toBe('reauth') expect(loginCall.target).toBe('/login-target') }) }) diff --git a/packages/wallet/wdk/test/identity-auth-dbs.test.ts b/packages/wallet/wdk/test/identity-auth-dbs.test.ts index 4062e0c26..bba408ef3 100644 --- a/packages/wallet/wdk/test/identity-auth-dbs.test.ts +++ b/packages/wallet/wdk/test/identity-auth-dbs.test.ts @@ -34,7 +34,7 @@ describe('Identity Authentication Databases', () => { verifier: 'test-verifier-code', challenge: 'test-challenge-hash', target: 'test-target-url', - isSignUp: true, + type: 'reauth', signer: '0x1234567890123456789012345678901234567890', } @@ -66,7 +66,7 @@ describe('Identity Authentication Databases', () => { response_mode: 'form_post', }, target: 'apple-redirect-url', - isSignUp: false, + type: 'auth', } await authCommitmentsDb.set(appleCommitment) @@ -74,7 +74,7 @@ describe('Identity Authentication Databases', () => { expect(retrieved).toBeDefined() expect(retrieved!.kind).toBe('apple') - expect(retrieved!.isSignUp).toBe(false) + expect(retrieved!.type).toBe('auth') expect(retrieved!.metadata.response_type).toBe('code id_token') }) @@ -85,21 +85,22 @@ describe('Identity Authentication Databases', () => { kind: 'google-pkce', metadata: {}, target: 'target-1', - isSignUp: true, + type: 'auth', }, { id: 'commit-2', kind: 'apple', metadata: {}, target: 'target-2', - isSignUp: false, + type: 'reauth', + signer: '0x1234567890123456789012345678901234567890', }, { id: 'commit-3', kind: 'google-pkce', metadata: {}, target: 'target-3', - isSignUp: true, + type: 'auth', }, ] @@ -129,7 +130,7 @@ describe('Identity Authentication Databases', () => { kind: 'google-pkce', metadata: {}, target: 'init-target', - isSignUp: true, + type: 'auth', } await freshDb.set(testCommitment) diff --git a/packages/wallet/wdk/test/wallets.test.ts b/packages/wallet/wdk/test/wallets.test.ts index f97b3bf92..d686ac257 100644 --- a/packages/wallet/wdk/test/wallets.test.ts +++ b/packages/wallet/wdk/test/wallets.test.ts @@ -160,7 +160,7 @@ describe('Wallets', () => { }) expect(url).toBe('https://accounts.google.com/o/oauth2/v2/auth?state=test-state') - expect(commitAuthSpy).toHaveBeenCalledWith('/auth/return', true) + expect(commitAuthSpy).toHaveBeenCalledWith('/auth/return', { type: 'auth' }) }) it('Should reject google-id-token signup when Google is configured for redirect auth', async () => { From a204a0a0833521963b569da2bc0cc7516eda67ae Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 19 Mar 2026 18:20:11 +0100 Subject: [PATCH 109/144] 3.0.5 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 918bad822..de944ea36 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 451ef58d0..8d2f87a22 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.4", + "version": "3.0.5", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 2643797ce..e45889345 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index ffc88e246..1897f0ab8 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.4", + "version": "3.0.5", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index f1d8b7552..a705f48ba 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 84d0bc3de..fc489cd03 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.4", + "version": "3.0.5", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index a266bf802..ff6cebf47 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index ddb68338b..bb61d8e20 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.4", + "version": "3.0.5", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index ac5f89be5..fb104e35f 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 7b2b6c2fb..7ad0de895 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.4", + "version": "3.0.5", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 359c4e344..5a97b94e8 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 213124ae8..865e0e5b4 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.4", + "version": "3.0.5", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index f194e094f..3362b424e 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 460686f75..acb19b042 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.4", + "version": "3.0.5", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index c781762ac..abefb99b7 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.5 + +### Patch Changes + +- Account federation support +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.5 + ## 3.0.4 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 6d5f306e0..0c1422d97 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.4", + "version": "3.0.5", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 3d914bb90..51ebad413 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 73cee886f..38f3c9d5a 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.4", + "version": "3.0.5", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 4a755c767..8194c38b8 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index dfb4d80c3..d70d75cdc 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.4", + "version": "3.0.5", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index d952d05be..23fc45fe4 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.5 + +### Patch Changes + +- Account federation support +- Updated dependencies + - @0xsequence/guard@3.0.5 + - @0xsequence/relayer@3.0.5 + - @0xsequence/wallet-primitives@3.0.5 + ## 3.0.4 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 056f84a65..413315786 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.4", + "version": "3.0.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 3beac386c..2039d0c2d 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.5 + +### Patch Changes + +- Account federation support +- Updated dependencies + - @0xsequence/guard@3.0.5 + - @0xsequence/relayer@3.0.5 + - @0xsequence/wallet-core@3.0.5 + - @0xsequence/wallet-primitives@3.0.5 + ## 3.0.4 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 2b6c069f9..457e7ec28 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.4", + "version": "3.0.5", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index cc25319ad..7e5a4cdbf 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.5 + +### Patch Changes + +- Account federation support + ## 3.0.4 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 2fc8c4c47..e0e283de6 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.4", + "version": "3.0.5", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index c4b6b370a..5101c28c5 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.5 + +### Patch Changes + +- Account federation support +- Updated dependencies + - @0xsequence/guard@3.0.5 + - @0xsequence/identity-instrument@3.0.5 + - @0xsequence/relayer@3.0.5 + - @0xsequence/wallet-core@3.0.5 + - @0xsequence/wallet-primitives@3.0.5 + ## 3.0.4 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index b08a0cfc9..772faa9aa 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.4", + "version": "3.0.5", "license": "Apache-2.0", "type": "module", "publishConfig": { From a04b263489624df69d47584064f586d3bdbeea8a Mon Sep 17 00:00:00 2001 From: Ocheretovich Date: Fri, 27 Mar 2026 15:22:32 +0200 Subject: [PATCH 110/144] chore: fixed broken link (#985) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c663ccf8..ae41ffdbd 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Sequence v3 core libraries and [wallet-contracts-v3](https://github.com/0xsequen - Run tests: `pnpm test` - > **Note:** Tests require [anvil](https://github.com/foundry-rs/foundry/tree/master/anvil) and [forge](https://github.com/foundry-rs/foundry) to be installed. You can run a local anvil instance using `pnpm run test:anvil`. + > **Note:** Tests require [anvil](https://github.com/foundry-rs/foundry/tree/master/crates/anvil) and [forge](https://github.com/foundry-rs/foundry) to be installed. You can run a local anvil instance using `pnpm run test:anvil`. - Linting and formatting is enforced via git hooks From 8388bca61e25134863585aff4e8dbdd9402df3e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:23:00 +0100 Subject: [PATCH 111/144] Bump happy-dom from 20.7.0 to 20.8.8 (#984) Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.7.0 to 20.8.8. - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.7.0...v20.8.8) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.8.8 dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/wallet/dapp-client/package.json | 2 +- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 129 ++++++++++++++++++----- 3 files changed, 105 insertions(+), 28 deletions(-) diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 457e7ec28..57e4a7825 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -27,7 +27,7 @@ "@vitest/coverage-v8": "^4.0.18", "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", - "happy-dom": "^20.7.0", + "happy-dom": "^20.8.8", "typescript": "^5.9.3", "vitest": "^4.0.18" }, diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 772faa9aa..23ae11cc8 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -30,7 +30,7 @@ "@vitest/coverage-v8": "^4.0.18", "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", - "happy-dom": "^20.7.0", + "happy-dom": "^20.8.8", "typescript": "^5.9.3", "vitest": "^4.0.18" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3a0e9843..961a474af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -157,7 +157,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) packages/services/identity-instrument: dependencies: @@ -185,7 +185,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) packages/services/indexer: devDependencies: @@ -261,7 +261,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) packages/services/userdata: devDependencies: @@ -325,7 +325,7 @@ importers: version: 25.3.0 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8)) dotenv: specifier: ^17.3.1 version: 17.3.1 @@ -337,7 +337,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) packages/wallet/dapp-client: dependencies: @@ -368,7 +368,7 @@ importers: version: 25.3.0 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8)) dotenv: specifier: ^17.3.1 version: 17.3.1 @@ -376,14 +376,14 @@ importers: specifier: ^6.2.5 version: 6.2.5 happy-dom: - specifier: ^20.7.0 - version: 20.7.0 + specifier: ^20.8.8 + version: 20.8.8 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) packages/wallet/primitives: dependencies: @@ -399,13 +399,13 @@ importers: version: link:../../../repo/typescript-config '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8)) typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) packages/wallet/primitives-cli: dependencies: @@ -488,7 +488,7 @@ importers: version: 25.3.0 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8)) dotenv: specifier: ^17.3.1 version: 17.3.1 @@ -496,14 +496,14 @@ importers: specifier: ^6.2.5 version: 6.2.5 happy-dom: - specifier: ^20.7.0 - version: 20.7.0 + specifier: ^20.8.8 + version: 20.8.8 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) repo/eslint-config: devDependencies: @@ -530,7 +530,7 @@ importers: version: 7.0.1(eslint@9.39.2) eslint-plugin-turbo: specifier: ^2.6.3 - version: 2.6.3(eslint@9.39.2)(turbo@2.8.10) + version: 2.6.3(eslint@9.39.2)(turbo@2.8.20) globals: specifier: ^16.5.0 version: 16.5.0 @@ -1326,10 +1326,40 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@turbo/darwin-64@2.8.20': + resolution: {integrity: sha512-FQ9EX1xMU5nbwjxXxM3yU88AQQ6Sqc6S44exPRroMcx9XZHqqppl5ymJF0Ig/z3nvQNwDmz1Gsnvxubo+nXWjQ==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.8.20': + resolution: {integrity: sha512-Gpyh9ATFGThD6/s9L95YWY54cizg/VRWl2B67h0yofG8BpHf67DFAh9nuJVKG7bY0+SBJDAo5cMur+wOl9YOYw==} + cpu: [arm64] + os: [darwin] + '@turbo/gen@1.13.4': resolution: {integrity: sha512-PK38N1fHhDUyjLi0mUjv0RbX0xXGwDLQeRSGsIlLcVpP1B5fwodSIwIYXc9vJok26Yne94BX5AGjueYsUT3uUw==} hasBin: true + '@turbo/linux-64@2.8.20': + resolution: {integrity: sha512-p2QxWUYyYUgUFG0b0kR+pPi8t7c9uaVlRtjTTI1AbCvVqkpjUfCcReBn6DgG/Hu8xrWdKLuyQFaLYFzQskZbcA==} + cpu: [x64] + os: [linux] + + '@turbo/linux-arm64@2.8.20': + resolution: {integrity: sha512-Gn5yjlZGLRZWarLWqdQzv0wMqyBNIdq1QLi48F1oY5Lo9kiohuf7BPQWtWxeNVS2NgJ1+nb/DzK1JduYC4AWOA==} + cpu: [arm64] + os: [linux] + + '@turbo/windows-64@2.8.20': + resolution: {integrity: sha512-vyaDpYk/8T6Qz5V/X+ihKvKFEZFUoC0oxYpC1sZanK6gaESJlmV3cMRT3Qhcg4D2VxvtC2Jjs9IRkrZGL+exLw==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.8.20': + resolution: {integrity: sha512-voicVULvUV5yaGXo0Iue13BcHGYW3u0VgqSbfQwBaHbpj1zLjYV4KIe+7fYIo6DO8FVUJzxFps3ODCQG/Wy2Qw==} + cpu: [arm64] + os: [win32] + '@turbo/workspaces@1.13.4': resolution: {integrity: sha512-3uYg2b5TWCiupetbDFMbBFMHl33xQTvp5DNg0fZSYal73Z9AlFH9yWabHWMYw6ywmwM1evkYRpTVA2n7GgqT5A==} hasBin: true @@ -1645,6 +1675,7 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.0, please upgrade better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -2255,8 +2286,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.7.0: - resolution: {integrity: sha512-hR/uLYQdngTyEfxnOoa+e6KTcfBFyc1hgFj/Cc144A5JJUuHFYqIEBDcD4FeGqUeKLRZqJ9eN9u7/GDjYEgS1g==} + happy-dom@20.8.8: + resolution: {integrity: sha512-5/F8wxkNxYtsN0bXfMwIyNLZ9WYsoOYPbmoluqVJqv8KBUbcyKZawJ7uYK4WTX8IHBLYv+VXIwfeNDPy1oKMwQ==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -3444,6 +3475,7 @@ packages: syncpack@14.0.0: resolution: {integrity: sha512-OfAa3Oip5YC9Ad1jEs92Hw08Wy4JfdpdeequIwaJGsQG0tJtb8gpQfCdLuBefsk6n8WiUdt/5qmzcW+BDXtzbQ==} engines: {node: '>=14.17.0'} + deprecated: 'pnpm users: upgrade to 14.0.2 or newer' hasBin: true term-size@2.2.1: @@ -3553,6 +3585,10 @@ packages: resolution: {integrity: sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==} hasBin: true + turbo@2.8.20: + resolution: {integrity: sha512-Rb4qk5YT8RUwwdXtkLpkVhNEe/lor6+WV7S5tTlLpxSz6MjV5Qi8jGNn4gS6NAvrYGA/rNrE6YUQM85sCZUDbQ==} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3793,6 +3829,18 @@ packages: utf-8-validate: optional: true + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4529,6 +4577,12 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@turbo/darwin-64@2.8.20': + optional: true + + '@turbo/darwin-arm64@2.8.20': + optional: true + '@turbo/gen@1.13.4(@types/node@25.3.0)(typescript@5.9.3)': dependencies: '@turbo/workspaces': 1.13.4(@types/node@25.3.0) @@ -4549,6 +4603,18 @@ snapshots: - supports-color - typescript + '@turbo/linux-64@2.8.20': + optional: true + + '@turbo/linux-arm64@2.8.20': + optional: true + + '@turbo/windows-64@2.8.20': + optional: true + + '@turbo/windows-arm64@2.8.20': + optional: true + '@turbo/workspaces@1.13.4(@types/node@25.3.0)': dependencies: chalk: 2.4.2 @@ -4714,7 +4780,7 @@ snapshots: '@typescript-eslint/types': 8.50.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -4726,7 +4792,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0) + vitest: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) '@vitest/expect@4.0.18': dependencies: @@ -5416,11 +5482,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.8.10): + eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.8.20): dependencies: dotenv: 16.0.3 eslint: 9.39.2 - turbo: 2.8.10 + turbo: 2.8.20 eslint-scope@8.4.0: dependencies: @@ -5731,14 +5797,14 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.7.0: + happy-dom@20.8.8: dependencies: '@types/node': 25.3.0 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 7.0.1 whatwg-mimetype: 3.0.0 - ws: 8.18.3 + ws: 8.20.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -7119,6 +7185,15 @@ snapshots: turbo-windows-64: 2.8.10 turbo-windows-arm64: 2.8.10 + turbo@2.8.20: + optionalDependencies: + '@turbo/darwin-64': 2.8.20 + '@turbo/darwin-arm64': 2.8.20 + '@turbo/linux-64': 2.8.20 + '@turbo/linux-arm64': 2.8.20 + '@turbo/windows-64': 2.8.20 + '@turbo/windows-arm64': 2.8.20 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -7247,7 +7322,7 @@ snapshots: '@types/node': 25.3.0 fsevents: 2.3.3 - vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0): + vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(vite@7.3.0(@types/node@25.3.0)) @@ -7271,7 +7346,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.3.0 - happy-dom: 20.7.0 + happy-dom: 20.8.8 transitivePeerDependencies: - jiti - less @@ -7367,6 +7442,8 @@ snapshots: ws@8.18.3: {} + ws@8.20.0: {} + y18n@5.0.8: {} yallist@3.1.1: {} From 2bbf0d22ed62c792adedd6a0b5088ee0369f08de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:23:21 +0100 Subject: [PATCH 112/144] Bump next from 15.5.10 to 15.5.14 (#982) Bumps [next](https://github.com/vercel/next.js) from 15.5.10 to 15.5.14. - [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.10...v15.5.14) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.14 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 | 120 +++++++++++++++++++-------------------- 3 files changed, 62 insertions(+), 62 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index 9c51ce6c1..ccf8cc5bb 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.10", + "next": "^15.5.14", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/extras/web/package.json b/extras/web/package.json index e7fd226c0..b8fdea499 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.10", + "next": "^15.5.14", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 961a474af..6a3864e57 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.10 - version: 15.5.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.14 + version: 15.5.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -76,8 +76,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.10 - version: 15.5.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.14 + version: 15.5.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -720,8 +720,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} @@ -933,8 +933,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} '@img/sharp-darwin-arm64@0.34.5': @@ -1104,56 +1104,56 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.5.10': - resolution: {integrity: sha512-plg+9A/KoZcTS26fe15LHg+QxReTazrIOoKKUC3Uz4leGGeNPgLHdevVraAAOX0snnUs3WkRx3eUQpj9mreG6A==} + '@next/env@15.5.14': + resolution: {integrity: sha512-aXeirLYuASxEgi4X4WhfXsShCFxWDfNn/8ZeC5YXAS2BB4A8FJi1kwwGL6nvMVboE7fZCzmJPNdMvVHc8JpaiA==} '@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==} + '@next/swc-darwin-arm64@15.5.14': + resolution: {integrity: sha512-Y9K6SPzobnZvrRDPO2s0grgzC+Egf0CqfbdvYmQVaztV890zicw8Z8+4Vqw8oPck8r1TjUHxVh8299Cg4TrxXg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.7': - resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} + '@next/swc-darwin-x64@15.5.14': + resolution: {integrity: sha512-aNnkSMjSFRTOmkd7qoNI2/rETQm/vKD6c/Ac9BZGa9CtoOzy3c2njgz7LvebQJ8iPxdeTuGnAjagyis8a9ifBw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.7': - resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} + '@next/swc-linux-arm64-gnu@15.5.14': + resolution: {integrity: sha512-tjlpia+yStPRS//6sdmlVwuO1Rioern4u2onafa5n+h2hCS9MAvMXqpVbSrjgiEOoCs0nJy7oPOmWgtRRNSM5Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.7': - resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} + '@next/swc-linux-arm64-musl@15.5.14': + resolution: {integrity: sha512-8B8cngBaLadl5lbDRdxGCP1Lef8ipD6KlxS3v0ElDAGil6lafrAM3B258p1KJOglInCVFUjk751IXMr2ixeQOQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.7': - resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} + '@next/swc-linux-x64-gnu@15.5.14': + resolution: {integrity: sha512-bAS6tIAg8u4Gn3Nz7fCPpSoKAexEt2d5vn1mzokcqdqyov6ZJ6gu6GdF9l8ORFrBuRHgv3go/RfzYz5BkZ6YSQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.7': - resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} + '@next/swc-linux-x64-musl@15.5.14': + resolution: {integrity: sha512-mMxv/FcrT7Gfaq4tsR22l17oKWXZmH/lVqcvjX0kfp5I0lKodHYLICKPoX1KRnnE+ci6oIUdriUhuA3rBCDiSw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.7': - resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} + '@next/swc-win32-arm64-msvc@15.5.14': + resolution: {integrity: sha512-OTmiBlYThppnvnsqx0rBqjDRemlmIeZ8/o4zI7veaXoeO1PVHoyj2lfTfXTiiGjCyRDhA10y4h6ZvZvBiynr2g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.7': - resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} + '@next/swc-win32-x64-msvc@15.5.14': + resolution: {integrity: sha512-+W7eFf3RS7m4G6tppVTOSyP9Y6FsJXfOuKzav1qKniiFm3KFByQfPEcouHdjlZmysl4zJGuGLQ/M9XyVeyeNEg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1733,8 +1733,8 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - caniuse-lite@1.0.30001769: - resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} + caniuse-lite@1.0.30001781: + resolution: {integrity: sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} @@ -2833,8 +2833,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.5.10: - resolution: {integrity: sha512-r0X65PNwyDDyOrWNKpQoZvOatw7BcsTPRKdwEqtc9cj3wv7mbBIk9tKed4klRaFXJdX0rugpuMTHslDrAU1bBg==} + next@15.5.14: + resolution: {integrity: sha512-M6S+4JyRjmKic2Ssm7jHUPkE6YUJ6lv4507jprsSZLulubz0ihO2E+S4zmQK3JZ2ov81JrugukKU4Tz0ivgqqQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3058,8 +3058,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -4146,7 +4146,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.8.1': + '@emnapi/runtime@1.9.1': dependencies: tslib: 2.8.1 optional: true @@ -4286,7 +4286,7 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/colour@1.0.0': + '@img/colour@1.1.0': optional: true '@img/sharp-darwin-arm64@0.34.5': @@ -4371,7 +4371,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.8.1 + '@emnapi/runtime': 1.9.1 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -4430,34 +4430,34 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.5.10': {} + '@next/env@15.5.14': {} '@next/eslint-plugin-next@15.5.9': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.7': + '@next/swc-darwin-arm64@15.5.14': optional: true - '@next/swc-darwin-x64@15.5.7': + '@next/swc-darwin-x64@15.5.14': optional: true - '@next/swc-linux-arm64-gnu@15.5.7': + '@next/swc-linux-arm64-gnu@15.5.14': optional: true - '@next/swc-linux-arm64-musl@15.5.7': + '@next/swc-linux-arm64-musl@15.5.14': optional: true - '@next/swc-linux-x64-gnu@15.5.7': + '@next/swc-linux-x64-gnu@15.5.14': optional: true - '@next/swc-linux-x64-musl@15.5.7': + '@next/swc-linux-x64-musl@15.5.14': optional: true - '@next/swc-win32-arm64-msvc@15.5.7': + '@next/swc-win32-arm64-msvc@15.5.14': optional: true - '@next/swc-win32-x64-msvc@15.5.7': + '@next/swc-win32-x64-msvc@15.5.14': optional: true '@noble/ciphers@1.3.0': {} @@ -5025,7 +5025,7 @@ snapshots: browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.7 - caniuse-lite: 1.0.30001769 + caniuse-lite: 1.0.30001781 electron-to-chromium: 1.5.267 node-releases: 2.0.27 update-browserslist-db: 1.2.2(browserslist@4.28.1) @@ -5061,7 +5061,7 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001769: {} + caniuse-lite@1.0.30001781: {} cbor2@1.12.0: {} @@ -6320,24 +6320,24 @@ snapshots: netmask@2.0.2: {} - next@15.5.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@next/env': 15.5.10 + '@next/env': 15.5.14 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001769 + caniuse-lite: 1.0.30001781 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) styled-jsx: 5.1.6(react@19.2.3) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.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 + '@next/swc-darwin-arm64': 15.5.14 + '@next/swc-darwin-x64': 15.5.14 + '@next/swc-linux-arm64-gnu': 15.5.14 + '@next/swc-linux-arm64-musl': 15.5.14 + '@next/swc-linux-x64-gnu': 15.5.14 + '@next/swc-linux-x64-musl': 15.5.14 + '@next/swc-win32-arm64-msvc': 15.5.14 + '@next/swc-win32-x64-msvc': 15.5.14 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -6596,7 +6596,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.6: + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -6841,7 +6841,7 @@ snapshots: sharp@0.34.5: dependencies: - '@img/colour': 1.0.0 + '@img/colour': 1.1.0 detect-libc: 2.1.2 semver: 7.7.4 optionalDependencies: @@ -7315,7 +7315,7 @@ snapshots: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 + postcss: 8.5.8 rollup: 4.53.4 tinyglobby: 0.2.15 optionalDependencies: From 9c37410a85bfbf79dfccb5248837a5d5f586dbf0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 29 Mar 2026 22:03:32 +0200 Subject: [PATCH 113/144] Bump happy-dom from 20.8.8 to 20.8.9 (#987) Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.8.8 to 20.8.9. - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.8.8...v20.8.9) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.8.9 dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/wallet/dapp-client/package.json | 2 +- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 104 +++++++++++------------ 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 57e4a7825..7ed1867e7 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -27,7 +27,7 @@ "@vitest/coverage-v8": "^4.0.18", "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", - "happy-dom": "^20.8.8", + "happy-dom": "^20.8.9", "typescript": "^5.9.3", "vitest": "^4.0.18" }, diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 23ae11cc8..2d62c2795 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -30,7 +30,7 @@ "@vitest/coverage-v8": "^4.0.18", "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", - "happy-dom": "^20.8.8", + "happy-dom": "^20.8.9", "typescript": "^5.9.3", "vitest": "^4.0.18" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a3864e57..54ad63e32 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -157,7 +157,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) packages/services/identity-instrument: dependencies: @@ -185,7 +185,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) packages/services/indexer: devDependencies: @@ -261,7 +261,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) packages/services/userdata: devDependencies: @@ -325,7 +325,7 @@ importers: version: 25.3.0 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.9)) dotenv: specifier: ^17.3.1 version: 17.3.1 @@ -337,7 +337,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) packages/wallet/dapp-client: dependencies: @@ -368,7 +368,7 @@ importers: version: 25.3.0 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.9)) dotenv: specifier: ^17.3.1 version: 17.3.1 @@ -376,14 +376,14 @@ importers: specifier: ^6.2.5 version: 6.2.5 happy-dom: - specifier: ^20.8.8 - version: 20.8.8 + specifier: ^20.8.9 + version: 20.8.9 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) packages/wallet/primitives: dependencies: @@ -399,13 +399,13 @@ importers: version: link:../../../repo/typescript-config '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.9)) typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) packages/wallet/primitives-cli: dependencies: @@ -488,7 +488,7 @@ importers: version: 25.3.0 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.9)) dotenv: specifier: ^17.3.1 version: 17.3.1 @@ -496,14 +496,14 @@ importers: specifier: ^6.2.5 version: 6.2.5 happy-dom: - specifier: ^20.8.8 - version: 20.8.8 + specifier: ^20.8.9 + version: 20.8.9 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) repo/eslint-config: devDependencies: @@ -530,7 +530,7 @@ importers: version: 7.0.1(eslint@9.39.2) eslint-plugin-turbo: specifier: ^2.6.3 - version: 2.6.3(eslint@9.39.2)(turbo@2.8.20) + version: 2.6.3(eslint@9.39.2)(turbo@2.8.21) globals: specifier: ^16.5.0 version: 16.5.0 @@ -1326,13 +1326,13 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@turbo/darwin-64@2.8.20': - resolution: {integrity: sha512-FQ9EX1xMU5nbwjxXxM3yU88AQQ6Sqc6S44exPRroMcx9XZHqqppl5ymJF0Ig/z3nvQNwDmz1Gsnvxubo+nXWjQ==} + '@turbo/darwin-64@2.8.21': + resolution: {integrity: sha512-kfGoM0Iw8ZNZpbds+4IzOe0hjvHldqJwUPRAjXJi3KBxg/QOZL95N893SRoMtf2aJ+jJ3dk32yPkp8rvcIjP9g==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.8.20': - resolution: {integrity: sha512-Gpyh9ATFGThD6/s9L95YWY54cizg/VRWl2B67h0yofG8BpHf67DFAh9nuJVKG7bY0+SBJDAo5cMur+wOl9YOYw==} + '@turbo/darwin-arm64@2.8.21': + resolution: {integrity: sha512-o9HEflxUEyr987x0cTUzZBhDOyL6u95JmdmlkH2VyxAw7zq2sdtM5e72y9ufv2N5SIoOBw1fVn9UES5VY5H6vQ==} cpu: [arm64] os: [darwin] @@ -1340,23 +1340,23 @@ packages: resolution: {integrity: sha512-PK38N1fHhDUyjLi0mUjv0RbX0xXGwDLQeRSGsIlLcVpP1B5fwodSIwIYXc9vJok26Yne94BX5AGjueYsUT3uUw==} hasBin: true - '@turbo/linux-64@2.8.20': - resolution: {integrity: sha512-p2QxWUYyYUgUFG0b0kR+pPi8t7c9uaVlRtjTTI1AbCvVqkpjUfCcReBn6DgG/Hu8xrWdKLuyQFaLYFzQskZbcA==} + '@turbo/linux-64@2.8.21': + resolution: {integrity: sha512-uTxlCcXWy5h1fSSymP8XSJ+AudzEHMDV3IDfKX7+DGB8kgJ+SLoTUAH7z4OFA7I/l2sznz0upPdbNNZs91YMag==} cpu: [x64] os: [linux] - '@turbo/linux-arm64@2.8.20': - resolution: {integrity: sha512-Gn5yjlZGLRZWarLWqdQzv0wMqyBNIdq1QLi48F1oY5Lo9kiohuf7BPQWtWxeNVS2NgJ1+nb/DzK1JduYC4AWOA==} + '@turbo/linux-arm64@2.8.21': + resolution: {integrity: sha512-cdHIcxNcihHHkCHp0Y4Zb60K4Qz+CK4xw1gb6s/t/9o4SMeMj+hTBCtoW6QpPnl9xPYmxuTou8Zw6+cylTnREg==} cpu: [arm64] os: [linux] - '@turbo/windows-64@2.8.20': - resolution: {integrity: sha512-vyaDpYk/8T6Qz5V/X+ihKvKFEZFUoC0oxYpC1sZanK6gaESJlmV3cMRT3Qhcg4D2VxvtC2Jjs9IRkrZGL+exLw==} + '@turbo/windows-64@2.8.21': + resolution: {integrity: sha512-/iBj4OzbqEY8CX+eaeKbBTMZv2CLXNrt0692F7HnK7LcyYwyDecaAiSET6ZzL4opT7sbwkKvzAC/fhqT3Quu1A==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.8.20': - resolution: {integrity: sha512-voicVULvUV5yaGXo0Iue13BcHGYW3u0VgqSbfQwBaHbpj1zLjYV4KIe+7fYIo6DO8FVUJzxFps3ODCQG/Wy2Qw==} + '@turbo/windows-arm64@2.8.21': + resolution: {integrity: sha512-95tMA/ZbIidJFUUtkmqioQ1gf3n3I1YbRP3ZgVdWTVn2qVbkodcIdGXBKRHHrIbRsLRl99SiHi/L7IxhpZDagQ==} cpu: [arm64] os: [win32] @@ -2286,8 +2286,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.8.8: - resolution: {integrity: sha512-5/F8wxkNxYtsN0bXfMwIyNLZ9WYsoOYPbmoluqVJqv8KBUbcyKZawJ7uYK4WTX8IHBLYv+VXIwfeNDPy1oKMwQ==} + happy-dom@20.8.9: + resolution: {integrity: sha512-Tz23LR9T9jOGVZm2x1EPdXqwA37G/owYMxRwU0E4miurAtFsPMQ1d2Jc2okUaSjZqAFz2oEn3FLXC5a0a+siyA==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -3585,8 +3585,8 @@ packages: resolution: {integrity: sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==} hasBin: true - turbo@2.8.20: - resolution: {integrity: sha512-Rb4qk5YT8RUwwdXtkLpkVhNEe/lor6+WV7S5tTlLpxSz6MjV5Qi8jGNn4gS6NAvrYGA/rNrE6YUQM85sCZUDbQ==} + turbo@2.8.21: + resolution: {integrity: sha512-FlJ8OD5Qcp0jTAM7E4a/RhUzRNds2GzKlyxHKA6N247VLy628rrxAGlMpIXSz6VB430+TiQDJ/SMl6PL1lu6wQ==} hasBin: true type-check@0.4.0: @@ -4577,10 +4577,10 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/darwin-64@2.8.20': + '@turbo/darwin-64@2.8.21': optional: true - '@turbo/darwin-arm64@2.8.20': + '@turbo/darwin-arm64@2.8.21': optional: true '@turbo/gen@1.13.4(@types/node@25.3.0)(typescript@5.9.3)': @@ -4603,16 +4603,16 @@ snapshots: - supports-color - typescript - '@turbo/linux-64@2.8.20': + '@turbo/linux-64@2.8.21': optional: true - '@turbo/linux-arm64@2.8.20': + '@turbo/linux-arm64@2.8.21': optional: true - '@turbo/windows-64@2.8.20': + '@turbo/windows-64@2.8.21': optional: true - '@turbo/windows-arm64@2.8.20': + '@turbo/windows-arm64@2.8.21': optional: true '@turbo/workspaces@1.13.4(@types/node@25.3.0)': @@ -4780,7 +4780,7 @@ snapshots: '@typescript-eslint/types': 8.50.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.9))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -4792,7 +4792,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.8) + vitest: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) '@vitest/expect@4.0.18': dependencies: @@ -5482,11 +5482,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.8.20): + eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.8.21): dependencies: dotenv: 16.0.3 eslint: 9.39.2 - turbo: 2.8.20 + turbo: 2.8.21 eslint-scope@8.4.0: dependencies: @@ -5797,7 +5797,7 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.8.8: + happy-dom@20.8.9: dependencies: '@types/node': 25.3.0 '@types/whatwg-mimetype': 3.0.2 @@ -7185,14 +7185,14 @@ snapshots: turbo-windows-64: 2.8.10 turbo-windows-arm64: 2.8.10 - turbo@2.8.20: + turbo@2.8.21: optionalDependencies: - '@turbo/darwin-64': 2.8.20 - '@turbo/darwin-arm64': 2.8.20 - '@turbo/linux-64': 2.8.20 - '@turbo/linux-arm64': 2.8.20 - '@turbo/windows-64': 2.8.20 - '@turbo/windows-arm64': 2.8.20 + '@turbo/darwin-64': 2.8.21 + '@turbo/darwin-arm64': 2.8.21 + '@turbo/linux-64': 2.8.21 + '@turbo/linux-arm64': 2.8.21 + '@turbo/windows-64': 2.8.21 + '@turbo/windows-arm64': 2.8.21 type-check@0.4.0: dependencies: @@ -7322,7 +7322,7 @@ snapshots: '@types/node': 25.3.0 fsevents: 2.3.3 - vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.8): + vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.9): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(vite@7.3.0(@types/node@25.3.0)) @@ -7346,7 +7346,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.3.0 - happy-dom: 20.8.8 + happy-dom: 20.8.9 transitivePeerDependencies: - jiti - less From dd6d0a232bb9f91fe076e9a64618fa124be44cbc Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Sun, 29 Mar 2026 23:30:04 +0200 Subject: [PATCH 114/144] Add latest relayer.gen.ts (#988) --- .../src/relayer/rpc-relayer/relayer.gen.ts | 652 ++++++++++++------ 1 file changed, 442 insertions(+), 210 deletions(-) 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 ca5dbe9c8..8a9ff4a7b 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts @@ -1,7 +1,7 @@ /* eslint-disable */ -// sequence-relayer v0.4.1 7f8a4b83b00e0b6849c76c2ff0e23931e26b3d9f +// sequence-relayer v0.4.1 0a2503bc893179ba968b0015d7580aabf6a88dd4 // -- -// Code generated by Webrpc-gen@v0.30.2 with typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen@v0.32.2 with typescript generator. DO NOT EDIT. // // webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts -compat @@ -12,7 +12,7 @@ export const WebrpcVersion = 'v1' export const WebrpcSchemaVersion = 'v0.4.1' // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = '7f8a4b83b00e0b6849c76c2ff0e23931e26b3d9f' +export const WebrpcSchemaHash = '0a2503bc893179ba968b0015d7580aabf6a88dd4' // // Client interface @@ -72,6 +72,23 @@ export interface RelayerClient { feeOptions(req: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise + /** + * Bridge gas endpoints for S2S calls + * Used for bridge fees (e.g., LayerZero messaging fees) that require msg.value to be fronted at runtime. + * bridgeGas will be included in fee calculation so the relayer gets reimbursed. + */ + sendMetaTxnWithBridgeGas( + req: SendMetaTxnWithBridgeGasArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + feeOptionsWithBridgeGas( + req: FeeOptionsWithBridgeGasArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + /** * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date */ @@ -81,6 +98,17 @@ export interface RelayerClient { signal?: AbortSignal, ): Promise + /** + * + * Sender administration + * + */ + startSender(req: StartSenderArgs, headers?: object, signal?: AbortSignal): Promise + + stopSender(req: StopSenderArgs, headers?: object, signal?: AbortSignal): Promise + + repairSender(req: RepairSenderArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTransactions( req: GetMetaTransactionsArgs, headers?: object, @@ -93,21 +121,6 @@ export interface RelayerClient { 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 */ @@ -145,7 +158,7 @@ export interface RelayerClient { ): Promise /** - * Gas Sponsorship + * Project-Level Gas Sponsorship */ listGasSponsors(req: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise @@ -157,6 +170,39 @@ export interface RelayerClient { removeGasSponsor(req: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + /** + * Ecosystem-level Gas Sponsorship + */ + listEcosystemGasSponsors( + req: ListEcosystemGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + getEcosystemGasSponsor( + req: GetEcosystemGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + addEcosystemGasSponsor( + req: AddEcosystemGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + updateEcosystemGasSponsor( + req: UpdateEcosystemGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + + removeEcosystemGasSponsor( + req: RemoveEcosystemGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + /** * Gas Sponsor Lookup */ @@ -186,6 +232,12 @@ export interface RelayerClient { // Schema types // +export enum RepairOperation { + SKIP = 'SKIP', + REQUEUE = 'REQUEUE', + DROP = 'DROP', +} + export enum ETHTxnStatus { UNKNOWN = 'UNKNOWN', DROPPED = 'DROPPED', @@ -195,6 +247,7 @@ export enum ETHTxnStatus { PARTIALLY_FAILED = 'PARTIALLY_FAILED', FAILED = 'FAILED', PENDING_PRECONDITION = 'PENDING_PRECONDITION', + MINED = 'MINED', } export enum TransferType { @@ -221,7 +274,7 @@ export enum FeeTokenType { ERC1155_TOKEN = 'ERC1155_TOKEN', } -export enum SortOrder { +export enum Order { DESC = 'DESC', ASC = 'ASC', } @@ -250,7 +303,31 @@ export interface SenderStatus { index: number address: string etherBalance: number + enabled: boolean active: boolean + nonce?: NonceStatus + current?: CurrentStatus +} + +export interface NonceStatus { + chain: number + mempool: number +} + +export interface CurrentStatus { + transaction: string + first: TransactionStatus + latest?: TransactionStatus +} + +export interface TransactionStatus { + transaction: string + gas: number + gasPrice: string + priorityFee: string + time: string + age: string + error?: string } export interface RuntimeChecks {} @@ -287,6 +364,7 @@ export interface GasSponsor { id: number gasTankId: number projectId: number + ecosystemId: number chainId: number address: string name: string @@ -329,6 +407,7 @@ export interface MetaTxnLog { minedAt: string target: string input: string + bridgeGas?: string txnArgs: { [key: string]: any } txnReceipt?: { [key: string]: any } walletAddress: string @@ -402,11 +481,6 @@ export interface TxnLogTransfer { amounts: Array } -export interface SentTransactionsFilter { - pending?: boolean - failed?: boolean -} - export interface SimulateResult { executed: boolean succeeded: boolean @@ -443,19 +517,16 @@ export interface FeeToken { } export interface Page { - pageSize?: number - page?: number - more?: boolean - totalRecords?: number - column?: string - before?: any - after?: any - sort?: Array + pageSize: number + page: number + more: boolean + column: string + sort: Array } -export interface SortBy { +export interface Sort { column: string - order: SortOrder + order: Order } export interface PingArgs {} @@ -566,6 +637,33 @@ export interface FeeOptionsReturn { quote?: string } +export interface SendMetaTxnWithBridgeGasArgs { + call: MetaTxn + quote?: string + projectID?: number + bridgeGas: string + preconditions?: Array +} + +export interface SendMetaTxnWithBridgeGasReturn { + status: boolean + txnHash: string +} + +export interface FeeOptionsWithBridgeGasArgs { + wallet: string + to: string + data: string + simulate?: boolean + bridgeGas: string +} + +export interface FeeOptionsWithBridgeGasReturn { + options: Array + sponsored: boolean + quote?: string +} + export interface GetMetaTxnNetworkFeeOptionsArgs { walletConfig: any payload: string @@ -575,6 +673,26 @@ export interface GetMetaTxnNetworkFeeOptionsReturn { options: Array } +export interface StartSenderArgs { + sender: number +} + +export interface StartSenderReturn {} + +export interface StopSenderArgs { + sender: number +} + +export interface StopSenderReturn {} + +export interface RepairSenderArgs { + sender: number + nonce: number + operation: RepairOperation +} + +export interface RepairSenderReturn {} + export interface GetMetaTransactionsArgs { projectId: number page?: Page @@ -595,25 +713,6 @@ 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 } @@ -735,6 +834,58 @@ export interface RemoveGasSponsorReturn { status: boolean } +export interface ListEcosystemGasSponsorsArgs { + ecosystemId: number + page?: Page +} + +export interface ListEcosystemGasSponsorsReturn { + page: Page + gasSponsors: Array +} + +export interface GetEcosystemGasSponsorArgs { + ecosystemId: number + id: number +} + +export interface GetEcosystemGasSponsorReturn { + gasSponsor: GasSponsor +} + +export interface AddEcosystemGasSponsorArgs { + ecosystemId: number + address: string + name?: string + active?: boolean +} + +export interface AddEcosystemGasSponsorReturn { + status: boolean + gasSponsor: GasSponsor +} + +export interface UpdateEcosystemGasSponsorArgs { + ecosystemId: number + id: number + name?: string + active?: boolean +} + +export interface UpdateEcosystemGasSponsorReturn { + status: boolean + gasSponsor: GasSponsor +} + +export interface RemoveEcosystemGasSponsorArgs { + ecosystemId: number + id: number +} + +export interface RemoveEcosystemGasSponsorReturn { + status: boolean +} + export interface AddressGasSponsorsArgs { address: string page?: Page @@ -795,12 +946,16 @@ export class Relayer implements RelayerClient { updateMetaTxnGasLimits: (req: UpdateMetaTxnGasLimitsArgs) => ['Relayer', 'updateMetaTxnGasLimits', req] as const, feeTokens: () => ['Relayer', 'feeTokens'] as const, feeOptions: (req: FeeOptionsArgs) => ['Relayer', 'feeOptions', req] as const, + sendMetaTxnWithBridgeGas: (req: SendMetaTxnWithBridgeGasArgs) => + ['Relayer', 'sendMetaTxnWithBridgeGas', req] as const, + feeOptionsWithBridgeGas: (req: FeeOptionsWithBridgeGasArgs) => ['Relayer', 'feeOptionsWithBridgeGas', req] as const, getMetaTxnNetworkFeeOptions: (req: GetMetaTxnNetworkFeeOptionsArgs) => ['Relayer', 'getMetaTxnNetworkFeeOptions', req] as const, + startSender: (req: StartSenderArgs) => ['Relayer', 'startSender', req] as const, + stopSender: (req: StopSenderArgs) => ['Relayer', 'stopSender', req] as const, + repairSender: (req: RepairSenderArgs) => ['Relayer', 'repairSender', 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, @@ -816,6 +971,14 @@ export class Relayer implements RelayerClient { addGasSponsor: (req: AddGasSponsorArgs) => ['Relayer', 'addGasSponsor', req] as const, updateGasSponsor: (req: UpdateGasSponsorArgs) => ['Relayer', 'updateGasSponsor', req] as const, removeGasSponsor: (req: RemoveGasSponsorArgs) => ['Relayer', 'removeGasSponsor', req] as const, + listEcosystemGasSponsors: (req: ListEcosystemGasSponsorsArgs) => + ['Relayer', 'listEcosystemGasSponsors', req] as const, + getEcosystemGasSponsor: (req: GetEcosystemGasSponsorArgs) => ['Relayer', 'getEcosystemGasSponsor', req] as const, + addEcosystemGasSponsor: (req: AddEcosystemGasSponsorArgs) => ['Relayer', 'addEcosystemGasSponsor', req] as const, + updateEcosystemGasSponsor: (req: UpdateEcosystemGasSponsorArgs) => + ['Relayer', 'updateEcosystemGasSponsor', req] as const, + removeEcosystemGasSponsor: (req: RemoveEcosystemGasSponsorArgs) => + ['Relayer', 'removeEcosystemGasSponsor', 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, @@ -897,10 +1060,7 @@ export class Relayer implements RelayerClient { } sendMetaTxn = (req: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SendMetaTxn'), - createHttpRequest(JsonEncode(req, 'SendMetaTxnArgs'), headers, signal), - ).then( + return this.fetch(this.url('SendMetaTxn'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'SendMetaTxnReturn') @@ -919,10 +1079,7 @@ export class Relayer implements RelayerClient { headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('GetMetaTxnNonce'), - createHttpRequest(JsonEncode(req, 'GetMetaTxnNonceArgs'), headers, signal), - ).then( + return this.fetch(this.url('GetMetaTxnNonce'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetMetaTxnNonceReturn') @@ -941,10 +1098,7 @@ export class Relayer implements RelayerClient { headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('GetMetaTxnReceipt'), - createHttpRequest(JsonEncode(req, 'GetMetaTxnReceiptArgs'), headers, signal), - ).then( + return this.fetch(this.url('GetMetaTxnReceipt'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetMetaTxnReceiptReturn') @@ -959,7 +1113,7 @@ export class Relayer implements RelayerClient { } simulate = (req: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch(this.url('Simulate'), createHttpRequest(JsonEncode(req, 'SimulateArgs'), headers, signal)).then( + return this.fetch(this.url('Simulate'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'SimulateReturn') @@ -974,10 +1128,7 @@ export class Relayer implements RelayerClient { } simulateV3 = (req: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SimulateV3'), - createHttpRequest(JsonEncode(req, 'SimulateV3Args'), headers, signal), - ).then( + return this.fetch(this.url('SimulateV3'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'SimulateV3Return') @@ -996,10 +1147,7 @@ export class Relayer implements RelayerClient { headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('UpdateMetaTxnGasLimits'), - createHttpRequest(JsonEncode(req, 'UpdateMetaTxnGasLimitsArgs'), headers, signal), - ).then( + return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UpdateMetaTxnGasLimitsReturn') @@ -1029,10 +1177,7 @@ export class Relayer implements RelayerClient { } feeOptions = (req: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FeeOptions'), - createHttpRequest(JsonEncode(req, 'FeeOptionsArgs'), headers, signal), - ).then( + return this.fetch(this.url('FeeOptions'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'FeeOptionsReturn') @@ -1046,6 +1191,44 @@ export class Relayer implements RelayerClient { ) } + sendMetaTxnWithBridgeGas = ( + req: SendMetaTxnWithBridgeGasArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SendMetaTxnWithBridgeGas'), createHttpRequest(JsonEncode(req), headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'SendMetaTxnWithBridgeGasReturn') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + feeOptionsWithBridgeGas = ( + req: FeeOptionsWithBridgeGasArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('FeeOptionsWithBridgeGas'), createHttpRequest(JsonEncode(req), headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'FeeOptionsWithBridgeGasReturn') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + getMetaTxnNetworkFeeOptions = ( req: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, @@ -1053,7 +1236,7 @@ export class Relayer implements RelayerClient { ): Promise => { return this.fetch( this.url('GetMetaTxnNetworkFeeOptions'), - createHttpRequest(JsonEncode(req, 'GetMetaTxnNetworkFeeOptionsArgs'), headers, signal), + createHttpRequest(JsonEncode(req), headers, signal), ).then( (res) => { return buildResponse(res).then((_data) => { @@ -1068,18 +1251,11 @@ export class Relayer implements RelayerClient { ) } - getMetaTransactions = ( - req: GetMetaTransactionsArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('GetMetaTransactions'), - createHttpRequest(JsonEncode(req, 'GetMetaTransactionsArgs'), headers, signal), - ).then( + startSender = (req: StartSenderArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('StartSender'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'GetMetaTransactionsReturn') + return JsonDecode(_data, 'StartSenderReturn') }) }, (error) => { @@ -1090,18 +1266,26 @@ export class Relayer implements RelayerClient { ) } - getTransactionCost = ( - req: GetTransactionCostArgs, - headers?: object, - signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('GetTransactionCost'), - createHttpRequest(JsonEncode(req, 'GetTransactionCostArgs'), headers, signal), - ).then( + stopSender = (req: StopSenderArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('StopSender'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'GetTransactionCostReturn') + return JsonDecode(_data, 'StopSenderReturn') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + repairSender = (req: RepairSenderArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RepairSender'), createHttpRequest(JsonEncode(req), headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'RepairSenderReturn') }) }, (error) => { @@ -1112,18 +1296,15 @@ export class Relayer implements RelayerClient { ) } - sentTransactions = ( - req: SentTransactionsArgs, + getMetaTransactions = ( + req: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('SentTransactions'), - createHttpRequest(JsonEncode(req, 'SentTransactionsArgs'), headers, signal), - ).then( + ): Promise => { + return this.fetch(this.url('GetMetaTransactions'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'SentTransactionsReturn') + return JsonDecode(_data, 'GetMetaTransactionsReturn') }) }, (error) => { @@ -1134,18 +1315,15 @@ export class Relayer implements RelayerClient { ) } - pendingTransactions = ( - req: PendingTransactionsArgs, + getTransactionCost = ( + req: GetTransactionCostArgs, headers?: object, signal?: AbortSignal, - ): Promise => { - return this.fetch( - this.url('PendingTransactions'), - createHttpRequest(JsonEncode(req, 'PendingTransactionsArgs'), headers, signal), - ).then( + ): Promise => { + return this.fetch(this.url('GetTransactionCost'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { - return JsonDecode(_data, 'PendingTransactionsReturn') + return JsonDecode(_data, 'GetTransactionCostReturn') }) }, (error) => { @@ -1157,10 +1335,7 @@ export class Relayer implements RelayerClient { } getGasTank = (req: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasTank'), - createHttpRequest(JsonEncode(req, 'GetGasTankArgs'), headers, signal), - ).then( + return this.fetch(this.url('GetGasTank'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetGasTankReturn') @@ -1175,10 +1350,7 @@ export class Relayer implements RelayerClient { } addGasTank = (req: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddGasTank'), - createHttpRequest(JsonEncode(req, 'AddGasTankArgs'), headers, signal), - ).then( + return this.fetch(this.url('AddGasTank'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'AddGasTankReturn') @@ -1193,10 +1365,7 @@ export class Relayer implements RelayerClient { } updateGasTank = (req: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateGasTank'), - createHttpRequest(JsonEncode(req, 'UpdateGasTankArgs'), headers, signal), - ).then( + return this.fetch(this.url('UpdateGasTank'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UpdateGasTankReturn') @@ -1217,7 +1386,7 @@ export class Relayer implements RelayerClient { ): Promise => { return this.fetch( this.url('NextGasTankBalanceAdjustmentNonce'), - createHttpRequest(JsonEncode(req, 'NextGasTankBalanceAdjustmentNonceArgs'), headers, signal), + createHttpRequest(JsonEncode(req), headers, signal), ).then( (res) => { return buildResponse(res).then((_data) => { @@ -1237,10 +1406,7 @@ export class Relayer implements RelayerClient { headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('AdjustGasTankBalance'), - createHttpRequest(JsonEncode(req, 'AdjustGasTankBalanceArgs'), headers, signal), - ).then( + return this.fetch(this.url('AdjustGasTankBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'AdjustGasTankBalanceReturn') @@ -1261,7 +1427,7 @@ export class Relayer implements RelayerClient { ): Promise => { return this.fetch( this.url('GetGasTankBalanceAdjustment'), - createHttpRequest(JsonEncode(req, 'GetGasTankBalanceAdjustmentArgs'), headers, signal), + createHttpRequest(JsonEncode(req), headers, signal), ).then( (res) => { return buildResponse(res).then((_data) => { @@ -1283,7 +1449,7 @@ export class Relayer implements RelayerClient { ): Promise => { return this.fetch( this.url('ListGasTankBalanceAdjustments'), - createHttpRequest(JsonEncode(req, 'ListGasTankBalanceAdjustmentsArgs'), headers, signal), + createHttpRequest(JsonEncode(req), headers, signal), ).then( (res) => { return buildResponse(res).then((_data) => { @@ -1303,10 +1469,7 @@ export class Relayer implements RelayerClient { headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('ListGasSponsors'), - createHttpRequest(JsonEncode(req, 'ListGasSponsorsArgs'), headers, signal), - ).then( + return this.fetch(this.url('ListGasSponsors'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ListGasSponsorsReturn') @@ -1321,10 +1484,7 @@ export class Relayer implements RelayerClient { } getGasSponsor = (req: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasSponsor'), - createHttpRequest(JsonEncode(req, 'GetGasSponsorArgs'), headers, signal), - ).then( + return this.fetch(this.url('GetGasSponsor'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetGasSponsorReturn') @@ -1339,10 +1499,7 @@ export class Relayer implements RelayerClient { } addGasSponsor = (req: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddGasSponsor'), - createHttpRequest(JsonEncode(req, 'AddGasSponsorArgs'), headers, signal), - ).then( + return this.fetch(this.url('AddGasSponsor'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'AddGasSponsorReturn') @@ -1361,10 +1518,7 @@ export class Relayer implements RelayerClient { headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('UpdateGasSponsor'), - createHttpRequest(JsonEncode(req, 'UpdateGasSponsorArgs'), headers, signal), - ).then( + return this.fetch(this.url('UpdateGasSponsor'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UpdateGasSponsorReturn') @@ -1383,10 +1537,7 @@ export class Relayer implements RelayerClient { headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('RemoveGasSponsor'), - createHttpRequest(JsonEncode(req, 'RemoveGasSponsorArgs'), headers, signal), - ).then( + return this.fetch(this.url('RemoveGasSponsor'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RemoveGasSponsorReturn') @@ -1400,15 +1551,107 @@ export class Relayer implements RelayerClient { ) } + listEcosystemGasSponsors = ( + req: ListEcosystemGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListEcosystemGasSponsors'), createHttpRequest(JsonEncode(req), headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListEcosystemGasSponsorsReturn') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + getEcosystemGasSponsor = ( + req: GetEcosystemGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetEcosystemGasSponsor'), createHttpRequest(JsonEncode(req), headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'GetEcosystemGasSponsorReturn') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + addEcosystemGasSponsor = ( + req: AddEcosystemGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddEcosystemGasSponsor'), createHttpRequest(JsonEncode(req), headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'AddEcosystemGasSponsorReturn') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + updateEcosystemGasSponsor = ( + req: UpdateEcosystemGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateEcosystemGasSponsor'), createHttpRequest(JsonEncode(req), headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'UpdateEcosystemGasSponsorReturn') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + removeEcosystemGasSponsor = ( + req: RemoveEcosystemGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RemoveEcosystemGasSponsor'), createHttpRequest(JsonEncode(req), headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'RemoveEcosystemGasSponsorReturn') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + addressGasSponsors = ( req: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('AddressGasSponsors'), - createHttpRequest(JsonEncode(req, 'AddressGasSponsorsArgs'), headers, signal), - ).then( + return this.fetch(this.url('AddressGasSponsors'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'AddressGasSponsorsReturn') @@ -1427,10 +1670,7 @@ export class Relayer implements RelayerClient { headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('GetProjectBalance'), - createHttpRequest(JsonEncode(req, 'GetProjectBalanceArgs'), headers, signal), - ).then( + return this.fetch(this.url('GetProjectBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetProjectBalanceReturn') @@ -1449,10 +1689,7 @@ export class Relayer implements RelayerClient { headers?: object, signal?: AbortSignal, ): Promise => { - return this.fetch( - this.url('AdjustProjectBalance'), - createHttpRequest(JsonEncode(req, 'AdjustProjectBalanceArgs'), headers, signal), - ).then( + return this.fetch(this.url('AdjustProjectBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( (res) => { return buildResponse(res).then((_data) => { return JsonDecode(_data, 'AdjustProjectBalanceReturn') @@ -1468,7 +1705,11 @@ export class Relayer implements RelayerClient { } const createHttpRequest = (body: string = '{}', headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } + const reqHeaders: { [key: string]: string } = { + ...headers, + 'Content-Type': 'application/json', + [WebrpcHeader]: WebrpcHeaderValue, + } return { method: 'POST', headers: reqHeaders, body, signal } } @@ -1499,44 +1740,11 @@ export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise(obj: T, typ: string = ''): string => { - return JSON.stringify(encodeType(typ, obj)) +// Encode object to JSON with BigInts converted to decimal strings. +export const JsonEncode = (obj: T): string => { + return JSON.stringify(obj, (key, value) => (typeof value === 'bigint' ? value.toString() : value)) } // Decode data (JSON string or already-parsed object) and convert declared BigInt string fields back to BigInt. @@ -1890,7 +2107,7 @@ export class AccessKeyMismatchError extends WebrpcError { 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 + this.status = typeof error.status === 'number' ? error.status : 403 if (error.cause !== undefined) this.cause = error.cause Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) } @@ -1932,6 +2149,18 @@ export class UnauthorizedUserError extends WebrpcError { } } +export class InvalidChainError extends WebrpcError { + constructor(error: WebrpcErrorParams = {}) { + super(error) + this.name = error.name || 'InvalidChain' + this.code = typeof error.code === 'number' ? error.code : 1106 + this.message = error.message || `Network 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, InvalidChainError.prototype) + } +} + export class QuotaExceededError extends WebrpcError { constructor(error: WebrpcErrorParams = {}) { super(error) @@ -2114,6 +2343,7 @@ export enum errors { InvalidOrigin = 'InvalidOrigin', InvalidService = 'InvalidService', UnauthorizedUser = 'UnauthorizedUser', + InvalidChain = 'InvalidChain', QuotaExceeded = 'QuotaExceeded', QuotaRateLimit = 'QuotaRateLimit', NoDefaultKey = 'NoDefaultKey', @@ -2155,6 +2385,7 @@ export enum WebrpcErrorCodes { InvalidOrigin = 1103, InvalidService = 1104, UnauthorizedUser = 1105, + InvalidChain = 1106, QuotaExceeded = 1200, QuotaRateLimit = 1201, NoDefaultKey = 1300, @@ -2196,6 +2427,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { [1103]: InvalidOriginError, [1104]: InvalidServiceError, [1105]: UnauthorizedUserError, + [1106]: InvalidChainError, [1200]: QuotaExceededError, [1201]: QuotaRateLimitError, [1300]: NoDefaultKeyError, @@ -2217,7 +2449,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { export const WebrpcHeader = 'Webrpc' -export const WebrpcHeaderValue = 'webrpc@v0.30.2;gen-typescript@v0.22.2;sequence-relayer@v0.4.1' +export const WebrpcHeaderValue = 'webrpc@v0.32.2;gen-typescript@v0.23.1;sequence-relayer@v0.4.1' type WebrpcGenVersions = { WebrpcGenVersion: string From e3541f24a95a3fb23d0fa4d188ec31651576f3bd Mon Sep 17 00:00:00 2001 From: William Hua Date: Tue, 14 Apr 2026 10:17:17 -0400 Subject: [PATCH 115/144] pnpm format --- packages/services/api/src/api.gen.ts | 1423 ++++++++++------- packages/services/indexer/src/indexer.gen.ts | 680 ++++---- .../services/indexer/src/indexergw.gen.ts | 260 +-- .../test/preconditions/preconditions.test.ts | 8 +- .../test/preconditions/selectors.test.ts | 38 +- 5 files changed, 1444 insertions(+), 965 deletions(-) diff --git a/packages/services/api/src/api.gen.ts b/packages/services/api/src/api.gen.ts index b9d2e5870..139fa541a 100644 --- a/packages/services/api/src/api.gen.ts +++ b/packages/services/api/src/api.gen.ts @@ -47,10 +47,14 @@ export interface APIClient { sendPasswordlessLink( req: SendPasswordlessLinkRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise - registerPublicKey(req: RegisterPublicKeyRequest, headers?: object, signal?: AbortSignal): Promise + registerPublicKey( + req: RegisterPublicKeyRequest, + headers?: object, + signal?: AbortSignal, + ): Promise getPublicKey(req: GetPublicKeyRequest, headers?: object, signal?: AbortSignal): Promise @@ -61,7 +65,11 @@ export interface APIClient { */ friendList(req: FriendListRequest, headers?: object, signal?: AbortSignal): Promise - getFriendByAddress(req: GetFriendByAddressRequest, headers?: object, signal?: AbortSignal): Promise + getFriendByAddress( + req: GetFriendByAddressRequest, + headers?: object, + signal?: AbortSignal, + ): Promise searchFriends(req: SearchFriendsRequest, headers?: object, signal?: AbortSignal): Promise @@ -70,7 +78,7 @@ export interface APIClient { updateFriendNickname( req: UpdateFriendNicknameRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise removeFriend(req: RemoveFriendRequest, headers?: object, signal?: AbortSignal): Promise @@ -82,12 +90,16 @@ export interface APIClient { */ contractCall(req: ContractCallRequest, headers?: object, signal?: AbortSignal): Promise - decodeContractCall(req: DecodeContractCallRequest, headers?: object, signal?: AbortSignal): Promise + decodeContractCall( + req: DecodeContractCallRequest, + headers?: object, + signal?: AbortSignal, + ): Promise lookupContractCallSelectors( req: LookupContractCallSelectorsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -95,16 +107,24 @@ export interface APIClient { * User Storage * */ - userStorageFetch(req: UserStorageFetchRequest, headers?: object, signal?: AbortSignal): Promise + userStorageFetch( + req: UserStorageFetchRequest, + headers?: object, + signal?: AbortSignal, + ): Promise userStorageSave(req: UserStorageSaveRequest, headers?: object, signal?: AbortSignal): Promise - userStorageDelete(req: UserStorageDeleteRequest, headers?: object, signal?: AbortSignal): Promise + userStorageDelete( + req: UserStorageDeleteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise userStorageFetchAll( req: UserStorageFetchAllRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -117,30 +137,38 @@ export interface APIClient { /** * - IsUsingGoogleMail(domain: string) => (yes: bool) */ - resolveENSAddress(req: ResolveENSAddressRequest, headers?: object, signal?: AbortSignal): Promise + resolveENSAddress( + req: ResolveENSAddressRequest, + 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(req: IsValidSignatureRequest, headers?: object, signal?: AbortSignal): Promise + isValidSignature( + req: IsValidSignatureRequest, + headers?: object, + signal?: AbortSignal, + ): Promise isValidMessageSignature( req: IsValidMessageSignatureRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise isValidTypedDataSignature( req: IsValidTypedDataSignatureRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise isValidETHAuthProof( req: IsValidETHAuthProofRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise getOnRampURL(req: GetOnRampURLRequest, headers?: object, signal?: AbortSignal): Promise @@ -155,13 +183,13 @@ export interface APIClient { transakGetSupportedNFTCheckoutChains( headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise transakGetWidgetURL( req: TransakGetWidgetURLRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -174,7 +202,7 @@ export interface APIClient { getCollectiblePrices( req: GetCollectiblePricesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -203,18 +231,26 @@ export interface APIClient { /** * NOTE: we're still using this from SW-API to Sequence-API to claim invite code */ - isValidAccessCode(req: IsValidAccessCodeRequest, headers?: object, signal?: AbortSignal): Promise + isValidAccessCode( + req: IsValidAccessCodeRequest, + headers?: object, + signal?: AbortSignal, + ): Promise internalClaimAccessCode( req: InternalClaimAccessCodeRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** * Utils */ - blockNumberAtTime(req: BlockNumberAtTimeRequest, headers?: object, signal?: AbortSignal): Promise + blockNumberAtTime( + req: BlockNumberAtTimeRequest, + headers?: object, + signal?: AbortSignal, + ): Promise /** * @@ -222,12 +258,16 @@ export interface APIClient { * TODO: deprecate in the future * */ - paperSessionSecret(req: PaperSessionSecretRequest, headers?: object, signal?: AbortSignal): Promise + paperSessionSecret( + req: PaperSessionSecretRequest, + headers?: object, + signal?: AbortSignal, + ): Promise paperSessionSecret2( req: PaperSessionSecret2Request, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -237,9 +277,17 @@ export interface APIClient { */ linkWallet(req: LinkWalletRequest, headers?: object, signal?: AbortSignal): Promise - getLinkedWallets(req: GetLinkedWalletsRequest, headers?: object, signal?: AbortSignal): Promise + getLinkedWallets( + req: GetLinkedWalletsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise - removeLinkedWallet(req: RemoveLinkedWalletRequest, headers?: object, signal?: AbortSignal): Promise + removeLinkedWallet( + req: RemoveLinkedWalletRequest, + 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 @@ -248,13 +296,13 @@ export interface APIClient { generateWaaSVerificationURL( req: GenerateWaaSVerificationURLRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise validateWaaSVerificationNonce( req: ValidateWaaSVerificationNonceRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -263,7 +311,11 @@ export interface APIClient { * WaaS child wallet adoption * */ - listAdoptedWallets(req: ListAdoptedWalletsRequest, headers?: object, signal?: AbortSignal): Promise + listAdoptedWallets( + req: ListAdoptedWalletsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise getLifiChains(headers?: object, signal?: AbortSignal): Promise @@ -273,9 +325,17 @@ export interface APIClient { * All parameters except `params` are deprecated. * Use only the `params` object to pass values. */ - getLifiSwapRoutes(req: GetLifiSwapRoutesRequest, headers?: object, signal?: AbortSignal): Promise + getLifiSwapRoutes( + req: GetLifiSwapRoutesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise - getLifiSwapQuote(req: GetLifiSwapQuoteRequest, headers?: object, signal?: AbortSignal): Promise + getLifiSwapQuote( + req: GetLifiSwapQuoteRequest, + headers?: object, + signal?: AbortSignal, + ): Promise /** * @@ -287,43 +347,43 @@ export interface APIClient { addOffchainInventory( req: AddOffchainInventoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise getOffchainInventory( req: GetOffchainInventoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise listOffchainInventories( req: ListOffchainInventoriesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise updateOffchainInventory( req: UpdateOffchainInventoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise deleteOffchainInventory( req: DeleteOffchainInventoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise requestOffchainPayment( req: RequestOffchainPaymentRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise listOffchainPayments( req: ListOffchainPaymentsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -339,38 +399,42 @@ export interface APIClient { deletePack(req: DeletePackRequest, headers?: object, signal?: AbortSignal): Promise - updatePackContent(req: UpdatePackContentRequest, 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 + signal?: AbortSignal, ): Promise checkoutOptionsSecondary( req: CheckoutOptionsSecondaryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise checkoutOptionsGetTransakContractID( req: CheckoutOptionsGetTransakContractIDRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise fortePayCreateIntent( req: FortePayCreateIntentRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise fortePayGetPaymentStatuses( req: FortePayGetPaymentStatusesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise } @@ -380,50 +444,50 @@ export interface APIClient { export enum SortOrder { DESC = 'DESC', - ASC = 'ASC' + ASC = 'ASC', } 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', - transak = 'transak' + transak = 'transak', } export enum CheckoutOptionOnRampProvider { unknown = 'unknown', - transak = 'transak' + transak = 'transak', } export enum CheckoutOptionSwapProvider { unknown = 'unknown', - lifi = 'lifi' + lifi = 'lifi', } export interface Version { @@ -1747,7 +1811,8 @@ export class API implements APIClient { 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, + 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, @@ -1794,1315 +1859,1553 @@ export class API implements APIClient { 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, + 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 + fortePayGetPaymentStatuses: (req: FortePayGetPaymentStatusesRequest) => + ['API', 'fortePayGetPaymentStatuses', 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 => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'PingResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'VersionResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RuntimeStatusResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ClockResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetSequenceContextResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('GetAuthToken'), + createHttpRequest(JsonEncode(req, 'GetAuthTokenRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetAuthTokenResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getAuthToken2 = (req: GetAuthToken2Request, headers?: object, signal?: AbortSignal): Promise => { + getAuthToken2 = ( + req: GetAuthToken2Request, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch( this.url('GetAuthToken2'), - createHttpRequest(JsonEncode(req, 'GetAuthToken2Request'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetAuthToken2Request'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetAuthToken2Response') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } sendPasswordlessLink = ( req: SendPasswordlessLinkRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('SendPasswordlessLink'), - createHttpRequest(JsonEncode(req, 'SendPasswordlessLinkRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'SendPasswordlessLinkRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'SendPasswordlessLinkResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } registerPublicKey = ( req: RegisterPublicKeyRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('RegisterPublicKey'), - createHttpRequest(JsonEncode(req, 'RegisterPublicKeyRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'RegisterPublicKeyRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RegisterPublicKeyResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('GetPublicKey'), + createHttpRequest(JsonEncode(req, 'GetPublicKeyRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetPublicKeyResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('FriendList'), + createHttpRequest(JsonEncode(req, 'FriendListRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'FriendListResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getFriendByAddress = ( req: GetFriendByAddressRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('GetFriendByAddress'), - createHttpRequest(JsonEncode(req, 'GetFriendByAddressRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetFriendByAddressRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetFriendByAddressResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - searchFriends = (req: SearchFriendsRequest, headers?: object, signal?: AbortSignal): Promise => { + searchFriends = ( + req: SearchFriendsRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch( this.url('SearchFriends'), - createHttpRequest(JsonEncode(req, 'SearchFriendsRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'SearchFriendsRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'SearchFriendsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('AddFriend'), + createHttpRequest(JsonEncode(req, 'AddFriendRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'AddFriendResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } updateFriendNickname = ( req: UpdateFriendNicknameRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('UpdateFriendNickname'), - createHttpRequest(JsonEncode(req, 'UpdateFriendNicknameRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'UpdateFriendNicknameRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UpdateFriendNicknameResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('RemoveFriend'), + createHttpRequest(JsonEncode(req, 'RemoveFriendRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RemoveFriendResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('ContractCall'), + createHttpRequest(JsonEncode(req, 'ContractCallRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ContractCallResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } decodeContractCall = ( req: DecodeContractCallRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('DecodeContractCall'), - createHttpRequest(JsonEncode(req, 'DecodeContractCallRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'DecodeContractCallRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'DecodeContractCallResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } lookupContractCallSelectors = ( req: LookupContractCallSelectorsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('LookupContractCallSelectors'), - createHttpRequest(JsonEncode(req, 'LookupContractCallSelectorsRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'LookupContractCallSelectorsRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'LookupContractCallSelectorsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } userStorageFetch = ( req: UserStorageFetchRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('UserStorageFetch'), - createHttpRequest(JsonEncode(req, 'UserStorageFetchRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'UserStorageFetchRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UserStorageFetchResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - userStorageSave = (req: UserStorageSaveRequest, headers?: object, signal?: AbortSignal): Promise => { + userStorageSave = ( + req: UserStorageSaveRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch( this.url('UserStorageSave'), - createHttpRequest(JsonEncode(req, 'UserStorageSaveRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'UserStorageSaveRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UserStorageSaveResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } userStorageDelete = ( req: UserStorageDeleteRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('UserStorageDelete'), - createHttpRequest(JsonEncode(req, 'UserStorageDeleteRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'UserStorageDeleteRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UserStorageDeleteResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } userStorageFetchAll = ( req: UserStorageFetchAllRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('UserStorageFetchAll'), - createHttpRequest(JsonEncode(req, 'UserStorageFetchAllRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'UserStorageFetchAllRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UserStorageFetchAllResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getMoonpayLink = (req: GetMoonpayLinkRequest, headers?: object, signal?: AbortSignal): Promise => { + getMoonpayLink = ( + req: GetMoonpayLinkRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch( this.url('GetMoonpayLink'), - createHttpRequest(JsonEncode(req, 'GetMoonpayLinkRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetMoonpayLinkRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetMoonpayLinkResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } resolveENSAddress = ( req: ResolveENSAddressRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('ResolveENSAddress'), - createHttpRequest(JsonEncode(req, 'ResolveENSAddressRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'ResolveENSAddressRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ResolveENSAddressResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } isValidSignature = ( req: IsValidSignatureRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('IsValidSignature'), - createHttpRequest(JsonEncode(req, 'IsValidSignatureRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'IsValidSignatureRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'IsValidSignatureResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } isValidMessageSignature = ( req: IsValidMessageSignatureRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('IsValidMessageSignature'), - createHttpRequest(JsonEncode(req, 'IsValidMessageSignatureRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'IsValidMessageSignatureRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'IsValidMessageSignatureResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } isValidTypedDataSignature = ( req: IsValidTypedDataSignatureRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('IsValidTypedDataSignature'), - createHttpRequest(JsonEncode(req, 'IsValidTypedDataSignatureRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'IsValidTypedDataSignatureRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'IsValidTypedDataSignatureResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } isValidETHAuthProof = ( req: IsValidETHAuthProofRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('IsValidETHAuthProof'), - createHttpRequest(JsonEncode(req, 'IsValidETHAuthProofRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'IsValidETHAuthProofRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'IsValidETHAuthProofResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('GetOnRampURL'), + createHttpRequest(JsonEncode(req, 'GetOnRampURLRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetOnRampURLResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } transakGetCountries = (headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('TransakGetCountries'), createHttpRequest('{}', headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'TransakGetCountriesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - transakGetCryptoCurrencies = (headers?: object, signal?: AbortSignal): Promise => { + transakGetCryptoCurrencies = ( + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch(this.url('TransakGetCryptoCurrencies'), createHttpRequest('{}', headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'TransakGetCryptoCurrenciesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } transakGetFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('TransakGetFiatCurrencies'), createHttpRequest('{}', headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'TransakGetFiatCurrenciesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - transakGetPrice = (req: TransakGetPriceRequest, headers?: object, signal?: AbortSignal): Promise => { + transakGetPrice = ( + req: TransakGetPriceRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch( this.url('TransakGetPrice'), - createHttpRequest(JsonEncode(req, 'TransakGetPriceRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'TransakGetPriceRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'TransakGetPriceResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } transakGetSupportedNFTCheckoutChains = ( headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('TransakGetSupportedNFTCheckoutChains'), createHttpRequest('{}', headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'TransakGetSupportedNFTCheckoutChainsResponse') + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode( + _data, + 'TransakGetSupportedNFTCheckoutChainsResponse', + ) + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } ) } transakGetWidgetURL = ( req: TransakGetWidgetURLRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('TransakGetWidgetURL'), - createHttpRequest(JsonEncode(req, 'TransakGetWidgetURLRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'TransakGetWidgetURLRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'TransakGetWidgetURLResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getCoinPrices = (req: GetCoinPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + getCoinPrices = ( + req: GetCoinPricesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch( this.url('GetCoinPrices'), - createHttpRequest(JsonEncode(req, 'GetCoinPricesRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetCoinPricesRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetCoinPricesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getCollectiblePrices = ( req: GetCollectiblePricesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('GetCollectiblePrices'), - createHttpRequest(JsonEncode(req, 'GetCollectiblePricesRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetCollectiblePricesRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetCollectiblePricesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getExchangeRate = (req: GetExchangeRateRequest, headers?: object, signal?: AbortSignal): Promise => { + getExchangeRate = ( + req: GetExchangeRateRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch( this.url('GetExchangeRate'), - createHttpRequest(JsonEncode(req, 'GetExchangeRateRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetExchangeRateRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetExchangeRateResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('MemoryStore'), + createHttpRequest(JsonEncode(req, 'MemoryStoreRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'MemoryStoreResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('MemoryLoad'), + createHttpRequest(JsonEncode(req, 'MemoryLoadRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'MemoryLoadResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetInviteInfoResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } isValidAccessCode = ( req: IsValidAccessCodeRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('IsValidAccessCode'), - createHttpRequest(JsonEncode(req, 'IsValidAccessCodeRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'IsValidAccessCodeRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'IsValidAccessCodeResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } internalClaimAccessCode = ( req: InternalClaimAccessCodeRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('InternalClaimAccessCode'), - createHttpRequest(JsonEncode(req, 'InternalClaimAccessCodeRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'InternalClaimAccessCodeRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'InternalClaimAccessCodeResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } blockNumberAtTime = ( req: BlockNumberAtTimeRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('BlockNumberAtTime'), - createHttpRequest(JsonEncode(req, 'BlockNumberAtTimeRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'BlockNumberAtTimeRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'BlockNumberAtTimeResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } paperSessionSecret = ( req: PaperSessionSecretRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('PaperSessionSecret'), - createHttpRequest(JsonEncode(req, 'PaperSessionSecretRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'PaperSessionSecretRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'PaperSessionSecretResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } paperSessionSecret2 = ( req: PaperSessionSecret2Request, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('PaperSessionSecret2'), - createHttpRequest(JsonEncode(req, 'PaperSessionSecret2Request'), headers, signal) + createHttpRequest(JsonEncode(req, 'PaperSessionSecret2Request'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'PaperSessionSecret2Response') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('LinkWallet'), + createHttpRequest(JsonEncode(req, 'LinkWalletRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'LinkWalletResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getLinkedWallets = ( req: GetLinkedWalletsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('GetLinkedWallets'), - createHttpRequest(JsonEncode(req, 'GetLinkedWalletsRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetLinkedWalletsRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetLinkedWalletsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } removeLinkedWallet = ( req: RemoveLinkedWalletRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('RemoveLinkedWallet'), - createHttpRequest(JsonEncode(req, 'RemoveLinkedWalletRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'RemoveLinkedWalletRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RemoveLinkedWalletResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } generateWaaSVerificationURL = ( req: GenerateWaaSVerificationURLRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('GenerateWaaSVerificationURL'), - createHttpRequest(JsonEncode(req, 'GenerateWaaSVerificationURLRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GenerateWaaSVerificationURLRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GenerateWaaSVerificationURLResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } validateWaaSVerificationNonce = ( req: ValidateWaaSVerificationNonceRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('ValidateWaaSVerificationNonce'), - createHttpRequest(JsonEncode(req, 'ValidateWaaSVerificationNonceRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'ValidateWaaSVerificationNonceRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ValidateWaaSVerificationNonceResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } listAdoptedWallets = ( req: ListAdoptedWalletsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('ListAdoptedWallets'), - createHttpRequest(JsonEncode(req, 'ListAdoptedWalletsRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'ListAdoptedWalletsRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ListAdoptedWalletsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetLifiChainsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getLifiTokens = (req: GetLifiTokensRequest, headers?: object, signal?: AbortSignal): Promise => { + getLifiTokens = ( + req: GetLifiTokensRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch( this.url('GetLifiTokens'), - createHttpRequest(JsonEncode(req, 'GetLifiTokensRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetLifiTokensRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetLifiTokensResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getLifiSwapRoutes = ( req: GetLifiSwapRoutesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('GetLifiSwapRoutes'), - createHttpRequest(JsonEncode(req, 'GetLifiSwapRoutesRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetLifiSwapRoutesRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetLifiSwapRoutesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getLifiSwapQuote = ( req: GetLifiSwapQuoteRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('GetLifiSwapQuote'), - createHttpRequest(JsonEncode(req, 'GetLifiSwapQuoteRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetLifiSwapQuoteRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetLifiSwapQuoteResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ListCurrencyGroupsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } addOffchainInventory = ( req: AddOffchainInventoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('AddOffchainInventory'), - createHttpRequest(JsonEncode(req, 'AddOffchainInventoryRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'AddOffchainInventoryRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'AddOffchainInventoryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getOffchainInventory = ( req: GetOffchainInventoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('GetOffchainInventory'), - createHttpRequest(JsonEncode(req, 'GetOffchainInventoryRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetOffchainInventoryRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetOffchainInventoryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } listOffchainInventories = ( req: ListOffchainInventoriesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('ListOffchainInventories'), - createHttpRequest(JsonEncode(req, 'ListOffchainInventoriesRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'ListOffchainInventoriesRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ListOffchainInventoriesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } updateOffchainInventory = ( req: UpdateOffchainInventoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('UpdateOffchainInventory'), - createHttpRequest(JsonEncode(req, 'UpdateOffchainInventoryRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'UpdateOffchainInventoryRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UpdateOffchainInventoryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } deleteOffchainInventory = ( req: DeleteOffchainInventoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('DeleteOffchainInventory'), - createHttpRequest(JsonEncode(req, 'DeleteOffchainInventoryRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'DeleteOffchainInventoryRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'DeleteOffchainInventoryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } requestOffchainPayment = ( req: RequestOffchainPaymentRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('RequestOffchainPayment'), - createHttpRequest(JsonEncode(req, 'RequestOffchainPaymentRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'RequestOffchainPaymentRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RequestOffchainPaymentResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } listOffchainPayments = ( req: ListOffchainPaymentsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('ListOffchainPayments'), - createHttpRequest(JsonEncode(req, 'ListOffchainPaymentsRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'ListOffchainPaymentsRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ListOffchainPaymentsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('SavePack'), + createHttpRequest(JsonEncode(req, 'SavePackRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'SavePackResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetPackResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('GetPackIds'), + createHttpRequest(JsonEncode(req, 'GetPackIdsRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetPackIdsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } 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 this.fetch( + this.url('DeletePack'), + createHttpRequest(JsonEncode(req, 'DeletePackRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'DeletePackResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } updatePackContent = ( req: UpdatePackContentRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('UpdatePackContent'), - createHttpRequest(JsonEncode(req, 'UpdatePackContentRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'UpdatePackContentRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UpdatePackContentResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getRevealTxData = (req: GetRevealTxDataRequest, headers?: object, signal?: AbortSignal): Promise => { + getRevealTxData = ( + req: GetRevealTxDataRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch( this.url('GetRevealTxData'), - createHttpRequest(JsonEncode(req, 'GetRevealTxDataRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'GetRevealTxDataRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetRevealTxDataResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } checkoutOptionsPrimary = ( req: CheckoutOptionsPrimaryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('CheckoutOptionsPrimary'), - createHttpRequest(JsonEncode(req, 'CheckoutOptionsPrimaryRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'CheckoutOptionsPrimaryRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'CheckoutOptionsPrimaryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } checkoutOptionsSecondary = ( req: CheckoutOptionsSecondaryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('CheckoutOptionsSecondary'), - createHttpRequest(JsonEncode(req, 'CheckoutOptionsSecondaryRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'CheckoutOptionsSecondaryRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'CheckoutOptionsSecondaryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } checkoutOptionsGetTransakContractID = ( req: CheckoutOptionsGetTransakContractIDRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('CheckoutOptionsGetTransakContractID'), - createHttpRequest(JsonEncode(req, 'CheckoutOptionsGetTransakContractIDRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'CheckoutOptionsGetTransakContractIDRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'CheckoutOptionsGetTransakContractIDResponse') + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode( + _data, + 'CheckoutOptionsGetTransakContractIDResponse', + ) + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } ) } fortePayCreateIntent = ( req: FortePayCreateIntentRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('FortePayCreateIntent'), - createHttpRequest(JsonEncode(req, 'FortePayCreateIntentRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'FortePayCreateIntentRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'FortePayCreateIntentResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } fortePayGetPaymentStatuses = ( req: FortePayGetPaymentStatusesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch( this.url('FortePayGetPaymentStatuses'), - createHttpRequest(JsonEncode(req, 'FortePayGetPaymentStatusesRequest'), headers, signal) + createHttpRequest(JsonEncode(req, 'FortePayGetPaymentStatusesRequest'), headers, signal), ).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'FortePayGetPaymentStatusesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } } @@ -3111,20 +3414,20 @@ const createHttpRequest = (body: string = '{}', headers: object = {}, signal: Ab const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json', - [WebrpcHeader]: WebrpcHeaderValue + [WebrpcHeader]: WebrpcHeaderValue, } return { method: 'POST', headers: reqHeaders, body, 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) { throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}` + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}`, }) } if (!res.ok) { @@ -3650,7 +3953,7 @@ export enum errors { Unavailable = 'Unavailable', QueryFailed = 'QueryFailed', NotFound = 'NotFound', - UnsupportedNetwork = 'UnsupportedNetwork' + UnsupportedNetwork = 'UnsupportedNetwork', } export enum WebrpcErrorCodes { @@ -3689,7 +3992,7 @@ export enum WebrpcErrorCodes { Unavailable = 2002, QueryFailed = 2003, NotFound = 3000, - UnsupportedNetwork = 3008 + UnsupportedNetwork = 3008, } export const webrpcErrorByCode: { [code: number]: any } = { @@ -3728,7 +4031,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { [2002]: UnavailableError, [2003]: QueryFailedError, [3000]: NotFoundError, - [3008]: UnsupportedNetworkError + [3008]: UnsupportedNetworkError, } // @@ -3755,7 +4058,7 @@ export function VersionFromHeader(headers: Headers): WebrpcGenVersions { codeGenName: '', codeGenVersion: '', schemaName: '', - schemaVersion: '' + schemaVersion: '', } } @@ -3770,7 +4073,7 @@ function parseWebrpcGenVersions(header: string): WebrpcGenVersions { codeGenName: '', codeGenVersion: '', schemaName: '', - schemaVersion: '' + schemaVersion: '', } } @@ -3783,6 +4086,6 @@ function parseWebrpcGenVersions(header: string): WebrpcGenVersions { codeGenName: codeGenName ?? '', codeGenVersion: codeGenVersion ?? '', schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '' + schemaVersion: schemaVersion ?? '', } } diff --git a/packages/services/indexer/src/indexer.gen.ts b/packages/services/indexer/src/indexer.gen.ts index 354ce47e2..8dba62d16 100644 --- a/packages/services/indexer/src/indexer.gen.ts +++ b/packages/services/indexer/src/indexer.gen.ts @@ -19,7 +19,11 @@ export const WebrpcSchemaHash = '2bca559c4c590bce7d70c33df115a58399efec82' // export interface IndexerClient { - addWebhookListener(req: AddWebhookListenerRequest, headers?: object, signal?: AbortSignal): Promise + addWebhookListener( + req: AddWebhookListenerRequest, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Fetches a single receipt and then will stop the subscription @@ -27,7 +31,7 @@ export interface IndexerClient { fetchTransactionReceipt( req: FetchTransactionReceiptRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -36,7 +40,7 @@ export interface IndexerClient { fetchTransactionReceiptWithFilter( req: FetchTransactionReceiptWithFilterRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -45,14 +49,18 @@ export interface IndexerClient { getAllWebhookListeners( req: GetAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** * Get balance update aggregate values -- useful for syncing balance details of a contract, ie. from Skyweaver. * Also consider using SubscribeBalanceUpdates or SubscribeEvents as other alternatives. */ - getBalanceUpdates(req: GetBalanceUpdatesRequest, headers?: object, signal?: AbortSignal): Promise + getBalanceUpdates( + req: GetBalanceUpdatesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Get the chain ID of the indexer @@ -94,7 +102,7 @@ export interface IndexerClient { getMarketplaceOrders( req: GetMarketplaceOrdersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -118,7 +126,7 @@ export interface IndexerClient { getMarketplaceTopOrders( req: GetMarketplaceTopOrdersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -129,7 +137,7 @@ export interface IndexerClient { getNativeTokenBalance( req: GetNativeTokenBalanceRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -144,7 +152,11 @@ export interface IndexerClient { * * @deprecated GetTokenBalancesSummary */ - getTokenBalances(req: GetTokenBalancesRequest, headers?: object, signal?: AbortSignal): Promise + getTokenBalances( + req: GetTokenBalancesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise /** * GetTokenBalancesByContract returns a balances for a specific accounts and @@ -160,7 +172,7 @@ export interface IndexerClient { getTokenBalancesByContract( req: GetTokenBalancesByContractRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -177,7 +189,7 @@ export interface IndexerClient { getTokenBalancesDetails( req: GetTokenBalancesDetailsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -194,7 +206,7 @@ export interface IndexerClient { getTokenBalancesSummary( req: GetTokenBalancesSummaryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -212,7 +224,11 @@ export interface IndexerClient { * will return just a single range from [1,100_000], but if there are gaps between the sequence, then * those will be broken into separate range entries. */ - getTokenIDRanges(req: GetTokenIDRangesRequest, headers?: object, signal?: AbortSignal): Promise + getTokenIDRanges( + req: GetTokenIDRangesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise /** * GetTokenIDs returns the list of each individual token id for a token collection contract. @@ -228,7 +244,11 @@ export interface IndexerClient { * GetTokenSupplies returns the set of tokenIDs used by a contract address, supporting ERC-20, ERC-721, and ERC-1155 * contracts, and their respective supply as well. */ - getTokenSupplies(req: GetTokenSuppliesRequest, headers?: object, signal?: AbortSignal): Promise + getTokenSupplies( + req: GetTokenSuppliesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise /** * GetTokenSuppliesMap returns the token supplies of ERC-20 and ERC-1155 tokens as requested in the `tokenMap` @@ -240,7 +260,7 @@ export interface IndexerClient { getTokenSuppliesMap( req: GetTokenSuppliesMapRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -250,17 +270,21 @@ export interface IndexerClient { getTransactionHistory( req: GetTransactionHistoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise - getWebhookListener(req: GetWebhookListenerRequest, headers?: object, signal?: AbortSignal): Promise + getWebhookListener( + req: GetWebhookListenerRequest, + headers?: object, + signal?: AbortSignal, + ): Promise listTokenPrices(req: ListTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise pauseAllWebhookListeners( req: PauseAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -271,19 +295,19 @@ export interface IndexerClient { removeAllWebhookListeners( req: RemoveAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise removeWebhookListener( req: RemoveWebhookListenerRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise resumeAllWebhookListeners( req: ResumeAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -296,7 +320,7 @@ export interface IndexerClient { */ subscribeBalanceUpdates( req: SubscribeBalanceUpdatesRequest, - options: WebrpcStreamOptions + options: WebrpcStreamOptions, ): WebrpcStreamController /** @@ -305,14 +329,17 @@ export interface IndexerClient { * TODO: some additional options can be passed such as block, reorg true, etc. * or stay behind, etc. */ - subscribeEvents(req: SubscribeEventsRequest, options: WebrpcStreamOptions): WebrpcStreamController + subscribeEvents( + req: SubscribeEventsRequest, + options: WebrpcStreamOptions, + ): WebrpcStreamController /** * Listen to transaction receipts on-chain based on the filter criteria */ subscribeReceipts( req: SubscribeReceiptsRequest, - options: WebrpcStreamOptions + options: WebrpcStreamOptions, ): WebrpcStreamController /** @@ -326,13 +353,13 @@ export interface IndexerClient { toggleWebhookListener( req: ToggleWebhookListenerRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise updateWebhookListener( req: UpdateWebhookListenerRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -361,7 +388,7 @@ export interface Asset { export enum BackupMode { INCREMENTAL = 'INCREMENTAL', - COMPLETE = 'COMPLETE' + COMPLETE = 'COMPLETE', } export interface BloomStats { @@ -443,13 +470,13 @@ export enum ContractType { ERC721_BRIDGE = 'ERC721_BRIDGE', ERC1155_BRIDGE = 'ERC1155_BRIDGE', SEQ_MARKETPLACE = 'SEQ_MARKETPLACE', - ERC6909 = 'ERC6909' + ERC6909 = 'ERC6909', } export enum ContractVerificationStatus { VERIFIED = 'VERIFIED', UNVERIFIED = 'UNVERIFIED', - ALL = 'ALL' + ALL = 'ALL', } export interface DiskUsage { @@ -503,13 +530,13 @@ export enum EventLogDataType { EVENT = 'EVENT', TOKEN_TRANSFER = 'TOKEN_TRANSFER', NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', - SEQUENCE_TXN = 'SEQUENCE_TXN' + SEQUENCE_TXN = 'SEQUENCE_TXN', } export enum EventLogType { UNKNOWN = 'UNKNOWN', BLOCK_ADDED = 'BLOCK_ADDED', - BLOCK_REMOVED = 'BLOCK_REMOVED' + BLOCK_REMOVED = 'BLOCK_REMOVED', } export interface GatewayBackendResponseTime { @@ -649,13 +676,13 @@ export interface NativeTokenBalance { export enum NetworkType { MAINNETS = 'MAINNETS', TESTNETS = 'TESTNETS', - ALL = 'ALL' + ALL = 'ALL', } export enum OrderStatus { OPEN = 'OPEN', CLOSED = 'CLOSED', - CANCELLED = 'CANCELLED' + CANCELLED = 'CANCELLED', } export interface Page { @@ -686,7 +713,7 @@ export interface Price { export enum ResourceStatus { NOT_AVAILABLE = 'NOT_AVAILABLE', REFRESHING = 'REFRESHING', - AVAILABLE = 'AVAILABLE' + AVAILABLE = 'AVAILABLE', } export interface RuntimeChecks { @@ -723,7 +750,7 @@ export interface SortBy { export enum SortOrder { DESC = 'DESC', - ASC = 'ASC' + ASC = 'ASC', } export interface TokenBalance { @@ -880,13 +907,13 @@ export interface TransactionReceipt { export enum TransactionStatus { FAILED = 'FAILED', - SUCCESSFUL = 'SUCCESSFUL' + SUCCESSFUL = 'SUCCESSFUL', } export enum TransactionType { LegacyTxnType = 'LegacyTxnType', AccessListTxnType = 'AccessListTxnType', - DynamicFeeTxnType = 'DynamicFeeTxnType' + DynamicFeeTxnType = 'DynamicFeeTxnType', } export interface TxnInfo { @@ -913,7 +940,7 @@ export interface TxnTransfer { export enum TxnTransferType { UNKNOWN = 'UNKNOWN', SEND = 'SEND', - RECEIVE = 'RECEIVE' + RECEIVE = 'RECEIVE', } export interface Version { @@ -1298,7 +1325,8 @@ export class Indexer implements IndexerClient { queryKey = { addWebhookListener: (req: AddWebhookListenerRequest) => ['Indexer', 'addWebhookListener', req] as const, - fetchTransactionReceipt: (req: FetchTransactionReceiptRequest) => ['Indexer', 'fetchTransactionReceipt', req] as const, + fetchTransactionReceipt: (req: FetchTransactionReceiptRequest) => + ['Indexer', 'fetchTransactionReceipt', req] as const, fetchTransactionReceiptWithFilter: (req: FetchTransactionReceiptWithFilterRequest) => ['Indexer', 'fetchTransactionReceiptWithFilter', req] as const, getAllWebhookListeners: (req: GetAllWebhookListenersRequest) => ['Indexer', 'getAllWebhookListeners', req] as const, @@ -1306,13 +1334,16 @@ export class Indexer implements IndexerClient { getChainID: () => ['Indexer', 'getChainID'] as const, getEtherBalance: (req: GetEtherBalanceRequest) => ['Indexer', 'getEtherBalance', req] as const, getMarketplaceOrders: (req: GetMarketplaceOrdersRequest) => ['Indexer', 'getMarketplaceOrders', req] as const, - getMarketplaceTopOrders: (req: GetMarketplaceTopOrdersRequest) => ['Indexer', 'getMarketplaceTopOrders', req] as const, + getMarketplaceTopOrders: (req: GetMarketplaceTopOrdersRequest) => + ['Indexer', 'getMarketplaceTopOrders', req] as const, getNativeTokenBalance: (req: GetNativeTokenBalanceRequest) => ['Indexer', 'getNativeTokenBalance', req] as const, getTokenBalances: (req: GetTokenBalancesRequest) => ['Indexer', 'getTokenBalances', req] as const, getTokenBalancesByContract: (req: GetTokenBalancesByContractRequest) => ['Indexer', 'getTokenBalancesByContract', req] as const, - getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => ['Indexer', 'getTokenBalancesDetails', req] as const, - getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => ['Indexer', 'getTokenBalancesSummary', req] as const, + getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => + ['Indexer', 'getTokenBalancesDetails', req] as const, + getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => + ['Indexer', 'getTokenBalancesSummary', req] as const, getTokenIDRanges: (req: GetTokenIDRangesRequest) => ['Indexer', 'getTokenIDRanges', req] as const, getTokenIDs: (req: GetTokenIDsRequest) => ['Indexer', 'getTokenIDs', req] as const, getTokenPrice: (req: GetTokenPriceRequest) => ['Indexer', 'getTokenPrice', req] as const, @@ -1322,626 +1353,721 @@ export class Indexer implements IndexerClient { getTransactionHistory: (req: GetTransactionHistoryRequest) => ['Indexer', 'getTransactionHistory', req] as const, getWebhookListener: (req: GetWebhookListenerRequest) => ['Indexer', 'getWebhookListener', req] as const, listTokenPrices: (req: ListTokenPricesRequest) => ['Indexer', 'listTokenPrices', req] as const, - pauseAllWebhookListeners: (req: PauseAllWebhookListenersRequest) => ['Indexer', 'pauseAllWebhookListeners', req] as const, + pauseAllWebhookListeners: (req: PauseAllWebhookListenersRequest) => + ['Indexer', 'pauseAllWebhookListeners', req] as const, ping: () => ['Indexer', 'ping'] as const, - removeAllWebhookListeners: (req: RemoveAllWebhookListenersRequest) => ['Indexer', 'removeAllWebhookListeners', req] as const, + removeAllWebhookListeners: (req: RemoveAllWebhookListenersRequest) => + ['Indexer', 'removeAllWebhookListeners', req] as const, removeWebhookListener: (req: RemoveWebhookListenerRequest) => ['Indexer', 'removeWebhookListener', req] as const, - resumeAllWebhookListeners: (req: ResumeAllWebhookListenersRequest) => ['Indexer', 'resumeAllWebhookListeners', req] as const, + resumeAllWebhookListeners: (req: ResumeAllWebhookListenersRequest) => + ['Indexer', 'resumeAllWebhookListeners', req] as const, runtimeStatus: () => ['Indexer', 'runtimeStatus'] as const, - subscribeBalanceUpdates: (req: SubscribeBalanceUpdatesRequest) => ['Indexer', 'subscribeBalanceUpdates', req] as const, + subscribeBalanceUpdates: (req: SubscribeBalanceUpdatesRequest) => + ['Indexer', 'subscribeBalanceUpdates', req] as const, subscribeEvents: (req: SubscribeEventsRequest) => ['Indexer', 'subscribeEvents', req] as const, subscribeReceipts: (req: SubscribeReceiptsRequest) => ['Indexer', 'subscribeReceipts', req] as const, syncBalance: (req: SyncBalanceRequest) => ['Indexer', 'syncBalance', req] as const, toggleWebhookListener: (req: ToggleWebhookListenerRequest) => ['Indexer', 'toggleWebhookListener', req] as const, updateWebhookListener: (req: UpdateWebhookListenerRequest) => ['Indexer', 'updateWebhookListener', req] as const, - version: () => ['Indexer', 'version'] as const + version: () => ['Indexer', 'version'] as const, } addWebhookListener = ( req: AddWebhookListenerRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('AddWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'AddWebhookListenerResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } fetchTransactionReceipt = ( req: FetchTransactionReceiptRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('FetchTransactionReceipt'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'FetchTransactionReceiptResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } fetchTransactionReceiptWithFilter = ( req: FetchTransactionReceiptWithFilterRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { - return this.fetch(this.url('FetchTransactionReceiptWithFilter'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { - return JsonDecode(_data, 'FetchTransactionReceiptWithFilterResponse') + return this.fetch( + this.url('FetchTransactionReceiptWithFilter'), + createHttpRequest(JsonEncode(req), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode( + _data, + 'FetchTransactionReceiptWithFilterResponse', + ) + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } ) } getAllWebhookListeners = ( req: GetAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetAllWebhookListenersResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getBalanceUpdates = ( req: GetBalanceUpdatesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetBalanceUpdates'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetBalanceUpdatesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetChainIDResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getEtherBalance = (req: GetEtherBalanceRequest, headers?: object, signal?: AbortSignal): Promise => { + getEtherBalance = ( + req: GetEtherBalanceRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch(this.url('GetEtherBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetEtherBalanceResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getMarketplaceOrders = ( req: GetMarketplaceOrdersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetMarketplaceOrders'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetMarketplaceOrdersResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getMarketplaceTopOrders = ( req: GetMarketplaceTopOrdersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetMarketplaceTopOrders'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetMarketplaceTopOrdersResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getNativeTokenBalance = ( req: GetNativeTokenBalanceRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetNativeTokenBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetNativeTokenBalanceResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenBalances = ( req: GetTokenBalancesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenBalances'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenBalancesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenBalancesByContract = ( req: GetTokenBalancesByContractRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenBalancesByContract'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenBalancesByContractResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenBalancesDetails = ( req: GetTokenBalancesDetailsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenBalancesDetails'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenBalancesDetailsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenBalancesSummary = ( req: GetTokenBalancesSummaryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenBalancesSummary'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenBalancesSummaryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenIDRanges = ( req: GetTokenIDRangesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenIDRanges'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenIDRangesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenIDs = (req: GetTokenIDsRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('GetTokenIDs'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenIDsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getTokenPrice = (req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise => { + getTokenPrice = ( + req: GetTokenPriceRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch(this.url('GetTokenPrice'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenPriceResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getTokenPrices = (req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + getTokenPrices = ( + req: GetTokenPricesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch(this.url('GetTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenPricesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenSupplies = ( req: GetTokenSuppliesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenSupplies'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenSuppliesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenSuppliesMap = ( req: GetTokenSuppliesMapRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenSuppliesMap'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenSuppliesMapResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTransactionHistory = ( req: GetTransactionHistoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTransactionHistory'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTransactionHistoryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getWebhookListener = ( req: GetWebhookListenerRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetWebhookListenerResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - listTokenPrices = (req: ListTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + listTokenPrices = ( + req: ListTokenPricesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch(this.url('ListTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ListTokenPricesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } pauseAllWebhookListeners = ( req: PauseAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('PauseAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'PauseAllWebhookListenersResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } ping = (headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'PingResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } removeAllWebhookListeners = ( req: RemoveAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('RemoveAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RemoveAllWebhookListenersResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } removeWebhookListener = ( req: RemoveWebhookListenerRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('RemoveWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RemoveWebhookListenerResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } resumeAllWebhookListeners = ( req: ResumeAllWebhookListenersRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('ResumeAllWebhookListeners'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ResumeAllWebhookListenersResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RuntimeStatusResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } subscribeBalanceUpdates = ( req: SubscribeBalanceUpdatesRequest, - options: WebrpcStreamOptions + options: WebrpcStreamOptions, ): WebrpcStreamController => { const abortController = new AbortController() const abortSignal = abortController.signal if (options.signal) { abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { - signal: options.signal + signal: options.signal, }) } const _fetch = () => - this.fetch(this.url('SubscribeBalanceUpdates'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( - async res => { + this.fetch( + this.url('SubscribeBalanceUpdates'), + createHttpRequest(JsonEncode(req), options.headers, abortSignal), + ).then( + async (res) => { await sseResponse(res, options, _fetch) }, - error => { + (error) => { options.onError(error, _fetch) - } + }, ) const resp = _fetch() return { abort: abortController.abort.bind(abortController), - closed: resp + closed: resp, } } subscribeEvents = ( req: SubscribeEventsRequest, - options: WebrpcStreamOptions + options: WebrpcStreamOptions, ): WebrpcStreamController => { const abortController = new AbortController() const abortSignal = abortController.signal if (options.signal) { abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { - signal: options.signal + signal: options.signal, }) } const _fetch = () => this.fetch(this.url('SubscribeEvents'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( - async res => { + async (res) => { await sseResponse(res, options, _fetch) }, - error => { + (error) => { options.onError(error, _fetch) - } + }, ) const resp = _fetch() return { abort: abortController.abort.bind(abortController), - closed: resp + closed: resp, } } subscribeReceipts = ( req: SubscribeReceiptsRequest, - options: WebrpcStreamOptions + options: WebrpcStreamOptions, ): WebrpcStreamController => { const abortController = new AbortController() const abortSignal = abortController.signal if (options.signal) { abortSignal.addEventListener('abort', () => abortController.abort(options.signal?.reason), { - signal: options.signal + signal: options.signal, }) } const _fetch = () => this.fetch(this.url('SubscribeReceipts'), createHttpRequest(JsonEncode(req), options.headers, abortSignal)).then( - async res => { + async (res) => { await sseResponse(res, options, _fetch) }, - error => { + (error) => { options.onError(error, _fetch) - } + }, ) const resp = _fetch() return { abort: abortController.abort.bind(abortController), - closed: resp + closed: resp, } } syncBalance = (req: SyncBalanceRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('SyncBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'SyncBalanceResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } toggleWebhookListener = ( req: ToggleWebhookListenerRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('ToggleWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'ToggleWebhookListenerResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } updateWebhookListener = ( req: UpdateWebhookListenerRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('UpdateWebhookListener'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'UpdateWebhookListenerResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'VersionResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } } @@ -1963,9 +2089,9 @@ const sseResponse = async (res: Response, options: WebrpcStreamOptions, ret onError( WebrpcBadResponseError.new({ status: res.status, - cause: 'Invalid response, missing body' + cause: 'Invalid response, missing body', }), - retryFetch + retryFetch, ) return } @@ -1999,18 +2125,18 @@ const sseResponse = async (res: Response, options: WebrpcStreamOptions, ret onError( WebrpcClientAbortedError.new({ message: 'AbortError', - cause: `AbortError: ${error instanceof Error ? error.message : String(error)}` + cause: `AbortError: ${error instanceof Error ? error.message : String(error)}`, }), () => { throw new Error('Abort signal cannot be used to reconnect') - } + }, ) } else { onError( WebrpcStreamLostError.new({ - cause: `reader.read(): ${error instanceof Error ? error.message : String(error)}` + cause: `reader.read(): ${error instanceof Error ? error.message : String(error)}`, }), - retryFetch + retryFetch, ) } return @@ -2038,9 +2164,9 @@ const sseResponse = async (res: Response, options: WebrpcStreamOptions, ret onError( WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}` + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}`, }), - retryFetch + retryFetch, ) } onMessage(data) @@ -2061,20 +2187,20 @@ const createHttpRequest = (body: string = '{}', headers: object = {}, signal: Ab const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json', - [WebrpcHeader]: WebrpcHeaderValue + [WebrpcHeader]: WebrpcHeaderValue, } return { method: 'POST', headers: reqHeaders, body, 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) { throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}` + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}`, }) } if (!res.ok) { @@ -2630,7 +2756,7 @@ export enum errors { Timeout = 'Timeout', Unauthorized = 'Unauthorized', UnauthorizedUser = 'UnauthorizedUser', - Unavailable = 'Unavailable' + Unavailable = 'Unavailable', } export enum WebrpcErrorCodes { @@ -2670,7 +2796,7 @@ export enum WebrpcErrorCodes { Timeout = 1900, Unauthorized = 1000, UnauthorizedUser = 1105, - Unavailable = 2002 + Unavailable = 2002, } export const webrpcErrorByCode: { [code: number]: any } = { @@ -2710,7 +2836,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { [1900]: TimeoutError, [1000]: UnauthorizedError, [1105]: UnauthorizedUserError, - [2002]: UnavailableError + [2002]: UnavailableError, } // @@ -2737,7 +2863,7 @@ export function VersionFromHeader(headers: Headers): WebrpcGenVersions { codeGenName: '', codeGenVersion: '', schemaName: '', - schemaVersion: '' + schemaVersion: '', } } @@ -2752,7 +2878,7 @@ function parseWebrpcGenVersions(header: string): WebrpcGenVersions { codeGenName: '', codeGenVersion: '', schemaName: '', - schemaVersion: '' + schemaVersion: '', } } @@ -2765,6 +2891,6 @@ function parseWebrpcGenVersions(header: string): WebrpcGenVersions { codeGenName: codeGenName ?? '', codeGenVersion: codeGenVersion ?? '', schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '' + schemaVersion: schemaVersion ?? '', } } diff --git a/packages/services/indexer/src/indexergw.gen.ts b/packages/services/indexer/src/indexergw.gen.ts index 618a50217..d22bc5b56 100644 --- a/packages/services/indexer/src/indexergw.gen.ts +++ b/packages/services/indexer/src/indexergw.gen.ts @@ -24,7 +24,11 @@ export interface IndexerGatewayClient { * on all indexer nodes. By default if accountAddress is left empty, it will * use the account from the jwt session. */ - getBalanceUpdates(req: GetBalanceUpdatesRequest, headers?: object, signal?: AbortSignal): Promise + getBalanceUpdates( + req: GetBalanceUpdatesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise /** * GetChains returns a list of chains with their ID and name @@ -38,7 +42,7 @@ export interface IndexerGatewayClient { getNativeTokenBalance( req: GetNativeTokenBalanceRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -48,7 +52,11 @@ export interface IndexerGatewayClient { * * @deprecated Use GetTokenBalancesSummary or GetTokenBalancesDetails instead. */ - getTokenBalances(req: GetTokenBalancesRequest, headers?: object, signal?: AbortSignal): Promise + getTokenBalances( + req: GetTokenBalancesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise /** * GetTokenBalancesByContract returns a balances for specific accounts and @@ -58,7 +66,7 @@ export interface IndexerGatewayClient { getTokenBalancesByContract( req: GetTokenBalancesByContractRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -69,7 +77,7 @@ export interface IndexerGatewayClient { getTokenBalancesDetails( req: GetTokenBalancesDetailsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -80,7 +88,7 @@ export interface IndexerGatewayClient { getTokenBalancesSummary( req: GetTokenBalancesSummaryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise getTokenPrice(req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise @@ -95,7 +103,7 @@ export interface IndexerGatewayClient { getTransactionHistory( req: GetTransactionHistoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise /** @@ -134,7 +142,7 @@ export interface Asset { export enum BackupMode { INCREMENTAL = 'INCREMENTAL', - COMPLETE = 'COMPLETE' + COMPLETE = 'COMPLETE', } export interface BloomStats { @@ -216,13 +224,13 @@ export enum ContractType { ERC721_BRIDGE = 'ERC721_BRIDGE', ERC1155_BRIDGE = 'ERC1155_BRIDGE', SEQ_MARKETPLACE = 'SEQ_MARKETPLACE', - ERC6909 = 'ERC6909' + ERC6909 = 'ERC6909', } export enum ContractVerificationStatus { VERIFIED = 'VERIFIED', UNVERIFIED = 'UNVERIFIED', - ALL = 'ALL' + ALL = 'ALL', } export interface DiskUsage { @@ -276,13 +284,13 @@ export enum EventLogDataType { EVENT = 'EVENT', TOKEN_TRANSFER = 'TOKEN_TRANSFER', NATIVE_TOKEN_TRANSFER = 'NATIVE_TOKEN_TRANSFER', - SEQUENCE_TXN = 'SEQUENCE_TXN' + SEQUENCE_TXN = 'SEQUENCE_TXN', } export enum EventLogType { UNKNOWN = 'UNKNOWN', BLOCK_ADDED = 'BLOCK_ADDED', - BLOCK_REMOVED = 'BLOCK_REMOVED' + BLOCK_REMOVED = 'BLOCK_REMOVED', } export interface GatewayBackendResponseTime { @@ -422,13 +430,13 @@ export interface NativeTokenBalance { export enum NetworkType { MAINNETS = 'MAINNETS', TESTNETS = 'TESTNETS', - ALL = 'ALL' + ALL = 'ALL', } export enum OrderStatus { OPEN = 'OPEN', CLOSED = 'CLOSED', - CANCELLED = 'CANCELLED' + CANCELLED = 'CANCELLED', } export interface Page { @@ -459,7 +467,7 @@ export interface Price { export enum ResourceStatus { NOT_AVAILABLE = 'NOT_AVAILABLE', REFRESHING = 'REFRESHING', - AVAILABLE = 'AVAILABLE' + AVAILABLE = 'AVAILABLE', } export interface RuntimeChecks { @@ -496,7 +504,7 @@ export interface SortBy { export enum SortOrder { DESC = 'DESC', - ASC = 'ASC' + ASC = 'ASC', } export interface TokenBalance { @@ -653,13 +661,13 @@ export interface TransactionReceipt { export enum TransactionStatus { FAILED = 'FAILED', - SUCCESSFUL = 'SUCCESSFUL' + SUCCESSFUL = 'SUCCESSFUL', } export enum TransactionType { LegacyTxnType = 'LegacyTxnType', AccessListTxnType = 'AccessListTxnType', - DynamicFeeTxnType = 'DynamicFeeTxnType' + DynamicFeeTxnType = 'DynamicFeeTxnType', } export interface TxnInfo { @@ -686,7 +694,7 @@ export interface TxnTransfer { export enum TxnTransferType { UNKNOWN = 'UNKNOWN', SEND = 'SEND', - RECEIVE = 'RECEIVE' + RECEIVE = 'RECEIVE', } export interface Version { @@ -884,214 +892,252 @@ export class IndexerGateway implements IndexerGatewayClient { queryKey = { getBalanceUpdates: (req: GetBalanceUpdatesRequest) => ['IndexerGateway', 'getBalanceUpdates', req] as const, getChains: (req: GetChainsRequest) => ['IndexerGateway', 'getChains', req] as const, - getNativeTokenBalance: (req: GetNativeTokenBalanceRequest) => ['IndexerGateway', 'getNativeTokenBalance', req] as const, + getNativeTokenBalance: (req: GetNativeTokenBalanceRequest) => + ['IndexerGateway', 'getNativeTokenBalance', req] as const, getTokenBalances: (req: GetTokenBalancesRequest) => ['IndexerGateway', 'getTokenBalances', req] as const, getTokenBalancesByContract: (req: GetTokenBalancesByContractRequest) => ['IndexerGateway', 'getTokenBalancesByContract', req] as const, - getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => ['IndexerGateway', 'getTokenBalancesDetails', req] as const, - getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => ['IndexerGateway', 'getTokenBalancesSummary', req] as const, + getTokenBalancesDetails: (req: GetTokenBalancesDetailsRequest) => + ['IndexerGateway', 'getTokenBalancesDetails', req] as const, + getTokenBalancesSummary: (req: GetTokenBalancesSummaryRequest) => + ['IndexerGateway', 'getTokenBalancesSummary', req] as const, getTokenPrice: (req: GetTokenPriceRequest) => ['IndexerGateway', 'getTokenPrice', req] as const, getTokenPrices: (req: GetTokenPricesRequest) => ['IndexerGateway', 'getTokenPrices', req] as const, - getTransactionHistory: (req: GetTransactionHistoryRequest) => ['IndexerGateway', 'getTransactionHistory', req] as const, + getTransactionHistory: (req: GetTransactionHistoryRequest) => + ['IndexerGateway', 'getTransactionHistory', req] as const, ping: () => ['IndexerGateway', 'ping'] as const, runtimeStatus: () => ['IndexerGateway', 'runtimeStatus'] as const, - version: () => ['IndexerGateway', 'version'] as const + version: () => ['IndexerGateway', 'version'] as const, } getBalanceUpdates = ( req: GetBalanceUpdatesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetBalanceUpdates'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetBalanceUpdatesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getChains = (req: GetChainsRequest, headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('GetChains'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetChainsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getNativeTokenBalance = ( req: GetNativeTokenBalanceRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetNativeTokenBalance'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetNativeTokenBalanceResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenBalances = ( req: GetTokenBalancesRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenBalances'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenBalancesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenBalancesByContract = ( req: GetTokenBalancesByContractRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenBalancesByContract'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenBalancesByContractResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenBalancesDetails = ( req: GetTokenBalancesDetailsRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenBalancesDetails'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenBalancesDetailsResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTokenBalancesSummary = ( req: GetTokenBalancesSummaryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTokenBalancesSummary'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenBalancesSummaryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getTokenPrice = (req: GetTokenPriceRequest, headers?: object, signal?: AbortSignal): Promise => { + getTokenPrice = ( + req: GetTokenPriceRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch(this.url('GetTokenPrice'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenPriceResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } - getTokenPrices = (req: GetTokenPricesRequest, headers?: object, signal?: AbortSignal): Promise => { + getTokenPrices = ( + req: GetTokenPricesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { return this.fetch(this.url('GetTokenPrices'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTokenPricesResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } getTransactionHistory = ( req: GetTransactionHistoryRequest, headers?: object, - signal?: AbortSignal + signal?: AbortSignal, ): Promise => { return this.fetch(this.url('GetTransactionHistory'), createHttpRequest(JsonEncode(req), headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'GetTransactionHistoryResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } ping = (headers?: object, signal?: AbortSignal): Promise => { return this.fetch(this.url('Ping'), createHttpRequest('{}', headers, signal)).then( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'PingResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'RuntimeStatusResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + 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( - res => { - return buildResponse(res).then(_data => { + (res) => { + return buildResponse(res).then((_data) => { return JsonDecode(_data, 'VersionResponse') }) }, - error => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error instanceof Error ? error.message : String(error)}` }) - } + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, ) } } @@ -1100,20 +1146,20 @@ const createHttpRequest = (body: string = '{}', headers: object = {}, signal: Ab const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json', - [WebrpcHeader]: WebrpcHeaderValue + [WebrpcHeader]: WebrpcHeaderValue, } return { method: 'POST', headers: reqHeaders, body, 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) { throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}` + cause: `JSON.parse(): ${error instanceof Error ? error.message : String(error)}: response text: ${text}`, }) } if (!res.ok) { @@ -1652,7 +1698,7 @@ export enum errors { Timeout = 'Timeout', Unauthorized = 'Unauthorized', UnauthorizedUser = 'UnauthorizedUser', - Unavailable = 'Unavailable' + Unavailable = 'Unavailable', } export enum WebrpcErrorCodes { @@ -1692,7 +1738,7 @@ export enum WebrpcErrorCodes { Timeout = 1900, Unauthorized = 1000, UnauthorizedUser = 1105, - Unavailable = 2002 + Unavailable = 2002, } export const webrpcErrorByCode: { [code: number]: any } = { @@ -1732,7 +1778,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { [1900]: TimeoutError, [1000]: UnauthorizedError, [1105]: UnauthorizedUserError, - [2002]: UnavailableError + [2002]: UnavailableError, } // @@ -1759,7 +1805,7 @@ export function VersionFromHeader(headers: Headers): WebrpcGenVersions { codeGenName: '', codeGenVersion: '', schemaName: '', - schemaVersion: '' + schemaVersion: '', } } @@ -1774,7 +1820,7 @@ function parseWebrpcGenVersions(header: string): WebrpcGenVersions { codeGenName: '', codeGenVersion: '', schemaName: '', - schemaVersion: '' + schemaVersion: '', } } @@ -1787,6 +1833,6 @@ function parseWebrpcGenVersions(header: string): WebrpcGenVersions { codeGenName: codeGenName ?? '', codeGenVersion: codeGenVersion ?? '', schemaName: schemaName ?? '', - schemaVersion: schemaVersion ?? '' + schemaVersion: schemaVersion ?? '', } } diff --git a/packages/services/relayer/test/preconditions/preconditions.test.ts b/packages/services/relayer/test/preconditions/preconditions.test.ts index 0fd12b7f7..2eee47cba 100644 --- a/packages/services/relayer/test/preconditions/preconditions.test.ts +++ b/packages/services/relayer/test/preconditions/preconditions.test.ts @@ -9,10 +9,7 @@ import { Erc721OwnershipPrecondition, NativeBalancePrecondition, } from '../../src/preconditions/types.js' -import { - LocalRelayer, - type GenericProvider, -} from '../../src/relayer/standard/local.js' +import { LocalRelayer, type GenericProvider } from '../../src/relayer/standard/local.js' import { Network } from '@0xsequence/wallet-primitives' const CAN_RUN_LIVE = false @@ -177,8 +174,7 @@ describe('Preconditions', () => { } // getApproved returns 32-byte word: 12 zero bytes + 20-byte address. Codec uses ownerAddress as operator. - const approvedHex = - '0x' + '0'.repeat(24) + testWalletAddress.toString().slice(2).toLowerCase() + const approvedHex = '0x' + '0'.repeat(24) + testWalletAddress.toString().slice(2).toLowerCase() vi.mocked(provider.call).mockResolvedValue(approvedHex as Hex.Hex) const isValid = await relayer.checkPrecondition(transactionPrecondition) diff --git a/packages/services/relayer/test/preconditions/selectors.test.ts b/packages/services/relayer/test/preconditions/selectors.test.ts index 0cacc0e28..706642c23 100644 --- a/packages/services/relayer/test/preconditions/selectors.test.ts +++ b/packages/services/relayer/test/preconditions/selectors.test.ts @@ -68,7 +68,12 @@ describe('Preconditions Selectors', () => { }) it('should return undefined when chainID is not present', () => { - const precondition = { type: 'native-balance', ownerAddress: TEST_ADDRESS, tokenAddress: ZERO_ADDRESS, minAmount: 1n } as TransactionPrecondition + const precondition = { + type: 'native-balance', + ownerAddress: TEST_ADDRESS, + tokenAddress: ZERO_ADDRESS, + minAmount: 1n, + } as TransactionPrecondition const chainId = extractChainID(precondition) expect(chainId).toBeUndefined() }) @@ -87,10 +92,7 @@ describe('Preconditions Selectors', () => { describe('extractSupportedPreconditions', () => { it('should extract valid preconditions', () => { - const intents: TransactionPrecondition[] = [ - nativePrecondition(), - erc20Precondition(), - ] + const intents: TransactionPrecondition[] = [nativePrecondition(), erc20Precondition()] const results = extractSupportedPreconditions(intents) expect(results).toHaveLength(2) @@ -101,7 +103,13 @@ describe('Preconditions Selectors', () => { it('should filter out invalid preconditions', () => { const intents: TransactionPrecondition[] = [ nativePrecondition(), - { type: 'unknown-type', chainId: 1, ownerAddress: TEST_ADDRESS, tokenAddress: ZERO_ADDRESS, minAmount: 0n } as TransactionPrecondition, + { + type: 'unknown-type', + chainId: 1, + ownerAddress: TEST_ADDRESS, + tokenAddress: ZERO_ADDRESS, + minAmount: 0n, + } as TransactionPrecondition, nativePrecondition({ ownerAddress: '' }), ] @@ -124,7 +132,13 @@ describe('Preconditions Selectors', () => { const intents: TransactionPrecondition[] = [ nativePrecondition(), erc721OwnershipPrecondition(), - { type: 'invalid-type', chainId: 1, ownerAddress: TEST_ADDRESS, tokenAddress: ZERO_ADDRESS, minAmount: 0n } as TransactionPrecondition, + { + type: 'invalid-type', + chainId: 1, + ownerAddress: TEST_ADDRESS, + tokenAddress: ZERO_ADDRESS, + minAmount: 0n, + } as TransactionPrecondition, ] const results = extractSupportedPreconditions(intents) @@ -151,10 +165,7 @@ describe('Preconditions Selectors', () => { }) it('should return empty array when no native balance preconditions exist', () => { - const intents: TransactionPrecondition[] = [ - erc20Precondition(), - erc721OwnershipPrecondition(), - ] + const intents: TransactionPrecondition[] = [erc20Precondition(), erc721OwnershipPrecondition()] const results = extractNativeBalancePreconditions(intents) expect(results).toEqual([]) @@ -202,10 +213,7 @@ describe('Preconditions Selectors', () => { }) it('should return empty array when no ERC20 balance preconditions exist', () => { - const intents: TransactionPrecondition[] = [ - nativePrecondition(), - erc721OwnershipPrecondition(), - ] + const intents: TransactionPrecondition[] = [nativePrecondition(), erc721OwnershipPrecondition()] const results = extractERC20BalancePreconditions(intents) expect(results).toEqual([]) From 92f48c91fbbc96a28f6828621a5fbf6d59dcb9d4 Mon Sep 17 00:00:00 2001 From: William Hua Date: Wed, 15 Apr 2026 12:29:55 -0400 Subject: [PATCH 116/144] core: arweave state reader (#991) --- .../wallet/core/src/state/arweave/arweave.ts | 115 ++ .../wallet/core/src/state/arweave/index.ts | 1006 +++++++++++++++++ .../wallet/core/src/state/arweave/schema.ts | 369 ++++++ packages/wallet/core/src/state/index.ts | 7 +- .../core/test/state/arweave/arweave.test.ts | 120 ++ 5 files changed, 1614 insertions(+), 3 deletions(-) create mode 100644 packages/wallet/core/src/state/arweave/arweave.ts create mode 100644 packages/wallet/core/src/state/arweave/index.ts create mode 100644 packages/wallet/core/src/state/arweave/schema.ts create mode 100644 packages/wallet/core/test/state/arweave/arweave.test.ts diff --git a/packages/wallet/core/src/state/arweave/arweave.ts b/packages/wallet/core/src/state/arweave/arweave.ts new file mode 100644 index 000000000..b3cadb734 --- /dev/null +++ b/packages/wallet/core/src/state/arweave/arweave.ts @@ -0,0 +1,115 @@ +export interface Options { + readonly namespace?: string + readonly owners?: string[] + readonly arweaveUrl?: string + readonly graphqlUrl?: string + readonly rateLimitRetryDelayMs?: number +} + +export const defaults = { + namespace: 'Sequence-Sessions', + owners: ['AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM'], + arweaveUrl: 'https://arweave.net', + graphqlUrl: 'https://arweave.net/graphql', + rateLimitRetryDelayMs: 5 * 60 * 1000, +} + +export async function findItems( + filter: { [name: string]: undefined | string | string[] }, + options?: Options & { pageSize?: number; maxResults?: number }, +): Promise<{ [id: string]: { [tag: string]: string } }> { + const namespace = options?.namespace ?? defaults.namespace + const owners = options?.owners ?? defaults.owners + const graphqlUrl = options?.graphqlUrl ?? defaults.graphqlUrl + const rateLimitRetryDelayMs = options?.rateLimitRetryDelayMs ?? defaults.rateLimitRetryDelayMs + const pageSize = options?.pageSize ?? 100 + const maxResults = options?.maxResults + + const tags = Object.entries(filter).flatMap(([name, values]) => + values === undefined + ? [] + : [ + `{ name: "${namespace ? `${namespace}-${name}` : name}", values: [${typeof values === 'string' ? `"${values}"` : values.map((value) => `"${value}"`).join(', ')}] }`, + ], + ) + + const edges: Array<{ cursor: string; node: { id: string; tags: Array<{ name: string; value: string }> } }> = [] + + for (let hasNextPage = true; hasNextPage && (maxResults === undefined || edges.length < maxResults); ) { + const results = maxResults === undefined ? pageSize : Math.min(pageSize, maxResults - edges.length) + + const query = ` + query { + transactions(sort: HEIGHT_DESC, ${edges.length ? `first: ${results}, after: "${edges[edges.length - 1]!.cursor}"` : `first: ${results}`}, tags: [${tags.join(', ')}]${owners.length ? `, owners: [${owners.map((owner) => `"${owner}"`).join(', ')}]` : ''}) { + pageInfo { + hasNextPage + } + edges { + cursor + node { + id + tags { + name + value + } + } + } + } + } + ` + + let response: Response + while (true) { + response = await fetch(graphqlUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ query }), + redirect: 'follow', + }) + if (response.status !== 429) { + break + } + console.warn( + `rate limited by ${graphqlUrl}, trying again in ${rateLimitRetryDelayMs / 1000} seconds at ${new Date(Date.now() + rateLimitRetryDelayMs).toLocaleTimeString()}`, + ) + await new Promise((resolve) => setTimeout(resolve, rateLimitRetryDelayMs)) + } + + const { + data: { transactions }, + } = await response.json() + + edges.push(...transactions.edges.slice(0, results)) + + hasNextPage = transactions.pageInfo.hasNextPage + } + + return Object.fromEntries( + edges.map(({ node: { id, tags } }) => [ + id, + Object.fromEntries( + tags.map(({ name, value }) => [ + namespace && name.startsWith(`${namespace}-`) ? name.slice(namespace.length + 1) : name, + value, + ]), + ), + ]), + ) +} + +export async function fetchItem( + id: string, + rateLimitRetryDelayMs = defaults.rateLimitRetryDelayMs, + arweaveUrl = defaults.arweaveUrl, +): Promise { + while (true) { + const response = await fetch(`${arweaveUrl}/${id}`, { redirect: 'follow' }) + if (response.status !== 429) { + return response + } + console.warn( + `rate limited by ${arweaveUrl}, trying again in ${rateLimitRetryDelayMs / 1000} seconds at ${new Date(Date.now() + rateLimitRetryDelayMs).toLocaleTimeString()}`, + ) + await new Promise((resolve) => setTimeout(resolve, rateLimitRetryDelayMs)) + } +} diff --git a/packages/wallet/core/src/state/arweave/index.ts b/packages/wallet/core/src/state/arweave/index.ts new file mode 100644 index 000000000..e0d05412d --- /dev/null +++ b/packages/wallet/core/src/state/arweave/index.ts @@ -0,0 +1,1006 @@ +import { + Address as SequenceAddress, + Config, + Context, + GenericTree, + Payload, + Signature, +} from '@0xsequence/wallet-primitives' +import { Address, Bytes, Hex, Signature as OxSignature } from 'ox' +import { Reader as ReaderInterface, normalizeAddressKeys } from '../index.js' +import { defaults, fetchItem, findItems, Options } from './arweave.js' +import type { + ArweaveConfigRecord, + ArweaveObject, + ArweavePayloadRecord, + ArweaveSapientSignatureRecord, + ArweaveSignatureRecord, + ArweaveTreeRecord, + ArweaveV1ConfigUpdatePayloadRecord, + ArweaveV2ConfigUpdatePayloadRecord, + ArweaveV3ConfigUpdatePayloadRecord, + ArweaveWalletRecord, + CallData, + ConfigData, + SignatureType, + TreeData, + V1ConfigData, + V2ConfigTreeData, + V2ConfigData, + V3ConfigTreeData, + V3ConfigData, +} from './schema.js' + +type ArweaveConfigUpdatePayloadRecord = + | ArweaveV1ConfigUpdatePayloadRecord + | ArweaveV2ConfigUpdatePayloadRecord + | ArweaveV3ConfigUpdatePayloadRecord + +type ItemTags = { [tag: string]: string } +type ItemEntry = { id: string; tags: ItemTags } + +type Witness = { + chainId: number + payload: Payload.Parented + signature: TSignature +} + +type WitnessMap = { + [wallet: Address.Address]: Witness +} + +type Candidate = { + nextImageHash: Hex.Hex + checkpoint: bigint + noChainId: boolean + signatureEntries: Map +} + +type TopologyChoice = { + topology: Config.Topology + weight: bigint + signatures: number + size: number + signatureMask: string +} + +type TopologyChoiceSet = { + slotCount: number + choices: Map +} + +const PLAIN_SIGNATURE_TYPES = ['eip-712', 'eth_sign', 'erc-1271'] satisfies SignatureType[] +const SAPIENT_SIGNATURE_TYPES = ['sapient', 'sapient-compact'] satisfies SignatureType[] +const PAYLOAD_VERSION_FILTER = { + 'Major-Version': '1', + 'Minor-Version': '2', +} as const + +function isSapientSignatureType(type: SignatureType): type is (typeof SAPIENT_SIGNATURE_TYPES)[number] { + return (SAPIENT_SIGNATURE_TYPES as readonly SignatureType[]).includes(type) +} + +function normalizeHex(value: Hex.Hex): Hex.Hex { + return Hex.fromBytes(Hex.toBytes(value)) +} + +function normalizeAddress(value: Address.Address): Address.Address { + return Address.checksum(value) +} + +function signerKey(address: Address.Address): string { + return normalizeAddress(address).toLowerCase() +} + +function sapientSignerKey(address: Address.Address, imageHash: Hex.Hex): string { + return `${signerKey(address)}:${normalizeHex(imageHash).toLowerCase()}` +} + +function sameAddress(left: Address.Address | undefined, right: Address.Address | undefined): boolean { + return left === undefined && right === undefined + ? true + : left !== undefined && right !== undefined && Address.isEqual(left, right) +} + +function mergeConfigurations(base: Config.Config | undefined, next: Config.Config): Config.Config { + if (!base) { + return next + } + + if ( + base.threshold !== next.threshold || + base.checkpoint !== next.checkpoint || + !sameAddress(base.checkpointer, next.checkpointer) + ) { + throw new Error('conflicting configuration metadata for the same image hash') + } + + return { + ...base, + topology: Config.mergeTopology(base.topology, next.topology), + } +} + +function fromCallData(call: CallData): Payload.Call { + return { + to: normalizeAddress(call.to), + value: BigInt(call.value), + data: normalizeHex(call.data), + gasLimit: BigInt(call.gasLimit), + delegateCall: call.delegateCall, + onlyFallback: call.onlyFallback, + behaviorOnError: call.behaviorOnError, + } +} + +function fromPayloadRecord(record: ArweavePayloadRecord): Payload.Parented { + switch (record['Payload-Type']) { + case 'calls': + return { + type: 'call', + space: BigInt(record.Space), + nonce: BigInt(record.Nonce), + calls: record.data.map(fromCallData), + } + + case 'message': + return { + type: 'message', + message: normalizeHex(record.data), + } + + case 'config update': + return { + type: 'config-update', + imageHash: normalizeHex(record['To-Config']), + } + + case 'digest': + return { + type: 'digest', + digest: normalizeHex(record.Digest), + } + } +} + +function fromTreeData(tree: TreeData): GenericTree.Tree { + if (typeof tree === 'string') { + return normalizeHex(tree) + } + + if (Array.isArray(tree)) { + return tree.map(fromTreeData) as GenericTree.Branch + } + + return { + type: 'leaf', + value: Bytes.fromHex(tree.data), + } +} + +function fromV2ConfigTree(tree: V2ConfigTreeData): Config.Topology { + if (typeof tree === 'string') { + return normalizeHex(tree) + } + + if (Array.isArray(tree)) { + return [fromV2ConfigTree(tree[0]), fromV2ConfigTree(tree[1])] + } + + if ('address' in tree) { + return { + type: 'signer', + address: normalizeAddress(tree.address), + weight: BigInt(tree.weight), + } + } + + if ('tree' in tree) { + return { + type: 'nested', + weight: BigInt(tree.weight), + threshold: BigInt(tree.threshold), + tree: fromV2ConfigTree(tree.tree), + } + } + + return { + type: 'subdigest', + digest: normalizeHex(tree.subdigest), + } +} + +function fromV3ConfigTree(tree: V3ConfigTreeData): Config.Topology { + if (typeof tree === 'string') { + return normalizeHex(tree) + } + + if (Array.isArray(tree)) { + return [fromV3ConfigTree(tree[0]), fromV3ConfigTree(tree[1])] + } + + if ('address' in tree) { + if ('imageHash' in tree) { + return { + type: 'sapient-signer', + address: normalizeAddress(tree.address), + weight: BigInt(tree.weight), + imageHash: normalizeHex(tree.imageHash), + } + } + + return { + type: 'signer', + address: normalizeAddress(tree.address), + weight: BigInt(tree.weight), + } + } + + if ('tree' in tree) { + return { + type: 'nested', + weight: BigInt(tree.weight), + threshold: BigInt(tree.threshold), + tree: fromV3ConfigTree(tree.tree), + } + } + + return { + type: 'isAnyAddress' in tree && tree.isAnyAddress ? 'any-address-subdigest' : 'subdigest', + digest: normalizeHex(tree.subdigest), + } +} + +function fromConfigData(version: '1' | '2' | '3', data: ConfigData): Config.Config { + switch (version) { + case '1': { + const v1Data = data as V1ConfigData + if (v1Data.signers.length === 0) { + throw new Error('legacy configuration cannot be empty') + } + + return { + threshold: BigInt(v1Data.threshold), + checkpoint: 0n, + topology: Config.flatLeavesToTopology( + v1Data.signers.map((signer) => ({ + type: 'signer' as const, + address: normalizeAddress(signer.address), + weight: BigInt(signer.weight), + })), + ), + } + } + + case '2': { + const v2Data = data as V2ConfigData + return { + threshold: BigInt(v2Data.threshold), + checkpoint: BigInt(v2Data.checkpoint), + topology: fromV2ConfigTree(v2Data.tree), + } + } + + case '3': { + const v3Data = data as V3ConfigData + return { + threshold: BigInt(v3Data.threshold), + checkpoint: BigInt(v3Data.checkpoint), + checkpointer: v3Data.checkpointer ? normalizeAddress(v3Data.checkpointer) : undefined, + topology: fromV3ConfigTree(v3Data.tree), + } + } + } +} + +function fromConfigCarrier( + record: + | ArweaveConfigRecord + | ArweaveConfigUpdatePayloadRecord + | Extract, +): Config.Config { + switch (record.Type) { + case 'config': + return fromConfigData(record.Version, record.data) + + case 'payload': + return fromConfigData(record['To-Version'], record.data) + + case 'wallet': + return fromConfigData(record['Deploy-Version'], record.data) + } +} + +function fromSignatureRecord(record: ArweaveSignatureRecord): Signature.SignatureOfSignerLeaf { + switch (record['Signature-Type']) { + case 'eip-712': + return { type: 'hash', ...OxSignature.from(record.data) } + + case 'eth_sign': + return { type: 'eth_sign', ...OxSignature.from(record.data) } + + case 'erc-1271': + return { + type: 'erc1271', + address: normalizeAddress(record.Signer), + data: normalizeHex(record.data), + } + + case 'sapient': + case 'sapient-compact': + throw new Error(`unexpected sapient signature type ${record['Signature-Type']}`) + } +} + +function fromSapientSignatureRecord(record: ArweaveSapientSignatureRecord): Signature.SignatureOfSapientSignerLeaf { + switch (record['Signature-Type']) { + case 'sapient': + return { + type: 'sapient', + address: normalizeAddress(record.Signer), + data: normalizeHex(record.data), + } + + case 'sapient-compact': + return { + type: 'sapient_compact', + address: normalizeAddress(record.Signer), + data: normalizeHex(record.data), + } + + case 'eip-712': + case 'eth_sign': + case 'erc-1271': + throw new Error(`unexpected plain signature type ${record['Signature-Type']}`) + } +} + +function inferContext(record: ArweaveWalletRecord): Context.Context | undefined { + if ('Context-Factory' in record) { + return { + factory: normalizeAddress(record['Context-Factory']), + stage1: normalizeAddress(record['Context-Stage-1']), + stage2: normalizeAddress(record['Context-Stage-2']), + creationCode: normalizeHex(record['Context-Creation-Code']), + } + } + + const wallet = normalizeAddress(record.Wallet) + const imageHashBytes = Bytes.fromHex(normalizeHex(record['Deploy-Config'])) + + const knownContext = Context.KnownContexts.find((context) => + Address.isEqual(SequenceAddress.from(imageHashBytes, context), wallet), + ) + + if (!knownContext) { + return undefined + } + + return { + factory: knownContext.factory, + stage1: knownContext.stage1, + stage2: knownContext.stage2, + creationCode: knownContext.creationCode, + } +} + +function toRecoveredLikeTopology(topology: Config.Topology): Config.Topology { + if (Config.isNode(topology)) { + return [toRecoveredLikeTopology(topology[0]), toRecoveredLikeTopology(topology[1])] + } + + if (Config.isSignerLeaf(topology)) { + return topology.signature ? { ...topology, signed: true } : topology + } + + if (Config.isSapientSignerLeaf(topology)) { + if (topology.signature) { + return { ...topology, signed: true } + } + + return Hex.fromBytes(Config.hashConfiguration(topology)) + } + + if (Config.isNestedLeaf(topology)) { + return { + ...topology, + tree: toRecoveredLikeTopology(topology.tree), + } + } + + return topology +} + +function fillTopologyWithSignatures( + configuration: Config.Config, + signatures: Map, +): Config.Topology { + return Signature.fillLeaves(configuration.topology, (leaf) => { + if (Config.isSapientSignerLeaf(leaf)) { + const signature = signatures.get(sapientSignerKey(leaf.address, leaf.imageHash)) + return signature && Signature.isSignatureOfSapientSignerLeaf(signature) ? signature : undefined + } + + const signature = signatures.get(signerKey(leaf.address)) + return signature && !Signature.isSignatureOfSapientSignerLeaf(signature) ? signature : undefined + }) +} + +function clampWeight(weight: bigint, cap: bigint): bigint { + return weight > cap ? cap : weight +} + +function zeroMask(length: number): string { + return '0'.repeat(length) +} + +function compareChoices(left: TopologyChoice, right: TopologyChoice): number { + if (left.signatures !== right.signatures) { + return left.signatures - right.signatures + } + + if (left.size !== right.size) { + return left.size - right.size + } + + if (left.signatureMask !== right.signatureMask) { + return left.signatureMask > right.signatureMask ? -1 : 1 + } + + return 0 +} + +function dominatesChoice(left: TopologyChoice, right: TopologyChoice): boolean { + return ( + left.weight >= right.weight && + left.signatures <= right.signatures && + left.size <= right.size && + left.signatureMask >= right.signatureMask + ) +} + +function makeChoice( + topology: Config.Topology, + weight: bigint, + signatures: number, + signatureMask: string, +): TopologyChoice { + return { + topology, + weight, + signatures, + size: Signature.encodeTopology(topology).length, + signatureMask, + } +} + +function addChoice(choiceSet: TopologyChoiceSet, choice: TopologyChoice): void { + const key = choice.weight.toString() + const existing = choiceSet.choices.get(key) + + if (!existing || compareChoices(choice, existing) < 0) { + choiceSet.choices.set(key, choice) + } +} + +function pruneChoiceSet(choiceSet: TopologyChoiceSet): TopologyChoiceSet { + const choices = [...choiceSet.choices.values()] + const pruned = new Map() + + for (const candidate of choices) { + const dominated = choices.some((other) => other !== candidate && dominatesChoice(other, candidate)) + if (!dominated) { + pruned.set(candidate.weight.toString(), candidate) + } + } + + return { ...choiceSet, choices: pruned } +} + +function buildTopologyChoiceSet(topology: Config.Topology, cap: bigint): TopologyChoiceSet { + if (Signature.isSignedSignerLeaf(topology)) { + const choices: TopologyChoiceSet = { slotCount: 1, choices: new Map() } + addChoice( + choices, + makeChoice({ type: 'signer', address: topology.address, weight: topology.weight }, 0n, 0, '0'), + ) + + if (topology.weight > 0n) { + addChoice(choices, makeChoice(topology, clampWeight(topology.weight, cap), 1, '1')) + } + + return choices + } + + if (Signature.isSignedSapientSignerLeaf(topology)) { + const choices: TopologyChoiceSet = { slotCount: 1, choices: new Map() } + addChoice(choices, makeChoice(Hex.fromBytes(Config.hashConfiguration(topology)), 0n, 0, '0')) + + if (topology.weight > 0n) { + addChoice(choices, makeChoice(topology, clampWeight(topology.weight, cap), 1, '1')) + } + + return choices + } + + if (Config.isSignerLeaf(topology)) { + return { + slotCount: 0, + choices: new Map([[0n.toString(), makeChoice(topology, 0n, 0, '')]]), + } + } + + if (Config.isSapientSignerLeaf(topology)) { + return { + slotCount: 0, + choices: new Map([[0n.toString(), makeChoice(Hex.fromBytes(Config.hashConfiguration(topology)), 0n, 0, '')]]), + } + } + + if (Config.isSubdigestLeaf(topology) || Config.isAnyAddressSubdigestLeaf(topology) || Config.isNodeLeaf(topology)) { + return { + slotCount: 0, + choices: new Map([[0n.toString(), makeChoice(topology, 0n, 0, '')]]), + } + } + + if (Config.isNestedLeaf(topology)) { + const treeChoices = buildTopologyChoiceSet(topology.tree, topology.threshold) + const choices: TopologyChoiceSet = { slotCount: treeChoices.slotCount, choices: new Map() } + addChoice(choices, makeChoice(Hex.fromBytes(Config.hashConfiguration(topology)), 0n, 0, zeroMask(treeChoices.slotCount))) + + const satisfied = treeChoices.choices.get(topology.threshold.toString()) + if (satisfied && topology.weight > 0n) { + addChoice( + choices, + makeChoice( + { ...topology, tree: satisfied.topology }, + clampWeight(topology.weight, cap), + satisfied.signatures, + satisfied.signatureMask, + ), + ) + } + + return pruneChoiceSet(choices) + } + + const leftChoices = buildTopologyChoiceSet(topology[0], cap) + const rightChoices = buildTopologyChoiceSet(topology[1], cap) + const choices: TopologyChoiceSet = { + slotCount: leftChoices.slotCount + rightChoices.slotCount, + choices: new Map(), + } + + addChoice(choices, makeChoice(Hex.fromBytes(Config.hashConfiguration(topology)), 0n, 0, zeroMask(choices.slotCount))) + + for (const leftChoice of leftChoices.choices.values()) { + for (const rightChoice of rightChoices.choices.values()) { + addChoice( + choices, + makeChoice( + [leftChoice.topology, rightChoice.topology], + clampWeight(leftChoice.weight + rightChoice.weight, cap), + leftChoice.signatures + rightChoice.signatures, + `${leftChoice.signatureMask}${rightChoice.signatureMask}`, + ), + ) + } + } + + return pruneChoiceSet(choices) +} + +function minimizeTopologyForThreshold(topology: Config.Topology, threshold: bigint): Config.Topology | undefined { + return buildTopologyChoiceSet(topology, threshold).choices.get(threshold.toString())?.topology +} + +export class Reader implements ReaderInterface { + constructor(private readonly options: Options = defaults) {} + + private async findEntries( + filter: { [name: string]: undefined | string | string[] }, + options?: { maxResults?: number }, + ): Promise { + const items = await findItems(filter, { ...this.options, maxResults: options?.maxResults }) + return Object.entries(items).map(([id, tags]) => ({ id, tags })) + } + + private async loadRecord(entry: ItemEntry): Promise { + const response = await fetchItem(entry.id, this.options.rateLimitRetryDelayMs, this.options.arweaveUrl) + if (!response.ok) { + throw new Error(`failed to fetch arweave item ${entry.id}: ${response.status}`) + } + + const data = + entry.tags['Content-Type'] === 'application/json' ? await response.json() : (await response.text()).trim() + return { ...entry.tags, data } as T + } + + private async findFirstRecord(filter: { + [name: string]: undefined | string | string[] + }): Promise { + const [entry] = await this.findEntries(filter, { maxResults: 1 }) + return entry ? this.loadRecord(entry) : undefined + } + + async getConfiguration(imageHash: Hex.Hex): Promise { + const normalizedImageHash = normalizeHex(imageHash) + const configEntries = await this.findEntries({ Type: 'config', Config: normalizedImageHash }) + + let configuration: Config.Config | undefined + + for (const record of await Promise.all(configEntries.map((entry) => this.loadRecord(entry)))) { + configuration = mergeConfigurations(configuration, fromConfigCarrier(record)) + } + + if (configuration) { + return configuration + } + + const [walletEntries, payloadEntries] = await Promise.all([ + this.findEntries({ + Type: 'wallet', + 'Deploy-Config': normalizedImageHash, + 'Deploy-Config-Attached': 'true', + }), + this.findEntries({ + Type: 'payload', + ...PAYLOAD_VERSION_FILTER, + 'Payload-Type': 'config update', + 'To-Config': normalizedImageHash, + }), + ]) + + for (const record of await Promise.all(walletEntries.map((entry) => this.loadRecord(entry)))) { + if (record['Deploy-Config-Attached'] === 'true') { + configuration = mergeConfigurations(configuration, fromConfigCarrier(record)) + } + } + + for (const record of await Promise.all( + payloadEntries.map((entry) => this.loadRecord(entry)), + )) { + configuration = mergeConfigurations(configuration, fromConfigCarrier(record)) + } + + return configuration + } + + async getDeploy(wallet: Address.Address): Promise<{ imageHash: Hex.Hex; context: Context.Context } | undefined> { + const record = await this.findFirstRecord({ + Type: 'wallet', + Wallet: normalizeAddress(wallet), + }) + + if (!record) { + return undefined + } + + const context = inferContext(record) + if (!context) { + return undefined + } + + return { + imageHash: normalizeHex(record['Deploy-Config']), + context, + } + } + + private async getWalletsGeneric( + filter: { [name: string]: undefined | string | string[] }, + signatureFrom: (record: TRecord) => TSignature, + ): Promise> { + const payloads = new Map< + Hex.Hex, + Promise<{ chainId: number; payload: Payload.Parented; wallet: Address.Address } | undefined> + >() + const response: WitnessMap = {} + + for (const entry of await this.findEntries(filter)) { + const wallet = normalizeAddress(entry.tags.Wallet as Address.Address) + if (response[wallet]) { + continue + } + + const record = await this.loadRecord(entry) + const subdigest = normalizeHex(record.Subdigest) + const payloadPromise = payloads.get(subdigest) ?? this.getPayload(subdigest) + payloads.set(subdigest, payloadPromise) + const payload = await payloadPromise + + if (!payload) { + continue + } + + response[wallet] = { + chainId: payload.chainId, + payload: payload.payload, + signature: signatureFrom(record), + } + } + + return normalizeAddressKeys(response) + } + + async getWallets(signer: Address.Address): Promise<{ + [wallet: Address.Address]: { + chainId: number + payload: Payload.Parented + signature: Signature.SignatureOfSignerLeaf + } + }> { + return this.getWalletsGeneric( + { + Type: 'signature', + Signer: normalizeAddress(signer), + Witness: 'true', + 'Signature-Type': [...PLAIN_SIGNATURE_TYPES], + }, + fromSignatureRecord, + ) + } + + async getWalletsForSapient( + signer: Address.Address, + imageHash: Hex.Hex, + ): Promise<{ + [wallet: Address.Address]: { + chainId: number + payload: Payload.Parented + signature: Signature.SignatureOfSapientSignerLeaf + } + }> { + return this.getWalletsGeneric( + { + Type: 'signature', + Signer: normalizeAddress(signer), + 'Image-Hash': normalizeHex(imageHash), + Witness: 'true', + 'Signature-Type': [...SAPIENT_SIGNATURE_TYPES], + }, + fromSapientSignatureRecord, + ) + } + + private async getWitnessGeneric( + filter: { [name: string]: undefined | string | string[] }, + signatureFrom: (record: TRecord) => TSignature, + ): Promise | undefined> { + const entries = await this.findEntries(filter) + + for (const entry of entries) { + const record = await this.loadRecord(entry) + const payload = await this.getPayload(record.Subdigest) + if (!payload) { + continue + } + + return { + chainId: payload.chainId, + payload: payload.payload, + signature: signatureFrom(record), + } + } + } + + getWitnessFor( + wallet: Address.Address, + signer: Address.Address, + ): Promise<{ chainId: number; payload: Payload.Parented; signature: Signature.SignatureOfSignerLeaf } | undefined> { + return this.getWitnessGeneric( + { + Type: 'signature', + Wallet: normalizeAddress(wallet), + Signer: normalizeAddress(signer), + Witness: 'true', + 'Signature-Type': [...PLAIN_SIGNATURE_TYPES], + }, + fromSignatureRecord, + ) + } + + getWitnessForSapient( + wallet: Address.Address, + signer: Address.Address, + imageHash: Hex.Hex, + ): Promise< + { chainId: number; payload: Payload.Parented; signature: Signature.SignatureOfSapientSignerLeaf } | undefined + > { + return this.getWitnessGeneric( + { + Type: 'signature', + Wallet: normalizeAddress(wallet), + Signer: normalizeAddress(signer), + 'Image-Hash': normalizeHex(imageHash), + Witness: 'true', + 'Signature-Type': [...SAPIENT_SIGNATURE_TYPES], + }, + fromSapientSignatureRecord, + ) + } + + async getConfigurationUpdates( + wallet: Address.Address, + fromImageHash: Hex.Hex, + options?: { allUpdates?: boolean }, + ): Promise> { + const normalizedWallet = normalizeAddress(wallet) + const signatureRecords = new Map>() + const loadSignatureRecord = (entry: ItemEntry): Promise => { + const cached = signatureRecords.get(entry.id) + if (cached) { + return cached + } + + const promise = isSapientSignatureType(entry.tags['Signature-Type'] as SignatureType) + ? this.loadRecord(entry) + : this.loadRecord(entry) + + signatureRecords.set(entry.id, promise) + return promise + } + + const updates: Array<{ imageHash: Hex.Hex; signature: Signature.RawSignature }> = [] + let currentImageHash = normalizeHex(fromImageHash) + + top: while (true) { + const currentConfig = await this.getConfiguration(currentImageHash) + if (!currentConfig) { + return updates + } + + const { signers, sapientSigners } = Config.getSigners(currentConfig) + const [plainEntries, sapientEntries] = await Promise.all([ + signers.length + ? this.findEntries({ + Type: 'config update', + Wallet: normalizedWallet, + Signer: signers.map(normalizeAddress), + 'Signature-Type': [...PLAIN_SIGNATURE_TYPES], + }) + : Promise.resolve([]), + Promise.all( + sapientSigners.map(({ address, imageHash }) => + this.findEntries({ + Type: 'config update', + Wallet: normalizedWallet, + Signer: normalizeAddress(address), + 'Image-Hash': normalizeHex(imageHash), + 'Signature-Type': [...SAPIENT_SIGNATURE_TYPES], + }), + ), + ), + ]) + + const candidates = new Map() + const addCandidate = (entry: ItemEntry, key: string) => { + const checkpoint = BigInt(entry.tags['To-Checkpoint']!) + if (checkpoint <= currentConfig.checkpoint) { + return + } + + const nextImageHash = normalizeHex(entry.tags['To-Config'] as Hex.Hex) + const candidateKey = `${checkpoint}:${nextImageHash.toLowerCase()}` + const candidate = candidates.get(candidateKey) + + if (candidate) { + if (!candidate.signatureEntries.has(key)) { + candidate.signatureEntries.set(key, entry) + } + + return + } + + candidates.set(candidateKey, { + nextImageHash, + checkpoint, + noChainId: entry.tags['Major-Version'] !== '1', + signatureEntries: new Map([[key, entry]]), + }) + } + + for (const entry of plainEntries) { + addCandidate(entry, signerKey(entry.tags.Signer as Address.Address)) + } + + for (const entries of sapientEntries) { + for (const entry of entries) { + addCandidate( + entry, + sapientSignerKey(entry.tags.Signer as Address.Address, entry.tags['Image-Hash'] as Hex.Hex), + ) + } + } + + const sortedCandidates = [...candidates.values()].sort((left, right) => { + if (left.checkpoint === right.checkpoint) { + return 0 + } + + if (options?.allUpdates) { + return left.checkpoint < right.checkpoint ? -1 : 1 + } + + return left.checkpoint > right.checkpoint ? -1 : 1 + }) + + for (const candidate of sortedCandidates) { + const signatures = new Map() + const records = await Promise.all([...candidate.signatureEntries.values()].map(loadSignatureRecord)) + + for (const record of records) { + if (isSapientSignatureType(record['Signature-Type'])) { + const sapientRecord = record as ArweaveSapientSignatureRecord + signatures.set( + sapientSignerKey(sapientRecord.Signer, sapientRecord['Image-Hash']), + fromSapientSignatureRecord(sapientRecord), + ) + } else { + signatures.set(signerKey(record.Signer), fromSignatureRecord(record as ArweaveSignatureRecord)) + } + } + + const filledTopology = fillTopologyWithSignatures(currentConfig, signatures) + const minimalTopology = minimizeTopologyForThreshold(filledTopology, currentConfig.threshold) + if (!minimalTopology) { + continue + } + + const topology = toRecoveredLikeTopology(minimalTopology) + const { weight } = Config.getWeight(topology, () => false) + if (weight < currentConfig.threshold) { + continue + } + + updates.push({ + imageHash: candidate.nextImageHash, + signature: { + noChainId: candidate.noChainId, + configuration: { + threshold: currentConfig.threshold, + checkpoint: currentConfig.checkpoint, + checkpointer: currentConfig.checkpointer, + topology, + }, + }, + }) + + currentImageHash = candidate.nextImageHash + continue top + } + + return updates + } + } + + async getTree(imageHash: Hex.Hex): Promise { + const record = await this.findFirstRecord({ + Type: 'tree', + Tree: normalizeHex(imageHash), + }) + + return record ? fromTreeData(record.data) : undefined + } + + async getPayload( + digest: Hex.Hex, + ): Promise<{ chainId: number; payload: Payload.Parented; wallet: Address.Address } | undefined> { + const record = await this.findFirstRecord({ + Type: 'payload', + ...PAYLOAD_VERSION_FILTER, + Payload: normalizeHex(digest), + }) + + if (!record) { + return undefined + } + + return { + chainId: Number(record['Chain-ID']), + payload: fromPayloadRecord(record), + wallet: normalizeAddress(record.Address), + } + } +} diff --git a/packages/wallet/core/src/state/arweave/schema.ts b/packages/wallet/core/src/state/arweave/schema.ts new file mode 100644 index 000000000..059579cb0 --- /dev/null +++ b/packages/wallet/core/src/state/arweave/schema.ts @@ -0,0 +1,369 @@ +import { Address, Hex } from 'ox' + +export type BooleanString = 'true' | 'false' +export type IntegerString = `${number}` +export type ConfigVersion = '1' | '2' | '3' +export type WalletMajorVersion = '1' | '2' +export type PayloadType = 'calls' | 'message' | 'config update' | 'digest' +export type SignatureType = 'eip-712' | 'eth_sign' | 'erc-1271' | 'sapient' | 'sapient-compact' +export type BehaviorOnError = 'ignore' | 'revert' | 'abort' + +export interface V1ConfigSignerData { + weight: number + address: Address.Address +} + +export interface V1ConfigData { + threshold: number + signers: Array +} + +export interface V2ConfigAddressLeafData { + weight: number + address: Address.Address +} + +export interface V2ConfigNestedLeafData { + weight: number + threshold: number + tree: V2ConfigTreeData +} + +export interface V2ConfigSubdigestLeafData { + subdigest: Hex.Hex +} + +export type V2ConfigTreeData = + | Hex.Hex + | [V2ConfigTreeData, V2ConfigTreeData] + | V2ConfigAddressLeafData + | V2ConfigNestedLeafData + | V2ConfigSubdigestLeafData + +export interface V2ConfigData { + threshold: number + checkpoint: number + tree: V2ConfigTreeData +} + +export interface V3ConfigAddressLeafData { + weight: number + address: Address.Address +} + +export interface V3ConfigSapientSignerLeafData { + weight: number + address: Address.Address + imageHash: Hex.Hex +} + +export interface V3ConfigNestedLeafData { + weight: number + threshold: number + tree: V3ConfigTreeData +} + +export interface V3ConfigSubdigestLeafData { + subdigest: Hex.Hex +} + +export interface V3ConfigAnyAddressSubdigestLeafData { + subdigest: Hex.Hex + isAnyAddress: true +} + +export type V3ConfigTreeData = + | Hex.Hex + | [V3ConfigTreeData, V3ConfigTreeData] + | V3ConfigAddressLeafData + | V3ConfigSapientSignerLeafData + | V3ConfigNestedLeafData + | V3ConfigSubdigestLeafData + | V3ConfigAnyAddressSubdigestLeafData + +export interface V3ConfigData { + threshold: number + checkpoint: IntegerString + tree: V3ConfigTreeData + checkpointer?: Address.Address +} + +export type ConfigData = V1ConfigData | V2ConfigData | V3ConfigData + +export interface TreeLeafData { + data: Hex.Hex +} + +export type TreeData = Hex.Hex | TreeLeafData | Array + +export interface CallData { + to: Address.Address + value: IntegerString + data: Hex.Hex + gasLimit: IntegerString + delegateCall: boolean + onlyFallback: boolean + behaviorOnError: BehaviorOnError +} + +export interface ArweaveRecordBase< + TType extends string, + TMajorVersion extends string, + TMinorVersion extends string, + TContentType extends string, +> { + Type: TType + 'Major-Version': TMajorVersion + 'Minor-Version': TMinorVersion + 'Content-Type': TContentType +} + +export interface ArweaveConfigRecordBase extends ArweaveRecordBase<'config', '1', '0', 'application/json'> { + Config: Hex.Hex + Complete: BooleanString + 'Signers-Count': IntegerString + 'Signers-Bloom': Hex.Hex +} + +export interface ArweaveV1ConfigRecord extends ArweaveConfigRecordBase { + Version: '1' + data: V1ConfigData +} + +export interface ArweaveV2ConfigRecord extends ArweaveConfigRecordBase { + Version: '2' + data: V2ConfigData +} + +export interface ArweaveV3ConfigRecord extends ArweaveConfigRecordBase { + Version: '3' + data: V3ConfigData +} + +export type ArweaveConfigRecord = ArweaveV1ConfigRecord | ArweaveV2ConfigRecord | ArweaveV3ConfigRecord + +export interface ArweaveTreeRecord extends ArweaveRecordBase<'tree', '1', '0', 'application/json'> { + Tree: Hex.Hex + Complete: BooleanString + data: TreeData +} + +export interface ArweaveWalletRecordBase extends ArweaveRecordBase< + 'wallet', + WalletMajorVersion, + '0', + 'application/json' +> { + Wallet: Address.Address + 'Deploy-Config': Hex.Hex + 'Deploy-Version': ConfigVersion + 'Deploy-Config-Attached': BooleanString + 'Deploy-Config-Complete': BooleanString + 'Deploy-Signers-Count': IntegerString + 'Deploy-Signers-Bloom': Hex.Hex +} + +export interface ArweaveWalletDefaultContext { + 'Major-Version': '1' +} + +export interface ArweaveWalletCustomContext { + 'Major-Version': '2' + 'Context-Factory': Address.Address + 'Context-Stage-1': Address.Address + 'Context-Stage-2': Address.Address + 'Context-Guest': Address.Address + 'Context-Creation-Code': Hex.Hex +} + +export interface ArweaveWalletDetachedData { + 'Deploy-Config-Attached': 'false' + 'Deploy-Config-Complete': 'false' + data: null +} + +export interface ArweaveWalletWithV1DeployConfig { + 'Deploy-Config-Attached': 'true' + 'Deploy-Version': '1' + data: V1ConfigData +} + +export interface ArweaveWalletWithV2DeployConfig { + 'Deploy-Config-Attached': 'true' + 'Deploy-Version': '2' + data: V2ConfigData +} + +export interface ArweaveWalletWithV3DeployConfig { + 'Deploy-Config-Attached': 'true' + 'Deploy-Version': '3' + data: V3ConfigData +} + +export type ArweaveWalletRecord = ArweaveWalletRecordBase & + (ArweaveWalletDefaultContext | ArweaveWalletCustomContext) & + ( + | ArweaveWalletDetachedData + | ArweaveWalletWithV1DeployConfig + | ArweaveWalletWithV2DeployConfig + | ArweaveWalletWithV3DeployConfig + ) + +export interface ArweavePayloadRecordBase extends ArweaveRecordBase<'payload', '1', '2', 'application/json'> { + Payload: Hex.Hex + Address: Address.Address + 'Chain-ID': IntegerString + 'Payload-Type': PayloadType +} + +export interface ArweaveCallsPayloadRecord extends ArweavePayloadRecordBase { + 'Payload-Type': 'calls' + Space: IntegerString + Nonce: IntegerString + data: Array +} + +export interface ArweaveMessagePayloadRecord extends ArweavePayloadRecordBase { + 'Payload-Type': 'message' + data: Hex.Hex +} + +export interface ArweaveConfigUpdatePayloadRecordBase extends ArweavePayloadRecordBase { + 'Payload-Type': 'config update' + 'To-Config': Hex.Hex + 'To-Checkpoint': IntegerString + 'To-Config-Complete': BooleanString + 'To-Signers-Count': IntegerString + 'To-Signers-Bloom': Hex.Hex +} + +export interface ArweaveV1ConfigUpdatePayloadRecord extends ArweaveConfigUpdatePayloadRecordBase { + 'To-Version': '1' + data: V1ConfigData +} + +export interface ArweaveV2ConfigUpdatePayloadRecord extends ArweaveConfigUpdatePayloadRecordBase { + 'To-Version': '2' + data: V2ConfigData +} + +export interface ArweaveV3ConfigUpdatePayloadRecord extends ArweaveConfigUpdatePayloadRecordBase { + 'To-Version': '3' + data: V3ConfigData +} + +export interface ArweaveDigestPayloadRecord extends ArweavePayloadRecordBase { + 'Payload-Type': 'digest' + Digest: Hex.Hex + data: null +} + +export type ArweavePayloadRecord = + | ArweaveCallsPayloadRecord + | ArweaveMessagePayloadRecord + | ArweaveV1ConfigUpdatePayloadRecord + | ArweaveV2ConfigUpdatePayloadRecord + | ArweaveV3ConfigUpdatePayloadRecord + | ArweaveDigestPayloadRecord + +export interface ArweaveConfigUpdateTags { + Type: 'config update' + 'To-Config': Hex.Hex + 'To-Checkpoint': IntegerString + 'To-Config-Complete': BooleanString + 'To-Signers-Count': IntegerString + 'To-Signers-Bloom': Hex.Hex +} + +export interface ArweavePlainSignatureTags { + Type: 'signature' +} + +export interface ArweaveSignatureDigestTags { + 'Major-Version': '1' + Digest: Hex.Hex +} + +export interface ArweaveSignatureSubdigestTags { + 'Major-Version': '2' +} + +export interface ArweaveSignatureBlockTags { + 'Block-Number': IntegerString + 'Block-Hash': Hex.Hex +} + +export interface ArweaveSignatureRecordBase extends ArweaveRecordBase< + 'signature' | 'config update', + '1' | '2', + '0', + 'text/plain' +> { + 'Signature-Type': SignatureType + Signer: Address.Address + Subdigest: Hex.Hex + Wallet: Address.Address + 'Chain-ID': IntegerString + Witness: BooleanString + data: Hex.Hex +} + +export type ArweaveSignatureRecord = + | (ArweaveSignatureRecordBase & ArweavePlainSignatureTags & ArweaveSignatureDigestTags) + | (ArweaveSignatureRecordBase & ArweavePlainSignatureTags & ArweaveSignatureSubdigestTags) + | (ArweaveSignatureRecordBase & ArweavePlainSignatureTags & ArweaveSignatureDigestTags & ArweaveSignatureBlockTags) + | (ArweaveSignatureRecordBase & ArweavePlainSignatureTags & ArweaveSignatureSubdigestTags & ArweaveSignatureBlockTags) + | (ArweaveSignatureRecordBase & ArweaveConfigUpdateTags & ArweaveSignatureDigestTags) + | (ArweaveSignatureRecordBase & ArweaveConfigUpdateTags & ArweaveSignatureSubdigestTags) + | (ArweaveSignatureRecordBase & ArweaveConfigUpdateTags & ArweaveSignatureDigestTags & ArweaveSignatureBlockTags) + | (ArweaveSignatureRecordBase & ArweaveConfigUpdateTags & ArweaveSignatureSubdigestTags & ArweaveSignatureBlockTags) + +export interface ArweaveSapientSignatureRecordBase extends ArweaveRecordBase< + 'signature' | 'config update', + '2', + '0', + 'text/plain' +> { + 'Signature-Type': SignatureType + Signer: Address.Address + 'Image-Hash': Hex.Hex + Subdigest: Hex.Hex + Wallet: Address.Address + 'Chain-ID': IntegerString + 'Block-Number': IntegerString + 'Block-Hash': Hex.Hex + Witness: BooleanString + data: Hex.Hex +} + +export type ArweaveSapientSignatureRecord = + | (ArweaveSapientSignatureRecordBase & ArweavePlainSignatureTags) + | (ArweaveSapientSignatureRecordBase & ArweaveConfigUpdateTags) + +export interface ArweaveMigrationRecord extends ArweaveRecordBase<'migration', '1', '0', 'text/plain'> { + Migration: Address.Address + 'Chain-ID': IntegerString + 'From-Version': ConfigVersion + 'From-Config': Hex.Hex + 'From-Config-Complete': BooleanString + 'From-Signers-Count': IntegerString + 'From-Signers-Bloom': Hex.Hex + 'To-Version': ConfigVersion + 'To-Config': Hex.Hex + 'To-Config-Complete': BooleanString + 'To-Signers-Count': IntegerString + 'To-Signers-Bloom': Hex.Hex + Executor: Address.Address + data: Hex.Hex +} + +export type ArweaveRecord = + | ArweaveConfigRecord + | ArweaveTreeRecord + | ArweaveWalletRecord + | ArweavePayloadRecord + | ArweaveSignatureRecord + | ArweaveSapientSignatureRecord + | ArweaveMigrationRecord + +export type ArweaveObject = ArweaveRecord diff --git a/packages/wallet/core/src/state/index.ts b/packages/wallet/core/src/state/index.ts index 53e169908..94faee061 100644 --- a/packages/wallet/core/src/state/index.ts +++ b/packages/wallet/core/src/state/index.ts @@ -79,9 +79,10 @@ export interface Writer { export type MaybePromise = T | Promise -export * as Local from './local/index.js' +export * from './cached.js' +export * from './debug.js' export * from './utils.js' +export * as Arweave from './arweave/index.js' +export * as Local from './local/index.js' export * as Remote from './remote/index.js' -export * from './cached.js' export * as Sequence from './sequence/index.js' -export * from './debug.js' diff --git a/packages/wallet/core/test/state/arweave/arweave.test.ts b/packages/wallet/core/test/state/arweave/arweave.test.ts new file mode 100644 index 000000000..3c7931e3e --- /dev/null +++ b/packages/wallet/core/test/state/arweave/arweave.test.ts @@ -0,0 +1,120 @@ +import { Address } from 'ox' +import { describe, expect, it } from 'vitest' + +import { Arweave, Reader, Sequence } from '../../../src/state/index' + +const TEST_TIMEOUT_MS = 20_000 + +const tests: { [method in keyof Reader]: { [description: string]: Parameters } } = { + getConfiguration: { + 'image hash: 0xfd32e01d7e814292f49f57e79722ca66423833acf8f25eba770faf3483ff3e78': [ + '0xfd32e01d7e814292f49f57e79722ca66423833acf8f25eba770faf3483ff3e78', + ], + }, + getDeploy: { + 'wallet: 0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE': ['0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE'], + }, + getWallets: { + 'signer: 0x94835215CaA1aD3E304F9A7E2148623fe661dEB7': ['0x94835215CaA1aD3E304F9A7E2148623fe661dEB7'], + }, + getWalletsForSapient: { + 'signer: 0x000000000000AB36D17eB1150116371520565205, image hash: 0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3': + [ + '0x000000000000AB36D17eB1150116371520565205', + '0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3', + ], + }, + getWitnessFor: { + 'wallet: 0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE, signer: 0x94835215CaA1aD3E304F9A7E2148623fe661dEB7': [ + '0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE', + '0x94835215CaA1aD3E304F9A7E2148623fe661dEB7', + ], + }, + getWitnessForSapient: { + 'wallet: 0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE, signer: 0x000000000000AB36D17eB1150116371520565205, image hash: 0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3': + [ + '0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE', + '0x000000000000AB36D17eB1150116371520565205', + '0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3', + ], + }, + getConfigurationUpdates: { + 'wallet: 0x135769a58639b4Fa7d779a9df9B57A706FBCa816, from: 0xaa14aff91091e94d7521625ab1c713273e86a8c21a0afb6cee35be28af47738a': + [ + '0x135769a58639b4Fa7d779a9df9B57A706FBCa816', + '0xaa14aff91091e94d7521625ab1c713273e86a8c21a0afb6cee35be28af47738a', + ], + }, + getTree: { + 'image hash: 0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3': [ + '0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3', + ], + }, + getPayload: { + 'calls payload: 0xc78f3951686b7f16f39e25aea1fd5acc0e2177083c170b4c962be6cd45630576': [ + '0xc78f3951686b7f16f39e25aea1fd5acc0e2177083c170b4c962be6cd45630576', + ], + 'message payload: 0x3a841ba3163a7a19cd168373df1144d38130b2f46b8d6eac956127f06fffe4f4': [ + '0x3a841ba3163a7a19cd168373df1144d38130b2f46b8d6eac956127f06fffe4f4', + ], + 'config update payload: 0xcae631660ffa90bddc5e9b4fa9c11692a53062a61640fb958f3f2959d22fe54b': [ + '0xcae631660ffa90bddc5e9b4fa9c11692a53062a61640fb958f3f2959d22fe54b', + ], + 'digest payload: 0xcd3c291e0939f029aaa4b4f292d5d2b2ce43baf98046d9abc2a3e8284b253432': [ + '0xcd3c291e0939f029aaa4b4f292d5d2b2ce43baf98046d9abc2a3e8284b253432', + ], + }, +} + +function normalize(value: any): any { + switch (typeof value) { + case 'string': + if (Address.validate(value)) { + return Address.checksum(value) + } + + break + + case 'object': + if (value === null) { + return value + } + + if (Array.isArray(value)) { + return value.map(normalize) + } + + return Object.fromEntries( + Object.entries(value) + .filter(([, value]) => value !== undefined) + .map(([key, value]) => [Address.validate(key) ? Address.checksum(key) : key, normalize(value)]), + ) + } + + return value +} + +describe('Arweave state reader', () => { + const arweave = new Arweave.Reader() + const sequence = new Sequence.Provider() + + const methods = Object.entries(tests).filter(([, methodTests]) => Object.keys(methodTests).length > 0) + if (methods.length === 0) { + it.skip('no configured test cases', () => {}) + } + + for (const [method, methodTests] of methods) { + describe(method, () => { + for (const [description, args] of Object.entries(methodTests)) { + it( + description, + async () => { + const [actual, expected] = await Promise.all([arweave[method](...args), sequence[method](...args)]) + expect(normalize(actual)).toEqual(normalize(expected)) + }, + TEST_TIMEOUT_MS, + ) + } + }) + } +}) From d3e810fd895f3177bdd82693fc61fa6fc11804d2 Mon Sep 17 00:00:00 2001 From: William Hua Date: Wed, 15 Apr 2026 12:32:33 -0400 Subject: [PATCH 117/144] pnpm format --- packages/wallet/core/src/state/arweave/index.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/wallet/core/src/state/arweave/index.ts b/packages/wallet/core/src/state/arweave/index.ts index e0d05412d..b5f3400e6 100644 --- a/packages/wallet/core/src/state/arweave/index.ts +++ b/packages/wallet/core/src/state/arweave/index.ts @@ -500,10 +500,7 @@ function pruneChoiceSet(choiceSet: TopologyChoiceSet): TopologyChoiceSet { function buildTopologyChoiceSet(topology: Config.Topology, cap: bigint): TopologyChoiceSet { if (Signature.isSignedSignerLeaf(topology)) { const choices: TopologyChoiceSet = { slotCount: 1, choices: new Map() } - addChoice( - choices, - makeChoice({ type: 'signer', address: topology.address, weight: topology.weight }, 0n, 0, '0'), - ) + addChoice(choices, makeChoice({ type: 'signer', address: topology.address, weight: topology.weight }, 0n, 0, '0')) if (topology.weight > 0n) { addChoice(choices, makeChoice(topology, clampWeight(topology.weight, cap), 1, '1')) @@ -547,7 +544,10 @@ function buildTopologyChoiceSet(topology: Config.Topology, cap: bigint): Topolog if (Config.isNestedLeaf(topology)) { const treeChoices = buildTopologyChoiceSet(topology.tree, topology.threshold) const choices: TopologyChoiceSet = { slotCount: treeChoices.slotCount, choices: new Map() } - addChoice(choices, makeChoice(Hex.fromBytes(Config.hashConfiguration(topology)), 0n, 0, zeroMask(treeChoices.slotCount))) + addChoice( + choices, + makeChoice(Hex.fromBytes(Config.hashConfiguration(topology)), 0n, 0, zeroMask(treeChoices.slotCount)), + ) const satisfied = treeChoices.choices.get(topology.threshold.toString()) if (satisfied && topology.weight > 0n) { From beca13ed7e9729fa0411fe8e149b22f2666d07bc Mon Sep 17 00:00:00 2001 From: William Hua Date: Wed, 15 Apr 2026 14:26:26 -0400 Subject: [PATCH 118/144] core: mock arweave tests --- .../core/test/state/arweave/arweave.test.ts | 116 +- .../wallet/core/test/state/arweave/recording | 2455 +++++++++++++++++ 2 files changed, 2568 insertions(+), 3 deletions(-) create mode 100644 packages/wallet/core/test/state/arweave/recording diff --git a/packages/wallet/core/test/state/arweave/arweave.test.ts b/packages/wallet/core/test/state/arweave/arweave.test.ts index 3c7931e3e..8c7aa5cd2 100644 --- a/packages/wallet/core/test/state/arweave/arweave.test.ts +++ b/packages/wallet/core/test/state/arweave/arweave.test.ts @@ -1,9 +1,30 @@ +import { existsSync, readFileSync, writeFileSync } from 'node:fs' import { Address } from 'ox' -import { describe, expect, it } from 'vitest' +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' import { Arweave, Reader, Sequence } from '../../../src/state/index' const TEST_TIMEOUT_MS = 20_000 +const RECORDING_FILE = new URL('./recording', import.meta.url) + +type RecordedRequest = { + method: string + url: string + headers: Record + body: string +} + +type RecordedResponse = { + status: number + statusText: string + headers: Record + body: string +} + +type RecordingEntry = { + request: RecordedRequest + response: RecordedResponse +} const tests: { [method in keyof Reader]: { [description: string]: Parameters } } = { getConfiguration: { @@ -94,9 +115,98 @@ function normalize(value: any): any { return value } +function normalizeHeaders(headers: Headers): Record { + return Object.fromEntries([...headers.entries()].sort(([left], [right]) => left.localeCompare(right))) +} + +async function serializeRequest(input: RequestInfo | URL, init?: RequestInit): Promise { + const request = new Request(input, init) + + return { + method: request.method.toUpperCase(), + url: request.url, + headers: normalizeHeaders(request.headers), + body: request.method === 'GET' || request.method === 'HEAD' ? '' : await request.clone().text(), + } +} + +function serializeResponse(response: Response, body: string): RecordedResponse { + return { + status: response.status, + statusText: response.statusText, + headers: normalizeHeaders(response.headers), + body, + } +} + +function requestKey(request: RecordedRequest): string { + return JSON.stringify(request) +} + describe('Arweave state reader', () => { - const arweave = new Arweave.Reader() - const sequence = new Sequence.Provider() + let arweave: Arweave.Reader + let sequence: Sequence.Provider + let originalFetch: typeof globalThis.fetch | undefined + + beforeAll(() => { + originalFetch = globalThis.fetch + if (!originalFetch) { + throw new Error('fetch is not available') + } + + if (existsSync(RECORDING_FILE)) { + const entries = JSON.parse(readFileSync(RECORDING_FILE, 'utf8')) as RecordingEntry[] + const responsesByRequest = new Map() + + for (const entry of entries) { + const key = requestKey(entry.request) + const responses = responsesByRequest.get(key) + + if (responses) { + responses.push(entry.response) + } else { + responsesByRequest.set(key, [entry.response]) + } + } + + globalThis.fetch = vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => { + const request = await serializeRequest(input, init) + const response = responsesByRequest.get(requestKey(request))?.shift() + + if (!response) { + throw new Error(`no recorded response for request ${JSON.stringify(request, null, 2)}`) + } + + return new Response(response.body, { + status: response.status, + statusText: response.statusText, + headers: response.headers, + }) + }) as typeof fetch + } else { + const entries: RecordingEntry[] = [] + + globalThis.fetch = vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => { + const request = await serializeRequest(input, init) + const response = await originalFetch!(input, init) + const body = await response.clone().text() + + entries.push({ request, response: serializeResponse(response, body) }) + writeFileSync(RECORDING_FILE, JSON.stringify(entries, null, 2)) + + return response + }) as typeof fetch + } + + arweave = new Arweave.Reader() + sequence = new Sequence.Provider() + }) + + afterAll(() => { + if (originalFetch) { + globalThis.fetch = originalFetch + } + }) const methods = Object.entries(tests).filter(([, methodTests]) => Object.keys(methodTests).length > 0) if (methods.length === 0) { diff --git a/packages/wallet/core/test/state/arweave/recording b/packages/wallet/core/test/state/arweave/recording new file mode 100644 index 000000000..f40e18f2e --- /dev/null +++ b/packages/wallet/core/test/state/arweave/recording @@ -0,0 +1,2455 @@ +[ + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Config", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"imageHash\":\"0xfd32e01d7e814292f49f57e79722ca66423833acf8f25eba770faf3483ff3e78\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb2e8831a2cf-YUL", + "connection": "keep-alive", + "content-length": "888", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:24 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"version\":3,\"config\":{\"checkpoint\":\"0\",\"threshold\":2,\"tree\":[[[{\"address\":\"0x94835215CaA1aD3E304F9A7E2148623fe661dEB7\",\"weight\":1},{\"address\":\"0xCD8B2b62B2EBE631C54ED0CC6F366794da6fF921\",\"weight\":1}],{\"threshold\":1,\"tree\":[{\"address\":\"0x26f3D30F41FA897309Ae804A2AFf15CEb1dA5742\",\"weight\":1},{\"address\":\"0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4\",\"weight\":1}],\"weight\":1}],[{\"threshold\":2,\"tree\":[{\"address\":\"0x00000000000030Bcc832F7d657f50D6Be35C92b3\",\"imageHash\":\"0x812f1270473f4e1def6b6a6a8c63a029f7daa9813665c9987b91d5f495e8cd87\",\"weight\":1},{\"threshold\":1,\"tree\":[{\"address\":\"0xF6Bc87F5F2edAdb66737E32D37b46423901dfEF1\",\"weight\":1},{\"address\":\"0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4\",\"weight\":1}],\"weight\":1}],\"weight\":255},{\"address\":\"0x000000000000AB36D17eB1150116371520565205\",\"imageHash\":\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\",\"weight\":255}]]}}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config\\\"] }, { name: \\\"Sequence-Sessions-Config\\\", values: [\\\"0xfd32e01d7e814292f49f57e79722ca66423833acf8f25eba770faf3483ff3e78\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb2ef8f75a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:24 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=5,cfOrigin;dur=450", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kpbR2IS45A+6Ufh8O1Qh02tddaebPFaIhBE+3wUVbVfW", + "x-77-nzt-ray": "331b5e0fe1a2ac959bd7df69036d5039", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk0NTk3LCJ3VE1XLVpndWhxQzgyZGNpek5jM0ctNWF0anlOMjJ4UkxfOW8waTNHX2swIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"wTMW-ZguhqC82dcizNc3G-5atjyN22xRL_9o0i3G_k0\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Config\",\"value\":\"0xfd32e01d7e814292f49f57e79722ca66423833acf8f25eba770faf3483ff3e78\"},{\"name\":\"Sequence-Sessions-Version\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Signers-Count\",\"value\":\"7\"},{\"name\":\"Sequence-Sessions-Signers-Bloom\",\"value\":\"0x0000008008000000802084048200000180000021400280141002000500020421\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/wTMW-ZguhqC82dcizNc3G-5atjyN22xRL_9o0i3G_k0", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:SnWk69XgOgnlTPEDUhZ6TNgWTJCmBUiMvvNY/xaSOxQ=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:24 GMT", + "sequence-sessions-complete": "true", + "sequence-sessions-config": "0xfd32e01d7e814292f49f57e79722ca66423833acf8f25eba770faf3483ff3e78", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signers-bloom": "0x0000008008000000802084048200000180000021400280141002000500020421", + "sequence-sessions-signers-count": "7", + "sequence-sessions-type": "config", + "sequence-sessions-version": "3", + "server": "CDN77-Turbo", + "signature": "comm-d6gtbzsyiobir2md4otysq5na7mzvhkjbgdadaxlgww=:/bnk/h4oAlnZ9L4ktaWXBfj7HuyUMt6ShWgm14KRw54=:, comm-wtmw-zguhqc82dciznc3g-5atjyn22xrl_9o0i3g_k0=:0nVpmzPqHnqRks1pepdX3cbGNhqiPS6Ol/kEVmluwqYFSdXi03u6JM/dsj+O7z45yu1mJoZqr0xAdi15BEE3Exw=:", + "signature-input": "comm-d6gtbzsyiobir2md4otysq5na7mzvhkjbgdadaxlgww=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-wtmw-zguhqc82dciznc3g-5atjyn22xrl_9o0i3g_k0=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmln, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:MA, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Config:MHhmZDMyZTAxZDdlODE0MjkyZjQ5ZjU3ZTc5NzIyY2E2NjQyMzgzM2FjZjhmMjVlYmE3NzBmYWYzNDgzZmYzZTc4, 6:Sequence-Sessions-Version:Mw, 7:Sequence-Sessions-Complete:dHJ1ZQ, 8:Sequence-Sessions-Signers-Count:Nw, 9:Sequence-Sessions-Signers-Bloom:MHgwMDAwMDA4MDA4MDAwMDAwODAyMDg0MDQ4MjAwMDAwMTgwMDAwMDIxNDAwMjgwMTQxMDAyMDAwNTAwMDIwNDIx\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "knpw3SVX5Mh6YEaxRsshOVYzMudH3if+g0tVslJtIwUt8A24pg", + "x-77-nzt-ray": "8705ec3425f5520e9cd7df696bdc2d25", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"checkpoint\":\"0\",\"threshold\":2,\"tree\":[[[{\"address\":\"0x94835215CaA1aD3E304F9A7E2148623fe661dEB7\",\"weight\":1},{\"address\":\"0xCD8B2b62B2EBE631C54ED0CC6F366794da6fF921\",\"weight\":1}],{\"threshold\":1,\"tree\":[{\"address\":\"0x26f3D30F41FA897309Ae804A2AFf15CEb1dA5742\",\"weight\":1},{\"address\":\"0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4\",\"weight\":1}],\"weight\":1}],[{\"threshold\":2,\"tree\":[{\"address\":\"0x00000000000030Bcc832F7d657f50D6Be35C92b3\",\"imageHash\":\"0x812f1270473f4e1def6b6a6a8c63a029f7daa9813665c9987b91d5f495e8cd87\",\"weight\":1},{\"threshold\":1,\"tree\":[{\"address\":\"0xF6Bc87F5F2edAdb66737E32D37b46423901dfEF1\",\"weight\":1},{\"address\":\"0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4\",\"weight\":1}],\"weight\":1}],\"weight\":255},{\"address\":\"0x000000000000AB36D17eB1150116371520565205\",\"imageHash\":\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\",\"weight\":255}]]}" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/DeployHash", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"wallet\":\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb3378b3a2cf-YUL", + "connection": "keep-alive", + "content-length": "467", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:24 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"deployHash\":\"0xfd32e01d7e814292f49f57e79722ca66423833acf8f25eba770faf3483ff3e78\",\"context\":{\"factory\":\"0x00000000000018A77519fcCCa060c2537c9D6d3F\",\"guestModule\":\"0x0000000000006Ac72ed1d192fa28f0058D3F8806\",\"mainModule\":\"0x0000000000001f3C39d61698ab21131a12134454\",\"mainModuleUpgradable\":\"0xD0ae8eF93b7DA4eabb32Ec4d81b7a501DCa04D4C\",\"version\":3,\"walletCreationCode\":\"0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3\"}}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 1, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"wallet\\\"] }, { name: \\\"Sequence-Sessions-Wallet\\\", values: [\\\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb339c615a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:25 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=8,cfOrigin;dur=348", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kt/gjX4CVlM2ee69NnlYVC8osIhfZGiPqYCvAJSX1XIV", + "x-77-nzt-ray": "331b5e0fe1a2ac959cd7df69011f0f2b", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":true},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk0NjE3LCItVGVjZW5JSUNIclN5ckJPMXd2VDlReTk4bXFTWms4VnZ0NkN0X0tJYlhNIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"-TecenIICHrSyrBO1wvT9Qy98mqSZk8Vvt6Ct_KIbXM\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"wallet\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\"},{\"name\":\"Sequence-Sessions-Deploy-Config\",\"value\":\"0xfd32e01d7e814292f49f57e79722ca66423833acf8f25eba770faf3483ff3e78\"},{\"name\":\"Sequence-Sessions-Deploy-Version\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Deploy-Config-Attached\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Deploy-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Deploy-Signers-Count\",\"value\":\"7\"},{\"name\":\"Sequence-Sessions-Deploy-Signers-Bloom\",\"value\":\"0x0000008008000000802084048200000180000021400280141002000500020421\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-Context-Factory\",\"value\":\"0x00000000000018A77519fcCCa060c2537c9D6d3F\"},{\"name\":\"Sequence-Sessions-Context-Stage-1\",\"value\":\"0x0000000000001f3C39d61698ab21131a12134454\"},{\"name\":\"Sequence-Sessions-Context-Stage-2\",\"value\":\"0xD0ae8eF93b7DA4eabb32Ec4d81b7a501DCa04D4C\"},{\"name\":\"Sequence-Sessions-Context-Guest\",\"value\":\"0x0000000000006Ac72ed1d192fa28f0058D3F8806\"},{\"name\":\"Sequence-Sessions-Context-Creation-Code\",\"value\":\"0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/-TecenIICHrSyrBO1wvT9Qy98mqSZk8Vvt6Ct_KIbXM", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:SnWk69XgOgnlTPEDUhZ6TNgWTJCmBUiMvvNY/xaSOxQ=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:25 GMT", + "sequence-sessions-context-creation-code": "0x6041600e3d396021805130553df33d3d36153402601f57363d3d373d363d30545af43d82803e903d91601f57fd5bf3", + "sequence-sessions-context-factory": "0x00000000000018A77519fcCCa060c2537c9D6d3F", + "sequence-sessions-context-guest": "0x0000000000006Ac72ed1d192fa28f0058D3F8806", + "sequence-sessions-context-stage-1": "0x0000000000001f3C39d61698ab21131a12134454", + "sequence-sessions-context-stage-2": "0xD0ae8eF93b7DA4eabb32Ec4d81b7a501DCa04D4C", + "sequence-sessions-deploy-config": "0xfd32e01d7e814292f49f57e79722ca66423833acf8f25eba770faf3483ff3e78", + "sequence-sessions-deploy-config-attached": "true", + "sequence-sessions-deploy-config-complete": "true", + "sequence-sessions-deploy-signers-bloom": "0x0000008008000000802084048200000180000021400280141002000500020421", + "sequence-sessions-deploy-signers-count": "7", + "sequence-sessions-deploy-version": "3", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-type": "wallet", + "sequence-sessions-wallet": "0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE", + "server": "CDN77-Turbo", + "signature": "comm--teceniichrsyrbo1wvt9qy98mqszk8vvt6ct_kibxm=:pxoQyhQGtlTMj25OLPFlmoFQD6+qgXzw9Mn/hhq2LUoqwg0JXwvxnnPPnZKa+ftI12jcxWydJUK0G6qYmqNqWxs=:, comm-qxsthx4mhrdeoltmaxgbf66wpeqlm_i5t_3mo9bfuau=:ZwH97MHIMAuwUTjyRuTtrkUiomCQM5+fS3Fj5B4XUZs=:", + "signature-input": "comm--teceniichrsyrbo1wvt9qy98mqszk8vvt6ct_kibxm=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-context-creation-code\" \"sequence-sessions-context-factory\" \"sequence-sessions-context-guest\" \"sequence-sessions-context-stage-1\" \"sequence-sessions-context-stage-2\" \"sequence-sessions-deploy-config\" \"sequence-sessions-deploy-config-attached\" \"sequence-sessions-deploy-config-complete\" \"sequence-sessions-deploy-signers-bloom\" \"sequence-sessions-deploy-signers-count\" \"sequence-sessions-deploy-version\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-type\" \"sequence-sessions-wallet\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:d2FsbGV0, 10:Sequence-Sessions-Deploy-Signers-Bloom:MHgwMDAwMDA4MDA4MDAwMDAwODAyMDg0MDQ4MjAwMDAwMTgwMDAwMDIxNDAwMjgwMTQxMDAyMDAwNTAwMDIwNDIx, 11:Sequence-Sessions-Major-Version:Mg, 12:Sequence-Sessions-Context-Factory:MHgwMDAwMDAwMDAwMDAxOEE3NzUxOWZjQ0NhMDYwYzI1MzdjOUQ2ZDNG, 13:Sequence-Sessions-Context-Stage-1:MHgwMDAwMDAwMDAwMDAxZjNDMzlkNjE2OThhYjIxMTMxYTEyMTM0NDU0, 14:Sequence-Sessions-Context-Stage-2:MHhEMGFlOGVGOTNiN0RBNGVhYmIzMkVjNGQ4MWI3YTUwMURDYTA0RDRD, 15:Sequence-Sessions-Context-Guest:MHgwMDAwMDAwMDAwMDA2QWM3MmVkMWQxOTJmYTI4ZjAwNThEM0Y4ODA2, 16:Sequence-Sessions-Context-Creation-Code:MHg2MDQxNjAwZTNkMzk2MDIxODA1MTMwNTUzZGYzM2QzZDM2MTUzNDAyNjAxZjU3MzYzZDNkMzczZDM2M2QzMDU0NWFmNDNkODI4MDNlOTAzZDkxNjAxZjU3ZmQ1YmYz, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:YXBwbGljYXRpb24vanNvbg, 4:Sequence-Sessions-Wallet:MHg0N0UwZTQ0REU2NDlCMzVDZjc4NjM5OThCZTZDNWE3RDVkOGM2M2JF, 5:Sequence-Sessions-Deploy-Config:MHhmZDMyZTAxZDdlODE0MjkyZjQ5ZjU3ZTc5NzIyY2E2NjQyMzgzM2FjZjhmMjVlYmE3NzBmYWYzNDgzZmYzZTc4, 6:Sequence-Sessions-Deploy-Version:Mw, 7:Sequence-Sessions-Deploy-Config-Attached:dHJ1ZQ, 8:Sequence-Sessions-Deploy-Config-Complete:dHJ1ZQ, 9:Sequence-Sessions-Deploy-Signers-Count:Nw\", comm-qxsthx4mhrdeoltmaxgbf66wpeqlm_i5t_3mo9bfuau=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-context-creation-code\" \"sequence-sessions-context-factory\" \"sequence-sessions-context-guest\" \"sequence-sessions-context-stage-1\" \"sequence-sessions-context-stage-2\" \"sequence-sessions-deploy-config\" \"sequence-sessions-deploy-config-attached\" \"sequence-sessions-deploy-config-complete\" \"sequence-sessions-deploy-signers-bloom\" \"sequence-sessions-deploy-signers-count\" \"sequence-sessions-deploy-version\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-type\" \"sequence-sessions-wallet\");alg=\"hmac-sha256\";keyid=\"constant:ao\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kkAzyuQWwUzYj0WpINtvDJmekDtWJOum72Ty4sJb/fWjilgW3w", + "x-77-nzt-ray": "3f9f132567ed7bbc9dd7df69cbb53410", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"checkpoint\":\"0\",\"threshold\":2,\"tree\":[[[{\"address\":\"0x94835215CaA1aD3E304F9A7E2148623fe661dEB7\",\"weight\":1},{\"address\":\"0xCD8B2b62B2EBE631C54ED0CC6F366794da6fF921\",\"weight\":1}],{\"threshold\":1,\"tree\":[{\"address\":\"0x26f3D30F41FA897309Ae804A2AFf15CEb1dA5742\",\"weight\":1},{\"address\":\"0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4\",\"weight\":1}],\"weight\":1}],[{\"threshold\":2,\"tree\":[{\"address\":\"0x00000000000030Bcc832F7d657f50D6Be35C92b3\",\"imageHash\":\"0x812f1270473f4e1def6b6a6a8c63a029f7daa9813665c9987b91d5f495e8cd87\",\"weight\":1},{\"threshold\":1,\"tree\":[{\"address\":\"0xF6Bc87F5F2edAdb66737E32D37b46423901dfEF1\",\"weight\":1},{\"address\":\"0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4\",\"weight\":1}],\"weight\":1}],\"weight\":255},{\"address\":\"0x000000000000AB36D17eB1150116371520565205\",\"imageHash\":\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\",\"weight\":255}]]}" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Wallets", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"signer\":\"0x94835215CaA1aD3E304F9A7E2148623fe661dEB7\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb37c830a2cf-YUL", + "connection": "keep-alive", + "content-length": "772", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:25 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"wallets\":{\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\":{\"digest\":\"\",\"payload\":{\"message\":\"0x7b22616374696f6e223a22636f6e73656e742d746f2d62652d706172742d6f662d77616c6c6574222c2277616c6c6574223a22307834376530653434646536343962333563663738363339393862653663356137643564386336336265222c227369676e6572223a22307839343833353231354361413161443345333034463941374532313438363233666536363164454237222c2274696d657374616d70223a313737353539333838393336372c227369676e65724b696e64223a226c6f67696e2d676f6f676c65227d\",\"type\":\"message\"},\"toImageHash\":\"\",\"chainID\":\"0\",\"type\":\"EIP712\",\"signature\":\"0x8af459fb08d4e7c7b9189ec61aaa74f1b08664e1f415dae09e5ca026bcab63e96c7d2faad656a8c713856857243f3acb4427bf8e20b13b18d6f3474f5de9a0db1c\",\"sapientHash\":\"\",\"validOnBlockHash\":\"\"}},\"cursor\":4309735}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"signature\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0x94835215CaA1aD3E304F9A7E2148623fe661dEB7\\\"] }, { name: \\\"Sequence-Sessions-Witness\\\", values: [\\\"true\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"eip-712\\\", \\\"eth_sign\\\", \\\"erc-1271\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb37ef8d5a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:25 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=9,cfOrigin;dur=251", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kn3s8DIJvjUDlJ3OTuNzNuSM4/bbBuAW3a93q34v+ryr", + "x-77-nzt-ray": "331b5e0fe1a2ac959dd7df698b4b2418", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk0NjM1LCJVZ3hGMno4MUlzZDA0b3JWVTRtS1FqSjR1R2hXaWpnSmN3SXd2R0ljUEdNIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"UgxF2z81Isd04orVU4mKQjJ4uGhWijgJcwIwvGIcPGM\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"signature\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eip-712\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x94835215CaA1aD3E304F9A7E2148623fe661dEB7\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/UgxF2z81Isd04orVU4mKQjJ4uGhWijgJcwIwvGIcPGM", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:DQMtV30uXskqMMCu16zNMvZyWfa6yEsZvfOQURm4xFU=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:26 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eip-712", + "sequence-sessions-signer": "0x94835215CaA1aD3E304F9A7E2148623fe661dEB7", + "sequence-sessions-subdigest": "0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107", + "sequence-sessions-type": "signature", + "sequence-sessions-wallet": "0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE", + "sequence-sessions-witness": "true", + "server": "CDN77-Turbo", + "signature": "comm-mjddmuaq1suixwpqp6yzqijq0jnz-sxkj26f3u3tipw=:TP9EhccyKY5tLhKceOrZYXdXXyqjT3DfJwn6iBwTAVk=:, comm-ugxf2z81isd04orvu4mkqjj4ughwijgjcwiwvgicpgm=:sR5lQIrliBqj6gDxCHx+VOOKwmvqSnQyKpOgtmI2bfV3ROL1TODu9BYbIgtRCXabSSfY8JufjbK/kIMaFxgG1Rw=:", + "signature-input": "comm-mjddmuaq1suixwpqp6yzqijq0jnz-sxkj26f3u3tipw=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-ugxf2z81isd04orvu4mkqjj4ughwijgjcwiwvgicpgm=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:c2lnbmF0dXJl, 10:Sequence-Sessions-Major-Version:Mg, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZWlwLTcxMg, 5:Sequence-Sessions-Signer:MHg5NDgzNTIxNUNhQTFhRDNFMzA0RjlBN0UyMTQ4NjIzZmU2NjFkRUI3, 6:Sequence-Sessions-Subdigest:MHgxZmQyYzJhZmVjZmQwMGMyOGNmZjAyZDA2MDg0ODllNDZmNzIyMjg5MTE2OTc3NGMyNGUyYjU2OGUzZTIyMTA3, 7:Sequence-Sessions-Wallet:MHg0N0UwZTQ0REU2NDlCMzVDZjc4NjM5OThCZTZDNWE3RDVkOGM2M2JF, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:dHJ1ZQ\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kkQcVZpruA8xMS3x0uudlfeLetOaOl1vUtIgg4zT7+y7NtcUQw", + "x-77-nzt-ray": "f03d0613ac3d59c59dd7df69ba83d131", + "x-77-pop": "newyorkUSNY" + }, + "body": "0x8af459fb08d4e7c7b9189ec61aaa74f1b08664e1f415dae09e5ca026bcab63e96c7d2faad656a8c713856857243f3acb4427bf8e20b13b18d6f3474f5de9a0db1c" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 1, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"payload\\\"] }, { name: \\\"Sequence-Sessions-Major-Version\\\", values: [\\\"1\\\"] }, { name: \\\"Sequence-Sessions-Minor-Version\\\", values: [\\\"2\\\"] }, { name: \\\"Sequence-Sessions-Payload\\\", values: [\\\"0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb3bdad15a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:26 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=8,cfOrigin;dur=374", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "klJ2qtcwZnoH8Z2gpSNApegfi+abKtYFw8FFk2M1CpNk", + "x-77-nzt-ray": "331b5e0fe1a2ac959ed7df693deb5502", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":true},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk2ODczLCJacEMxWDZQM2ttTUo2ZVBLRzhyZjVicEN4bjVzSlVnU2FqRGpTYlJ3ZjQ4Il0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"ZpC1X6P3kmMJ6ePKG8rf5bpCxn5sJUgSajDjSbRwf48\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"payload\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"2\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Payload\",\"value\":\"0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107\"},{\"name\":\"Sequence-Sessions-Address\",\"value\":\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Payload-Type\",\"value\":\"message\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/ZpC1X6P3kmMJ6ePKG8rf5bpCxn5sJUgSajDjSbRwf48", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:WrFeEzEBLlRPhslU5kXRAZENf+CRW4DvMJbK+3q4fBw=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:26 GMT", + "sequence-sessions-address": "0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "2", + "sequence-sessions-payload": "0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107", + "sequence-sessions-payload-type": "message", + "sequence-sessions-type": "payload", + "server": "CDN77-Turbo", + "signature": "comm-z6psoyqzpxcxfsjacq6u2tw2zwr5am0z-qxanycxlxk=:/XWIuXs2TLz6Uq6WLXmvwx3R0MrP0B8Hg/vL2cSg0tw=:, comm-zpc1x6p3kmmj6epkg8rf5bpcxn5sjugsajdjsbrwf48=:FFC2OB/9mHTDSiPM2jaM/W9DndWBvsNcKZGT81tluPk13ODkpIf8XYLaJ90yscVPami5RQscKmBY9OmxfzL3gBs=:", + "signature-input": "comm-z6psoyqzpxcxfsjacq6u2tw2zwr5am0z-qxanycxlxk=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-type\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-zpc1x6p3kmmj6epkg8rf5bpcxn5sjugsajdjsbrwf48=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-type\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:cGF5bG9hZA, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:Mg, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Payload:MHgxZmQyYzJhZmVjZmQwMGMyOGNmZjAyZDA2MDg0ODllNDZmNzIyMjg5MTE2OTc3NGMyNGUyYjU2OGUzZTIyMTA3, 6:Sequence-Sessions-Address:MHg0N0UwZTQ0REU2NDlCMzVDZjc4NjM5OThCZTZDNWE3RDVkOGM2M2JF, 7:Sequence-Sessions-Chain-ID:MA, 8:Sequence-Sessions-Payload-Type:bWVzc2FnZQ\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "klRRFUM66/ntQEiXsPNtmx1THYfl0HFEcIiLg9YiTZPnpccl+Q", + "x-77-nzt-ray": "f03d06133b5c02e39ed7df69da818923", + "x-77-pop": "newyorkUSNY" + }, + "body": "\"0x7b22616374696f6e223a22636f6e73656e742d746f2d62652d706172742d6f662d77616c6c6574222c2277616c6c6574223a22307834376530653434646536343962333563663738363339393862653663356137643564386336336265222c227369676e6572223a22307839343833353231354361413161443345333034463941374532313438363233666536363164454237222c2274696d657374616d70223a313737353539333838393336372c227369676e65724b696e64223a226c6f67696e2d676f6f676c65227d\"" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Wallets", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"signer\":\"0x000000000000AB36D17eB1150116371520565205\",\"sapientHash\":\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb3fad85a2cf-YUL", + "connection": "keep-alive", + "content-length": "25", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:26 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"wallets\":{},\"cursor\":0}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"signature\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0x000000000000AB36D17eB1150116371520565205\\\"] }, { name: \\\"Sequence-Sessions-Image-Hash\\\", values: [\\\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\\\"] }, { name: \\\"Sequence-Sessions-Witness\\\", values: [\\\"true\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"sapient\\\", \\\"sapient-compact\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb3fce2c5a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:26 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=11,cfOrigin;dur=213", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "khmh6JDIHNcpGLJnUaMbETHny2ujNPAg4nL2VQbfpRJU", + "x-77-nzt-ray": "331b5e0fe1a2ac959ed7df697da8d827", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[]}}}\n" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Witness", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"signer\":\"0x94835215CaA1aD3E304F9A7E2148623fe661dEB7\",\"wallet\":\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb41885ea2cf-YUL", + "connection": "keep-alive", + "content-length": "708", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:27 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"witness\":{\"digest\":\"\",\"payload\":{\"message\":\"0x7b22616374696f6e223a22636f6e73656e742d746f2d62652d706172742d6f662d77616c6c6574222c2277616c6c6574223a22307834376530653434646536343962333563663738363339393862653663356137643564386336336265222c227369676e6572223a22307839343833353231354361413161443345333034463941374532313438363233666536363164454237222c2274696d657374616d70223a313737353539333838393336372c227369676e65724b696e64223a226c6f67696e2d676f6f676c65227d\",\"type\":\"message\"},\"toImageHash\":\"\",\"chainID\":\"0\",\"type\":\"EIP712\",\"signature\":\"0x8af459fb08d4e7c7b9189ec61aaa74f1b08664e1f415dae09e5ca026bcab63e96c7d2faad656a8c713856857243f3acb4427bf8e20b13b18d6f3474f5de9a0db1c\",\"sapientHash\":\"\",\"validOnBlockHash\":\"\"}}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"signature\\\"] }, { name: \\\"Sequence-Sessions-Wallet\\\", values: [\\\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0x94835215CaA1aD3E304F9A7E2148623fe661dEB7\\\"] }, { name: \\\"Sequence-Sessions-Witness\\\", values: [\\\"true\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"eip-712\\\", \\\"eth_sign\\\", \\\"erc-1271\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb41af855a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:27 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=9,cfOrigin;dur=244", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kmdP+2wrt6KTzTa7i5NS39F0SWlUh55mmkJYE0vTU5j7", + "x-77-nzt-ray": "331b5e0fe1a2ac959ed7df692d4c8d39", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk0NjM1LCJVZ3hGMno4MUlzZDA0b3JWVTRtS1FqSjR1R2hXaWpnSmN3SXd2R0ljUEdNIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"UgxF2z81Isd04orVU4mKQjJ4uGhWijgJcwIwvGIcPGM\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"signature\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eip-712\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x94835215CaA1aD3E304F9A7E2148623fe661dEB7\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/UgxF2z81Isd04orVU4mKQjJ4uGhWijgJcwIwvGIcPGM", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:DQMtV30uXskqMMCu16zNMvZyWfa6yEsZvfOQURm4xFU=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:27 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eip-712", + "sequence-sessions-signer": "0x94835215CaA1aD3E304F9A7E2148623fe661dEB7", + "sequence-sessions-subdigest": "0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107", + "sequence-sessions-type": "signature", + "sequence-sessions-wallet": "0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE", + "sequence-sessions-witness": "true", + "server": "CDN77-Turbo", + "signature": "comm-mjddmuaq1suixwpqp6yzqijq0jnz-sxkj26f3u3tipw=:TP9EhccyKY5tLhKceOrZYXdXXyqjT3DfJwn6iBwTAVk=:, comm-ugxf2z81isd04orvu4mkqjj4ughwijgjcwiwvgicpgm=:sR5lQIrliBqj6gDxCHx+VOOKwmvqSnQyKpOgtmI2bfV3ROL1TODu9BYbIgtRCXabSSfY8JufjbK/kIMaFxgG1Rw=:", + "signature-input": "comm-mjddmuaq1suixwpqp6yzqijq0jnz-sxkj26f3u3tipw=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-ugxf2z81isd04orvu4mkqjj4ughwijgjcwiwvgicpgm=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:c2lnbmF0dXJl, 10:Sequence-Sessions-Major-Version:Mg, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZWlwLTcxMg, 5:Sequence-Sessions-Signer:MHg5NDgzNTIxNUNhQTFhRDNFMzA0RjlBN0UyMTQ4NjIzZmU2NjFkRUI3, 6:Sequence-Sessions-Subdigest:MHgxZmQyYzJhZmVjZmQwMGMyOGNmZjAyZDA2MDg0ODllNDZmNzIyMjg5MTE2OTc3NGMyNGUyYjU2OGUzZTIyMTA3, 7:Sequence-Sessions-Wallet:MHg0N0UwZTQ0REU2NDlCMzVDZjc4NjM5OThCZTZDNWE3RDVkOGM2M2JF, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:dHJ1ZQ\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-age": "1", + "x-77-cache": "HIT", + "x-77-nzt": "ktcsB2vBzPXSPSGPD1IQ68FPpsz0JveQuLOk4aaBYBoRC7gHow", + "x-77-nzt-ray": "f03d0613ac3d59c59fd7df692252fe12", + "x-77-pop": "newyorkUSNY" + }, + "body": "0x8af459fb08d4e7c7b9189ec61aaa74f1b08664e1f415dae09e5ca026bcab63e96c7d2faad656a8c713856857243f3acb4427bf8e20b13b18d6f3474f5de9a0db1c" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 1, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"payload\\\"] }, { name: \\\"Sequence-Sessions-Major-Version\\\", values: [\\\"1\\\"] }, { name: \\\"Sequence-Sessions-Minor-Version\\\", values: [\\\"2\\\"] }, { name: \\\"Sequence-Sessions-Payload\\\", values: [\\\"0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb3bdad15a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:27 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=8,cfOrigin;dur=374", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kmDFEymCjaCQYBxiS+RUbDG8nDrbjToz2fktrzleS5uG", + "x-77-nzt-ray": "331b5e0fe1a2ac959fd7df691b96cd15", + "x-77-pop": "montrealCAQC" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":true},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk2ODczLCJacEMxWDZQM2ttTUo2ZVBLRzhyZjVicEN4bjVzSlVnU2FqRGpTYlJ3ZjQ4Il0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"ZpC1X6P3kmMJ6ePKG8rf5bpCxn5sJUgSajDjSbRwf48\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"payload\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"2\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Payload\",\"value\":\"0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107\"},{\"name\":\"Sequence-Sessions-Address\",\"value\":\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Payload-Type\",\"value\":\"message\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/ZpC1X6P3kmMJ6ePKG8rf5bpCxn5sJUgSajDjSbRwf48", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:WrFeEzEBLlRPhslU5kXRAZENf+CRW4DvMJbK+3q4fBw=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:27 GMT", + "sequence-sessions-address": "0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "2", + "sequence-sessions-payload": "0x1fd2c2afecfd00c28cff02d0608489e46f7222891169774c24e2b568e3e22107", + "sequence-sessions-payload-type": "message", + "sequence-sessions-type": "payload", + "server": "CDN77-Turbo", + "signature": "comm-z6psoyqzpxcxfsjacq6u2tw2zwr5am0z-qxanycxlxk=:/XWIuXs2TLz6Uq6WLXmvwx3R0MrP0B8Hg/vL2cSg0tw=:, comm-zpc1x6p3kmmj6epkg8rf5bpcxn5sjugsajdjsbrwf48=:FFC2OB/9mHTDSiPM2jaM/W9DndWBvsNcKZGT81tluPk13ODkpIf8XYLaJ90yscVPami5RQscKmBY9OmxfzL3gBs=:", + "signature-input": "comm-z6psoyqzpxcxfsjacq6u2tw2zwr5am0z-qxanycxlxk=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-type\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-zpc1x6p3kmmj6epkg8rf5bpcxn5sjugsajdjsbrwf48=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-type\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:cGF5bG9hZA, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:Mg, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Payload:MHgxZmQyYzJhZmVjZmQwMGMyOGNmZjAyZDA2MDg0ODllNDZmNzIyMjg5MTE2OTc3NGMyNGUyYjU2OGUzZTIyMTA3, 6:Sequence-Sessions-Address:MHg0N0UwZTQ0REU2NDlCMzVDZjc4NjM5OThCZTZDNWE3RDVkOGM2M2JF, 7:Sequence-Sessions-Chain-ID:MA, 8:Sequence-Sessions-Payload-Type:bWVzc2FnZQ\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-age": "1", + "x-77-cache": "HIT", + "x-77-nzt": "kto/Tx3txZyfUHYUjDdHYYatpm/yIhRWCo6zu8XkeGRdMPcm8g", + "x-77-nzt-ray": "f03d06133b5c02e39fd7df691d7c821b", + "x-77-pop": "newyorkUSNY" + }, + "body": "\"0x7b22616374696f6e223a22636f6e73656e742d746f2d62652d706172742d6f662d77616c6c6574222c2277616c6c6574223a22307834376530653434646536343962333563663738363339393862653663356137643564386336336265222c227369676e6572223a22307839343833353231354361413161443345333034463941374532313438363233666536363164454237222c2274696d657374616d70223a313737353539333838393336372c227369676e65724b696e64223a226c6f67696e2d676f6f676c65227d\"" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Witness", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"signer\":\"0x000000000000AB36D17eB1150116371520565205\",\"wallet\":\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\",\"sapientHash\":\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\"}" + }, + "response": { + "status": 404, + "statusText": "Not Found", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb44cde6a2cf-YUL", + "connection": "keep-alive", + "content-length": "527", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:27 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"error\":\"NotFound\",\"code\":2,\"msg\":\"not found\",\"cause\":\"unable to find witness for sapient signer 0x000000000000ab36d17eb1150116371520565205 image hash 0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3 wallet 0x47e0e44de649b35cf7863998be6c5a7d5d8c63be: unable to find witness for sapient signer 0x000000000000ab36d17eb1150116371520565205 image hash 0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3 wallet 0x47e0e44de649b35cf7863998be6c5a7d5d8c63be: pgkit: no rows in result set\",\"status\":404}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"signature\\\"] }, { name: \\\"Sequence-Sessions-Wallet\\\", values: [\\\"0x47E0e44DE649B35Cf7863998Be6C5a7D5d8c63bE\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0x000000000000AB36D17eB1150116371520565205\\\"] }, { name: \\\"Sequence-Sessions-Image-Hash\\\", values: [\\\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\\\"] }, { name: \\\"Sequence-Sessions-Witness\\\", values: [\\\"true\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"sapient\\\", \\\"sapient-compact\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb44fa375a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:27 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=8,cfOrigin;dur=193", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "krTnhHzpB0qpko17WyAtyDvAyvrzk2wWisOQst+mtd9e", + "x-77-nzt-ray": "331b5e0fe1a2ac959fd7df69277a2f1d", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[]}}}\n" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/ConfigUpdates", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"wallet\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\",\"fromImageHash\":\"0xaa14aff91091e94d7521625ab1c713273e86a8c21a0afb6cee35be28af47738a\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb4688b6a2cf-YUL", + "connection": "keep-alive", + "content-length": "1715", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:27 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"updates\":[{\"toImageHash\":\"0xa411f8bf05839071761a3cfece2ac3ece2a59a257d989d915068d5f7ddaab294\",\"signature\":\"0x0600017126c7b33eb2463c323d6c12e14b128c935a28d41abfa9a200c12a2c622992ee81e16f14850f8ff490fc850c4740543eb0b96ab785eec461f669fe1261001df1b1\"},{\"toImageHash\":\"0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930\",\"signature\":\"0x0601027172830470d9a9a8f28d3f7554dae9806e14f34f75ffdc8cdff62f691566ff3bb3884ff61967f0180f0c7cb56c860a97cad1c810894becfae50768e1425486d3f371116bea5f536c7745117315baef9743ed6e9bd0bb4d6b0e0dcba7fffdab393a2a50ae10f526151f937cdf8fe67f6b2199e6127e4637017bc056dd7f08d959e0981188a25af00c5590a0583c7f4d994ec87e5cde0ba2\"},{\"toImageHash\":\"0xe60a2df731c3eb8e237b88b8b7c13fd6d4b56b48496d1adce8cf29a572ce6487\",\"signature\":\"0x060502113114b2ede71533c3100842b62e3773e930989a1e71d74d840a07de51b5012bc94fcf3a7715bfa1b7845b2674874a71bef4a7f3cd269eb75136e3eadfe33931302452d1cccca8819e3f0615fb36ba71aaeb8465b70571ecd8bcb73872ad91461bba93b42b363b7048d61bc29c813ef890ae5904cb5a0bbad5796934d1c54bac5ee162dbe9acf2ad16cb34e656b4e6c3cc1880c151cf1b\"},{\"toImageHash\":\"0xd430d9d056a14a874c22b86246902a60f4b25573fbe998f1148a7e193edf69ae\",\"signature\":\"0x06060171e375fd12b814b897838f13daf9e36bd9d66c78d606580b7822c1364ae2c56ca2b87ca29afec44adba341c80b4a0b45c072087043cd123ad084c7d57ba6b4d0721107a87dc7616f121951e81a997d32ed03c38566071149fca172d48f43f8e8e45685c1581d9ab14f9fae\"},{\"toImageHash\":\"0x19b94a7bd3dfbd5af528650ff492802bfdb909aff70608684feace24f3e08a01\",\"signature\":\"0x0608011143dc62e7f055b75948ba6d0288e233027f08f4df71af1656da7ca89e388d1c500826c5d7dd0ee670f68b83615b7e1aac78b0cae4c19cdab9e9c4af8fe5564aa49b0c50fad1218023dc6e3fa87307e29b23952a757011004702aad30e9fcb3af53a635f86c4a4f0dff2ef\"}]}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config\\\"] }, { name: \\\"Sequence-Sessions-Config\\\", values: [\\\"0xaa14aff91091e94d7521625ab1c713273e86a8c21a0afb6cee35be28af47738a\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb46ab715a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:28 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=8,cfOrigin;dur=281", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kof1ezmpOdlXDn9T8faYG8D1IuPZzf6IiLyidLSfg7Kc", + "x-77-nzt-ray": "331b5e0fe1a2ac959fd7df69317af82d", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJTOVNHYmpmbVdKVmxRSmxqbjZXOXBWZmthSTR4R2pkdmJaX2NzVmo1ZWlnIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"S9SGbjfmWJVlQJljn6W9pVfkaI4xGjdvbZ_csVj5eig\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Config\",\"value\":\"0xaa14aff91091e94d7521625ab1c713273e86a8c21a0afb6cee35be28af47738a\"},{\"name\":\"Sequence-Sessions-Version\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Signers-Count\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Signers-Bloom\",\"value\":\"0x0000000000000000020001000000000000000000000408000000000000000000\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/S9SGbjfmWJVlQJljn6W9pVfkaI4xGjdvbZ_csVj5eig", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:Gv6Njbd+6bmZJQS19Kpl/N2I/J9u5zxx0RWSNateHh8=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:28 GMT", + "sequence-sessions-complete": "true", + "sequence-sessions-config": "0xaa14aff91091e94d7521625ab1c713273e86a8c21a0afb6cee35be28af47738a", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signers-bloom": "0x0000000000000000020001000000000000000000000408000000000000000000", + "sequence-sessions-signers-count": "1", + "sequence-sessions-type": "config", + "sequence-sessions-version": "3", + "server": "CDN77-Turbo", + "signature": "comm-5q2kghl8cf8zhsqsfgox1fau_q0tyzru55pwlfnbi0c=:FDu+idLtiySYuW38oIhAvf6uLQ2fMB96MlBgdXz4mtc=:, comm-s9sgbjfmwjvlqjljn6w9pvfkai4xgjdvbz_csvj5eig=:n/6B3uOAtJhxMyQAtcAGLUtoFUen3JQ8JdOYJ5z+CKBw3k3rqZJFt5KUzi53pCISKhx1I5zmYNNRyhHhSYBfAxs=:", + "signature-input": "comm-5q2kghl8cf8zhsqsfgox1fau_q0tyzru55pwlfnbi0c=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-s9sgbjfmwjvlqjljn6w9pvfkai4xgjdvbz_csvj5eig=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmln, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:MA, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Config:MHhhYTE0YWZmOTEwOTFlOTRkNzUyMTYyNWFiMWM3MTMyNzNlODZhOGMyMWEwYWZiNmNlZTM1YmUyOGFmNDc3Mzhh, 6:Sequence-Sessions-Version:Mw, 7:Sequence-Sessions-Complete:dHJ1ZQ, 8:Sequence-Sessions-Signers-Count:MQ, 9:Sequence-Sessions-Signers-Bloom:MHgwMDAwMDAwMDAwMDAwMDAwMDIwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDA4MDAwMDAwMDAwMDAwMDAwMDAw\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kiDzhOXXjZ+sIg4zjsnuzEoNTgPhUMI3GY9/WQVHZTb/t3PYgA", + "x-77-nzt-ray": "f03d0613653cfd25a0d7df69fbb68c0d", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"checkpoint\":\"0\",\"threshold\":1,\"tree\":{\"address\":\"0x1494927eC78E099321151C2b9d06c5bB98a21191\",\"weight\":1}}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config update\\\"] }, { name: \\\"Sequence-Sessions-Wallet\\\", values: [\\\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0x1494927eC78E099321151C2b9d06c5bB98a21191\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"eip-712\\\", \\\"eth_sign\\\", \\\"erc-1271\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb4a6e725a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:28 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=6,cfOrigin;dur=175", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "knD6rYB3F2GDXZE2xiF+pjLj1xwpUGaRJTOITX3anJAL", + "x-77-nzt-ray": "331b5e0fe1a2ac95a0d7df6920e69515", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJpenQ4V3lWNDF0SkZiS1Yzdlo3cUxFLW54M05lMXVER0gycUF2SUxiUjhRIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"izt8WyV41tJFbKV3vZ7qLE-nx3Ne1uDGH2qAvILbR8Q\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x1494927eC78E099321151C2b9d06c5bB98a21191\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0xc68f343dd513b86c83a47c20218eb39d5dc7f2cfadd435c4253e268f7b7f4016\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xa411f8bf05839071761a3cfece2ac3ece2a59a257d989d915068d5f7ddaab294\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000000100000004500400000000800100000000000001080000000\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/izt8WyV41tJFbKV3vZ7qLE-nx3Ne1uDGH2qAvILbR8Q", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:5V17yO++KQTYC6pt/sLS3ygLP6/h0QJnF+9e2FHFQPY=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:28 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eth_sign", + "sequence-sessions-signer": "0x1494927eC78E099321151C2b9d06c5bB98a21191", + "sequence-sessions-subdigest": "0xc68f343dd513b86c83a47c20218eb39d5dc7f2cfadd435c4253e268f7b7f4016", + "sequence-sessions-to-checkpoint": "1", + "sequence-sessions-to-config": "0xa411f8bf05839071761a3cfece2ac3ece2a59a257d989d915068d5f7ddaab294", + "sequence-sessions-to-config-complete": "true", + "sequence-sessions-to-signers-bloom": "0x0000000502000000100000004500400000000800100000000000001080000000", + "sequence-sessions-to-signers-count": "3", + "sequence-sessions-type": "config update", + "sequence-sessions-wallet": "0x135769a58639b4Fa7d779a9df9B57A706FBCa816", + "sequence-sessions-witness": "true", + "server": "CDN77-Turbo", + "signature": "comm-izt8wyv41tjfbkv3vz7qle-nx3ne1udgh2qavilbr8q=:Rtry+88OHbpQW31vhv2P+YQaydNrVPtgldw2BJqd8qsDwDsjM7vcO4Yj54LiPMkuVn9nOGv4lqfQ5ODsfhROnRs=:, comm-l89rjriyuff5qj8_r92qjquo7xjqgirvu0_lu1b29xq=:KhFweURuUOR33tKJjhlPjpOO9f8kl7fPjyLMabPjwOE=:", + "signature-input": "comm-izt8wyv41tjfbkv3vz7qle-nx3ne1udgh2qavilbr8q=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmlnIHVwZGF0ZQ, 10:Sequence-Sessions-Major-Version:Mg, 11:Sequence-Sessions-To-Config:MHhhNDExZjhiZjA1ODM5MDcxNzYxYTNjZmVjZTJhYzNlY2UyYTU5YTI1N2Q5ODlkOTE1MDY4ZDVmN2RkYWFiMjk0, 12:Sequence-Sessions-To-Checkpoint:MQ, 13:Sequence-Sessions-To-Config-Complete:dHJ1ZQ, 14:Sequence-Sessions-To-Signers-Count:Mw, 15:Sequence-Sessions-To-Signers-Bloom:MHgwMDAwMDAwNTAyMDAwMDAwMTAwMDAwMDA0NTAwNDAwMDAwMDAwODAwMTAwMDAwMDAwMDAwMDAxMDgwMDAwMDAw, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZXRoX3NpZ24, 5:Sequence-Sessions-Signer:MHgxNDk0OTI3ZUM3OEUwOTkzMjExNTFDMmI5ZDA2YzViQjk4YTIxMTkx, 6:Sequence-Sessions-Subdigest:MHhjNjhmMzQzZGQ1MTNiODZjODNhNDdjMjAyMThlYjM5ZDVkYzdmMmNmYWRkNDM1YzQyNTNlMjY4ZjdiN2Y0MDE2, 7:Sequence-Sessions-Wallet:MHgxMzU3NjlhNTg2MzliNEZhN2Q3NzlhOWRmOUI1N0E3MDZGQkNhODE2, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:dHJ1ZQ\", comm-l89rjriyuff5qj8_r92qjquo7xjqgirvu0_lu1b29xq=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kmaEcGv4HK6lYliBsjNRILzxFuSArvL/LGTD71iIv9gLs+oxXQ", + "x-77-nzt-ray": "f03d0613bf5c6c3ba0d7df69f68c742b", + "x-77-pop": "newyorkUSNY" + }, + "body": "0x26c7b33eb2463c323d6c12e14b128c935a28d41abfa9a200c12a2c622992ee81616f14850f8ff490fc850c4740543eb0b96ab785eec461f669fe1261001df1b11c" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config\\\"] }, { name: \\\"Sequence-Sessions-Config\\\", values: [\\\"0xa411f8bf05839071761a3cfece2ac3ece2a59a257d989d915068d5f7ddaab294\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb4d18905a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:29 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=8,cfOrigin;dur=185", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kjlqZaVBXeQLSEYmXiAVLejJodr3HMepIYXYP3x9MM84", + "x-77-nzt-ray": "331b5e0fe1a2ac95a0d7df69c9e72d2f", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJOWjJIWWNGZDAtOThVZExudWJLc2N1S09valJ1dGlnX1RwcC1sMkgtSWtFIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"NZ2HYcFd0-98UdLnubKscuKOojRutig_Tpp-l2H-IkE\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Config\",\"value\":\"0xa411f8bf05839071761a3cfece2ac3ece2a59a257d989d915068d5f7ddaab294\"},{\"name\":\"Sequence-Sessions-Version\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Signers-Bloom\",\"value\":\"0x0000000502000000100000004500400000000800100000000000001080000000\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/NZ2HYcFd0-98UdLnubKscuKOojRutig_Tpp-l2H-IkE", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:SV08eWGigUB+aigp46hMh2a0MgdrwYXYXNl1hV8xqBc=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:29 GMT", + "sequence-sessions-complete": "true", + "sequence-sessions-config": "0xa411f8bf05839071761a3cfece2ac3ece2a59a257d989d915068d5f7ddaab294", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signers-bloom": "0x0000000502000000100000004500400000000800100000000000001080000000", + "sequence-sessions-signers-count": "3", + "sequence-sessions-type": "config", + "sequence-sessions-version": "3", + "server": "CDN77-Turbo", + "signature": "comm-hkjz12krcwpdpscafdqy2i1mtx_crmzwrygba7ev28i=:F016DF5NiP4rsrw3xFweRK7a6ufEShE27XbmIZ0mM0U=:, comm-nz2hycfd0-98udlnubkscukoojrutig_tpp-l2h-ike=:0szAi+qf/tbBpzdEDAb6YmZaWpdGZxgz8EwfVWItkCMqC1OCCco2um+SGlxB4upmVWuhuqvmPrd3n/r3FbIMqxs=:", + "signature-input": "comm-hkjz12krcwpdpscafdqy2i1mtx_crmzwrygba7ev28i=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-nz2hycfd0-98udlnubkscukoojrutig_tpp-l2h-ike=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmln, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:MA, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Config:MHhhNDExZjhiZjA1ODM5MDcxNzYxYTNjZmVjZTJhYzNlY2UyYTU5YTI1N2Q5ODlkOTE1MDY4ZDVmN2RkYWFiMjk0, 6:Sequence-Sessions-Version:Mw, 7:Sequence-Sessions-Complete:dHJ1ZQ, 8:Sequence-Sessions-Signers-Count:Mw, 9:Sequence-Sessions-Signers-Bloom:MHgwMDAwMDAwNTAyMDAwMDAwMTAwMDAwMDA0NTAwNDAwMDAwMDAwODAwMTAwMDAwMDAwMDAwMDAxMDgwMDAwMDAw\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "khsoikltqnrtzOqDWKW2HYe5dYh3rJZRF4vNeKiJmIIu4/HoPA", + "x-77-nzt-ray": "3f9f1325610a726ea1d7df69ec8dcd08", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"checkpoint\":\"1\",\"threshold\":2,\"tree\":[[{\"address\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\",\"weight\":1},{\"address\":\"0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548\",\"weight\":1}],{\"address\":\"0x88A25Af00C5590a0583c7F4d994Ec87E5Cde0bA2\",\"weight\":1}]}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config update\\\"] }, { name: \\\"Sequence-Sessions-Wallet\\\", values: [\\\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0x3114b2Ede71533C3100842B62e3773e930989A1E\\\", \\\"0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548\\\", \\\"0x88A25Af00C5590a0583c7F4d994Ec87E5Cde0bA2\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"eip-712\\\", \\\"eth_sign\\\", \\\"erc-1271\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb4fbaa55a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:29 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=6,cfOrigin;dur=220", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "koCOMWdJBLCcnc0fzZurVvjw4i3Nn0rg5nRirg2TFixh", + "x-77-nzt-ray": "331b5e0fe1a2ac95a1d7df6936d7fc0c", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCI0VjZoTjI4M29XWW9WTFhwRGE5MGxIeTUtNEN0VmZFTlMzMjB4eXJobWxjIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"4V6hN283oWYoVLXpDa90lHy5-4CtVfENS320xyrhmlc\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x88A25Af00C5590a0583c7F4d994Ec87E5Cde0bA2\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x58d9ed51710c4e5de31ea3e486cbb6e45f204e9dd9a97ce49e354c19f12cf716\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xaa0482c0c3f36dc41941c9fde395fe7f77775353d7ace363df4f6a924cde404d\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000000100000004000400000000800100000000000100000002014\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJEX0huLUZETFJIeThORjFWN1BGOTI1dFlEZ3paSTVYWng2NFdDckhUd1ZzIl0sImluZGV4IjoxfQ==\",\"node\":{\"id\":\"D_Hn-FDLRHy8NF1V7PF925tYDgzZI5XZx64WCrHTwVs\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x58d9ed51710c4e5de31ea3e486cbb6e45f204e9dd9a97ce49e354c19f12cf716\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xaa0482c0c3f36dc41941c9fde395fe7f77775353d7ace363df4f6a924cde404d\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000000100000004000400000000800100000000000100000002014\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJGejRFQmo3V0xmVXEyVlZzRzJ0emxWb0ttODZLbU9YRGJVRi1qNm1kOWpzIl0sImluZGV4IjoyfQ==\",\"node\":{\"id\":\"Fz4EBj7WLfUq2VVsG2tzlVoKm86KmOXDbUF-j6md9js\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x7bab5d0f4f3f4087736b9dc8500202e73ece7eeb645abdd4ee3252fd2db6f6c3\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xe60a2df731c3eb8e237b88b8b7c13fd6d4b56b48496d1adce8cf29a572ce6487\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"6\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0008000180000400020000000000000000000109200008010000400000000000\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJfRWNTa3dxT3BSQTdRWjlGUndfSjRHVlQxVDdIYmVvelJ1RVU1UnRTTnlJIl0sImluZGV4IjozfQ==\",\"node\":{\"id\":\"_EcSkwqOpRA7QZ9FRw_J4GVT1T7HbeozRuEU5RtSNyI\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0xe842d9fea808a29c77e53e06e5cc78e122374ab5b0c2494e8a0baacd1b48b6a0\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"5\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000100100000005000400000000800100002000000000020000000\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJlMXhjRE1scnJMNTVBZ2ZVWDZ1MkdzNGRlcm1KeDZ0SnQtTjhWdnNmQ2ZNIl0sImluZGV4Ijo0fQ==\",\"node\":{\"id\":\"e1xcDMlrrL55AgfUX6u2Gs4dermJx6tJt-N8VvsfCfM\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x406a8fb3dee0ed7a025cc2bab7e1ac829b489b2e8692fea8f694bd3719b88eb5\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xd0dedc8b8e2407f4ca09d86b381a8da08e7e8fb551d5699f56a4daa6273bf13d\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x1000000502000000100000004000400000042800100000000000000000020000\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJsN1ZwTWJ3MV9nNEpNOU9XWHZYcHFneDlseVhlbGdVUldMVEQ0YVhKSmxvIl0sImluZGV4Ijo1fQ==\",\"node\":{\"id\":\"l7VpMbw1_g4JM9OWXvXpqgx9lyXelgURWLTD4aXJJlo\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x568723a41b651b52c87c0a9769243e76e02a6ebdfcf4ff89d551429deac205c2\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xe0d9a803e3dbd676c10cea040e6501b80d011a7acf3c6312d0aad291326862c5\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"4\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000000100000004000400080000800100000000000020000000100\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJ3NU54RFJ2a0VCaTJWeG5KZ2p6NS02d2RXUEF2X3ZDUjRoWkwtV0RIaHNNIl0sImluZGV4Ijo2fQ==\",\"node\":{\"id\":\"w5NxDRvkEBi2VxnJgjz5-6wdWPAv_vCR4hZL-WDHhsM\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0xe842d9fea808a29c77e53e06e5cc78e122374ab5b0c2494e8a0baacd1b48b6a0\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"5\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000100100000005000400000000800100002000000000020000000\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/Fz4EBj7WLfUq2VVsG2tzlVoKm86KmOXDbUF-j6md9js", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:gl4mTPi1DdVGbow10VFIzL14OgN2Y35fOYI2KgBElAU=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:29 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eth_sign", + "sequence-sessions-signer": "0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548", + "sequence-sessions-subdigest": "0x7bab5d0f4f3f4087736b9dc8500202e73ece7eeb645abdd4ee3252fd2db6f6c3", + "sequence-sessions-to-checkpoint": "6", + "sequence-sessions-to-config": "0xe60a2df731c3eb8e237b88b8b7c13fd6d4b56b48496d1adce8cf29a572ce6487", + "sequence-sessions-to-config-complete": "true", + "sequence-sessions-to-signers-bloom": "0x0008000180000400020000000000000000000109200008010000400000000000", + "sequence-sessions-to-signers-count": "3", + "sequence-sessions-type": "config update", + "sequence-sessions-wallet": "0x135769a58639b4Fa7d779a9df9B57A706FBCa816", + "sequence-sessions-witness": "false", + "server": "CDN77-Turbo", + "signature": "comm-dkuigffhmyx2wop753phvp2o56fbn2efe-i-orzwsre=:NRXf0YANg7WO0IyBzvdHidfMGeMiGG1dCE2VWRMnn2U=:, comm-fz4ebj7wlfuq2vvsg2tzlvokm86kmoxdbuf-j6md9js=:PIRkvIK56BiA3gNYpQ3Y6Iqqh7iwqYFutzjp5RF8sy1nr+/VlYKTI5npT/LFyyBv13laNRFXgAV2mCc9uzrH9Rw=:", + "signature-input": "comm-dkuigffhmyx2wop753phvp2o56fbn2efe-i-orzwsre=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-fz4ebj7wlfuq2vvsg2tzlvokm86kmoxdbuf-j6md9js=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmlnIHVwZGF0ZQ, 10:Sequence-Sessions-Major-Version:Mg, 11:Sequence-Sessions-To-Config:MHhlNjBhMmRmNzMxYzNlYjhlMjM3Yjg4YjhiN2MxM2ZkNmQ0YjU2YjQ4NDk2ZDFhZGNlOGNmMjlhNTcyY2U2NDg3, 12:Sequence-Sessions-To-Checkpoint:Ng, 13:Sequence-Sessions-To-Config-Complete:dHJ1ZQ, 14:Sequence-Sessions-To-Signers-Count:Mw, 15:Sequence-Sessions-To-Signers-Bloom:MHgwMDA4MDAwMTgwMDAwNDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMTA5MjAwMDA4MDEwMDAwNDAwMDAwMDAwMDAw, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZXRoX3NpZ24, 5:Sequence-Sessions-Signer:MHhiMjBFOWZmMzFBNzUxOTBCNUFhMjVmRmZhZTY0NkFGNzgyMUQ0NTQ4, 6:Sequence-Sessions-Subdigest:MHg3YmFiNWQwZjRmM2Y0MDg3NzM2YjlkYzg1MDAyMDJlNzNlY2U3ZWViNjQ1YWJkZDRlZTMyNTJmZDJkYjZmNmMz, 7:Sequence-Sessions-Wallet:MHgxMzU3NjlhNTg2MzliNEZhN2Q3NzlhOWRmOUI1N0E3MDZGQkNhODE2, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:ZmFsc2U\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "ktuYrhp0DCHMjpvuQl6ghF489ixAO0MeTI6HIQ6uRTrrdrCatQ", + "x-77-nzt-ray": "8705ec34b6d394d7a1d7df693595b823", + "x-77-pop": "newyorkUSNY" + }, + "body": "0xd74d840a07de51b5012bc94fcf3a7715bfa1b7845b2674874a71bef4a7f3cd261eb75136e3eadfe33931302452d1cccca8819e3f0615fb36ba71aaeb8465b7051c" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/_EcSkwqOpRA7QZ9FRw_J4GVT1T7HbeozRuEU5RtSNyI", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:VBsXK1M8uZVlxPKBBimHHRZfzcKY+OP9ht9pd1e8OYY=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:29 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eth_sign", + "sequence-sessions-signer": "0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548", + "sequence-sessions-subdigest": "0xe842d9fea808a29c77e53e06e5cc78e122374ab5b0c2494e8a0baacd1b48b6a0", + "sequence-sessions-to-checkpoint": "5", + "sequence-sessions-to-config": "0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930", + "sequence-sessions-to-config-complete": "true", + "sequence-sessions-to-signers-bloom": "0x0000000502000100100000005000400000000800100002000000000020000000", + "sequence-sessions-to-signers-count": "3", + "sequence-sessions-type": "config update", + "sequence-sessions-wallet": "0x135769a58639b4Fa7d779a9df9B57A706FBCa816", + "sequence-sessions-witness": "true", + "server": "CDN77-Turbo", + "signature": "comm-_ecskwqopra7qz9frw_j4gvt1t7hbeozrueu5rtsnyi=:mSJ7Wfbo2CDWKJ4Tc2PdmncNyLqy1ejvND6aZGdduvsmhVqizKMuM4rAWyFb38VxYD5NmaBz584iSsTvEzsHZRs=:, comm-sqp56wurfwh57gj_yhzmnwcwrflfaznkcus5vu0is28=:iX5RbPW4qPV3vnOamVp087pHbC3RE4Ux1daDnGuT6W0=:", + "signature-input": "comm-_ecskwqopra7qz9frw_j4gvt1t7hbeozrueu5rtsnyi=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmlnIHVwZGF0ZQ, 10:Sequence-Sessions-Major-Version:Mg, 11:Sequence-Sessions-To-Config:MHhhN2I0YzgxZjhjZTVkMjlkZDFiYjgzZTE4OGUwMzlkYjA4ZTM5YTNjNGRlNzA2ZjEwODI3NTU2ZmI0NGE2OTMw, 12:Sequence-Sessions-To-Checkpoint:NQ, 13:Sequence-Sessions-To-Config-Complete:dHJ1ZQ, 14:Sequence-Sessions-To-Signers-Count:Mw, 15:Sequence-Sessions-To-Signers-Bloom:MHgwMDAwMDAwNTAyMDAwMTAwMTAwMDAwMDA1MDAwNDAwMDAwMDAwODAwMTAwMDAyMDAwMDAwMDAwMDIwMDAwMDAw, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZXRoX3NpZ24, 5:Sequence-Sessions-Signer:MHhiMjBFOWZmMzFBNzUxOTBCNUFhMjVmRmZhZTY0NkFGNzgyMUQ0NTQ4, 6:Sequence-Sessions-Subdigest:MHhlODQyZDlmZWE4MDhhMjljNzdlNTNlMDZlNWNjNzhlMTIyMzc0YWI1YjBjMjQ5NGU4YTBiYWFjZDFiNDhiNmEw, 7:Sequence-Sessions-Wallet:MHgxMzU3NjlhNTg2MzliNEZhN2Q3NzlhOWRmOUI1N0E3MDZGQkNhODE2, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:dHJ1ZQ\", comm-sqp56wurfwh57gj_yhzmnwcwrflfaznkcus5vu0is28=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kjf1MaCVro4tzO8Y+rtRj2DW+I0WgSG8mxMPrsRr+jU5xYziGg", + "x-77-nzt-ray": "3f9f13256fea358aa1d7df69c155482d", + "x-77-pop": "newyorkUSNY" + }, + "body": "0x116bea5f536c7745117315baef9743ed6e9bd0bb4d6b0e0dcba7fffdab393a2a50ae10f526151f937cdf8fe67f6b2199e6127e4637017bc056dd7f08d959e0981b" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/w5NxDRvkEBi2VxnJgjz5-6wdWPAv_vCR4hZL-WDHhsM", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:2ZuMVXKr8u5m20NWLWAyvvaN1rrF5LETVZPHv5u2sIw=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:29 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eth_sign", + "sequence-sessions-signer": "0x3114b2Ede71533C3100842B62e3773e930989A1E", + "sequence-sessions-subdigest": "0xe842d9fea808a29c77e53e06e5cc78e122374ab5b0c2494e8a0baacd1b48b6a0", + "sequence-sessions-to-checkpoint": "5", + "sequence-sessions-to-config": "0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930", + "sequence-sessions-to-config-complete": "true", + "sequence-sessions-to-signers-bloom": "0x0000000502000100100000005000400000000800100002000000000020000000", + "sequence-sessions-to-signers-count": "3", + "sequence-sessions-type": "config update", + "sequence-sessions-wallet": "0x135769a58639b4Fa7d779a9df9B57A706FBCa816", + "sequence-sessions-witness": "false", + "server": "CDN77-Turbo", + "signature": "comm-1lo1olkgrwhm3l5m_kzswkx4op49pdu_cddhrgaemdk=:DkOaOPc1X07fP3Pm80/Ic3FVqDNdqR6GoLK8eO0zwqA=:, comm-w5nxdrvkebi2vxnjgjz5-6wdwpav_vcr4hzl-wdhhsm=:lP/eLayDbnw09wD2+CDqLmugY5DxoBNt5A64ljWv+wAKZNuM6Qy9UJCE4OdLW58tpetZenD2nUBdfl3duCs0oRs=:", + "signature-input": "comm-1lo1olkgrwhm3l5m_kzswkx4op49pdu_cddhrgaemdk=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-w5nxdrvkebi2vxnjgjz5-6wdwpav_vcr4hzl-wdhhsm=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmlnIHVwZGF0ZQ, 10:Sequence-Sessions-Major-Version:Mg, 11:Sequence-Sessions-To-Config:MHhhN2I0YzgxZjhjZTVkMjlkZDFiYjgzZTE4OGUwMzlkYjA4ZTM5YTNjNGRlNzA2ZjEwODI3NTU2ZmI0NGE2OTMw, 12:Sequence-Sessions-To-Checkpoint:NQ, 13:Sequence-Sessions-To-Config-Complete:dHJ1ZQ, 14:Sequence-Sessions-To-Signers-Count:Mw, 15:Sequence-Sessions-To-Signers-Bloom:MHgwMDAwMDAwNTAyMDAwMTAwMTAwMDAwMDA1MDAwNDAwMDAwMDAwODAwMTAwMDAyMDAwMDAwMDAwMDIwMDAwMDAw, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZXRoX3NpZ24, 5:Sequence-Sessions-Signer:MHgzMTE0YjJFZGU3MTUzM0MzMTAwODQyQjYyZTM3NzNlOTMwOTg5QTFF, 6:Sequence-Sessions-Subdigest:MHhlODQyZDlmZWE4MDhhMjljNzdlNTNlMDZlNWNjNzhlMTIyMzc0YWI1YjBjMjQ5NGU4YTBiYWFjZDFiNDhiNmEw, 7:Sequence-Sessions-Wallet:MHgxMzU3NjlhNTg2MzliNEZhN2Q3NzlhOWRmOUI1N0E3MDZGQkNhODE2, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:ZmFsc2U\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kvh3BkK8TrK1nTICmKayfCCRR1hM+1BYVjHoi6xwQVy0WElnJA", + "x-77-nzt-ray": "8705ec341a2987e1a1d7df69ca29e131", + "x-77-pop": "newyorkUSNY" + }, + "body": "0x72830470d9a9a8f28d3f7554dae9806e14f34f75ffdc8cdff62f691566ff3bb3084ff61967f0180f0c7cb56c860a97cad1c810894becfae50768e1425486d3f31c" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config\\\"] }, { name: \\\"Sequence-Sessions-Config\\\", values: [\\\"0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb542e345a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:30 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=8,cfOrigin;dur=207", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "khIGCL18wor0fRfALbLVb+Dna3rNs5tWWmLEe9up1Eoj", + "x-77-nzt-ray": "331b5e0fe1a2ac95a1d7df6975d36337", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJPNlFyTWV3VDhhWkpNQ0djNjBCSjlxQ3d1QTI5ME5RaUYwTnBreEhDNVk4Il0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"O6QrMewT8aZJMCGc60BJ9qCwuA290NQiF0NpkxHC5Y8\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Config\",\"value\":\"0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930\"},{\"name\":\"Sequence-Sessions-Version\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Signers-Bloom\",\"value\":\"0x0000000502000100100000005000400000000800100002000000000020000000\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/O6QrMewT8aZJMCGc60BJ9qCwuA290NQiF0NpkxHC5Y8", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:lOaTY4n1aPuJ6aIVdvkExjh8xxlEMMzle3itHhyVcqQ=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:30 GMT", + "sequence-sessions-complete": "true", + "sequence-sessions-config": "0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signers-bloom": "0x0000000502000100100000005000400000000800100002000000000020000000", + "sequence-sessions-signers-count": "3", + "sequence-sessions-type": "config", + "sequence-sessions-version": "3", + "server": "CDN77-Turbo", + "signature": "comm-eq9xeugrr-8aivbdkcqvhhnrput45awkg5fu2w7n2bs=:bf/sXvC3hyBe+2Svwtz166VEvDFznyNqUtUiphysPzI=:, comm-o6qrmewt8azjmcgc60bj9qcwua290nqif0npkxhc5y8=:76kyiO7vdyBjhrDD7pMGU8GLU6xxEWc7E0sTjzPPVbZJWnDBWvIZs84oaBEjgl+WU2EkL41oyLGiM2f2QfFEDBw=:", + "signature-input": "comm-eq9xeugrr-8aivbdkcqvhhnrput45awkg5fu2w7n2bs=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-o6qrmewt8azjmcgc60bj9qcwua290nqif0npkxhc5y8=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmln, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:MA, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Config:MHhhN2I0YzgxZjhjZTVkMjlkZDFiYjgzZTE4OGUwMzlkYjA4ZTM5YTNjNGRlNzA2ZjEwODI3NTU2ZmI0NGE2OTMw, 6:Sequence-Sessions-Version:Mw, 7:Sequence-Sessions-Complete:dHJ1ZQ, 8:Sequence-Sessions-Signers-Count:Mw, 9:Sequence-Sessions-Signers-Bloom:MHgwMDAwMDAwNTAyMDAwMTAwMTAwMDAwMDA1MDAwNDAwMDAwMDAwODAwMTAwMDAyMDAwMDAwMDAwMDIwMDAwMDAw\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "ks4H+fRU5lxCmKBu64MCm0ROK5j1onKuklVRaCW11n86PbgNyg", + "x-77-nzt-ray": "f03d06130872167ba2d7df6903120c12", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"checkpoint\":\"5\",\"threshold\":2,\"tree\":[[{\"address\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\",\"weight\":1},{\"address\":\"0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548\",\"weight\":1}],{\"address\":\"0xDbbF0590A29c203D15dbc462CE2ceF43C8210fB4\",\"weight\":1}]}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config update\\\"] }, { name: \\\"Sequence-Sessions-Wallet\\\", values: [\\\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0x3114b2Ede71533C3100842B62e3773e930989A1E\\\", \\\"0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548\\\", \\\"0xDbbF0590A29c203D15dbc462CE2ceF43C8210fB4\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"eip-712\\\", \\\"eth_sign\\\", \\\"erc-1271\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb5708f35a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:30 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=6,cfOrigin;dur=226", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kjXn2kmQkyX8246oMcLumt2q+Ue5i54AU4j/EPpLph+d", + "x-77-nzt-ray": "331b5e0fe1a2ac95a2d7df6903837317", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJEX0huLUZETFJIeThORjFWN1BGOTI1dFlEZ3paSTVYWng2NFdDckhUd1ZzIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"D_Hn-FDLRHy8NF1V7PF925tYDgzZI5XZx64WCrHTwVs\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x58d9ed51710c4e5de31ea3e486cbb6e45f204e9dd9a97ce49e354c19f12cf716\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xaa0482c0c3f36dc41941c9fde395fe7f77775353d7ace363df4f6a924cde404d\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000000100000004000400000000800100000000000100000002014\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJGejRFQmo3V0xmVXEyVlZzRzJ0emxWb0ttODZLbU9YRGJVRi1qNm1kOWpzIl0sImluZGV4IjoxfQ==\",\"node\":{\"id\":\"Fz4EBj7WLfUq2VVsG2tzlVoKm86KmOXDbUF-j6md9js\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x7bab5d0f4f3f4087736b9dc8500202e73ece7eeb645abdd4ee3252fd2db6f6c3\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xe60a2df731c3eb8e237b88b8b7c13fd6d4b56b48496d1adce8cf29a572ce6487\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"6\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0008000180000400020000000000000000000109200008010000400000000000\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJSSnlvbnFmZGtfeDU2a0JZVjhvdDNxYWRFa1BQcE5JSlBjVDNJcTR0U3lFIl0sImluZGV4IjoyfQ==\",\"node\":{\"id\":\"RJyonqfdk_x56kBYV8ot3qadEkPPpNIJPcT3Iq4tSyE\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xDbbF0590A29c203D15dbc462CE2ceF43C8210fB4\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x7bab5d0f4f3f4087736b9dc8500202e73ece7eeb645abdd4ee3252fd2db6f6c3\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xe60a2df731c3eb8e237b88b8b7c13fd6d4b56b48496d1adce8cf29a572ce6487\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"6\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0008000180000400020000000000000000000109200008010000400000000000\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJfRWNTa3dxT3BSQTdRWjlGUndfSjRHVlQxVDdIYmVvelJ1RVU1UnRTTnlJIl0sImluZGV4IjozfQ==\",\"node\":{\"id\":\"_EcSkwqOpRA7QZ9FRw_J4GVT1T7HbeozRuEU5RtSNyI\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xb20E9ff31A75190B5Aa25fFfae646AF7821D4548\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0xe842d9fea808a29c77e53e06e5cc78e122374ab5b0c2494e8a0baacd1b48b6a0\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"5\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000100100000005000400000000800100002000000000020000000\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJlMXhjRE1scnJMNTVBZ2ZVWDZ1MkdzNGRlcm1KeDZ0SnQtTjhWdnNmQ2ZNIl0sImluZGV4Ijo0fQ==\",\"node\":{\"id\":\"e1xcDMlrrL55AgfUX6u2Gs4dermJx6tJt-N8VvsfCfM\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x406a8fb3dee0ed7a025cc2bab7e1ac829b489b2e8692fea8f694bd3719b88eb5\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xd0dedc8b8e2407f4ca09d86b381a8da08e7e8fb551d5699f56a4daa6273bf13d\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x1000000502000000100000004000400000042800100000000000000000020000\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJsN1ZwTWJ3MV9nNEpNOU9XWHZYcHFneDlseVhlbGdVUldMVEQ0YVhKSmxvIl0sImluZGV4Ijo1fQ==\",\"node\":{\"id\":\"l7VpMbw1_g4JM9OWXvXpqgx9lyXelgURWLTD4aXJJlo\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x568723a41b651b52c87c0a9769243e76e02a6ebdfcf4ff89d551429deac205c2\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xe0d9a803e3dbd676c10cea040e6501b80d011a7acf3c6312d0aad291326862c5\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"4\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000000100000004000400080000800100000000000020000000100\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJ3NU54RFJ2a0VCaTJWeG5KZ2p6NS02d2RXUEF2X3ZDUjRoWkwtV0RIaHNNIl0sImluZGV4Ijo2fQ==\",\"node\":{\"id\":\"w5NxDRvkEBi2VxnJgjz5-6wdWPAv_vCR4hZL-WDHhsM\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x3114b2Ede71533C3100842B62e3773e930989A1E\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0xe842d9fea808a29c77e53e06e5cc78e122374ab5b0c2494e8a0baacd1b48b6a0\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xa7b4c81f8ce5d29dd1bb83e188e039db08e39a3c4de706f10827556fb44a6930\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"5\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000502000100100000005000400000000800100002000000000020000000\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/RJyonqfdk_x56kBYV8ot3qadEkPPpNIJPcT3Iq4tSyE", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:PEukna0+GD2hJOvo/DIg/ImTk2ZUTgAFkHUxpkl/mMk=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:30 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eth_sign", + "sequence-sessions-signer": "0xDbbF0590A29c203D15dbc462CE2ceF43C8210fB4", + "sequence-sessions-subdigest": "0x7bab5d0f4f3f4087736b9dc8500202e73ece7eeb645abdd4ee3252fd2db6f6c3", + "sequence-sessions-to-checkpoint": "6", + "sequence-sessions-to-config": "0xe60a2df731c3eb8e237b88b8b7c13fd6d4b56b48496d1adce8cf29a572ce6487", + "sequence-sessions-to-config-complete": "true", + "sequence-sessions-to-signers-bloom": "0x0008000180000400020000000000000000000109200008010000400000000000", + "sequence-sessions-to-signers-count": "3", + "sequence-sessions-type": "config update", + "sequence-sessions-wallet": "0x135769a58639b4Fa7d779a9df9B57A706FBCa816", + "sequence-sessions-witness": "true", + "server": "CDN77-Turbo", + "signature": "comm-fsvleswb_4wzsytpfbpcqjcck-uidvwsfoyzyhistd8=:4fue3tEjvSRint0i8SzqRVqnTcIuPVaFvXmjdXoAp/E=:, comm-rjyonqfdk_x56kbyv8ot3qadekpppnijpct3iq4tsye=:xybXj2uxTejbwNwuYv6CMlz07SZCHDc8v5Vo6zhGgm8bckzYbIdpas31XHDzBB7w4tjo9cyzUzt3ez3JFLBQQRs=:", + "signature-input": "comm-fsvleswb_4wzsytpfbpcqjcck-uidvwsfoyzyhistd8=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-rjyonqfdk_x56kbyv8ot3qadekpppnijpct3iq4tsye=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmlnIHVwZGF0ZQ, 10:Sequence-Sessions-Major-Version:Mg, 11:Sequence-Sessions-To-Config:MHhlNjBhMmRmNzMxYzNlYjhlMjM3Yjg4YjhiN2MxM2ZkNmQ0YjU2YjQ4NDk2ZDFhZGNlOGNmMjlhNTcyY2U2NDg3, 12:Sequence-Sessions-To-Checkpoint:Ng, 13:Sequence-Sessions-To-Config-Complete:dHJ1ZQ, 14:Sequence-Sessions-To-Signers-Count:Mw, 15:Sequence-Sessions-To-Signers-Bloom:MHgwMDA4MDAwMTgwMDAwNDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMTA5MjAwMDA4MDEwMDAwNDAwMDAwMDAwMDAw, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZXRoX3NpZ24, 5:Sequence-Sessions-Signer:MHhEYmJGMDU5MEEyOWMyMDNEMTVkYmM0NjJDRTJjZUY0M0M4MjEwZkI0, 6:Sequence-Sessions-Subdigest:MHg3YmFiNWQwZjRmM2Y0MDg3NzM2YjlkYzg1MDAyMDJlNzNlY2U3ZWViNjQ1YWJkZDRlZTMyNTJmZDJkYjZmNmMz, 7:Sequence-Sessions-Wallet:MHgxMzU3NjlhNTg2MzliNEZhN2Q3NzlhOWRmOUI1N0E3MDZGQkNhODE2, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:dHJ1ZQ\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kspqVXqy0lxAq0Exzh68cxy5isFudoM5KH6a2vuaSHHeX+netw", + "x-77-nzt-ray": "8705ec347811ca07a2d7df691ca6912f", + "x-77-pop": "newyorkUSNY" + }, + "body": "0xecd8bcb73872ad91461bba93b42b363b7048d61bc29c813ef890ae5904cb5a0b3ad5796934d1c54bac5ee162dbe9acf2ad16cb34e656b4e6c3cc1880c151cf1b1c" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config\\\"] }, { name: \\\"Sequence-Sessions-Config\\\", values: [\\\"0xe60a2df731c3eb8e237b88b8b7c13fd6d4b56b48496d1adce8cf29a572ce6487\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb5a2bb75a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:31 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=5,cfOrigin;dur=185", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "ko5mQ8om74otrj47od4kQf7P4MGlI39VvitW/gEGOscM", + "x-77-nzt-ray": "331b5e0fe1a2ac95a2d7df690ddf0835", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCItQjRuenQ5blBYOGYtUVFGSlZVVXkzNlctamxrcjFSR1F3S3UxcjZ3WFowIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"-B4nzt9nPX8f-QQFJVUUy36W-jlkr1RGQwKu1r6wXZ0\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Config\",\"value\":\"0xe60a2df731c3eb8e237b88b8b7c13fd6d4b56b48496d1adce8cf29a572ce6487\"},{\"name\":\"Sequence-Sessions-Version\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Signers-Bloom\",\"value\":\"0x0008000180000400020000000000000000000109200008010000400000000000\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/-B4nzt9nPX8f-QQFJVUUy36W-jlkr1RGQwKu1r6wXZ0", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:ksByouZ0PZUghZHHFzg2DenqCafpnya2RRPuydP3cGk=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:31 GMT", + "sequence-sessions-complete": "true", + "sequence-sessions-config": "0xe60a2df731c3eb8e237b88b8b7c13fd6d4b56b48496d1adce8cf29a572ce6487", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signers-bloom": "0x0008000180000400020000000000000000000109200008010000400000000000", + "sequence-sessions-signers-count": "3", + "sequence-sessions-type": "config", + "sequence-sessions-version": "3", + "server": "CDN77-Turbo", + "signature": "comm--b4nzt9npx8f-qqfjvuuy36w-jlkr1rgqwku1r6wxz0=:tzZO2MoXIqZXnZvr1LXRRtCxCUQrFr5WWrl1Cnek9EM1owGM3nJ2cFoNDwamyCuLRCuyb3PbuMtadAARRgwvZxw=:, comm-7u-kon49dtsoauudnzs8fdrc6yo-vilu7sanv6dwqp4=:kYXPoiF9pt7xSqMyHiBPnetFHt4iwZJR9edbkLvVhtM=:", + "signature-input": "comm--b4nzt9npx8f-qqfjvuuy36w-jlkr1rgqwku1r6wxz0=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmln, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:MA, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Config:MHhlNjBhMmRmNzMxYzNlYjhlMjM3Yjg4YjhiN2MxM2ZkNmQ0YjU2YjQ4NDk2ZDFhZGNlOGNmMjlhNTcyY2U2NDg3, 6:Sequence-Sessions-Version:Mw, 7:Sequence-Sessions-Complete:dHJ1ZQ, 8:Sequence-Sessions-Signers-Count:Mw, 9:Sequence-Sessions-Signers-Bloom:MHgwMDA4MDAwMTgwMDAwNDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMTA5MjAwMDA4MDEwMDAwNDAwMDAwMDAwMDAw\", comm-7u-kon49dtsoauudnzs8fdrc6yo-vilu7sanv6dwqp4=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"hmac-sha256\";keyid=\"constant:ao\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "ksmw8yXPXCv/QiVuFuJA0fM39DGJpQOz6gS2rTgGTcOlG2IHSw", + "x-77-nzt-ray": "3f9f13251bfbd5cea3d7df69ce140a0f", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"checkpoint\":\"6\",\"threshold\":1,\"tree\":[[{\"address\":\"0x8534Cb5487E769e510c5F71b790B2ca02D1819a0\",\"weight\":1},{\"address\":\"0x07a87DC7616F121951e81A997D32eD03c3856607\",\"weight\":1}],{\"address\":\"0x49FcA172d48f43f8e8E45685C1581D9aB14F9FAE\",\"weight\":1}]}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config update\\\"] }, { name: \\\"Sequence-Sessions-Wallet\\\", values: [\\\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0x8534Cb5487E769e510c5F71b790B2ca02D1819a0\\\", \\\"0x07a87DC7616F121951e81A997D32eD03c3856607\\\", \\\"0x49FcA172d48f43f8e8E45685C1581D9aB14F9FAE\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"eip-712\\\", \\\"eth_sign\\\", \\\"erc-1271\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb5cddd05a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:31 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=6,cfOrigin;dur=206", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kqPYwNmgDa7sX+6+d24x+6w0D4GaaBcyrq2OrEckWBl/", + "x-77-nzt-ray": "331b5e0fe1a2ac95a3d7df6939d52113", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJLYzd0MGNBWVZUc0o5b0FiZHF4aXlPaTV1MFpaLUF2TGZ4WXJkZUdKVUJRIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"Kc7t0cAYVTsJ9oAbdqxiyOi5u0ZZ-AvLfxYrdeGJUBQ\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x8534Cb5487E769e510c5F71b790B2ca02D1819a0\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x1debc90c68f232310b434b7fc8a672fb7aebe95422ad426707ec1d1e03fe0b89\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xd430d9d056a14a874c22b86246902a60f4b25573fbe998f1148a7e193edf69ae\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"8\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000000000000000000000020000004600100008100000000003000002010\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJzM1BWUVpZV2dDN2VJNHJNTTNRN2RaZEEzUWtzYURrV0JiSU5mU21EV0tZIl0sImluZGV4IjoxfQ==\",\"node\":{\"id\":\"s3PVQZYWgC7eI4rMM3Q7dZdA3QksaDkWBbINfSmDWKY\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x49FcA172d48f43f8e8E45685C1581D9aB14F9FAE\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0xbe193096e90de1cbeea21495f3c246168a715f7d34a3bcecc7852019e0784856\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0x6a484f49f59ea0d5d9134ac92bf36ccf0f06a15030e07624f576b4294a5fdd7c\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"7\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x000800019000000002000002000000000000010020000c010000000001000000\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJ4TTdfN1hQbUNWVUxHNElMYWk0dUZmcEFoU2VQcEN1cjJWQS1hNVNDYmVvIl0sImluZGV4IjoyfQ==\",\"node\":{\"id\":\"xM7_7XPmCVULG4ILai4uFfpAhSePpCur2VA-a5SCbeo\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x07a87DC7616F121951e81A997D32eD03c3856607\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x1debc90c68f232310b434b7fc8a672fb7aebe95422ad426707ec1d1e03fe0b89\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xd430d9d056a14a874c22b86246902a60f4b25573fbe998f1148a7e193edf69ae\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"8\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000000000000000000000020000004600100008100000000003000002010\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/xM7_7XPmCVULG4ILai4uFfpAhSePpCur2VA-a5SCbeo", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:3CJOMRYcb9BRY+qlR4qHnRoD+o7cCstWySxk6xTFYes=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:31 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eth_sign", + "sequence-sessions-signer": "0x07a87DC7616F121951e81A997D32eD03c3856607", + "sequence-sessions-subdigest": "0x1debc90c68f232310b434b7fc8a672fb7aebe95422ad426707ec1d1e03fe0b89", + "sequence-sessions-to-checkpoint": "8", + "sequence-sessions-to-config": "0xd430d9d056a14a874c22b86246902a60f4b25573fbe998f1148a7e193edf69ae", + "sequence-sessions-to-config-complete": "true", + "sequence-sessions-to-signers-bloom": "0x0000000000000000000000000020000004600100008100000000003000002010", + "sequence-sessions-to-signers-count": "3", + "sequence-sessions-type": "config update", + "sequence-sessions-wallet": "0x135769a58639b4Fa7d779a9df9B57A706FBCa816", + "sequence-sessions-witness": "true", + "server": "CDN77-Turbo", + "signature": "comm-f7rp8sdytpirgwvoy_bpvzninwx3fe32tw36amj0jxc=:5LC5m46+2oi/xeTp/QMdclEzludnK+ISrSmWazfO6kA=:, comm-xm7_7xpmcvulg4ilai4uffpahseppcur2va-a5scbeo=:BArCNITJliJDJrORialbgBAEjuKKGCM8y1NIJY3EoGY5uo00kzl0BohEUiN0znskgXjuQsm3Cd/msMtsOWsfrRw=:", + "signature-input": "comm-f7rp8sdytpirgwvoy_bpvzninwx3fe32tw36amj0jxc=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-xm7_7xpmcvulg4ilai4uffpahseppcur2va-a5scbeo=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmlnIHVwZGF0ZQ, 10:Sequence-Sessions-Major-Version:Mg, 11:Sequence-Sessions-To-Config:MHhkNDMwZDlkMDU2YTE0YTg3NGMyMmI4NjI0NjkwMmE2MGY0YjI1NTczZmJlOTk4ZjExNDhhN2UxOTNlZGY2OWFl, 12:Sequence-Sessions-To-Checkpoint:OA, 13:Sequence-Sessions-To-Config-Complete:dHJ1ZQ, 14:Sequence-Sessions-To-Signers-Count:Mw, 15:Sequence-Sessions-To-Signers-Bloom:MHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDA0NjAwMTAwMDA4MTAwMDAwMDAwMDAzMDAwMDAyMDEw, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZXRoX3NpZ24, 5:Sequence-Sessions-Signer:MHgwN2E4N0RDNzYxNkYxMjE5NTFlODFBOTk3RDMyZUQwM2MzODU2NjA3, 6:Sequence-Sessions-Subdigest:MHgxZGViYzkwYzY4ZjIzMjMxMGI0MzRiN2ZjOGE2NzJmYjdhZWJlOTU0MjJhZDQyNjcwN2VjMWQxZTAzZmUwYjg5, 7:Sequence-Sessions-Wallet:MHgxMzU3NjlhNTg2MzliNEZhN2Q3NzlhOWRmOUI1N0E3MDZGQkNhODE2, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:dHJ1ZQ\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kqNwqjfqmGocmde0Peb+pShGFRd1tnyeV8b+67b+/1QX0h+s7Q", + "x-77-nzt-ray": "3f9f1325f7fba7e2a3d7df698817de28", + "x-77-pop": "newyorkUSNY" + }, + "body": "0x5937db592a0799449fb2442eed3932ce32f2cef81ce8c359cbda05f8288da27f2fc09a0f17005e8c1fbd27ac58b47046c4feebf1278783c12f64fa0ab9ae12441c" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/Kc7t0cAYVTsJ9oAbdqxiyOi5u0ZZ-AvLfxYrdeGJUBQ", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:9d4wu0YAdl5mfAKuEkIXHdXO6uCAQkxgneeV3Zr9+9s=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:31 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eth_sign", + "sequence-sessions-signer": "0x8534Cb5487E769e510c5F71b790B2ca02D1819a0", + "sequence-sessions-subdigest": "0x1debc90c68f232310b434b7fc8a672fb7aebe95422ad426707ec1d1e03fe0b89", + "sequence-sessions-to-checkpoint": "8", + "sequence-sessions-to-config": "0xd430d9d056a14a874c22b86246902a60f4b25573fbe998f1148a7e193edf69ae", + "sequence-sessions-to-config-complete": "true", + "sequence-sessions-to-signers-bloom": "0x0000000000000000000000000020000004600100008100000000003000002010", + "sequence-sessions-to-signers-count": "3", + "sequence-sessions-type": "config update", + "sequence-sessions-wallet": "0x135769a58639b4Fa7d779a9df9B57A706FBCa816", + "sequence-sessions-witness": "true", + "server": "CDN77-Turbo", + "signature": "comm-2vhls37zqgon56ymq8tdapyh9dstpdixgd4yj-ittvu=:7VBwLsBh2Nn/42bwA0auDaeX6MwAD69evUz2q/00XPA=:, comm-kc7t0cayvtsj9oabdqxiyoi5u0zz-avlfxyrdegjubq=:4hG3iejxTU/Pph3BhyXkYkIT+WdnA2+ew9pW/8gFD6ZRK+/cieu2hIpQYFY0nmFneJqNkpK5a7yvEjsbXzMdQBw=:", + "signature-input": "comm-2vhls37zqgon56ymq8tdapyh9dstpdixgd4yj-ittvu=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-kc7t0cayvtsj9oabdqxiyoi5u0zz-avlfxyrdegjubq=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmlnIHVwZGF0ZQ, 10:Sequence-Sessions-Major-Version:Mg, 11:Sequence-Sessions-To-Config:MHhkNDMwZDlkMDU2YTE0YTg3NGMyMmI4NjI0NjkwMmE2MGY0YjI1NTczZmJlOTk4ZjExNDhhN2UxOTNlZGY2OWFl, 12:Sequence-Sessions-To-Checkpoint:OA, 13:Sequence-Sessions-To-Config-Complete:dHJ1ZQ, 14:Sequence-Sessions-To-Signers-Count:Mw, 15:Sequence-Sessions-To-Signers-Bloom:MHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDA0NjAwMTAwMDA4MTAwMDAwMDAwMDAzMDAwMDAyMDEw, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZXRoX3NpZ24, 5:Sequence-Sessions-Signer:MHg4NTM0Q2I1NDg3RTc2OWU1MTBjNUY3MWI3OTBCMmNhMDJEMTgxOWEw, 6:Sequence-Sessions-Subdigest:MHgxZGViYzkwYzY4ZjIzMjMxMGI0MzRiN2ZjOGE2NzJmYjdhZWJlOTU0MjJhZDQyNjcwN2VjMWQxZTAzZmUwYjg5, 7:Sequence-Sessions-Wallet:MHgxMzU3NjlhNTg2MzliNEZhN2Q3NzlhOWRmOUI1N0E3MDZGQkNhODE2, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:dHJ1ZQ\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "knuK0dh8qHZJ1pa87ng+NmZAC5z178BwWKJB6obyHUru32Zq6A", + "x-77-nzt-ray": "3f9f1325f7fb6de3a3d7df69a61c8a2a", + "x-77-pop": "newyorkUSNY" + }, + "body": "0xe375fd12b814b897838f13daf9e36bd9d66c78d606580b7822c1364ae2c56ca2387ca29afec44adba341c80b4a0b45c072087043cd123ad084c7d57ba6b4d0721c" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config\\\"] }, { name: \\\"Sequence-Sessions-Config\\\", values: [\\\"0xd430d9d056a14a874c22b86246902a60f4b25573fbe998f1148a7e193edf69ae\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb5fd84a5a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:31 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=6,cfOrigin;dur=150", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kuNvMAojgQ/yrO7l7csjoJWNJKVsJ2PuiCBCpJs68no5", + "x-77-nzt-ray": "331b5e0fe1a2ac95a3d7df69c404cc2f", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCIwMzNDeFAxLXplTmRMeTJ4X2dzbGlmRjZ1U2I5SS1EVng5b2RXcGFOYzljIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"033CxP1-zeNdLy2x_gslifF6uSb9I-DVx9odWpaNc9c\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Config\",\"value\":\"0xd430d9d056a14a874c22b86246902a60f4b25573fbe998f1148a7e193edf69ae\"},{\"name\":\"Sequence-Sessions-Version\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Signers-Bloom\",\"value\":\"0x0000000000000000000000000020000004600100008100000000003000002010\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/033CxP1-zeNdLy2x_gslifF6uSb9I-DVx9odWpaNc9c", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:pR1drysB449OQBdWWWfOfHQnU3tlTDtrhl+v9ns8yGk=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:32 GMT", + "sequence-sessions-complete": "true", + "sequence-sessions-config": "0xd430d9d056a14a874c22b86246902a60f4b25573fbe998f1148a7e193edf69ae", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signers-bloom": "0x0000000000000000000000000020000004600100008100000000003000002010", + "sequence-sessions-signers-count": "3", + "sequence-sessions-type": "config", + "sequence-sessions-version": "3", + "server": "CDN77-Turbo", + "signature": "comm-033cxp1-zendly2x_gsliff6usb9i-dvx9odwpanc9c=:jlvjFuDF312zUk/2peb5tOw5rrK43A3JH+LhrpiakgZa4uY4Q/Wlea3PUolzDLIMgCfIywbxyUlmpcAHX8tmLRs=:, comm-4kmu9zanvxaovs_arucd0j5fseiwphsln5kdzm_mpba=:il2HPBkL+GNyvIbm9yeo5XLbdLLCFjcxJEEhEntxLCg=:", + "signature-input": "comm-033cxp1-zendly2x_gsliff6usb9i-dvx9odwpanc9c=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmln, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:MA, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Config:MHhkNDMwZDlkMDU2YTE0YTg3NGMyMmI4NjI0NjkwMmE2MGY0YjI1NTczZmJlOTk4ZjExNDhhN2UxOTNlZGY2OWFl, 6:Sequence-Sessions-Version:Mw, 7:Sequence-Sessions-Complete:dHJ1ZQ, 8:Sequence-Sessions-Signers-Count:Mw, 9:Sequence-Sessions-Signers-Bloom:MHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDA0NjAwMTAwMDA4MTAwMDAwMDAwMDAzMDAwMDAyMDEw\", comm-4kmu9zanvxaovs_arucd0j5fseiwphsln5kdzm_mpba=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"hmac-sha256\";keyid=\"constant:ao\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kqNEoZW5LBBaGsB+Te/VCXhiu7aHH5fEZ+97fC45ic8Ps8iMWA", + "x-77-nzt-ray": "3f9f1325cfd22cf6a4d7df694e8f1f07", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"checkpoint\":\"8\",\"threshold\":1,\"tree\":[[{\"address\":\"0x43dC62e7F055b75948BA6D0288e233027F08F4df\",\"weight\":1},{\"address\":\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\",\"weight\":1}],{\"address\":\"0x004702AAD30e9fCb3Af53a635f86C4a4F0Dff2eF\",\"weight\":1}]}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config update\\\"] }, { name: \\\"Sequence-Sessions-Wallet\\\", values: [\\\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0x43dC62e7F055b75948BA6D0288e233027F08F4df\\\", \\\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\\\", \\\"0x004702AAD30e9fCb3Af53a635f86C4a4F0Dff2eF\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"eip-712\\\", \\\"eth_sign\\\", \\\"erc-1271\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb626a5f5a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:32 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=6,cfOrigin;dur=159", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kpKBhuw0SzPTeV5TrX7UCPHXJhbUgZPL5A6okZgvuZX5", + "x-77-nzt-ray": "331b5e0fe1a2ac95a4d7df69fa19af0c", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCIxSmZCQ0w3bnpaSzlxcmZ6OHFPQTRZVjEtR1JmLU1FLWIwenVxY3J3NmRFIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"1JfBCL7nzZK9qrfz8qOA4YV1-GRf-ME-b0zuqcrw6dE\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x512485d4e46a9758b98e84105d4d54755ce6645bd3ddbab0e850c968a8ef25ba\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0x7178a76bb537253e8f37c2c6a400af1a85b7f5314ae9f06bfeb1a93df275fca3\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"11\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0040000000000000000000000000000000411100008100000000003000002010\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCI0OGdNdUE5V0NlUlB6RW9FNnFSSWE4RUs4Y3piZHBicENaNGdIRDNUQVhBIl0sImluZGV4IjoxfQ==\",\"node\":{\"id\":\"48gMuA9WCeRPzEoE6qRIa8EK8czbdpbpCZ4gHD3TAXA\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0x43dC62e7F055b75948BA6D0288e233027F08F4df\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x00d52df963e55d1be9b37ca9af01fc1529e76aa9e4adfc8258b9bfa96883d2cb\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xcde2e7ec78ebea962db5fc8c5bd1124b37b699131db4ccd99653f10e6b463b8c\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"9\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000000000000000000040000000000410100008100000000003004002090\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJHMHo4V29aYm85allnbzFsa01GbHRLcm9uc2c3em16WmVuUFRiVkZNaldjIl0sImluZGV4IjoyfQ==\",\"node\":{\"id\":\"G0z8WoZbo9jYgo1lkMFltKronsg7zmzZenPTbVFMjWc\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0xa3c45186be4593770ea3414abbd86c5e10f5791b093372b2f8a9a25482e9f826\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0x2bafea1dbc6381b39848d226dccb906f23171edf7661149da26ab609d15a1339\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"10\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000000000000000000000000000400400100408100000001003000082010\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJnZGdUclNoR09vUjBzYlFXSVI0M1hEUE5JTmI3THExUFVMUEY4SU9RNy1ZIl0sImluZGV4IjozfQ==\",\"node\":{\"id\":\"gdgTrShGOoR0sbQWIR43XDPNINb7Lq1PULPF8IOQ7-Y\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x64825b014c15f38a1464da1a4fc9694584a59f052ae2065dac457935f488059b\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0x19b94a7bd3dfbd5af528650ff492802bfdb909aff70608684feace24f3e08a01\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"12\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000120000404000000040000000000000100000000000000312000002010\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/gdgTrShGOoR0sbQWIR43XDPNINb7Lq1PULPF8IOQ7-Y", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:YvO0UJsvKhf3KcMrD0ijPMAIjZCYoeXF1YboroG7GFo=:", + "content-encoding": "gzip", + "content-type": "text/plain", + "date": "Wed, 15 Apr 2026 18:23:32 GMT", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "2", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signature-type": "eth_sign", + "sequence-sessions-signer": "0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07", + "sequence-sessions-subdigest": "0x64825b014c15f38a1464da1a4fc9694584a59f052ae2065dac457935f488059b", + "sequence-sessions-to-checkpoint": "12", + "sequence-sessions-to-config": "0x19b94a7bd3dfbd5af528650ff492802bfdb909aff70608684feace24f3e08a01", + "sequence-sessions-to-config-complete": "true", + "sequence-sessions-to-signers-bloom": "0x0000000120000404000000040000000000000100000000000000312000002010", + "sequence-sessions-to-signers-count": "3", + "sequence-sessions-type": "config update", + "sequence-sessions-wallet": "0x135769a58639b4Fa7d779a9df9B57A706FBCa816", + "sequence-sessions-witness": "false", + "server": "CDN77-Turbo", + "signature": "comm-egncy3liqfquug_n0abtquya6qvhh071cvmvptlqg-4=:Dio++Bk3uNbWk+jRSV7664zTj16HKxvid9ULuWTD3tE=:, comm-gdgtrshgoor0sbqwir43xdpninb7lq1pulpf8ioq7-y=:C2XS2s2WWfgKn4IvalZanI1Mc1WCSGalLXxYwblW+45MEQYb6JCo/2s3b8rWFWuxCGbSKOAOl0wPjocnBDXfJBs=:", + "signature-input": "comm-egncy3liqfquug_n0abtquya6qvhh071cvmvptlqg-4=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-gdgtrshgoor0sbqwir43xdpninb7lq1pulpf8ioq7-y=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signature-type\" \"sequence-sessions-signer\" \"sequence-sessions-subdigest\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-wallet\" \"sequence-sessions-witness\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmlnIHVwZGF0ZQ, 10:Sequence-Sessions-Major-Version:Mg, 11:Sequence-Sessions-To-Config:MHgxOWI5NGE3YmQzZGZiZDVhZjUyODY1MGZmNDkyODAyYmZkYjkwOWFmZjcwNjA4Njg0ZmVhY2UyNGYzZTA4YTAx, 12:Sequence-Sessions-To-Checkpoint:MTI, 13:Sequence-Sessions-To-Config-Complete:dHJ1ZQ, 14:Sequence-Sessions-To-Signers-Count:Mw, 15:Sequence-Sessions-To-Signers-Bloom:MHgwMDAwMDAwMTIwMDAwNDA0MDAwMDAwMDQwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMzEyMDAwMDAyMDEw, 2:Sequence-Sessions-Minor-Version:MA, 3:Content-Type:dGV4dC9wbGFpbg, 4:Sequence-Sessions-Signature-Type:ZXRoX3NpZ24, 5:Sequence-Sessions-Signer:MHhBZGE1MmU3NThkNmU2ZGZmNWU5Q2Y1RTk0NGNGNkQzZjIxMzg3RjA3, 6:Sequence-Sessions-Subdigest:MHg2NDgyNWIwMTRjMTVmMzhhMTQ2NGRhMWE0ZmM5Njk0NTg0YTU5ZjA1MmFlMjA2NWRhYzQ1NzkzNWY0ODgwNTli, 7:Sequence-Sessions-Wallet:MHgxMzU3NjlhNTg2MzliNEZhN2Q3NzlhOWRmOUI1N0E3MDZGQkNhODE2, 8:Sequence-Sessions-Chain-ID:MA, 9:Sequence-Sessions-Witness:ZmFsc2U\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kvVh9MCLFtrHa/I5Tw0vQ/XufyHHGKaudXFCXE9xxdzG326htQ", + "x-77-nzt-ray": "8705ec3425fb5c4fa4d7df697537cf1f", + "x-77-pop": "newyorkUSNY" + }, + "body": "0xaf1656da7ca89e388d1c500826c5d7dd0ee670f68b83615b7e1aac78b0cae4c11cdab9e9c4af8fe5564aa49b0c50fad1218023dc6e3fa87307e29b23952a75701c" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config\\\"] }, { name: \\\"Sequence-Sessions-Config\\\", values: [\\\"0x19b94a7bd3dfbd5af528650ff492802bfdb909aff70608684feace24f3e08a01\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb64ec385a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:33 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=13,cfOrigin;dur=391", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kkdNispgdvnwMIBxRgVePYUfIN5f7YWmXuDUaQLkUQCd", + "x-77-nzt-ray": "331b5e0fe1a2ac95a4d7df697f837524", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJiMzhSTG1QbktvdEU3cEo2SVhZRjgyT19PaEo5WGdRRk96RXB4ZDdHOWE4Il0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"b38RLmPnKotE7pJ6IXYF82O_OhJ9XgQFOzEpxd7G9a8\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Config\",\"value\":\"0x19b94a7bd3dfbd5af528650ff492802bfdb909aff70608684feace24f3e08a01\"},{\"name\":\"Sequence-Sessions-Version\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-Signers-Bloom\",\"value\":\"0x0000000120000404000000040000000000000100000000000000312000002010\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/b38RLmPnKotE7pJ6IXYF82O_OhJ9XgQFOzEpxd7G9a8", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:SiVzr20W80RCGWy7sZQeosNKLYQT9bClI+k7XXY7tZ8=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:33 GMT", + "sequence-sessions-complete": "true", + "sequence-sessions-config": "0x19b94a7bd3dfbd5af528650ff492802bfdb909aff70608684feace24f3e08a01", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "0", + "sequence-sessions-signers-bloom": "0x0000000120000404000000040000000000000100000000000000312000002010", + "sequence-sessions-signers-count": "3", + "sequence-sessions-type": "config", + "sequence-sessions-version": "3", + "server": "CDN77-Turbo", + "signature": "comm-b38rlmpnkote7pj6ixyf82o_ohj9xgqfozepxd7g9a8=:VwZrTQ5NGtQYAghYnlBLUUWlY+4VH7Kv77zIbzHYkl4hnHj7BctL/+cwv6sum7MwR3gI8kDF/4N6mX7gZ7Pj9Bw=:, comm-il29hgsyyy8ti2jdr8t-9zseofap4epv1ew-_yjtrxq=:St6HmXse1t1+v1iZWEVNOTyg2CknotAMcf3FJ5B+ebI=:", + "signature-input": "comm-b38rlmpnkote7pj6ixyf82o_ohj9xgqfozepxd7g9a8=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:Y29uZmln, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:MA, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Config:MHgxOWI5NGE3YmQzZGZiZDVhZjUyODY1MGZmNDkyODAyYmZkYjkwOWFmZjcwNjA4Njg0ZmVhY2UyNGYzZTA4YTAx, 6:Sequence-Sessions-Version:Mw, 7:Sequence-Sessions-Complete:dHJ1ZQ, 8:Sequence-Sessions-Signers-Count:Mw, 9:Sequence-Sessions-Signers-Bloom:MHgwMDAwMDAwMTIwMDAwNDA0MDAwMDAwMDQwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMzEyMDAwMDAyMDEw\", comm-il29hgsyyy8ti2jdr8t-9zseofap4epv1ew-_yjtrxq=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-config\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-signers-bloom\" \"sequence-sessions-signers-count\" \"sequence-sessions-type\" \"sequence-sessions-version\");alg=\"hmac-sha256\";keyid=\"constant:ao\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kgitQmrvR9rzg6zMlMxn7wKABUI/mFKkvgQifxHMnmtqmyzTxg", + "x-77-nzt-ray": "3f9f132583faaf24a5d7df69caa95d0a", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"checkpoint\":\"12\",\"threshold\":2,\"tree\":[[{\"address\":\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\",\"weight\":1},{\"address\":\"0x4eEa115852357FC87Ad9E1AD4A4554fECE1e7ff7\",\"weight\":1}],{\"address\":\"0xEb80E4dF62074285675DD0b2Bc360272847444cb\",\"weight\":1}]}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 100, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"config update\\\"] }, { name: \\\"Sequence-Sessions-Wallet\\\", values: [\\\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\\\"] }, { name: \\\"Sequence-Sessions-Signer\\\", values: [\\\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\\\", \\\"0x4eEa115852357FC87Ad9E1AD4A4554fECE1e7ff7\\\", \\\"0xEb80E4dF62074285675DD0b2Bc360272847444cb\\\"] }, { name: \\\"Sequence-Sessions-Signature-Type\\\", values: [\\\"eip-712\\\", \\\"eth_sign\\\", \\\"erc-1271\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb691f205a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:33 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=6,cfOrigin;dur=604", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kgw/4qBeSg1P1uuTNx/Hcxi0jSn8niL83kSvawnOBygh", + "x-77-nzt-ray": "331b5e0fe1a2ac95a5d7df699e05d310", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":false},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCIxSmZCQ0w3bnpaSzlxcmZ6OHFPQTRZVjEtR1JmLU1FLWIwenVxY3J3NmRFIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"1JfBCL7nzZK9qrfz8qOA4YV1-GRf-ME-b0zuqcrw6dE\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x512485d4e46a9758b98e84105d4d54755ce6645bd3ddbab0e850c968a8ef25ba\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0x7178a76bb537253e8f37c2c6a400af1a85b7f5314ae9f06bfeb1a93df275fca3\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"11\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0040000000000000000000000000000000411100008100000000003000002010\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJHMHo4V29aYm85allnbzFsa01GbHRLcm9uc2c3em16WmVuUFRiVkZNaldjIl0sImluZGV4IjoxfQ==\",\"node\":{\"id\":\"G0z8WoZbo9jYgo1lkMFltKronsg7zmzZenPTbVFMjWc\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0xa3c45186be4593770ea3414abbd86c5e10f5791b093372b2f8a9a25482e9f826\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0x2bafea1dbc6381b39848d226dccb906f23171edf7661149da26ab609d15a1339\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"10\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000000000000000000000000000400400100408100000001003000082010\"}]}},{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk3NDg3LCJnZGdUclNoR09vUjBzYlFXSVI0M1hEUE5JTmI3THExUFVMUEY4SU9RNy1ZIl0sImluZGV4IjoyfQ==\",\"node\":{\"id\":\"gdgTrShGOoR0sbQWIR43XDPNINb7Lq1PULPF8IOQ7-Y\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"text/plain\"},{\"name\":\"Sequence-Sessions-Signature-Type\",\"value\":\"eth_sign\"},{\"name\":\"Sequence-Sessions-Signer\",\"value\":\"0xAda52e758d6e6dff5e9Cf5E944cF6D3f21387F07\"},{\"name\":\"Sequence-Sessions-Subdigest\",\"value\":\"0x64825b014c15f38a1464da1a4fc9694584a59f052ae2065dac457935f488059b\"},{\"name\":\"Sequence-Sessions-Wallet\",\"value\":\"0x135769a58639b4Fa7d779a9df9B57A706FBCa816\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Witness\",\"value\":\"false\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"2\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0x19b94a7bd3dfbd5af528650ff492802bfdb909aff70608684feace24f3e08a01\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"12\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000000120000404000000040000000000000100000000000000312000002010\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Tree", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"imageHash\":\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb6d89d7c45b-YYZ", + "connection": "keep-alive", + "content-length": "250", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:34 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"version\":3,\"tree\":{\"data\":\"0x53657175656e6365207265636f76657279206c6561663a0acd8b2b62b2ebe631c54ed0cc6f366794da6ff9210000000000000000000000000000000000000000000000000000000000278d000000000000000000000000000000000000000000000000000000000000000000\"}}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 1, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"tree\\\"] }, { name: \\\"Sequence-Sessions-Tree\\\", values: [\\\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb6d6abe5a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:34 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=10,cfOrigin;dur=860", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "ktvGusekN26TEaTojilG7xgDP1HgCOxZxFZos1oIuzfe", + "x-77-nzt-ray": "331b5e0fe1a2ac95a5d7df69b184a939", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":true},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk0NjAwLCJEWDNTWFZQM2JRMHVJdUszemdFRG01bGhOcVdobFZ5b1FSMVBCTlg1RVZRIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"DX3SXVP3bQ0uIuK3zgEDm5lhNqWhlVyoQR1PBNX5EVQ\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"tree\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"0\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Tree\",\"value\":\"0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3\"},{\"name\":\"Sequence-Sessions-Complete\",\"value\":\"true\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/DX3SXVP3bQ0uIuK3zgEDm5lhNqWhlVyoQR1PBNX5EVQ", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:qM7Bkyg+mTuQK5e9pXMhkxjPMYMlBs9jzrZPiEyacok=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:35 GMT", + "sequence-sessions-complete": "true", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "0", + "sequence-sessions-tree": "0xeef69774e1cb488a71f6d235c858fa564134ee7c3acda9ff116b6c9d42b3cee3", + "sequence-sessions-type": "tree", + "server": "CDN77-Turbo", + "signature": "comm-a11d_hsfetaqh-a7f91x_ponikv_nsvqfihjthrz-py=:L1yxUCmwZ4/xlamH02g3fxhZ07XoyZN+lDpJ7qqeCkU=:, comm-dx3sxvp3bq0uiuk3zgedm5lhnqwhlvyoqr1pbnx5evq=:X3r/xo7yfg6fvD9WoIqEpBJ+lQwDyPjyYEGnb27OcidyahZZuAdsX1OlKKmrrqRsWKcOoY7oMrCG7mPPKpNfexw=:", + "signature-input": "comm-a11d_hsfetaqh-a7f91x_ponikv_nsvqfihjthrz-py=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-tree\" \"sequence-sessions-type\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-dx3sxvp3bq0uiuk3zgedm5lhnqwhlvyoqr1pbnx5evq=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-complete\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-tree\" \"sequence-sessions-type\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:dHJlZQ, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:MA, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Tree:MHhlZWY2OTc3NGUxY2I0ODhhNzFmNmQyMzVjODU4ZmE1NjQxMzRlZTdjM2FjZGE5ZmYxMTZiNmM5ZDQyYjNjZWUz, 6:Sequence-Sessions-Complete:dHJ1ZQ\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kuPrk/ujs35DBlekVTvr5jJ5pCrbdv4t5IEOkG3tG5DDuN1X9A", + "x-77-nzt-ray": "f03d06137f7e9036a6d7df697c5d623b", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"data\":\"0x53657175656e6365207265636f76657279206c6561663a0acd8b2b62b2ebe631c54ed0cc6f366794da6ff9210000000000000000000000000000000000000000000000000000000000278d000000000000000000000000000000000000000000000000000000000000000000\"}" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Payload", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"digest\":\"0xc78f3951686b7f16f39e25aea1fd5acc0e2177083c170b4c962be6cd45630576\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb743cf0c45b-YYZ", + "connection": "keep-alive", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:35 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "transfer-encoding": "chunked", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"version\":3,\"payload\":{\"calls\":[{\"behaviorOnError\":\"revert\",\"data\":\"0xe2a53ed00000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c3359000000000000000000000000000000000000000000000000000000000007d1f4\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0x4B3eC67c5812543924C12a07140369C29077071e\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0x095ea7b3000000000000000000000000fdb42a198a932c8d3b506ffa5e855bc4b348a712ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0xe6bd720e0000000000000000000000000000000000000000000000000000000000002337000000000000000000000000000000000000000000000000000000000000000100000000000000000000000068104a4e8a0da125cfcbe4918dc44c157da5cf5600000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000858db1cbf6d09d447c96a11603189b49b2d1c219\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0xb8dc491b0000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c335900000000000000000000000068104a4e8a0da125cfcbe4918dc44c157da5cf56\",\"delegateCall\":true,\"gasLimit\":\"0\",\"onlyFallback\":true,\"to\":\"0xBaE357CBAA04a68cbfD5a560Ab06C4E9A3328A90\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0x095ea7b3000000000000000000000000fdb42a198a932c8d3b506ffa5e855bc4b348a7120000000000000000000000000000000000000000000000000000000000000000\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0xd86930726aa24a63\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0x0000000000000000000000000000000000000004\",\"value\":\"0\"}],\"nonce\":\"0\",\"space\":\"0\",\"type\":\"call\"},\"wallet\":\"0x2D733fB8F1fB7669B0AFA980C11F1A6dd4F630F5\",\"chainID\":\"137\"}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 1, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"payload\\\"] }, { name: \\\"Sequence-Sessions-Major-Version\\\", values: [\\\"1\\\"] }, { name: \\\"Sequence-Sessions-Minor-Version\\\", values: [\\\"2\\\"] }, { name: \\\"Sequence-Sessions-Payload\\\", values: [\\\"0xc78f3951686b7f16f39e25aea1fd5acc0e2177083c170b4c962be6cd45630576\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb7458815a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:35 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=6,cfOrigin;dur=160", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kky/ENH9JInPTEZqn2ndbNgN0+M4+SAb9s4G6PCc3KZq", + "x-77-nzt-ray": "331b5e0fe1a2ac95a7d7df69514c8a04", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":true},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk2ODY0LCIyUUdGMXBQVThxVjlpSnRMWkFDdXN5akRRak9NX1pQOVA1aXBXSmZNWnZZIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"2QGF1pPU8qV9iJtLZACusyjDQjOM_ZP9P5ipWJfMZvY\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"payload\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"2\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Payload\",\"value\":\"0xc78f3951686b7f16f39e25aea1fd5acc0e2177083c170b4c962be6cd45630576\"},{\"name\":\"Sequence-Sessions-Address\",\"value\":\"0x2D733fB8F1fB7669B0AFA980C11F1A6dd4F630F5\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"137\"},{\"name\":\"Sequence-Sessions-Payload-Type\",\"value\":\"calls\"},{\"name\":\"Sequence-Sessions-Space\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Nonce\",\"value\":\"0\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/2QGF1pPU8qV9iJtLZACusyjDQjOM_ZP9P5ipWJfMZvY", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:y73VlX9cN7fjXboylCRs43zrkkidSnrYBsg/a62Xmxo=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:35 GMT", + "sequence-sessions-address": "0x2D733fB8F1fB7669B0AFA980C11F1A6dd4F630F5", + "sequence-sessions-chain-id": "137", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "2", + "sequence-sessions-nonce": "0", + "sequence-sessions-payload": "0xc78f3951686b7f16f39e25aea1fd5acc0e2177083c170b4c962be6cd45630576", + "sequence-sessions-payload-type": "calls", + "sequence-sessions-space": "0", + "sequence-sessions-type": "payload", + "server": "CDN77-Turbo", + "signature": "comm-2qgf1ppu8qv9ijtlzacusyjdqjom_zp9p5ipwjfmzvy=:EprEWA/QS88utcQNaUU9Mm9m7CxrUBn65vOfEq8sqBAJ4v4GO9UAm+0SOkeF2uN3GwKLbavIAK1QPIPKONw58hw=:, comm-q_y3jmjfuj2dbzu0ixgerlile_uk1vh_fwegfphj-kg=:2VqYVrvsUIA5dRuJeyHv4D8jGMtRVpkfB29bRQaoOv8=:", + "signature-input": "comm-2qgf1ppu8qv9ijtlzacusyjdqjom_zp9p5ipwjfmzvy=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-nonce\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-space\" \"sequence-sessions-type\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:cGF5bG9hZA, 10:Sequence-Sessions-Nonce:MA, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:Mg, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Payload:MHhjNzhmMzk1MTY4NmI3ZjE2ZjM5ZTI1YWVhMWZkNWFjYzBlMjE3NzA4M2MxNzBiNGM5NjJiZTZjZDQ1NjMwNTc2, 6:Sequence-Sessions-Address:MHgyRDczM2ZCOEYxZkI3NjY5QjBBRkE5ODBDMTFGMUE2ZGQ0RjYzMEY1, 7:Sequence-Sessions-Chain-ID:MTM3, 8:Sequence-Sessions-Payload-Type:Y2FsbHM, 9:Sequence-Sessions-Space:MA\", comm-q_y3jmjfuj2dbzu0ixgerlile_uk1vh_fwegfphj-kg=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-nonce\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-space\" \"sequence-sessions-type\");alg=\"hmac-sha256\";keyid=\"constant:ao\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kvXz0wEERDnzpE02FEx7DASf9Vn8KQ1OK/HUGQ/AKAKRl8ru1A", + "x-77-nzt-ray": "3f9f132582d25d8aa7d7df696573b718", + "x-77-pop": "newyorkUSNY" + }, + "body": "[{\"behaviorOnError\":\"revert\",\"data\":\"0xe2a53ed00000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c3359000000000000000000000000000000000000000000000000000000000007d1f4\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0x4B3eC67c5812543924C12a07140369C29077071e\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0x095ea7b3000000000000000000000000fdb42a198a932c8d3b506ffa5e855bc4b348a712ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0xe6bd720e0000000000000000000000000000000000000000000000000000000000002337000000000000000000000000000000000000000000000000000000000000000100000000000000000000000068104a4e8a0da125cfcbe4918dc44c157da5cf5600000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000858db1cbf6d09d447c96a11603189b49b2d1c219\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0xb8dc491b0000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c335900000000000000000000000068104a4e8a0da125cfcbe4918dc44c157da5cf56\",\"delegateCall\":true,\"gasLimit\":\"0\",\"onlyFallback\":true,\"to\":\"0xBaE357CBAA04a68cbfD5a560Ab06C4E9A3328A90\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0x095ea7b3000000000000000000000000fdb42a198a932c8d3b506ffa5e855bc4b348a7120000000000000000000000000000000000000000000000000000000000000000\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\"value\":\"0\"},{\"behaviorOnError\":\"ignore\",\"data\":\"0xd86930726aa24a63\",\"delegateCall\":false,\"gasLimit\":\"0\",\"onlyFallback\":false,\"to\":\"0x0000000000000000000000000000000000000004\",\"value\":\"0\"}]" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Payload", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"digest\":\"0x3a841ba3163a7a19cd168373df1144d38130b2f46b8d6eac956127f06fffe4f4\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb76eccec45b-YYZ", + "connection": "keep-alive", + "content-length": "531", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:35 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"version\":3,\"payload\":{\"message\":\"0x7b22616374696f6e223a22636f6e73656e742d746f2d62652d706172742d6f662d77616c6c6574222c2277616c6c6574223a22307844323437443562313932353732393438634365643444624131633634386262366662666539306543222c227369676e6572223a22307830643662303266623238306533353336303364356538613462646136623432366135633762343138222c2274696d657374616d70223a313736363038333632303439382c227369676e65724b696e64223a226c6f63616c2d646576696365227d\",\"type\":\"message\"},\"wallet\":\"0xD247D5b192572948cCed4DbA1c648bb6fbfe90eC\",\"chainID\":\"0\"}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 1, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"payload\\\"] }, { name: \\\"Sequence-Sessions-Major-Version\\\", values: [\\\"1\\\"] }, { name: \\\"Sequence-Sessions-Minor-Version\\\", values: [\\\"2\\\"] }, { name: \\\"Sequence-Sessions-Payload\\\", values: [\\\"0x3a841ba3163a7a19cd168373df1144d38130b2f46b8d6eac956127f06fffe4f4\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb770ab35a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:35 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=8,cfOrigin;dur=374", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kqX6v+4iErm5YUpn1+BYcdVbqzpv/72vAxv/CecuStWy", + "x-77-nzt-ray": "331b5e0fe1a2ac95a7d7df691e56231e", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":true},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk2ODY0LCIzSGYxUFdGaF9ZdzRhdTBDWjhBYU14NldCX0ZWQ1Q5UkJIMy1OOW1wVlJnIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"3Hf1PWFh_Yw4au0CZ8AaMx6WB_FVCT9RBH3-N9mpVRg\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"payload\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"2\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Payload\",\"value\":\"0x3a841ba3163a7a19cd168373df1144d38130b2f46b8d6eac956127f06fffe4f4\"},{\"name\":\"Sequence-Sessions-Address\",\"value\":\"0xD247D5b192572948cCed4DbA1c648bb6fbfe90eC\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Payload-Type\",\"value\":\"message\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/3Hf1PWFh_Yw4au0CZ8AaMx6WB_FVCT9RBH3-N9mpVRg", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:A1YMLxj1j3HT9nFpONVt2VC77V87xprIq9H/yLXq9j8=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:36 GMT", + "sequence-sessions-address": "0xD247D5b192572948cCed4DbA1c648bb6fbfe90eC", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "2", + "sequence-sessions-payload": "0x3a841ba3163a7a19cd168373df1144d38130b2f46b8d6eac956127f06fffe4f4", + "sequence-sessions-payload-type": "message", + "sequence-sessions-type": "payload", + "server": "CDN77-Turbo", + "signature": "comm-3hf1pwfh_yw4au0cz8aamx6wb_fvct9rbh3-n9mpvrg=:790rl5TXvVj20BC8LJ98yNjsx4ejtsrgBSFEZm/obn9h5lK8UPI5ztHX+WA5psYNPhxi1XvTNfEhwZmyz9pG5xs=:, comm-fdqefal8-0i-shhtdty8o5mtdosf0h_yvt9gipd4ziu=:UoLz2MjgY7q35/CBTDrfiRRMA8ieQKTi5ATCLXg4YF0=:", + "signature-input": "comm-3hf1pwfh_yw4au0cz8aamx6wb_fvct9rbh3-n9mpvrg=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-type\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:cGF5bG9hZA, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:Mg, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Payload:MHgzYTg0MWJhMzE2M2E3YTE5Y2QxNjgzNzNkZjExNDRkMzgxMzBiMmY0NmI4ZDZlYWM5NTYxMjdmMDZmZmZlNGY0, 6:Sequence-Sessions-Address:MHhEMjQ3RDViMTkyNTcyOTQ4Y0NlZDREYkExYzY0OGJiNmZiZmU5MGVD, 7:Sequence-Sessions-Chain-ID:MA, 8:Sequence-Sessions-Payload-Type:bWVzc2FnZQ\", comm-fdqefal8-0i-shhtdty8o5mtdosf0h_yvt9gipd4ziu=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-type\");alg=\"hmac-sha256\";keyid=\"constant:ao\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kon1rwdQeQ1znuXHKI8UDqFy/lgo04k2GpXNPxF/7tZEmWehhw", + "x-77-nzt-ray": "8705ec34712958dfa8d7df69d7f8d003", + "x-77-pop": "newyorkUSNY" + }, + "body": "\"0x7b22616374696f6e223a22636f6e73656e742d746f2d62652d706172742d6f662d77616c6c6574222c2277616c6c6574223a22307844323437443562313932353732393438634365643444624131633634386262366662666539306543222c227369676e6572223a22307830643662303266623238306533353336303364356538613462646136623432366135633762343138222c2274696d657374616d70223a313736363038333632303439382c227369676e65724b696e64223a226c6f63616c2d646576696365227d\"" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Payload", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"digest\":\"0xcae631660ffa90bddc5e9b4fa9c11692a53062a61640fb958f3f2959d22fe54b\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb7b6a0cc45b-YYZ", + "connection": "keep-alive", + "content-length": "197", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:36 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"version\":3,\"payload\":{\"imageHash\":\"0xe25d51d076cbb34dd4f68b26421724e2f6f7be49dfd913dae3d0c0fa05e86d53\",\"type\":\"config-update\"},\"wallet\":\"0xC018D4EB963bDe912f3a440554Af070c7C0BF313\",\"chainID\":\"0\"}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 1, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"payload\\\"] }, { name: \\\"Sequence-Sessions-Major-Version\\\", values: [\\\"1\\\"] }, { name: \\\"Sequence-Sessions-Minor-Version\\\", values: [\\\"2\\\"] }, { name: \\\"Sequence-Sessions-Payload\\\", values: [\\\"0xcae631660ffa90bddc5e9b4fa9c11692a53062a61640fb958f3f2959d22fe54b\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb7b8e245a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:36 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=7,cfOrigin;dur=171", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "kvQQ+5s8UFxvEgTO6p+xw8zMfYsSlUhNC3eI+QhmYpqk", + "x-77-nzt-ray": "331b5e0fe1a2ac95a8d7df69c0c4840d", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":true},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk2ODc3LCJUd20zU3NzTzlITTJSOG9CSkp0V1JwSUFaeThHemFjcFE5dnBFWUdLWnVFIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"Twm3SssO9HM2R8oBJJtWRpIAZy8GzacpQ9vpEYGKZuE\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"payload\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"2\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Payload\",\"value\":\"0xcae631660ffa90bddc5e9b4fa9c11692a53062a61640fb958f3f2959d22fe54b\"},{\"name\":\"Sequence-Sessions-Address\",\"value\":\"0xC018D4EB963bDe912f3a440554Af070c7C0BF313\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"0\"},{\"name\":\"Sequence-Sessions-Payload-Type\",\"value\":\"config update\"},{\"name\":\"Sequence-Sessions-To-Config\",\"value\":\"0xe25d51d076cbb34dd4f68b26421724e2f6f7be49dfd913dae3d0c0fa05e86d53\"},{\"name\":\"Sequence-Sessions-To-Version\",\"value\":\"3\"},{\"name\":\"Sequence-Sessions-To-Checkpoint\",\"value\":\"4\"},{\"name\":\"Sequence-Sessions-To-Config-Complete\",\"value\":\"true\"},{\"name\":\"Sequence-Sessions-To-Signers-Count\",\"value\":\"7\"},{\"name\":\"Sequence-Sessions-To-Signers-Bloom\",\"value\":\"0x0000008008000100802082840208090100000023400000140002000500020409\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/Twm3SssO9HM2R8oBJJtWRpIAZy8GzacpQ9vpEYGKZuE", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:sDSB/zhiOWptyMrGP5eMgYGCSjAG+AEX5ek1NCPhKTI=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:36 GMT", + "sequence-sessions-address": "0xC018D4EB963bDe912f3a440554Af070c7C0BF313", + "sequence-sessions-chain-id": "0", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "2", + "sequence-sessions-payload": "0xcae631660ffa90bddc5e9b4fa9c11692a53062a61640fb958f3f2959d22fe54b", + "sequence-sessions-payload-type": "config update", + "sequence-sessions-to-checkpoint": "4", + "sequence-sessions-to-config": "0xe25d51d076cbb34dd4f68b26421724e2f6f7be49dfd913dae3d0c0fa05e86d53", + "sequence-sessions-to-config-complete": "true", + "sequence-sessions-to-signers-bloom": "0x0000008008000100802082840208090100000023400000140002000500020409", + "sequence-sessions-to-signers-count": "7", + "sequence-sessions-to-version": "3", + "sequence-sessions-type": "payload", + "server": "CDN77-Turbo", + "signature": "comm-5pnsazaxuuh8mktavldjkji_92nknngtzzri_wuxhia=:+TfdPyPtERmEfeW5geLa7tkcJ7ZcdKsRkDNgBG3oJos=:, comm-twm3ssso9hm2r8objjtwrpiazy8gzacpq9vpeygkzue=:UrFROJgchVKSsHYlhqdsLasc82cIbkqkHd7Ia9u+h5kCiuVuSHn/DGt7Dp4+fTxAYJlgr3uDy8yEK6FDPP0FVRs=:", + "signature-input": "comm-5pnsazaxuuh8mktavldjkji_92nknngtzzri_wuxhia=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-to-version\" \"sequence-sessions-type\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-twm3ssso9hm2r8objjtwrpiazy8gzacpq9vpeygkzue=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-to-checkpoint\" \"sequence-sessions-to-config\" \"sequence-sessions-to-config-complete\" \"sequence-sessions-to-signers-bloom\" \"sequence-sessions-to-signers-count\" \"sequence-sessions-to-version\" \"sequence-sessions-type\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:cGF5bG9hZA, 10:Sequence-Sessions-To-Version:Mw, 11:Sequence-Sessions-To-Checkpoint:NA, 12:Sequence-Sessions-To-Config-Complete:dHJ1ZQ, 13:Sequence-Sessions-To-Signers-Count:Nw, 14:Sequence-Sessions-To-Signers-Bloom:MHgwMDAwMDA4MDA4MDAwMTAwODAyMDgyODQwMjA4MDkwMTAwMDAwMDIzNDAwMDAwMTQwMDAyMDAwNTAwMDIwNDA5, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:Mg, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Payload:MHhjYWU2MzE2NjBmZmE5MGJkZGM1ZTliNGZhOWMxMTY5MmE1MzA2MmE2MTY0MGZiOTU4ZjNmMjk1OWQyMmZlNTRi, 6:Sequence-Sessions-Address:MHhDMDE4RDRFQjk2M2JEZTkxMmYzYTQ0MDU1NEFmMDcwYzdDMEJGMzEz, 7:Sequence-Sessions-Chain-ID:MA, 8:Sequence-Sessions-Payload-Type:Y29uZmlnIHVwZGF0ZQ, 9:Sequence-Sessions-To-Config:MHhlMjVkNTFkMDc2Y2JiMzRkZDRmNjhiMjY0MjE3MjRlMmY2ZjdiZTQ5ZGZkOTEzZGFlM2QwYzBmYTA1ZTg2ZDUz\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "kgtQOfxtm1ATCfanlgWwAEqGnZLSUhWuvzXjo6pK4TdefM3aSw", + "x-77-nzt-ray": "3f9f132578e09bbba8d7df6948a99d21", + "x-77-pop": "newyorkUSNY" + }, + "body": "{\"checkpoint\":\"4\",\"threshold\":2,\"tree\":[[[{\"address\":\"0xF223a6E051B743BfEC993e17555d31cee5ac9fE9\",\"weight\":1},{\"address\":\"0xB34EFD7629C431d2caDf69d9aFDEA984Ff6EC86b\",\"weight\":1}],{\"threshold\":1,\"tree\":[{\"address\":\"0x26f3D30F41FA897309Ae804A2AFf15CEb1dA5742\",\"weight\":1},{\"address\":\"0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4\",\"weight\":1}],\"weight\":1}],[{\"threshold\":2,\"tree\":[{\"address\":\"0x00000000000030Bcc832F7d657f50D6Be35C92b3\",\"imageHash\":\"0x507c907dd7fbb034d69ea4287e7a52c9d689d9795ac4d8ef38231bb87e38feec\",\"weight\":1},{\"threshold\":1,\"tree\":[{\"address\":\"0xF6Bc87F5F2edAdb66737E32D37b46423901dfEF1\",\"weight\":1},{\"address\":\"0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4\",\"weight\":1}],\"weight\":1}],\"weight\":255},{\"address\":\"0x000000000000AB36D17eB1150116371520565205\",\"imageHash\":\"0x5b59a76df21cc0aebe78bafe7d705f9dffb21d5ccf633d0f53a8cc7dd35730b7\",\"weight\":255}]]}" + } + }, + { + "request": { + "method": "POST", + "url": "https://keymachine.sequence.app/rpc/Sessions/Payload", + "headers": { + "content-type": "application/json", + "webrpc": "webrpc@v0.22.1;gen-typescript@v0.16.2;sessions@v0.0.1" + }, + "body": "{\"digest\":\"0xcd3c291e0939f029aaa4b4f292d5d2b2ce43baf98046d9abc2a3e8284b253432\"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "alt-svc": "h3=\":443\"; ma=86400", + "cache-control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb7e3a5cc45b-YYZ", + "connection": "keep-alive", + "content-length": "187", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:36 GMT", + "expires": "Thu, 01 Jan 1970 00:00:00 GMT", + "pragma": "no-cache", + "server": "cloudflare", + "strict-transport-security": "max-age=2592000; includeSubDomains", + "vary": "Origin", + "via": "1.1 google", + "webrpc": "webrpc@v0.22.1;gen-golang@v0.17.0;key-machine@v0.0.1" + }, + "body": "{\"version\":3,\"payload\":{\"digest\":\"0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef\",\"type\":\"digest\"},\"wallet\":\"0x1111111111111111111111111111111111111111\",\"chainID\":\"1\"}" + } + }, + { + "request": { + "method": "POST", + "url": "https://arweave.net/graphql", + "headers": { + "content-type": "application/json" + }, + "body": "{\"query\":\"\\n query {\\n transactions(sort: HEIGHT_DESC, first: 1, tags: [{ name: \\\"Sequence-Sessions-Type\\\", values: [\\\"payload\\\"] }, { name: \\\"Sequence-Sessions-Major-Version\\\", values: [\\\"1\\\"] }, { name: \\\"Sequence-Sessions-Minor-Version\\\", values: [\\\"2\\\"] }, { name: \\\"Sequence-Sessions-Payload\\\", values: [\\\"0xcd3c291e0939f029aaa4b4f292d5d2b2ce43baf98046d9abc2a3e8284b253432\\\"] }], owners: [\\\"AZ6R2mG8zxW9q7--iZXGrBknjegHoPzmG5IG-nxvMaM\\\"]) {\\n pageInfo {\\n hasNextPage\\n }\\n edges {\\n cursor\\n node {\\n id\\n tags {\\n name\\n value\\n }\\n }\\n }\\n }\\n }\\n \"}" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "cache-control": "no-store", + "cf-cache-status": "DYNAMIC", + "cf-ray": "9eccfb7e48075a46-IAD", + "connection": "keep-alive", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:36 GMT", + "server": "CDN77-Turbo", + "server-timing": "cfCacheStatus;desc=\"DYNAMIC\", cfEdge;dur=4,cfOrigin;dur=188", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding, Origin", + "x-77-cache": "MISS", + "x-77-nzt": "khTWKji6AMQLths5NYi/adhHHOlYkr5Pbz13CeYGRmzp", + "x-77-nzt-ray": "331b5e0fe1a2ac95a8d7df69e27a3228", + "x-77-pop": "montrealCAQC", + "x-upstream-url": "https://arweave-search.goldsky.com/graphql" + }, + "body": "{\"data\":{\"transactions\":{\"pageInfo\":{\"hasNextPage\":true},\"edges\":[{\"cursor\":\"eyJzZWFyY2hfYWZ0ZXIiOlsxODk2ODY3LCJsVmgyQUxiTTNrTHlKcDdtb0pBNUk4d1Y1Y1VsY25LeUI1bnJGSVNPdkVvIl0sImluZGV4IjowfQ==\",\"node\":{\"id\":\"lVh2ALbM3kLyJp7moJA5I8wV5cUlcnKyB5nrFISOvEo\",\"tags\":[{\"name\":\"Sequence-Sessions-Type\",\"value\":\"payload\"},{\"name\":\"Sequence-Sessions-Major-Version\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Minor-Version\",\"value\":\"2\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"},{\"name\":\"Sequence-Sessions-Payload\",\"value\":\"0xcd3c291e0939f029aaa4b4f292d5d2b2ce43baf98046d9abc2a3e8284b253432\"},{\"name\":\"Sequence-Sessions-Address\",\"value\":\"0x1111111111111111111111111111111111111111\"},{\"name\":\"Sequence-Sessions-Chain-ID\",\"value\":\"1\"},{\"name\":\"Sequence-Sessions-Payload-Type\",\"value\":\"digest\"},{\"name\":\"Sequence-Sessions-Digest\",\"value\":\"0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef\"}]}}]}}}\n" + } + }, + { + "request": { + "method": "GET", + "url": "https://arweave.net/lVh2ALbM3kLyJp7moJA5I8wV5cUlcnKyB5nrFISOvEo", + "headers": {}, + "body": "" + }, + "response": { + "status": 200, + "statusText": "OK", + "headers": { + "access-control-allow-headers": "*", + "access-control-allow-methods": "GET, POST, HEAD, OPTIONS", + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-ArNS-Resolved-Id, X-ArNS-TTL-Seconds, X-ArNS-Process-Id, X-ArNS-Undername-Limit, X-ArNS-Record-Index", + "ao-body-key": "data", + "ao-types": "status=\"integer\"", + "connection": "keep-alive", + "content-digest": "sha-256=:dCNOmK/nSY+12vHzasLXiswzlGT5UHA7jAGYkvmCuQs=:", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Wed, 15 Apr 2026 18:23:37 GMT", + "sequence-sessions-address": "0x1111111111111111111111111111111111111111", + "sequence-sessions-chain-id": "1", + "sequence-sessions-digest": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", + "sequence-sessions-major-version": "1", + "sequence-sessions-minor-version": "2", + "sequence-sessions-payload": "0xcd3c291e0939f029aaa4b4f292d5d2b2ce43baf98046d9abc2a3e8284b253432", + "sequence-sessions-payload-type": "digest", + "sequence-sessions-type": "payload", + "server": "CDN77-Turbo", + "signature": "comm-_jzqikhymam_lprvj7ycaaktslaa0sbqc7czeyhvbhg=:2nut0qs1ieXwfVSjm9pppo+WVEbavBKS+FfI0s0auYI=:, comm-lvh2albm3klyjp7moja5i8wv5culcnkyb5nrfisoveo=:ZINUHXdgCdrtP9TmAanj/BS4HaadRFWWaferNtdEEKtriq3gi/My1CCCpPc5MI7FwVsOHpYmIrTP3ZRIAhG+xBs=:", + "signature-input": "comm-_jzqikhymam_lprvj7ycaaktslaa0sbqc7czeyhvbhg=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-digest\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-type\");alg=\"hmac-sha256\";keyid=\"constant:ao\", comm-lvh2albm3klyjp7moja5i8wv5culcnkyb5nrfisoveo=(\"ao-body-key\" \"content-digest\" \"content-type\" \"sequence-sessions-address\" \"sequence-sessions-chain-id\" \"sequence-sessions-digest\" \"sequence-sessions-major-version\" \"sequence-sessions-minor-version\" \"sequence-sessions-payload\" \"sequence-sessions-payload-type\" \"sequence-sessions-type\");alg=\"ans104@1.0/ethereum\";keyid=\"publickey:BCwPuj81bBSAUGJtslnOolGAOVnjkrC-I2cb6NcN_LafVFnmIz_BbUxSWkYflq6AyqWMD2xcLZkWrgMij33mDD0\";bundle=\"false\";original-tags=\"1:Sequence-Sessions-Type:cGF5bG9hZA, 2:Sequence-Sessions-Major-Version:MQ, 3:Sequence-Sessions-Minor-Version:Mg, 4:Content-Type:YXBwbGljYXRpb24vanNvbg, 5:Sequence-Sessions-Payload:MHhjZDNjMjkxZTA5MzlmMDI5YWFhNGI0ZjI5MmQ1ZDJiMmNlNDNiYWY5ODA0NmQ5YWJjMmEzZTgyODRiMjUzNDMy, 6:Sequence-Sessions-Address:MHgxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx, 7:Sequence-Sessions-Chain-ID:MQ, 8:Sequence-Sessions-Payload-Type:ZGlnZXN0, 9:Sequence-Sessions-Digest:MHhkZWFkYmVlZmRlYWRiZWVmZGVhZGJlZWZkZWFkYmVlZmRlYWRiZWVmZGVhZGJlZWZkZWFkYmVlZmRlYWRiZWVm\"", + "status": "200", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-77-cache": "MISS", + "x-77-nzt": "knv9xlzlzyl+8BAqY6Rzi6OmidE58jsyXeJYUQRAB8zDDWWidQ", + "x-77-nzt-ray": "f03d061342437487a9d7df69cd5e1901", + "x-77-pop": "newyorkUSNY" + }, + "body": "null" + } + } +] \ No newline at end of file From ae123719ed5e7eaa9829222791ba843873fd7070 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Mon, 4 May 2026 08:14:45 -0400 Subject: [PATCH 119/144] Upgrade uuid from v13 to v14 (#996) --- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 2d62c2795..1934c2e60 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -44,6 +44,6 @@ "idb": "^8.0.3", "jwt-decode": "^4.0.0", "ox": "^0.9.17", - "uuid": "^13.0.0" + "uuid": "^14.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 54ad63e32..a9f2f2560 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -474,8 +474,8 @@ importers: specifier: ^0.9.17 version: 0.9.17(typescript@5.9.3)(zod@4.2.0) uuid: - specifier: ^13.0.0 - version: 13.0.0 + specifier: ^14.0.0 + version: 14.0.0 devDependencies: '@repo/eslint-config': specifier: workspace:^ @@ -3669,8 +3669,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@13.0.0: - resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true v8-compile-cache-lib@3.0.1: @@ -7287,7 +7287,7 @@ snapshots: util-deprecate@1.0.2: {} - uuid@13.0.0: {} + uuid@14.0.0: {} v8-compile-cache-lib@3.0.1: {} From 957f74d8c7cd3415788e74cdba554d89d46dd7e0 Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Mon, 4 May 2026 17:19:55 -0400 Subject: [PATCH 120/144] Upgrading workspace root deps (#997) --- extras/docs/package.json | 2 +- extras/docs/tsconfig.json | 9 +- extras/web/package.json | 2 +- extras/web/tsconfig.json | 9 +- package.json | 10 +- 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/services/userdata/package.json | 2 +- packages/utils/abi/package.json | 2 +- packages/wallet/core/package.json | 2 +- packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives-cli/package.json | 2 +- packages/wallet/primitives-cli/tsconfig.json | 3 +- packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/package.json | 2 +- pnpm-lock.yaml | 518 ++++++++---------- repo/eslint-config/package.json | 2 +- .../next-css-side-effect.d.ts | 2 + repo/ui/package.json | 2 +- 25 files changed, 272 insertions(+), 317 deletions(-) create mode 100644 repo/typescript-config/next-css-side-effect.d.ts diff --git a/extras/docs/package.json b/extras/docs/package.json index ccf8cc5bb..d48a68d1e 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -24,6 +24,6 @@ "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "eslint": "^9.39.2", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/extras/docs/tsconfig.json b/extras/docs/tsconfig.json index c2fa4ee5d..7b9803267 100644 --- a/extras/docs/tsconfig.json +++ b/extras/docs/tsconfig.json @@ -7,6 +7,13 @@ } ] }, - "include": ["**/*.ts", "**/*.tsx", "next-env.d.ts", "next.config.js", ".next/types/**/*.ts"], + "include": [ + "**/*.ts", + "**/*.tsx", + "../../repo/typescript-config/next-css-side-effect.d.ts", + "next-env.d.ts", + "next.config.js", + ".next/types/**/*.ts" + ], "exclude": ["node_modules"] } diff --git a/extras/web/package.json b/extras/web/package.json index b8fdea499..3f2920e88 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -24,6 +24,6 @@ "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "eslint": "^9.39.2", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/extras/web/tsconfig.json b/extras/web/tsconfig.json index c2fa4ee5d..7b9803267 100644 --- a/extras/web/tsconfig.json +++ b/extras/web/tsconfig.json @@ -7,6 +7,13 @@ } ] }, - "include": ["**/*.ts", "**/*.tsx", "next-env.d.ts", "next.config.js", ".next/types/**/*.ts"], + "include": [ + "**/*.ts", + "**/*.tsx", + "../../repo/typescript-config/next-css-side-effect.d.ts", + "next-env.d.ts", + "next.config.js", + ".next/types/**/*.ts" + ], "exclude": ["node_modules"] } diff --git a/package.json b/package.json index 92559c510..512f8a44c 100644 --- a/package.json +++ b/package.json @@ -21,12 +21,12 @@ }, "devDependencies": { "@changesets/cli": "^2.29.8", - "lefthook": "^2.1.1", - "prettier": "^3.8.1", + "lefthook": "^2.1.6", + "prettier": "^3.8.3", "rimraf": "^6.1.3", - "syncpack": "^14.0.0", - "turbo": "^2.8.10", - "typescript": "^5.9.3" + "syncpack": "^14.3.1", + "turbo": "^2.9.8", + "typescript": "^6.0.3" }, "pnpm": { "overrides": { diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 8d2f87a22..29e0fd74c 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -26,6 +26,6 @@ "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", "@repo/eslint-config": "workspace:^", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 1897f0ab8..d7b89a694 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -26,6 +26,6 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index fc489cd03..57dc6b4e2 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -28,7 +28,7 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "vitest": "^4.0.18" }, "dependencies": { diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index bb61d8e20..ea2abd640 100644 --- a/packages/services/identity-instrument/package.json +++ b/packages/services/identity-instrument/package.json @@ -24,7 +24,7 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "vitest": "^4.0.18" }, "dependencies": { diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 7ad0de895..c7c6e6db7 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -26,6 +26,6 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 865e0e5b4..c2b372d07 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -26,6 +26,6 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index acb19b042..f6b1f39dd 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -26,6 +26,6 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 0c1422d97..43e3a79d9 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -30,7 +30,7 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "vitest": "^4.0.18" }, "dependencies": { diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 38f3c9d5a..2d9690477 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -26,6 +26,6 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index d70d75cdc..909e1226d 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -26,6 +26,6 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@types/node": "^25.3.0", - "typescript": "^5.9.3" + "typescript": "^6.0.3" } } diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 413315786..05b3cc7da 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -29,7 +29,7 @@ "@vitest/coverage-v8": "^4.0.18", "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "vitest": "^4.0.18" }, "dependencies": { diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 7ed1867e7..71022d182 100644 --- a/packages/wallet/dapp-client/package.json +++ b/packages/wallet/dapp-client/package.json @@ -28,7 +28,7 @@ "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", "happy-dom": "^20.8.9", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "vitest": "^4.0.18" }, "dependencies": { diff --git a/packages/wallet/primitives-cli/package.json b/packages/wallet/primitives-cli/package.json index ec35fc66e..b91c0a885 100644 --- a/packages/wallet/primitives-cli/package.json +++ b/packages/wallet/primitives-cli/package.json @@ -28,7 +28,7 @@ "concurrently": "^9.2.1", "esbuild": "^0.27.3", "nodemon": "^3.1.14", - "typescript": "^5.9.3" + "typescript": "^6.0.3" }, "dependencies": { "@0xsequence/wallet-primitives": "workspace:^", diff --git a/packages/wallet/primitives-cli/tsconfig.json b/packages/wallet/primitives-cli/tsconfig.json index 1e325a596..39eeeb094 100644 --- a/packages/wallet/primitives-cli/tsconfig.json +++ b/packages/wallet/primitives-cli/tsconfig.json @@ -3,7 +3,8 @@ "compilerOptions": { "rootDir": "src", "outDir": "dist", - "sourceMap": true + "sourceMap": true, + "types": ["node"] }, "include": ["src"], "exclude": ["node_modules", "dist"] diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index e0e283de6..0cd4d93df 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -26,7 +26,7 @@ "@repo/eslint-config": "workspace:^", "@repo/typescript-config": "workspace:^", "@vitest/coverage-v8": "^4.0.18", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "vitest": "^4.0.18" }, "dependencies": { diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 1934c2e60..681c70c8e 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -31,7 +31,7 @@ "dotenv": "^17.3.1", "fake-indexeddb": "^6.2.5", "happy-dom": "^20.8.9", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "vitest": "^4.0.18" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9f2f2560..a729099c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,23 +15,23 @@ importers: specifier: ^2.29.8 version: 2.29.8(@types/node@25.3.0) lefthook: - specifier: ^2.1.1 - version: 2.1.1 + specifier: ^2.1.6 + version: 2.1.6 prettier: - specifier: ^3.8.1 - version: 3.8.1 + specifier: ^3.8.3 + version: 3.8.3 rimraf: specifier: ^6.1.3 version: 6.1.3 syncpack: - specifier: ^14.0.0 - version: 14.0.0 + specifier: ^14.3.1 + version: 14.3.1 turbo: - specifier: ^2.8.10 - version: 2.8.10 + specifier: ^2.9.8 + version: 2.9.8 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 extras/docs: dependencies: @@ -67,8 +67,8 @@ importers: specifier: ^9.39.2 version: 9.39.2 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 extras/web: dependencies: @@ -104,8 +104,8 @@ importers: specifier: ^9.39.2 version: 9.39.2 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages/services/api: devDependencies: @@ -119,8 +119,8 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages/services/builder: devDependencies: @@ -134,14 +134,14 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages/services/guard: dependencies: ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3)(zod@4.2.0) + version: 0.9.17(typescript@6.0.3)(zod@4.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:^ @@ -153,8 +153,8 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.18 version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) @@ -169,7 +169,7 @@ importers: version: 4.0.0 ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3)(zod@4.2.0) + version: 0.9.17(typescript@6.0.3)(zod@4.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:^ @@ -181,8 +181,8 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.18 version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) @@ -199,8 +199,8 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages/services/marketplace: devDependencies: @@ -214,8 +214,8 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages/services/metadata: devDependencies: @@ -229,8 +229,8 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages/services/relayer: dependencies: @@ -239,13 +239,13 @@ importers: version: link:../../wallet/primitives mipd: specifier: ^0.0.7 - version: 0.0.7(typescript@5.9.3) + version: 0.0.7(typescript@6.0.3) ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3)(zod@4.2.0) + version: 0.9.17(typescript@6.0.3)(zod@4.2.0) viem: specifier: ^2.40.3 - version: 2.42.1(typescript@5.9.3)(zod@4.2.0) + version: 2.42.1(typescript@6.0.3)(zod@4.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:^ @@ -257,8 +257,8 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.18 version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) @@ -275,8 +275,8 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages/utils/abi: devDependencies: @@ -290,8 +290,8 @@ importers: specifier: ^25.3.0 version: 25.3.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages/wallet/core: dependencies: @@ -306,13 +306,13 @@ importers: version: link:../primitives mipd: specifier: ^0.0.7 - version: 0.0.7(typescript@5.9.3) + version: 0.0.7(typescript@6.0.3) ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3)(zod@4.2.0) + version: 0.9.17(typescript@6.0.3)(zod@4.2.0) viem: specifier: ^2.40.3 - version: 2.42.1(typescript@5.9.3)(zod@4.2.0) + version: 2.42.1(typescript@6.0.3)(zod@4.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:^ @@ -333,8 +333,8 @@ importers: specifier: ^6.2.5 version: 6.2.5 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.18 version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) @@ -355,7 +355,7 @@ importers: version: link:../primitives ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3)(zod@4.2.0) + version: 0.9.17(typescript@6.0.3)(zod@4.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:^ @@ -379,8 +379,8 @@ importers: specifier: ^20.8.9 version: 20.8.9 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.18 version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) @@ -389,7 +389,7 @@ importers: dependencies: ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3)(zod@4.2.0) + version: 0.9.17(typescript@6.0.3)(zod@4.2.0) devDependencies: '@repo/eslint-config': specifier: workspace:^ @@ -401,8 +401,8 @@ importers: specifier: ^4.0.18 version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.8.9)) typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.18 version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) @@ -414,7 +414,7 @@ importers: version: link:../primitives ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3)(zod@4.2.0) + version: 0.9.17(typescript@6.0.3)(zod@4.2.0) yargs: specifier: ^18.0.0 version: 18.0.0 @@ -441,8 +441,8 @@ importers: specifier: ^3.1.14 version: 3.1.14 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages/wallet/wdk: dependencies: @@ -472,7 +472,7 @@ importers: version: 4.0.0 ox: specifier: ^0.9.17 - version: 0.9.17(typescript@5.9.3)(zod@4.2.0) + version: 0.9.17(typescript@6.0.3)(zod@4.2.0) uuid: specifier: ^14.0.0 version: 14.0.0 @@ -499,8 +499,8 @@ importers: specifier: ^20.8.9 version: 20.8.9 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.18 version: 4.0.18(@types/node@25.3.0)(happy-dom@20.8.9) @@ -530,16 +530,16 @@ importers: version: 7.0.1(eslint@9.39.2) eslint-plugin-turbo: specifier: ^2.6.3 - version: 2.6.3(eslint@9.39.2)(turbo@2.8.21) + version: 2.6.3(eslint@9.39.2)(turbo@2.9.8) globals: specifier: ^16.5.0 version: 16.5.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 typescript-eslint: specifier: ^8.49.0 - version: 8.50.0(eslint@9.39.2)(typescript@5.9.3) + version: 8.50.0(eslint@9.39.2)(typescript@6.0.3) repo/typescript-config: {} @@ -560,7 +560,7 @@ importers: version: link:../typescript-config '@turbo/gen': specifier: ^1.13.4 - version: 1.13.4(@types/node@25.3.0)(typescript@5.9.3) + version: 1.13.4(@types/node@25.3.0)(typescript@6.0.3) '@types/node': specifier: ^25.3.0 version: 25.3.0 @@ -571,8 +571,8 @@ importers: specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.7) typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages: @@ -1326,13 +1326,13 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@turbo/darwin-64@2.8.21': - resolution: {integrity: sha512-kfGoM0Iw8ZNZpbds+4IzOe0hjvHldqJwUPRAjXJi3KBxg/QOZL95N893SRoMtf2aJ+jJ3dk32yPkp8rvcIjP9g==} + '@turbo/darwin-64@2.9.8': + resolution: {integrity: sha512-zU1P95ygDpsQ+2QHh7CVTqvYwi9UBlhKWzoIyUnP3vUoge7H9SQEzrd8dj+XcTrslAp9Db3vIBcXtMVoTEYDnA==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.8.21': - resolution: {integrity: sha512-o9HEflxUEyr987x0cTUzZBhDOyL6u95JmdmlkH2VyxAw7zq2sdtM5e72y9ufv2N5SIoOBw1fVn9UES5VY5H6vQ==} + '@turbo/darwin-arm64@2.9.8': + resolution: {integrity: sha512-nKRFI5ZhCGUi4eXNlrojzWcT/CehMj0raot1WE4lw5qf66ZxZHbRbBqcwNEy+ZLY7RkJJRY+TaU89fuj3BcgGg==} cpu: [arm64] os: [darwin] @@ -1340,23 +1340,23 @@ packages: resolution: {integrity: sha512-PK38N1fHhDUyjLi0mUjv0RbX0xXGwDLQeRSGsIlLcVpP1B5fwodSIwIYXc9vJok26Yne94BX5AGjueYsUT3uUw==} hasBin: true - '@turbo/linux-64@2.8.21': - resolution: {integrity: sha512-uTxlCcXWy5h1fSSymP8XSJ+AudzEHMDV3IDfKX7+DGB8kgJ+SLoTUAH7z4OFA7I/l2sznz0upPdbNNZs91YMag==} + '@turbo/linux-64@2.9.8': + resolution: {integrity: sha512-Wf/kQpVDCaWM3P5d6lKvJnqjYn/ofUBGbT4h4vRFrdC4N6B/nsun03S2kQNJJMXpXg39woeS4CI367RMU3/OAg==} cpu: [x64] os: [linux] - '@turbo/linux-arm64@2.8.21': - resolution: {integrity: sha512-cdHIcxNcihHHkCHp0Y4Zb60K4Qz+CK4xw1gb6s/t/9o4SMeMj+hTBCtoW6QpPnl9xPYmxuTou8Zw6+cylTnREg==} + '@turbo/linux-arm64@2.9.8': + resolution: {integrity: sha512-v6S3HuKVoa9CEx16IxKj1i/+crxXx22A9O80zW1350zyUlcX0T/zLOxVf1k+ruK/7ssXnDJVg8uSYOxlYRedlA==} cpu: [arm64] os: [linux] - '@turbo/windows-64@2.8.21': - resolution: {integrity: sha512-/iBj4OzbqEY8CX+eaeKbBTMZv2CLXNrt0692F7HnK7LcyYwyDecaAiSET6ZzL4opT7sbwkKvzAC/fhqT3Quu1A==} + '@turbo/windows-64@2.9.8': + resolution: {integrity: sha512-JaefWOJNBazDylAn3f+lLB34XMNu8nEBbgPRP/Ewysg81cBubGfcyyyzpQOGVuMwfaqdNAE/kitG7w3AbJn9/g==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.8.21': - resolution: {integrity: sha512-95tMA/ZbIidJFUUtkmqioQ1gf3n3I1YbRP3ZgVdWTVn2qVbkodcIdGXBKRHHrIbRsLRl99SiHi/L7IxhpZDagQ==} + '@turbo/windows-arm64@2.9.8': + resolution: {integrity: sha512-Or6ljjB4TiiwCdVKDYWew0SokQ9kep5zruL8P3nbum9WdkH5XA41rQID4Ulc215Z+R3DrB+qXSHPsJjU3/n2ng==} cpu: [arm64] os: [win32] @@ -2638,58 +2638,58 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - lefthook-darwin-arm64@2.1.1: - resolution: {integrity: sha512-O/RS1j03/Fnq5zCzEb2r7UOBsqPeBuf1C5pMkIJcO4TSE6hf3rhLUkcorKc2M5ni/n5zLGtzQUXHV08/fSAT3Q==} + lefthook-darwin-arm64@2.1.6: + resolution: {integrity: sha512-hyB7eeiX78BS66f70byTJacDLC/xV1vgMv9n+idFUsrM7J3Udd/ag9Ag5NP3t0eN0EqQqAtrNnt35EH01lxnRQ==} cpu: [arm64] os: [darwin] - lefthook-darwin-x64@2.1.1: - resolution: {integrity: sha512-mm/kdKl81ROPoYnj9XYk5JDqj+/6Al8w/SSPDfhItkLJyl4pqS+hWUOP6gDGrnuRk8S0DvJ2+hzhnDsQnZohWQ==} + lefthook-darwin-x64@2.1.6: + resolution: {integrity: sha512-5Ka6cFxiH83krt+OMRQtmS6zqoZR5SLXSudLjTbZA1c3ZqF0+dqkeb4XcB6plx6WR0GFizabuc6Bi3iXPIe1eQ==} cpu: [x64] os: [darwin] - lefthook-freebsd-arm64@2.1.1: - resolution: {integrity: sha512-F7JXlKmjxGqGbCWPLND0bVB4DMQezIe48pEwTlUQZbxh450c2gP5Q8FdttMZKOT163kBGGTqJAJSEC6zW+QSxA==} + lefthook-freebsd-arm64@2.1.6: + resolution: {integrity: sha512-VswyOg5CVN3rMaOJ2HtnkltiMKgFHW/wouWxXsV8RxSa4tgWOKxM0EmSXi8qc2jX+LRga6B0uOY6toXS01zWxA==} cpu: [arm64] os: [freebsd] - lefthook-freebsd-x64@2.1.1: - resolution: {integrity: sha512-Po8/lJMqNzKSZPuEI46dLuWoBoXtAxCuRpeOh6DAV/M4RhBynaCu8rLMZ9BqF7cVbZEWoplOmYo6HdOuiYpCkQ==} + lefthook-freebsd-x64@2.1.6: + resolution: {integrity: sha512-vXsCUFYuVwrVWwcypB7Zt2Hf+5pl1V1la7ZfvGYZaTRURu0zF/XUnMF/nOz/PebGv0f4x/iOWXWwP7E42xRWsg==} cpu: [x64] os: [freebsd] - lefthook-linux-arm64@2.1.1: - resolution: {integrity: sha512-mI2ljFgPEqHxI8vrN9nKgnVu63Rz1KisDbPwlvs7BTYNwq3sncdK5ukpGR4zzWdh6saNJ5tCtHEtep5GQI11nw==} + lefthook-linux-arm64@2.1.6: + resolution: {integrity: sha512-WDJiQhJdZOvKORZd+kF/ms2l6NSsXzdA9ahflyr65V90AC4jES223W8VtEMbGPUtHuGWMEZ/v/XvwlWv0Ioz9g==} cpu: [arm64] os: [linux] - lefthook-linux-x64@2.1.1: - resolution: {integrity: sha512-m3G/FaxC+crxeg9XeaUuHfEoL+i9gbkg2Hp2KD2IcVVIxprqlyqf0Hb8zbLV2NMXuo5RSGokJu44oAoTO3Ou2g==} + lefthook-linux-x64@2.1.6: + resolution: {integrity: sha512-C18nCd7nTX1AVL4TcvwMmLAO1VI1OuGluIOTjiPkBQ746Ls1HhL5rl//jMPACmT28YmxIQJ2ZcLPNmhvEVBZvw==} cpu: [x64] os: [linux] - lefthook-openbsd-arm64@2.1.1: - resolution: {integrity: sha512-gz/8FJPvhjOdOFt1GmFvuvDOe+W+BBRjoeAT1/mTgkN7HCXMXgqNjjvakQKQeGz1I1v08wXG1ZNf5y+T9XBCDQ==} + lefthook-openbsd-arm64@2.1.6: + resolution: {integrity: sha512-mZOMxM8HiPxVFXDO3PtCUbH4GB8rkveXhsgXF27oAZTYVzQ3gO9vT6r/pxit6msqRXz3fvcwimLVJgb8eRsa8A==} cpu: [arm64] os: [openbsd] - lefthook-openbsd-x64@2.1.1: - resolution: {integrity: sha512-ch3lyMUtbmtWUufaQVn4IoEs/2hjK51XqaCdY1mh5ca//VctR1peknIwQ5feHu+vATCDviWQ7HsdNDewm3HMPg==} + lefthook-openbsd-x64@2.1.6: + resolution: {integrity: sha512-sG9ALLZSnnMOfXu+B7SmxFhJhuoAh4bqi5En5aaHJET48TqrLOcWWZuH+7ArFM6gr/U5KfSUvdmHFmY8WqCcIg==} cpu: [x64] os: [openbsd] - lefthook-windows-arm64@2.1.1: - resolution: {integrity: sha512-mm3PZhKDs9FE/jQDimkfWxtoj9xQ2k8uw2MdhtC825bhvIh+MEi0WFj/MOW+ug0RBg0I55tGYzZ5aVuozAWpTQ==} + lefthook-windows-arm64@2.1.6: + resolution: {integrity: sha512-lD8yFWY4Csuljd0Rqs7EQaySC0VvDf7V3rN1FhRMUISTRDHutebIom1Loc8ckQPvKYGC6mftT9k0GvipsS+Brw==} cpu: [arm64] os: [win32] - lefthook-windows-x64@2.1.1: - resolution: {integrity: sha512-1L2oGIzmhfOTxfwbe5mpSQ+m3ilpvGNymwIhn4UHq6hwHsUL6HEhODqx02GfBn6OXpVIr56bvdBAusjL/SVYGQ==} + lefthook-windows-x64@2.1.6: + resolution: {integrity: sha512-q4z2n3xucLscoWiyMwFViEj3N8MDSkPulMwcJYuCYFHoPhP1h+icqNu7QRLGYj6AnVrCQweiUJY3Tb2X+GbD/A==} cpu: [x64] os: [win32] - lefthook@2.1.1: - resolution: {integrity: sha512-Tl9h9c+sG3ShzTHKuR3LAIblnnh+Mgxnm2Ul7yu9cu260Z27LEbO3V6Zw4YZFP59/2rlD42pt/llYsQCkkCFzw==} + lefthook@2.1.6: + resolution: {integrity: sha512-w9sBoR0mdN+kJc3SB85VzpiAAl451/rxdCRcZlwW71QLjkeH3EBQFgc4VMj5apePychYDHAlqEWTB8J8JK/j1Q==} hasBin: true levn@0.4.1: @@ -3071,8 +3071,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true @@ -3432,50 +3432,49 @@ packages: swap-case@1.1.2: resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} - syncpack-darwin-arm64@14.0.0: - resolution: {integrity: sha512-mEcku9YkOHfM6JOxhq9McgeLvd4djsJvRwNONZXHeoJ6+yqC96DdxZwFjkw3e8Vn95wsxsrwY5ZjMExs5Gbacw==} + syncpack-darwin-arm64@14.3.1: + resolution: {integrity: sha512-WtHbqXCEDSRzdqTIroYqYSMW/0yQ8dYvpucQ6SKsbVE86K5wjFd37TOIDFM5NLudCYASJpy4FXv7G/HxHAyRLw==} cpu: [arm64] os: [darwin] - syncpack-darwin-x64@14.0.0: - resolution: {integrity: sha512-qSj3bT3SIZA5NLM5PNVeExapyOrdmptlGSMu0SLVHj9hata/Vqh3xWgwq7wB9uajmlrHljeJ84R/NKAHyzFewA==} + syncpack-darwin-x64@14.3.1: + resolution: {integrity: sha512-K+Zx1TN67vllDLrouc6YISOhhWm7RxrRE7087ea36T85WNq4JvI+M3UBJoxRjaJ+0v3wBA2YmBzEHzJg8skAww==} cpu: [x64] os: [darwin] - syncpack-linux-arm64-musl@14.0.0: - resolution: {integrity: sha512-i57Chz0tHP7ybKElPLhoygl6Cab1fxyUKS9xRgezX5NDrNxKUgrvqBfYd7288/QKB4C8+IcYHugFPjZjoFlAIA==} + syncpack-linux-arm64-musl@14.3.1: + resolution: {integrity: sha512-gZTLgIS0irmZx2HjZqco9YsbYe6sz/5Lce/yKmTBdCaHCpurb+TZA97nu5FxXSAA0HKs3Nzi8CDjNzv+yAQUXw==} cpu: [arm64] os: [linux] - syncpack-linux-arm64@14.0.0: - resolution: {integrity: sha512-votlkb4P/0Bxd9yhBWCSUOjZwaii+LfFn1tZZVN5dfs8qcjcLeqfdG5zbnlJSzZhS3T+BfzejFW+Z95OxZag0A==} + syncpack-linux-arm64@14.3.1: + resolution: {integrity: sha512-+5fXNoKz2ZqQszplZGp6J9ZKL6JW1hr3BMjEkklYz+jufX9rH/MWY0hcRCfHJSuvcTUrsYo/koqU/UnBiANjGg==} cpu: [arm64] os: [linux] - syncpack-linux-x64-musl@14.0.0: - resolution: {integrity: sha512-RKyp+29UlLGE8oYkd3UfwgjWUHN4dLHDyarv0dS6gWVpWM6qHtHS339KBc9JcIS7FD1vNGnQ3GmSaAodxDlkMA==} + syncpack-linux-x64-musl@14.3.1: + resolution: {integrity: sha512-NK+1Qm762bbXDYqAz2+++NlJ9jONX+3Hrulp4XpytFEIGABiy8wIzouBpxZkppf30+1mxt4o8LMtZ8P54/ObNA==} cpu: [x64] os: [linux] - syncpack-linux-x64@14.0.0: - resolution: {integrity: sha512-sZGy4+uL+P/+nI0yc9jwW/R22u9lw0+NXDYC/9ts9eYiWFyO4+luOeosvVKbED1OavUp/GQJqNV+9KHjMwq0Fw==} + syncpack-linux-x64@14.3.1: + resolution: {integrity: sha512-v1Y4D0oB2uIx+Npy1eD384adOSKvrjtu3VodjcQ/2aK4rTjVZl3k4eOA5py4I4Qdt6+zC6n+t5KrGuiaiBlbWQ==} cpu: [x64] os: [linux] - syncpack-windows-arm64@14.0.0: - resolution: {integrity: sha512-aNtr0F6HkA7M0azDuDkt//DlPWlplFa4kmvHXirwDmJQ9u3SAvN3ZItW4ZYS96ZbiV1DgO15jIKBI7rDkzcwrQ==} + syncpack-windows-arm64@14.3.1: + resolution: {integrity: sha512-xf+i8B5dDc3AIG8ZFF215gLQF0PKXQC6I8skmEfGy36oFh3VTAJKBjgEg6P8R3FC9/kRzkWFcDZmNLkbKN6YmA==} cpu: [arm64] os: [win32] - syncpack-windows-x64@14.0.0: - resolution: {integrity: sha512-usMH61wlonssfh2Q8SJDiiAcsXVzuPzRl8XdHqdavR3XeCSGBIW9ieJpPfiKvDPWslekufWD+GhLNoH+8vV0Cg==} + syncpack-windows-x64@14.3.1: + resolution: {integrity: sha512-gjbWwc05RcekcrLHOi5gq0JKvhoIMNqbUnAvPZLu46/+HrYuuJiUqruoj6y/GbCuvoQ880E820GF1pQFW9xNXA==} cpu: [x64] os: [win32] - syncpack@14.0.0: - resolution: {integrity: sha512-OfAa3Oip5YC9Ad1jEs92Hw08Wy4JfdpdeequIwaJGsQG0tJtb8gpQfCdLuBefsk6n8WiUdt/5qmzcW+BDXtzbQ==} + syncpack@14.3.1: + resolution: {integrity: sha512-TCqOY6Z7TH5yHV3saI6sHb5XRsZ8m2DaI4FQMonKT7UoCKL2WBiI54PLEFDSv1F2sL1BZA5e1opprf190ohirg==} engines: {node: '>=14.17.0'} - deprecated: 'pnpm users: upgrade to 14.0.2 or newer' hasBin: true term-size@2.2.1: @@ -3551,42 +3550,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.8.10: - resolution: {integrity: sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.8.10: - resolution: {integrity: sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.8.10: - resolution: {integrity: sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.8.10: - resolution: {integrity: sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.8.10: - resolution: {integrity: sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.8.10: - resolution: {integrity: sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ==} - cpu: [arm64] - os: [win32] - - turbo@2.8.10: - resolution: {integrity: sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==} - hasBin: true - - turbo@2.8.21: - resolution: {integrity: sha512-FlJ8OD5Qcp0jTAM7E4a/RhUzRNds2GzKlyxHKA6N247VLy628rrxAGlMpIXSz6VB430+TiQDJ/SMl6PL1lu6wQ==} + turbo@2.9.8: + resolution: {integrity: sha512-REEB2rVTVDTf4hav1gJ5dIsGylWZrNonvjXFtk1dCi8gND3PhZtnYkyry1bra/Fo+iP6ctTEZbg6vWfdfHq/1A==} hasBin: true type-check@0.4.0: @@ -3620,8 +3585,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -4577,13 +4542,13 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/darwin-64@2.8.21': + '@turbo/darwin-64@2.9.8': optional: true - '@turbo/darwin-arm64@2.8.21': + '@turbo/darwin-arm64@2.9.8': optional: true - '@turbo/gen@1.13.4(@types/node@25.3.0)(typescript@5.9.3)': + '@turbo/gen@1.13.4(@types/node@25.3.0)(typescript@6.0.3)': dependencies: '@turbo/workspaces': 1.13.4(@types/node@25.3.0) chalk: 2.4.2 @@ -4593,7 +4558,7 @@ snapshots: minimatch: 9.0.5 node-plop: 0.26.3 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@25.3.0)(typescript@5.9.3) + ts-node: 10.9.2(@types/node@25.3.0)(typescript@6.0.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -4603,16 +4568,16 @@ snapshots: - supports-color - typescript - '@turbo/linux-64@2.8.21': + '@turbo/linux-64@2.9.8': optional: true - '@turbo/linux-arm64@2.8.21': + '@turbo/linux-arm64@2.9.8': optional: true - '@turbo/windows-64@2.8.21': + '@turbo/windows-64@2.9.8': optional: true - '@turbo/windows-arm64@2.8.21': + '@turbo/windows-arm64@2.9.8': optional: true '@turbo/workspaces@1.13.4(@types/node@25.3.0)': @@ -4689,40 +4654,40 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.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/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@6.0.3))(eslint@9.39.2)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@6.0.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/type-utils': 8.50.0(eslint@9.39.2)(typescript@6.0.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@6.0.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.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@6.0.3)': dependencies: '@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/typescript-estree': 8.50.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.50.0 debug: 4.4.3(supports-color@5.5.0) eslint: 9.39.2 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.50.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@6.0.3) '@typescript-eslint/types': 8.50.0 debug: 4.4.3(supports-color@5.5.0) - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -4731,47 +4696,47 @@ snapshots: '@typescript-eslint/types': 8.50.0 '@typescript-eslint/visitor-keys': 8.50.0 - '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.50.0(typescript@6.0.3)': dependencies: - typescript: 5.9.3 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2)(typescript@6.0.3)': dependencies: '@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) + '@typescript-eslint/typescript-estree': 8.50.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@6.0.3) debug: 4.4.3(supports-color@5.5.0) eslint: 9.39.2 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.50.0': {} - '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.50.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) + '@typescript-eslint/project-service': 8.50.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@6.0.3) '@typescript-eslint/types': 8.50.0 '@typescript-eslint/visitor-keys': 8.50.0 debug: 4.4.3(supports-color@5.5.0) minimatch: 9.0.5 semver: 7.7.3 tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.50.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/utils@8.50.0(eslint@9.39.2)(typescript@6.0.3)': dependencies: '@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) + '@typescript-eslint/typescript-estree': 8.50.0(typescript@6.0.3) eslint: 9.39.2 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -4833,14 +4798,14 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - abitype@1.1.0(typescript@5.9.3)(zod@4.2.0): + abitype@1.1.0(typescript@6.0.3)(zod@4.2.0): optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 zod: 4.2.0 - abitype@1.2.2(typescript@5.9.3)(zod@4.2.0): + abitype@1.2.2(typescript@6.0.3)(zod@4.2.0): optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 zod: 4.2.0 acorn-jsx@5.3.2(acorn@8.15.0): @@ -5482,11 +5447,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.8.21): + eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.9.8): dependencies: dotenv: 16.0.3 eslint: 9.39.2 - turbo: 2.8.21 + turbo: 2.9.8 eslint-scope@8.4.0: dependencies: @@ -6162,48 +6127,48 @@ snapshots: dependencies: json-buffer: 3.0.1 - lefthook-darwin-arm64@2.1.1: + lefthook-darwin-arm64@2.1.6: optional: true - lefthook-darwin-x64@2.1.1: + lefthook-darwin-x64@2.1.6: optional: true - lefthook-freebsd-arm64@2.1.1: + lefthook-freebsd-arm64@2.1.6: optional: true - lefthook-freebsd-x64@2.1.1: + lefthook-freebsd-x64@2.1.6: optional: true - lefthook-linux-arm64@2.1.1: + lefthook-linux-arm64@2.1.6: optional: true - lefthook-linux-x64@2.1.1: + lefthook-linux-x64@2.1.6: optional: true - lefthook-openbsd-arm64@2.1.1: + lefthook-openbsd-arm64@2.1.6: optional: true - lefthook-openbsd-x64@2.1.1: + lefthook-openbsd-x64@2.1.6: optional: true - lefthook-windows-arm64@2.1.1: + lefthook-windows-arm64@2.1.6: optional: true - lefthook-windows-x64@2.1.1: + lefthook-windows-x64@2.1.6: optional: true - lefthook@2.1.1: + lefthook@2.1.6: optionalDependencies: - lefthook-darwin-arm64: 2.1.1 - lefthook-darwin-x64: 2.1.1 - lefthook-freebsd-arm64: 2.1.1 - lefthook-freebsd-x64: 2.1.1 - lefthook-linux-arm64: 2.1.1 - lefthook-linux-x64: 2.1.1 - lefthook-openbsd-arm64: 2.1.1 - lefthook-openbsd-x64: 2.1.1 - lefthook-windows-arm64: 2.1.1 - lefthook-windows-x64: 2.1.1 + lefthook-darwin-arm64: 2.1.6 + lefthook-darwin-x64: 2.1.6 + lefthook-freebsd-arm64: 2.1.6 + lefthook-freebsd-x64: 2.1.6 + lefthook-linux-arm64: 2.1.6 + lefthook-linux-x64: 2.1.6 + lefthook-openbsd-arm64: 2.1.6 + lefthook-openbsd-x64: 2.1.6 + lefthook-windows-arm64: 2.1.6 + lefthook-windows-x64: 2.1.6 levn@0.4.1: dependencies: @@ -6298,9 +6263,9 @@ snapshots: minipass@7.1.3: {} - mipd@0.0.7(typescript@5.9.3): + mipd@0.0.7(typescript@6.0.3): optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 mkdirp@0.5.6: dependencies: @@ -6470,7 +6435,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.9.17(typescript@5.9.3)(zod@4.2.0): + ox@0.9.17(typescript@6.0.3)(zod@4.2.0): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -6478,10 +6443,10 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.2(typescript@5.9.3)(zod@4.2.0) + abitype: 1.2.2(typescript@6.0.3)(zod@4.2.0) eventemitter3: 5.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - zod @@ -6606,7 +6571,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.8.1: {} + prettier@3.8.3: {} prop-types@15.8.1: dependencies: @@ -7058,40 +7023,40 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.3 - syncpack-darwin-arm64@14.0.0: + syncpack-darwin-arm64@14.3.1: optional: true - syncpack-darwin-x64@14.0.0: + syncpack-darwin-x64@14.3.1: optional: true - syncpack-linux-arm64-musl@14.0.0: + syncpack-linux-arm64-musl@14.3.1: optional: true - syncpack-linux-arm64@14.0.0: + syncpack-linux-arm64@14.3.1: optional: true - syncpack-linux-x64-musl@14.0.0: + syncpack-linux-x64-musl@14.3.1: optional: true - syncpack-linux-x64@14.0.0: + syncpack-linux-x64@14.3.1: optional: true - syncpack-windows-arm64@14.0.0: + syncpack-windows-arm64@14.3.1: optional: true - syncpack-windows-x64@14.0.0: + syncpack-windows-x64@14.3.1: optional: true - syncpack@14.0.0: + syncpack@14.3.1: optionalDependencies: - syncpack-darwin-arm64: 14.0.0 - syncpack-darwin-x64: 14.0.0 - syncpack-linux-arm64: 14.0.0 - syncpack-linux-arm64-musl: 14.0.0 - syncpack-linux-x64: 14.0.0 - syncpack-linux-x64-musl: 14.0.0 - syncpack-windows-arm64: 14.0.0 - syncpack-windows-x64: 14.0.0 + syncpack-darwin-arm64: 14.3.1 + syncpack-darwin-x64: 14.3.1 + syncpack-linux-arm64: 14.3.1 + syncpack-linux-arm64-musl: 14.3.1 + syncpack-linux-x64: 14.3.1 + syncpack-linux-x64-musl: 14.3.1 + syncpack-windows-arm64: 14.3.1 + syncpack-windows-x64: 14.3.1 term-size@2.2.1: {} @@ -7132,11 +7097,11 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.9.3): + ts-api-utils@2.1.0(typescript@6.0.3): dependencies: - typescript: 5.9.3 + typescript: 6.0.3 - ts-node@10.9.2(@types/node@25.3.0)(typescript@5.9.3): + ts-node@10.9.2(@types/node@25.3.0)(typescript@6.0.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -7150,7 +7115,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.3 + typescript: 6.0.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -7158,41 +7123,14 @@ snapshots: tslib@2.8.1: {} - turbo-darwin-64@2.8.10: - optional: true - - turbo-darwin-arm64@2.8.10: - optional: true - - turbo-linux-64@2.8.10: - optional: true - - turbo-linux-arm64@2.8.10: - optional: true - - turbo-windows-64@2.8.10: - optional: true - - turbo-windows-arm64@2.8.10: - optional: true - - turbo@2.8.10: - optionalDependencies: - turbo-darwin-64: 2.8.10 - turbo-darwin-arm64: 2.8.10 - turbo-linux-64: 2.8.10 - turbo-linux-arm64: 2.8.10 - turbo-windows-64: 2.8.10 - turbo-windows-arm64: 2.8.10 - - turbo@2.8.21: + turbo@2.9.8: optionalDependencies: - '@turbo/darwin-64': 2.8.21 - '@turbo/darwin-arm64': 2.8.21 - '@turbo/linux-64': 2.8.21 - '@turbo/linux-arm64': 2.8.21 - '@turbo/windows-64': 2.8.21 - '@turbo/windows-arm64': 2.8.21 + '@turbo/darwin-64': 2.9.8 + '@turbo/darwin-arm64': 2.9.8 + '@turbo/linux-64': 2.9.8 + '@turbo/linux-arm64': 2.9.8 + '@turbo/windows-64': 2.9.8 + '@turbo/windows-arm64': 2.9.8 type-check@0.4.0: dependencies: @@ -7233,18 +7171,18 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.50.0(eslint@9.39.2)(typescript@5.9.3): + typescript-eslint@8.50.0(eslint@9.39.2)(typescript@6.0.3): dependencies: - '@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) + '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@6.0.3))(eslint@9.39.2)(typescript@6.0.3) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.50.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@6.0.3) eslint: 9.39.2 - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - typescript@5.9.3: {} + typescript@6.0.3: {} uglify-js@3.19.3: optional: true @@ -7293,18 +7231,18 @@ snapshots: validate-npm-package-name@5.0.1: {} - viem@2.42.1(typescript@5.9.3)(zod@4.2.0): + viem@2.42.1(typescript@6.0.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)(zod@4.2.0) + abitype: 1.1.0(typescript@6.0.3)(zod@4.2.0) isows: 1.0.7(ws@8.18.3) - ox: 0.9.17(typescript@5.9.3)(zod@4.2.0) + ox: 0.9.17(typescript@6.0.3)(zod@4.2.0) ws: 8.18.3 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - bufferutil - utf-8-validate diff --git a/repo/eslint-config/package.json b/repo/eslint-config/package.json index 9c38b6988..4b4d2db7f 100644 --- a/repo/eslint-config/package.json +++ b/repo/eslint-config/package.json @@ -18,7 +18,7 @@ "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-turbo": "^2.6.3", "globals": "^16.5.0", - "typescript": "^5.9.3", + "typescript": "^6.0.3", "typescript-eslint": "^8.49.0" } } diff --git a/repo/typescript-config/next-css-side-effect.d.ts b/repo/typescript-config/next-css-side-effect.d.ts new file mode 100644 index 000000000..6a748979a --- /dev/null +++ b/repo/typescript-config/next-css-side-effect.d.ts @@ -0,0 +1,2 @@ +/** Plain `.css` side-effect imports (e.g. `app/globals.css`). `*.module.css` is covered by Next. */ +declare module '*.css' {} diff --git a/repo/ui/package.json b/repo/ui/package.json index f0045e54d..4c3634444 100644 --- a/repo/ui/package.json +++ b/repo/ui/package.json @@ -20,7 +20,7 @@ "@types/node": "^25.3.0", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", - "typescript": "^5.9.3" + "typescript": "^6.0.3" }, "dependencies": { "react": "^19.2.3", From 68f6d2978290d702e417002843f0f932f9529513 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 16 Apr 2026 14:30:14 +0200 Subject: [PATCH 121/144] New userdata.gen.ts --- .../services/userdata/src/userdata.gen.ts | 137 +++++++++++++++++- 1 file changed, 135 insertions(+), 2 deletions(-) diff --git a/packages/services/userdata/src/userdata.gen.ts b/packages/services/userdata/src/userdata.gen.ts index d671010be..5a4882250 100644 --- a/packages/services/userdata/src/userdata.gen.ts +++ b/packages/services/userdata/src/userdata.gen.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// userdata v0.1.0 88764bb5f99353e11d849a1aa8f8a998501ffedb +// userdata v0.1.0 1c37d1866dada9f3770a8ca37e790c7bcdb6424a // -- // Code generated by Webrpc-gen@v0.30.2 with typescript generator. DO NOT EDIT. // @@ -12,7 +12,7 @@ export const WebrpcVersion = 'v1' export const WebrpcSchemaVersion = 'v0.1.0' // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = '88764bb5f99353e11d849a1aa8f8a998501ffedb' +export const WebrpcSchemaHash = '1c37d1866dada9f3770a8ca37e790c7bcdb6424a' // // Client interface @@ -152,6 +152,20 @@ export interface UserDataClient { headers?: object, signal?: AbortSignal, ): Promise + + listActiveDevices( + req: ListActiveDevicesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise + + putActiveDevice(req: PutActiveDeviceRequest, headers?: object, signal?: AbortSignal): Promise + + deleteActiveDevice( + req: DeleteActiveDeviceRequest, + headers?: object, + signal?: AbortSignal, + ): Promise } // @@ -294,6 +308,29 @@ export interface WatchedWalletProps { nickname?: string } +export interface ActiveDevice { + walletAddress: string + address: string + nickname?: string + userAgent: string + platform: string + mobile: boolean + location?: string + firstSeen: string + lastSeen: string + createdAt: string + updatedAt: string +} + +export interface ActiveDeviceProps { + address: string + nickname?: string + userAgent: string + platform: string + mobile: boolean + location?: string +} + export interface GetCapabilitiesRequest {} export interface GetCapabilitiesResponse { @@ -550,6 +587,33 @@ export interface DeleteHiddenTokenRequest { export interface DeleteHiddenTokenResponse {} +export interface ListActiveDevicesRequest { + wallet: string + pageSize: number + cursor: string +} + +export interface ListActiveDevicesResponse { + devices: Array + nextCursor: string +} + +export interface PutActiveDeviceRequest { + wallet: string + device: ActiveDeviceProps +} + +export interface PutActiveDeviceResponse { + device: ActiveDevice +} + +export interface DeleteActiveDeviceRequest { + wallet: string + address: string +} + +export interface DeleteActiveDeviceResponse {} + // // Client // @@ -599,6 +663,9 @@ export class UserData implements UserDataClient { listHiddenTokens: (req: ListHiddenTokensRequest) => ['UserData', 'listHiddenTokens', req] as const, putHiddenToken: (req: PutHiddenTokenRequest) => ['UserData', 'putHiddenToken', req] as const, deleteHiddenToken: (req: DeleteHiddenTokenRequest) => ['UserData', 'deleteHiddenToken', req] as const, + listActiveDevices: (req: ListActiveDevicesRequest) => ['UserData', 'listActiveDevices', req] as const, + putActiveDevice: (req: PutActiveDeviceRequest) => ['UserData', 'putActiveDevice', req] as const, + deleteActiveDevice: (req: DeleteActiveDeviceRequest) => ['UserData', 'deleteActiveDevice', req] as const, } getCapabilities = (headers?: object, signal?: AbortSignal): Promise => { @@ -1215,6 +1282,72 @@ export class UserData implements UserDataClient { }, ) } + + listActiveDevices = ( + req: ListActiveDevicesRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('ListActiveDevices'), + createHttpRequest(JsonEncode(req, 'ListActiveDevicesRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'ListActiveDevicesResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + putActiveDevice = ( + req: PutActiveDeviceRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('PutActiveDevice'), + createHttpRequest(JsonEncode(req, 'PutActiveDeviceRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'PutActiveDeviceResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } + + deleteActiveDevice = ( + req: DeleteActiveDeviceRequest, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch( + this.url('DeleteActiveDevice'), + createHttpRequest(JsonEncode(req, 'DeleteActiveDeviceRequest'), headers, signal), + ).then( + (res) => { + return buildResponse(res).then((_data) => { + return JsonDecode(_data, 'DeleteActiveDeviceResponse') + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ + cause: `fetch(): ${error instanceof Error ? error.message : String(error)}`, + }) + }, + ) + } } const createHttpRequest = (body: string = '{}', headers: object = {}, signal: AbortSignal | null = null): object => { From e804f032f94e4fdf83a8c747c97c1198543bcdaa Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 16 Apr 2026 16:20:35 +0200 Subject: [PATCH 122/144] 3.0.6 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index de944ea36..6996a4118 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 29e0fd74c..2b051e0c2 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.5", + "version": "3.0.6", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index e45889345..0ae3d6418 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index d7b89a694..9f23e13e0 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.5", + "version": "3.0.6", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index a705f48ba..822b2cdec 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 57dc6b4e2..8ae80c463 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.5", + "version": "3.0.6", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index ff6cebf47..dba4f6963 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index ea2abd640..5a9262ace 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.5", + "version": "3.0.6", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index fb104e35f..5d042a5b0 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index c7c6e6db7..74a4186ef 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.5", + "version": "3.0.6", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 5a97b94e8..6c1e3c8d3 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index c2b372d07..53dd3805b 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.5", + "version": "3.0.6", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 3362b424e..9024c9954 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index f6b1f39dd..1f6bcab2d 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.5", + "version": "3.0.6", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index abefb99b7..7a4d1a061 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.6 + ## 3.0.5 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 43e3a79d9..fc0f0b195 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.5", + "version": "3.0.6", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 51ebad413..d0d38f935 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 2d9690477..13f3eb2fc 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.5", + "version": "3.0.6", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 8194c38b8..ca22c1d98 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 909e1226d..63fe81dc1 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.5", + "version": "3.0.6", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 23fc45fe4..1c4b5ad79 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support +- Updated dependencies + - @0xsequence/guard@3.0.6 + - @0xsequence/relayer@3.0.6 + - @0xsequence/wallet-primitives@3.0.6 + ## 3.0.5 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 05b3cc7da..68381fdf8 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.5", + "version": "3.0.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 2039d0c2d..b836fbc6a 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support +- Updated dependencies + - @0xsequence/guard@3.0.6 + - @0xsequence/relayer@3.0.6 + - @0xsequence/wallet-core@3.0.6 + - @0xsequence/wallet-primitives@3.0.6 + ## 3.0.5 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 71022d182..2f87aee79 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.5", + "version": "3.0.6", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 7e5a4cdbf..29c297a29 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support + ## 3.0.5 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 0cd4d93df..a6397edc3 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.5", + "version": "3.0.6", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 5101c28c5..369b60d4f 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.6 + +### Patch Changes + +- userdata upgrade, arweave support +- Updated dependencies + - @0xsequence/guard@3.0.6 + - @0xsequence/identity-instrument@3.0.6 + - @0xsequence/relayer@3.0.6 + - @0xsequence/wallet-core@3.0.6 + - @0xsequence/wallet-primitives@3.0.6 + ## 3.0.5 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 681c70c8e..11447749c 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.5", + "version": "3.0.6", "license": "Apache-2.0", "type": "module", "publishConfig": { From 021207e8323304f0824f56d34f9662355f59a373 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 5 May 2026 11:27:34 +0200 Subject: [PATCH 123/144] 3.0.7 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 6996a4118..41da58802 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 2b051e0c2..af9d87826 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.6", + "version": "3.0.7", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 0ae3d6418..fa0194ad8 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 9f23e13e0..fa6e74220 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.6", + "version": "3.0.7", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 822b2cdec..01ea62e91 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 8ae80c463..23e20abd2 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.6", + "version": "3.0.7", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index dba4f6963..332a1da08 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 5a9262ace..52e9dd3e9 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.6", + "version": "3.0.7", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 5d042a5b0..60ba43237 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 74a4186ef..34866a0a4 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.6", + "version": "3.0.7", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 6c1e3c8d3..279631525 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 53dd3805b..b170e7e96 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.6", + "version": "3.0.7", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 9024c9954..3aba7ff75 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 1f6bcab2d..60e74e945 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.6", + "version": "3.0.7", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 7a4d1a061..8bacc6a22 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.7 + +### Patch Changes + +- Minor bug fixes +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.7 + ## 3.0.6 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index fc0f0b195..86caff6b9 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.6", + "version": "3.0.7", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index d0d38f935..d77aa6ae6 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 13f3eb2fc..736a1d2fc 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.6", + "version": "3.0.7", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index ca22c1d98..7703a169b 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 63fe81dc1..a5ab2a7e0 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.6", + "version": "3.0.7", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 1c4b5ad79..95389b179 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.7 + +### Patch Changes + +- Minor bug fixes +- Updated dependencies + - @0xsequence/guard@3.0.7 + - @0xsequence/relayer@3.0.7 + - @0xsequence/wallet-primitives@3.0.7 + ## 3.0.6 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 68381fdf8..981013a46 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.6", + "version": "3.0.7", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index b836fbc6a..8b3ad2e3b 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.7 + +### Patch Changes + +- Minor bug fixes +- Updated dependencies + - @0xsequence/guard@3.0.7 + - @0xsequence/relayer@3.0.7 + - @0xsequence/wallet-core@3.0.7 + - @0xsequence/wallet-primitives@3.0.7 + ## 3.0.6 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 2f87aee79..160196a45 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.6", + "version": "3.0.7", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 29c297a29..dbb469e9f 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.7 + +### Patch Changes + +- Minor bug fixes + ## 3.0.6 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index a6397edc3..d1e94ce9d 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.6", + "version": "3.0.7", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 369b60d4f..5c3a48775 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.7 + +### Patch Changes + +- Minor bug fixes +- Updated dependencies + - @0xsequence/guard@3.0.7 + - @0xsequence/identity-instrument@3.0.7 + - @0xsequence/relayer@3.0.7 + - @0xsequence/wallet-core@3.0.7 + - @0xsequence/wallet-primitives@3.0.7 + ## 3.0.6 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 11447749c..593a4c699 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.6", + "version": "3.0.7", "license": "Apache-2.0", "type": "module", "publishConfig": { From 1c23094b8b2e50fc1db1c43a4d6786133f55f2be Mon Sep 17 00:00:00 2001 From: Corban Riley Date: Wed, 6 May 2026 12:44:18 -0400 Subject: [PATCH 124/144] Fix fee options for undeployed wallets (#998) --- .../services/relayer/src/relayer/relayer.ts | 1 + .../relayer/src/relayer/rpc-relayer/index.ts | 14 +-- .../relayer/src/relayer/standard/sequence.ts | 3 +- .../relayer/test/relayer/relayer.test.ts | 67 ++++++++++-- packages/wallet/core/src/wallet.ts | 50 +++++++++ .../core/test/wallet-fee-options.test.ts | 101 ++++++++++++++++++ .../dapp-client/src/ChainSessionManager.ts | 8 +- .../wallet/wdk/src/sequence/transactions.ts | 31 ++++-- 8 files changed, 249 insertions(+), 26 deletions(-) create mode 100644 packages/wallet/core/test/wallet-fee-options.test.ts diff --git a/packages/services/relayer/src/relayer/relayer.ts b/packages/services/relayer/src/relayer/relayer.ts index f68536820..9f648004a 100644 --- a/packages/services/relayer/src/relayer/relayer.ts +++ b/packages/services/relayer/src/relayer/relayer.ts @@ -18,6 +18,7 @@ export interface Relayer { chainId: number, to: Address.Address, calls: Payload.Call[], + data?: Hex.Hex, ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> relay(to: Address.Address, data: Hex.Hex, chainId: number, quote?: FeeQuote): Promise<{ opHash: Hex.Hex }> diff --git a/packages/services/relayer/src/relayer/rpc-relayer/index.ts b/packages/services/relayer/src/relayer/rpc-relayer/index.ts index e045b996e..814d25bbd 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/index.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/index.ts @@ -149,22 +149,24 @@ export class RpcRelayer implements Relayer { chainId: number, to: Address.Address, calls: Payload.Call[], + data?: Hex.Hex, ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { // IMPORTANT: // The relayer FeeOptions endpoint simulates `eth_call(to, data)`. - // wallet-webapp-v3 requests FeeOptions with `to = wallet` and `data = Payload.encode(calls, self=wallet)`. - // This works for undeployed wallets and avoids guest-module simulation pitfalls. - const callsStruct: Payload.Calls = { type: 'call', space: 0n, nonce: 0n, calls: calls } + // Callers that already built a wallet transaction should pass its `to` and `data`. + // This is required for undeployed wallets because the transaction must target the + // guest module and include the deploy call before executing from the wallet. + const callsStruct: Payload.Calls = { type: 'call', space: 0n, nonce: 0n, calls } - const feeOptionsTo = wallet - const data = Payload.encode(callsStruct, wallet) + const feeOptionsTo = to + const feeOptionsData = data ?? Hex.fromBytes(Payload.encode(callsStruct, to)) try { const result = await this.client.feeOptions( { wallet, to: feeOptionsTo, - data: Hex.fromBytes(data), + data: feeOptionsData, }, { ...(this.projectAccessKey ? { 'X-Access-Key': this.projectAccessKey } : undefined) }, ) diff --git a/packages/services/relayer/src/relayer/standard/sequence.ts b/packages/services/relayer/src/relayer/standard/sequence.ts index bb55a9726..1ae5ec69b 100644 --- a/packages/services/relayer/src/relayer/standard/sequence.ts +++ b/packages/services/relayer/src/relayer/standard/sequence.ts @@ -38,11 +38,12 @@ export class SequenceRelayer implements Relayer { _chainId: number, to: Address.Address, calls: Payload.Call[], + transactionData?: Hex.Hex, ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { const execute = AbiFunction.from('function execute(bytes calldata _payload, bytes calldata _signature)') const payload = Payload.encode({ type: 'call', space: 0n, nonce: 0n, calls }, to) const signature = '0x0001' // TODO: use a stub signature - const data = AbiFunction.encodeData(execute, [Bytes.toHex(payload), signature]) + const data = transactionData ?? AbiFunction.encodeData(execute, [Bytes.toHex(payload), signature]) const { options, quote } = await this.service.feeOptions({ wallet, to, data }) diff --git a/packages/services/relayer/test/relayer/relayer.test.ts b/packages/services/relayer/test/relayer/relayer.test.ts index 716cd11d6..028ccf32f 100644 --- a/packages/services/relayer/test/relayer/relayer.test.ts +++ b/packages/services/relayer/test/relayer/relayer.test.ts @@ -91,13 +91,11 @@ describe('Relayer', () => { }) it('should return false for non-objects', () => { - // These will throw due to the 'in' operator, so we need to test the actual behavior - 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(Relayer.isRelayer(null)).toBe(false) + expect(Relayer.isRelayer(undefined)).toBe(false) + expect(Relayer.isRelayer('string')).toBe(false) + expect(Relayer.isRelayer(123)).toBe(false) + expect(Relayer.isRelayer(true)).toBe(false) expect(Relayer.isRelayer([])).toBe(false) }) @@ -324,6 +322,61 @@ describe('Relayer', () => { }) }) + describe('RpcRelayer.feeOptions', () => { + const mockCall: Payload.Call = { + to: TEST_TO_ADDRESS, + value: 0n, + data: TEST_DATA, + gasLimit: 21000n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + } + + const makeRelayer = () => { + const requests: Array<{ input: RequestInfo; init?: RequestInit }> = [] + const fetchImpl = vi.fn(async (input: RequestInfo, init?: RequestInit) => { + requests.push({ input, init }) + return new Response(JSON.stringify({ options: [], sponsored: false }), { status: 200 }) + }) + + return { + relayer: new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl), + requests, + } + } + + it('should send provided transaction target and data when available', async () => { + const { relayer, requests } = makeRelayer() + + await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall], TEST_DATA) + + expect(requests).toHaveLength(1) + expect(requests[0]!.input).toBe('https://relayer.test/rpc/Relayer/FeeOptions') + expect(JSON.parse(requests[0]!.init!.body as string)).toEqual({ + wallet: TEST_WALLET_ADDRESS, + to: TEST_TO_ADDRESS, + data: TEST_DATA, + }) + }) + + it('should encode calls for the provided target when transaction data is not provided', async () => { + const { relayer, requests } = makeRelayer() + + await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall]) + + const expectedData = Hex.fromBytes( + Payload.encode({ type: 'call', space: 0n, nonce: 0n, calls: [mockCall] }, TEST_TO_ADDRESS), + ) + + expect(JSON.parse(requests[0]!.init!.body as string)).toEqual({ + wallet: TEST_WALLET_ADDRESS, + to: TEST_TO_ADDRESS, + data: expectedData, + }) + }) + }) + describe('Type compatibility', () => { it('should work with Address and Hex types from ox', () => { // Test that the interfaces work correctly with ox types diff --git a/packages/wallet/core/src/wallet.ts b/packages/wallet/core/src/wallet.ts index d89d5b2b9..cdfdf66c2 100644 --- a/packages/wallet/core/src/wallet.ts +++ b/packages/wallet/core/src/wallet.ts @@ -494,6 +494,56 @@ export class Wallet { } } + async buildFeeOptionsTransaction( + provider: Provider.Provider, + payload: Payload.Calls, + ): Promise<{ to: Address.Address; data: Hex.Hex }> { + const status = await this.getStatus(provider) + const signature = '0x0001' as Hex.Hex + + const executeData = AbiFunction.encodeData(Constants.EXECUTE, [Bytes.toHex(Payload.encode(payload)), signature]) + + if (status.isDeployed) { + return { + to: this.address, + data: executeData, + } + } + + const deploy = await this.buildDeployTransaction() + + return { + to: this.guest, + data: Bytes.toHex( + Payload.encode({ + type: 'call', + space: 0n, + nonce: 0n, + calls: [ + { + to: deploy.to, + value: 0n, + data: deploy.data, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }, + { + to: this.address, + value: 0n, + data: executeData, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }, + ], + }), + ), + } + } + async buildTransaction(provider: Provider.Provider, envelope: Envelope.Signed) { const status = await this.getStatus(provider) diff --git a/packages/wallet/core/test/wallet-fee-options.test.ts b/packages/wallet/core/test/wallet-fee-options.test.ts new file mode 100644 index 000000000..d3e4ef30f --- /dev/null +++ b/packages/wallet/core/test/wallet-fee-options.test.ts @@ -0,0 +1,101 @@ +import { describe, expect, it, vi } from 'vitest' +import { AbiFunction, Address, Bytes, Hex, Provider } from 'ox' + +import { Constants, Config, Context, Payload } from '../../primitives/src/index.js' +import { State, Wallet } from '../src/index.js' + +const SIGNER = '0x1234567890123456789012345678901234567890' as Address.Address +const TARGET = '0xabcdefabcdefabcdefabcdefabcdefabcdefabcd' as Address.Address + +const configuration: Config.Config = { + threshold: 1n, + checkpoint: 0n, + topology: { type: 'signer', address: SIGNER, weight: 1n }, +} + +const call: Payload.Call = { + to: TARGET, + value: 0n, + data: '0x', + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', +} + +const payload: Payload.Calls = { + type: 'call', + space: 0n, + nonce: 0n, + calls: [call], +} + +function providerFor(options: { deployed: boolean; imageHash: Hex.Hex }): Provider.Provider { + return { + request: vi.fn(async (request: { method: string; params?: unknown[] }) => { + switch (request.method) { + case 'eth_chainId': + return '0x1' + + case 'eth_getCode': + return options.deployed ? '0x1234' : '0x' + + case 'eth_call': { + const rpcCall = request.params?.[0] as { data?: Hex.Hex } | undefined + + if (rpcCall?.data === AbiFunction.encodeData(Constants.GET_IMPLEMENTATION)) { + return options.deployed ? Hex.padLeft(Context.Dev2.stage2, 32) : '0x' + } + + if (rpcCall?.data === AbiFunction.encodeData(Constants.IMAGE_HASH)) { + return options.imageHash + } + + return '0x' + } + + default: + throw new Error(`Unexpected RPC method: ${request.method}`) + } + }), + } as unknown as Provider.Provider +} + +async function createWallet() { + const stateProvider = new State.Local.Provider() + const wallet = await Wallet.fromConfiguration(configuration, { stateProvider, context: Context.Dev2 }) + const imageHash = Hex.from(Config.hashConfiguration(configuration)) + + return { wallet, imageHash } +} + +describe('Wallet.buildFeeOptionsTransaction', () => { + it('targets the wallet execute method when the wallet is deployed', async () => { + const { wallet, imageHash } = await createWallet() + const transaction = await wallet.buildFeeOptionsTransaction(providerFor({ deployed: true, imageHash }), payload) + + const expectedData = AbiFunction.encodeData(Constants.EXECUTE, [Bytes.toHex(Payload.encode(payload)), '0x0001']) + + expect(Address.isEqual(transaction.to, wallet.address)).toBe(true) + expect(transaction.data).toBe(expectedData) + }) + + it('targets the guest module and prefixes deployment when the wallet is undeployed', async () => { + const { wallet, imageHash } = await createWallet() + const deploy = await wallet.buildDeployTransaction() + const transaction = await wallet.buildFeeOptionsTransaction(providerFor({ deployed: false, imageHash }), payload) + const decoded = Payload.decode(Bytes.fromHex(transaction.data)) + + const expectedExecuteData = AbiFunction.encodeData(Constants.EXECUTE, [ + Bytes.toHex(Payload.encode(payload)), + '0x0001', + ]) + + expect(Address.isEqual(transaction.to, Constants.DefaultGuestAddress)).toBe(true) + expect(decoded.calls).toHaveLength(2) + expect(Address.isEqual(decoded.calls[0]!.to, deploy.to)).toBe(true) + expect(decoded.calls[0]!.data).toBe(deploy.data) + expect(Address.isEqual(decoded.calls[1]!.to, wallet.address)).toBe(true) + expect(decoded.calls[1]!.data).toBe(expectedExecuteData) + }) +}) diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index a57e2c232..dc1f30e23 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -865,7 +865,13 @@ export class ChainSessionManager { } const walletAddress = this.walletAddress if (!walletAddress) throw new InitializationError('Wallet is not initialized.') - const feeOptions = await this.relayer.feeOptions(walletAddress, this.chainId, signedCall.to, callsToSend) + const feeOptions = await this.relayer.feeOptions( + walletAddress, + this.chainId, + signedCall.to, + callsToSend, + signedCall.data, + ) return feeOptions.options } catch (err) { throw new FeeOptionError(`Failed to get fee options: ${err instanceof Error ? err.message : String(err)}`) diff --git a/packages/wallet/wdk/src/sequence/transactions.ts b/packages/wallet/wdk/src/sequence/transactions.ts index 26bf21d34..146d66999 100644 --- a/packages/wallet/wdk/src/sequence/transactions.ts +++ b/packages/wallet/wdk/src/sequence/transactions.ts @@ -310,22 +310,28 @@ export class Transactions implements TransactionsInterface { throw new Error(`Transaction ${transactionId} is not in the requested state`) } + if (!Payload.isCalls(tx.envelope.payload)) { + throw new Error(`Transaction ${transactionId} is not a calls payload`) + } + + const payload = tx.envelope.payload + // Modify the envelope with the changes if (changes?.nonce) { - tx.envelope.payload.nonce = changes.nonce + payload.nonce = changes.nonce } if (changes?.space) { - tx.envelope.payload.space = changes.space + payload.space = changes.space } if (changes?.calls) { - if (changes.calls.length !== tx.envelope.payload.calls.length) { + if (changes.calls.length !== payload.calls.length) { throw new Error(`Invalid number of calls for transaction ${transactionId}`) } for (let i = 0; i < changes.calls.length; i++) { - tx.envelope.payload.calls[i]!.gasLimit = changes.calls[i]!.gasLimit + payload.calls[i]!.gasLimit = changes.calls[i]!.gasLimit } } @@ -335,6 +341,7 @@ export class Transactions implements TransactionsInterface { throw new Error(`Network not found for ${tx.envelope.chainId}`) } const provider = Provider.from(RpcTransport.fromHttp(network.rpcUrl)) + const feeOptionsTransaction = await wallet.buildFeeOptionsTransaction(provider, payload) // Get relayer and relayer options const [allRelayerOptions, allBundlerOptions] = await Promise.all([ @@ -347,11 +354,13 @@ export class Transactions implements TransactionsInterface { return [] } - // Determine the to address for the built transaction - const walletStatus = await wallet.getStatus(provider) - const to = walletStatus.isDeployed ? wallet.address : wallet.guest - - const feeOptions = await relayer.feeOptions(tx.wallet, tx.envelope.chainId, to, tx.envelope.payload.calls) + const feeOptions = await relayer.feeOptions( + tx.wallet, + tx.envelope.chainId, + feeOptionsTransaction.to, + payload.calls, + feeOptionsTransaction.data, + ) if (feeOptions.options.length === 0) { const { name, icon } = relayer instanceof Relayer.EIP6963.EIP6963Relayer ? relayer.info : {} @@ -392,8 +401,8 @@ export class Transactions implements TransactionsInterface { } try { - const erc4337Op = await wallet.prepare4337Transaction(provider, tx.envelope.payload.calls, { - space: tx.envelope.payload.space, + const erc4337Op = await wallet.prepare4337Transaction(provider, payload.calls, { + space: payload.space, }) const erc4337OpsWithEstimatedLimits = await bundler.estimateLimits(tx.wallet, erc4337Op.payload) From 34fc30ae1f545c629c3a03b48ac5d6cd453d11ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 12:06:09 +0200 Subject: [PATCH 125/144] Bump next from 15.5.14 to 15.5.15 (#989) Bumps [next](https://github.com/vercel/next.js) from 15.5.14 to 15.5.15. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.14...v15.5.15) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.15 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 | 191 ++++++++++++++++++++++++++------------- 3 files changed, 128 insertions(+), 67 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index d48a68d1e..eb5768ed0 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.14", + "next": "^15.5.15", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/extras/web/package.json b/extras/web/package.json index 3f2920e88..a4c4edaa7 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.14", + "next": "^15.5.15", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a729099c4..1306fd11f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.14 - version: 15.5.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.15 + version: 15.5.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -76,8 +76,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.14 - version: 15.5.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.15 + version: 15.5.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -530,7 +530,7 @@ importers: version: 7.0.1(eslint@9.39.2) eslint-plugin-turbo: specifier: ^2.6.3 - version: 2.6.3(eslint@9.39.2)(turbo@2.9.8) + version: 2.6.3(eslint@9.39.2)(turbo@2.9.9) globals: specifier: ^16.5.0 version: 16.5.0 @@ -720,8 +720,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.9.1': - resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} @@ -1104,56 +1104,56 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.5.14': - resolution: {integrity: sha512-aXeirLYuASxEgi4X4WhfXsShCFxWDfNn/8ZeC5YXAS2BB4A8FJi1kwwGL6nvMVboE7fZCzmJPNdMvVHc8JpaiA==} + '@next/env@15.5.15': + resolution: {integrity: sha512-vcmyu5/MyFzN7CdqRHO3uHO44p/QPCZkuTUXroeUmhNP8bL5PHFEhik22JUazt+CDDoD6EpBYRCaS2pISL+/hg==} '@next/eslint-plugin-next@15.5.9': resolution: {integrity: sha512-kUzXx0iFiXw27cQAViE1yKWnz/nF8JzRmwgMRTMh8qMY90crNsdXJRh2e+R0vBpFR3kk1yvAR7wev7+fCCb79Q==} - '@next/swc-darwin-arm64@15.5.14': - resolution: {integrity: sha512-Y9K6SPzobnZvrRDPO2s0grgzC+Egf0CqfbdvYmQVaztV890zicw8Z8+4Vqw8oPck8r1TjUHxVh8299Cg4TrxXg==} + '@next/swc-darwin-arm64@15.5.15': + resolution: {integrity: sha512-6PvFO2Tzt10GFK2Ro9tAVEtacMqRmTarYMFKAnV2vYMdwWc73xzmDQyAV7SwEdMhzmiRoo7+m88DuiXlJlGeaw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.14': - resolution: {integrity: sha512-aNnkSMjSFRTOmkd7qoNI2/rETQm/vKD6c/Ac9BZGa9CtoOzy3c2njgz7LvebQJ8iPxdeTuGnAjagyis8a9ifBw==} + '@next/swc-darwin-x64@15.5.15': + resolution: {integrity: sha512-G+YNV+z6FDZTp/+IdGyIMFqalBTaQSnvAA+X/hrt+eaTRFSznRMz9K7rTmzvM6tDmKegNtyzgufZW0HwVzEqaQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.14': - resolution: {integrity: sha512-tjlpia+yStPRS//6sdmlVwuO1Rioern4u2onafa5n+h2hCS9MAvMXqpVbSrjgiEOoCs0nJy7oPOmWgtRRNSM5Q==} + '@next/swc-linux-arm64-gnu@15.5.15': + resolution: {integrity: sha512-eVkrMcVIBqGfXB+QUC7jjZ94Z6uX/dNStbQFabewAnk13Uy18Igd1YZ/GtPRzdhtm7QwC0e6o7zOQecul4iC1w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.14': - resolution: {integrity: sha512-8B8cngBaLadl5lbDRdxGCP1Lef8ipD6KlxS3v0ElDAGil6lafrAM3B258p1KJOglInCVFUjk751IXMr2ixeQOQ==} + '@next/swc-linux-arm64-musl@15.5.15': + resolution: {integrity: sha512-RwSHKMQ7InLy5GfkY2/n5PcFycKA08qI1VST78n09nN36nUPqCvGSMiLXlfUmzmpQpF6XeBYP2KRWHi0UW3uNg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.14': - resolution: {integrity: sha512-bAS6tIAg8u4Gn3Nz7fCPpSoKAexEt2d5vn1mzokcqdqyov6ZJ6gu6GdF9l8ORFrBuRHgv3go/RfzYz5BkZ6YSQ==} + '@next/swc-linux-x64-gnu@15.5.15': + resolution: {integrity: sha512-nplqvY86LakS+eeiuWsNWvfmK8pFcOEW7ZtVRt4QH70lL+0x6LG/m1OpJ/tvrbwjmR8HH9/fH2jzW1GlL03TIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.14': - resolution: {integrity: sha512-mMxv/FcrT7Gfaq4tsR22l17oKWXZmH/lVqcvjX0kfp5I0lKodHYLICKPoX1KRnnE+ci6oIUdriUhuA3rBCDiSw==} + '@next/swc-linux-x64-musl@15.5.15': + resolution: {integrity: sha512-eAgl9NKQ84/sww0v81DQINl/vL2IBxD7sMybd0cWRw6wqgouVI53brVRBrggqBRP/NWeIAE1dm5cbKYoiMlqDQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.14': - resolution: {integrity: sha512-OTmiBlYThppnvnsqx0rBqjDRemlmIeZ8/o4zI7veaXoeO1PVHoyj2lfTfXTiiGjCyRDhA10y4h6ZvZvBiynr2g==} + '@next/swc-win32-arm64-msvc@15.5.15': + resolution: {integrity: sha512-GJVZC86lzSquh0MtvZT+L7G8+jMnJcldloOjA8Kf3wXvBrvb6OGe2MzPuALxFshSm/IpwUtD2mIoof39ymf52A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.14': - resolution: {integrity: sha512-+W7eFf3RS7m4G6tppVTOSyP9Y6FsJXfOuKzav1qKniiFm3KFByQfPEcouHdjlZmysl4zJGuGLQ/M9XyVeyeNEg==} + '@next/swc-win32-x64-msvc@15.5.15': + resolution: {integrity: sha512-nFucjVdwlFqxh/JG3hWSJ4p8+YJV7Ii8aPDuBQULB6DzUF4UNZETXLfEUk+oI2zEznWWULPt7MeuTE6xtK1HSA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1331,11 +1331,21 @@ packages: cpu: [x64] os: [darwin] + '@turbo/darwin-64@2.9.9': + resolution: {integrity: sha512-hTEiNu2ABZZOO1qbjnKASI8eF3BdOOzU6iKv5w5uGOK65DDMc10cS40N1kqM99YT0uSAGUwNu6GdFctRPeEeVA==} + cpu: [x64] + os: [darwin] + '@turbo/darwin-arm64@2.9.8': resolution: {integrity: sha512-nKRFI5ZhCGUi4eXNlrojzWcT/CehMj0raot1WE4lw5qf66ZxZHbRbBqcwNEy+ZLY7RkJJRY+TaU89fuj3BcgGg==} cpu: [arm64] os: [darwin] + '@turbo/darwin-arm64@2.9.9': + resolution: {integrity: sha512-MinO40EEcP5mJiTVpfjtEulsEBhVeryfq21QhYtJZ8hQJLHGgy459rcmDVAY8/JERe4dkVU4KW+zoLF22o01EA==} + cpu: [arm64] + os: [darwin] + '@turbo/gen@1.13.4': resolution: {integrity: sha512-PK38N1fHhDUyjLi0mUjv0RbX0xXGwDLQeRSGsIlLcVpP1B5fwodSIwIYXc9vJok26Yne94BX5AGjueYsUT3uUw==} hasBin: true @@ -1345,21 +1355,41 @@ packages: cpu: [x64] os: [linux] + '@turbo/linux-64@2.9.9': + resolution: {integrity: sha512-7JNLw88Isk+gMlbsC8pulLDkrqe2B827ZsKFEHilb17AC6Xn/62pzH7afjY7fEU6Ayp4XP/vGhlRWOzqBvBvIQ==} + cpu: [x64] + os: [linux] + '@turbo/linux-arm64@2.9.8': resolution: {integrity: sha512-v6S3HuKVoa9CEx16IxKj1i/+crxXx22A9O80zW1350zyUlcX0T/zLOxVf1k+ruK/7ssXnDJVg8uSYOxlYRedlA==} cpu: [arm64] os: [linux] + '@turbo/linux-arm64@2.9.9': + resolution: {integrity: sha512-0pnXDwPw1rHii98JZPRg7SvsjIzy7jrhkwGU9Jy5fVYoMdYd3P2vbtLfII+OJ0Mm4Ar5yykdHDTz3RWiRI1o9g==} + cpu: [arm64] + os: [linux] + '@turbo/windows-64@2.9.8': resolution: {integrity: sha512-JaefWOJNBazDylAn3f+lLB34XMNu8nEBbgPRP/Ewysg81cBubGfcyyyzpQOGVuMwfaqdNAE/kitG7w3AbJn9/g==} cpu: [x64] os: [win32] + '@turbo/windows-64@2.9.9': + resolution: {integrity: sha512-vjDQycz4gQVvIq4n2rPtiiIESwJlAc406qtkiZlqyL+fHZEd9SxYNlBIFYtc5cuMuwrk+sIKrhN7XvwjmvS9YQ==} + cpu: [x64] + os: [win32] + '@turbo/windows-arm64@2.9.8': resolution: {integrity: sha512-Or6ljjB4TiiwCdVKDYWew0SokQ9kep5zruL8P3nbum9WdkH5XA41rQID4Ulc215Z+R3DrB+qXSHPsJjU3/n2ng==} cpu: [arm64] os: [win32] + '@turbo/windows-arm64@2.9.9': + resolution: {integrity: sha512-V6NiH43oCctepbOdQFp7UjqLyK8p6Tt824QA+G4TE+B1BBHu80A0W8OCL+H7uBJ3XZjAj/hvPDw3k3l65DoDGw==} + cpu: [arm64] + os: [win32] + '@turbo/workspaces@1.13.4': resolution: {integrity: sha512-3uYg2b5TWCiupetbDFMbBFMHl33xQTvp5DNg0fZSYal73Z9AlFH9yWabHWMYw6ywmwM1evkYRpTVA2n7GgqT5A==} hasBin: true @@ -1675,7 +1705,7 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.0, please upgrade + deprecated: Security vulnerability fixed in 5.2.1, please upgrade better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -1733,8 +1763,8 @@ packages: camel-case@3.0.0: resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - caniuse-lite@1.0.30001781: - resolution: {integrity: sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==} + caniuse-lite@1.0.30001791: + resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} cbor2@1.12.0: resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} @@ -2818,8 +2848,8 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2833,8 +2863,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.5.14: - resolution: {integrity: sha512-M6S+4JyRjmKic2Ssm7jHUPkE6YUJ6lv4507jprsSZLulubz0ihO2E+S4zmQK3JZ2ov81JrugukKU4Tz0ivgqqQ==} + next@15.5.15: + resolution: {integrity: sha512-VSqCrJwtLVGwAVE0Sb/yikrQfkwkZW9p+lL/J4+xe+G3ZA+QnWPqgcfH1tDUEuk9y+pthzzVFp4L/U8JerMfMQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3058,8 +3088,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3554,6 +3584,10 @@ packages: resolution: {integrity: sha512-REEB2rVTVDTf4hav1gJ5dIsGylWZrNonvjXFtk1dCi8gND3PhZtnYkyry1bra/Fo+iP6ctTEZbg6vWfdfHq/1A==} hasBin: true + turbo@2.9.9: + resolution: {integrity: sha512-3xfzXE/yTjhh0S5dIWlE+3E+J9A09REpLI1ZqVh2+HrNZoVzZn0pkvjiRgVK/Ev3PF9XnaTwCntTx+CADWXcyA==} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -4111,7 +4145,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.9.1': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true @@ -4336,7 +4370,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.9.1 + '@emnapi/runtime': 1.10.0 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -4395,34 +4429,34 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.5.14': {} + '@next/env@15.5.15': {} '@next/eslint-plugin-next@15.5.9': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.14': + '@next/swc-darwin-arm64@15.5.15': optional: true - '@next/swc-darwin-x64@15.5.14': + '@next/swc-darwin-x64@15.5.15': optional: true - '@next/swc-linux-arm64-gnu@15.5.14': + '@next/swc-linux-arm64-gnu@15.5.15': optional: true - '@next/swc-linux-arm64-musl@15.5.14': + '@next/swc-linux-arm64-musl@15.5.15': optional: true - '@next/swc-linux-x64-gnu@15.5.14': + '@next/swc-linux-x64-gnu@15.5.15': optional: true - '@next/swc-linux-x64-musl@15.5.14': + '@next/swc-linux-x64-musl@15.5.15': optional: true - '@next/swc-win32-arm64-msvc@15.5.14': + '@next/swc-win32-arm64-msvc@15.5.15': optional: true - '@next/swc-win32-x64-msvc@15.5.14': + '@next/swc-win32-x64-msvc@15.5.15': optional: true '@noble/ciphers@1.3.0': {} @@ -4545,9 +4579,15 @@ snapshots: '@turbo/darwin-64@2.9.8': optional: true + '@turbo/darwin-64@2.9.9': + optional: true + '@turbo/darwin-arm64@2.9.8': optional: true + '@turbo/darwin-arm64@2.9.9': + optional: true + '@turbo/gen@1.13.4(@types/node@25.3.0)(typescript@6.0.3)': dependencies: '@turbo/workspaces': 1.13.4(@types/node@25.3.0) @@ -4571,15 +4611,27 @@ snapshots: '@turbo/linux-64@2.9.8': optional: true + '@turbo/linux-64@2.9.9': + optional: true + '@turbo/linux-arm64@2.9.8': optional: true + '@turbo/linux-arm64@2.9.9': + optional: true + '@turbo/windows-64@2.9.8': optional: true + '@turbo/windows-64@2.9.9': + optional: true + '@turbo/windows-arm64@2.9.8': optional: true + '@turbo/windows-arm64@2.9.9': + optional: true + '@turbo/workspaces@1.13.4(@types/node@25.3.0)': dependencies: chalk: 2.4.2 @@ -4990,7 +5042,7 @@ snapshots: browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.7 - caniuse-lite: 1.0.30001781 + caniuse-lite: 1.0.30001791 electron-to-chromium: 1.5.267 node-releases: 2.0.27 update-browserslist-db: 1.2.2(browserslist@4.28.1) @@ -5026,7 +5078,7 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - caniuse-lite@1.0.30001781: {} + caniuse-lite@1.0.30001791: {} cbor2@1.12.0: {} @@ -5447,11 +5499,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.9.8): + eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.9.9): dependencies: dotenv: 16.0.3 eslint: 9.39.2 - turbo: 2.9.8 + turbo: 2.9.9 eslint-scope@8.4.0: dependencies: @@ -6277,7 +6329,7 @@ snapshots: mute-stream@0.0.8: {} - nanoid@3.3.11: {} + nanoid@3.3.12: {} natural-compare@1.4.0: {} @@ -6285,24 +6337,24 @@ snapshots: netmask@2.0.2: {} - next@15.5.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@next/env': 15.5.14 + '@next/env': 15.5.15 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001781 + caniuse-lite: 1.0.30001791 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) styled-jsx: 5.1.6(react@19.2.3) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.14 - '@next/swc-darwin-x64': 15.5.14 - '@next/swc-linux-arm64-gnu': 15.5.14 - '@next/swc-linux-arm64-musl': 15.5.14 - '@next/swc-linux-x64-gnu': 15.5.14 - '@next/swc-linux-x64-musl': 15.5.14 - '@next/swc-win32-arm64-msvc': 15.5.14 - '@next/swc-win32-x64-msvc': 15.5.14 + '@next/swc-darwin-arm64': 15.5.15 + '@next/swc-darwin-x64': 15.5.15 + '@next/swc-linux-arm64-gnu': 15.5.15 + '@next/swc-linux-arm64-musl': 15.5.15 + '@next/swc-linux-x64-gnu': 15.5.15 + '@next/swc-linux-x64-musl': 15.5.15 + '@next/swc-win32-arm64-msvc': 15.5.15 + '@next/swc-win32-x64-msvc': 15.5.15 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -6557,13 +6609,13 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.8: + postcss@8.5.14: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -7132,6 +7184,15 @@ snapshots: '@turbo/windows-64': 2.9.8 '@turbo/windows-arm64': 2.9.8 + turbo@2.9.9: + optionalDependencies: + '@turbo/darwin-64': 2.9.9 + '@turbo/darwin-arm64': 2.9.9 + '@turbo/linux-64': 2.9.9 + '@turbo/linux-arm64': 2.9.9 + '@turbo/windows-64': 2.9.9 + '@turbo/windows-arm64': 2.9.9 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -7253,7 +7314,7 @@ snapshots: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.8 + postcss: 8.5.14 rollup: 4.53.4 tinyglobby: 0.2.15 optionalDependencies: From f221969048099b0bb082cb21c7a0d45940ffbd4c Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 7 May 2026 12:14:00 +0200 Subject: [PATCH 126/144] Update to latest pnpm --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 512f8a44c..38bc33117 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "ox": "^0.9.17" } }, - "packageManager": "pnpm@10.24.0", + "packageManager": "pnpm@10.33.4", "engines": { "node": ">=18" }, From 1bbade9efd9855783b646ef412ce3a1b70714785 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 7 May 2026 12:15:22 +0200 Subject: [PATCH 127/144] 3.0.8 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 41da58802..7942b730c 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index af9d87826..359c12969 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.7", + "version": "3.0.8", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index fa0194ad8..a27170830 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index fa6e74220..5fccc7a08 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.7", + "version": "3.0.8", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 01ea62e91..f12fb465e 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 23e20abd2..0853fc65f 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.7", + "version": "3.0.8", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 332a1da08..78ec5497b 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 52e9dd3e9..daa031f06 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.7", + "version": "3.0.8", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 60ba43237..e43fe0583 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 34866a0a4..a6d8be0f9 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.7", + "version": "3.0.8", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 279631525..7f30ad850 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index b170e7e96..eb0744fbf 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.7", + "version": "3.0.8", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 3aba7ff75..81061de89 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 60e74e945..5e584f138 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.7", + "version": "3.0.8", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 8bacc6a22..77712a024 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.8 + ## 3.0.7 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 86caff6b9..26cc339c4 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.7", + "version": "3.0.8", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index d77aa6ae6..0b2755f3c 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 736a1d2fc..9bb771949 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.7", + "version": "3.0.8", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 7703a169b..99e7d94c1 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index a5ab2a7e0..82a4ff06e 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.7", + "version": "3.0.8", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 95389b179..cb76e1375 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling +- Updated dependencies + - @0xsequence/guard@3.0.8 + - @0xsequence/relayer@3.0.8 + - @0xsequence/wallet-primitives@3.0.8 + ## 3.0.7 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 981013a46..06663fb0b 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.7", + "version": "3.0.8", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 8b3ad2e3b..a8bb103ef 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling +- Updated dependencies + - @0xsequence/guard@3.0.8 + - @0xsequence/relayer@3.0.8 + - @0xsequence/wallet-core@3.0.8 + - @0xsequence/wallet-primitives@3.0.8 + ## 3.0.7 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 160196a45..ab25225cf 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.7", + "version": "3.0.8", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index dbb469e9f..f396de96b 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling + ## 3.0.7 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index d1e94ce9d..8503cd9a2 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.7", + "version": "3.0.8", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 5c3a48775..3eb4a5877 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.8 + +### Patch Changes + +- Bug fix for relayer fee options handling +- Updated dependencies + - @0xsequence/guard@3.0.8 + - @0xsequence/identity-instrument@3.0.8 + - @0xsequence/relayer@3.0.8 + - @0xsequence/wallet-core@3.0.8 + - @0xsequence/wallet-primitives@3.0.8 + ## 3.0.7 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 593a4c699..50758011d 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.7", + "version": "3.0.8", "license": "Apache-2.0", "type": "module", "publishConfig": { From 7ff5d5135af3362fd105732096a19d6351dc9b1f Mon Sep 17 00:00:00 2001 From: tolgahan-arikan Date: Thu, 7 May 2026 16:06:06 +0300 Subject: [PATCH 128/144] Fix fee options stub signature (#999) --- packages/wallet/core/src/wallet.ts | 47 ++++++++++++++++++- .../core/test/wallet-fee-options.test.ts | 9 +++- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/packages/wallet/core/src/wallet.ts b/packages/wallet/core/src/wallet.ts index cdfdf66c2..66b0eb52b 100644 --- a/packages/wallet/core/src/wallet.ts +++ b/packages/wallet/core/src/wallet.ts @@ -25,6 +25,51 @@ export const DefaultWalletOptions: WalletOptions = { guest: Constants.DefaultGuestAddress, } +const FeeOptionsStubSignature: SequenceSignature.SignatureOfSignerLeaf = { + type: 'eth_sign', + r: 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffn, + s: 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0n, + yParity: 0, +} + +function stubFeeOptionsTopology(topology: Config.Topology): SequenceSignature.RawTopology { + if (Array.isArray(topology)) { + return [stubFeeOptionsTopology(topology[0]), stubFeeOptionsTopology(topology[1])] + } + + if (Config.isSignerLeaf(topology)) { + return { + type: 'unrecovered-signer', + weight: topology.weight, + signature: FeeOptionsStubSignature, + } + } + + if (Config.isNestedLeaf(topology)) { + return { + type: 'nested', + weight: topology.weight, + threshold: topology.threshold, + tree: stubFeeOptionsTopology(topology.tree), + } + } + + return topology +} + +function buildFeeOptionsStubSignature(status: WalletStatusWithOnchain): Hex.Hex { + return Bytes.toHex( + SequenceSignature.encodeSignature({ + noChainId: status.chainId === 0, + configuration: { + ...status.configuration, + topology: stubFeeOptionsTopology(status.configuration.topology), + }, + suffix: status.pendingUpdates.map(({ signature }) => signature), + }), + ) +} + export type WalletStatus = { address: Address.Address isDeployed: boolean @@ -499,7 +544,7 @@ export class Wallet { payload: Payload.Calls, ): Promise<{ to: Address.Address; data: Hex.Hex }> { const status = await this.getStatus(provider) - const signature = '0x0001' as Hex.Hex + const signature = buildFeeOptionsStubSignature(status) const executeData = AbiFunction.encodeData(Constants.EXECUTE, [Bytes.toHex(Payload.encode(payload)), signature]) diff --git a/packages/wallet/core/test/wallet-fee-options.test.ts b/packages/wallet/core/test/wallet-fee-options.test.ts index d3e4ef30f..633f47672 100644 --- a/packages/wallet/core/test/wallet-fee-options.test.ts +++ b/packages/wallet/core/test/wallet-fee-options.test.ts @@ -6,6 +6,8 @@ import { State, Wallet } from '../src/index.js' const SIGNER = '0x1234567890123456789012345678901234567890' as Address.Address const TARGET = '0xabcdefabcdefabcdefabcdefabcdefabcdefabcd' as Address.Address +const FEE_OPTIONS_STUB_SIGNATURE = + '0x040001711fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0' as Hex.Hex const configuration: Config.Config = { threshold: 1n, @@ -74,7 +76,10 @@ describe('Wallet.buildFeeOptionsTransaction', () => { const { wallet, imageHash } = await createWallet() const transaction = await wallet.buildFeeOptionsTransaction(providerFor({ deployed: true, imageHash }), payload) - const expectedData = AbiFunction.encodeData(Constants.EXECUTE, [Bytes.toHex(Payload.encode(payload)), '0x0001']) + const expectedData = AbiFunction.encodeData(Constants.EXECUTE, [ + Bytes.toHex(Payload.encode(payload)), + FEE_OPTIONS_STUB_SIGNATURE, + ]) expect(Address.isEqual(transaction.to, wallet.address)).toBe(true) expect(transaction.data).toBe(expectedData) @@ -88,7 +93,7 @@ describe('Wallet.buildFeeOptionsTransaction', () => { const expectedExecuteData = AbiFunction.encodeData(Constants.EXECUTE, [ Bytes.toHex(Payload.encode(payload)), - '0x0001', + FEE_OPTIONS_STUB_SIGNATURE, ]) expect(Address.isEqual(transaction.to, Constants.DefaultGuestAddress)).toBe(true) From 87cf349fe3859770d06ab74152f1ec9957c6bba4 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 7 May 2026 15:09:40 +0200 Subject: [PATCH 129/144] 3.0.9 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 7942b730c..8d7c5dc55 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 359c12969..c0fe2135e 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.8", + "version": "3.0.9", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index a27170830..98b2661e7 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 5fccc7a08..058fda6a5 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.8", + "version": "3.0.9", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index f12fb465e..b3c436416 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 0853fc65f..35857bea6 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.8", + "version": "3.0.9", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 78ec5497b..5575cda0b 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index daa031f06..856d7e329 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.8", + "version": "3.0.9", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index e43fe0583..b3233d5c6 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index a6d8be0f9..1b0d32023 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.8", + "version": "3.0.9", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 7f30ad850..4365abb88 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index eb0744fbf..f2aed5ef2 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.8", + "version": "3.0.9", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 81061de89..19d5943a1 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 5e584f138..a4ea57696 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.8", + "version": "3.0.9", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 77712a024..5e5312a89 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.9 + +### Patch Changes + +- Fee options fixes +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.9 + ## 3.0.8 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 26cc339c4..1ba9e2c52 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.8", + "version": "3.0.9", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 0b2755f3c..9b41afaa0 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 9bb771949..bf0e18458 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.8", + "version": "3.0.9", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 99e7d94c1..b66fe1270 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 82a4ff06e..a226d70fb 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.8", + "version": "3.0.9", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index cb76e1375..9f44040a1 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.9 + +### Patch Changes + +- Fee options fixes +- Updated dependencies + - @0xsequence/guard@3.0.9 + - @0xsequence/relayer@3.0.9 + - @0xsequence/wallet-primitives@3.0.9 + ## 3.0.8 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 06663fb0b..8cbb4eacd 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.8", + "version": "3.0.9", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index a8bb103ef..d037d5636 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.9 + +### Patch Changes + +- Fee options fixes +- Updated dependencies + - @0xsequence/guard@3.0.9 + - @0xsequence/relayer@3.0.9 + - @0xsequence/wallet-core@3.0.9 + - @0xsequence/wallet-primitives@3.0.9 + ## 3.0.8 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index ab25225cf..82a3c95a2 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.8", + "version": "3.0.9", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index f396de96b..9b0a19d85 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.9 + +### Patch Changes + +- Fee options fixes + ## 3.0.8 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 8503cd9a2..4648ce66a 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.8", + "version": "3.0.9", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 3eb4a5877..795eb18ae 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.9 + +### Patch Changes + +- Fee options fixes +- Updated dependencies + - @0xsequence/guard@3.0.9 + - @0xsequence/identity-instrument@3.0.9 + - @0xsequence/relayer@3.0.9 + - @0xsequence/wallet-core@3.0.9 + - @0xsequence/wallet-primitives@3.0.9 + ## 3.0.8 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 50758011d..547bc15c3 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.8", + "version": "3.0.9", "license": "Apache-2.0", "type": "module", "publishConfig": { From 282db7d0698b0be67366906d099589366fba9958 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri, 8 May 2026 09:15:45 +0700 Subject: [PATCH 130/144] Create SECURITY.md Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- 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 b574739a38bf7a75d8032a1943db518183514c8e Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 8 May 2026 14:51:43 +0200 Subject: [PATCH 131/144] Enforce minimum age limitation for packages --- pnpm-workspace.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 59a78ba9a..8b50aefa0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,7 @@ +minimumReleaseAge: 20160 # 60 * 24 * 7 * 2 = do not install package releases that are not at least 2 weeks old +# DO NOT REMOVE OR MODIFY minimumReleaseAge without approval +# list packages to be excluded from minimum release limitation + packages: - extras/* - packages/* From 1897d93b602d9e5b74ae4d4f169112bc5655b061 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 15 May 2026 12:50:20 +0200 Subject: [PATCH 132/144] Bump next.js deps to resolve security issue (#1000) --- extras/docs/package.json | 2 +- extras/web/package.json | 2 +- pnpm-lock.yaml | 117 +++++++++++++++++++++++++-------------- pnpm-workspace.yaml | 2 +- 4 files changed, 77 insertions(+), 46 deletions(-) diff --git a/extras/docs/package.json b/extras/docs/package.json index eb5768ed0..5b275db5b 100644 --- a/extras/docs/package.json +++ b/extras/docs/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.15", + "next": "^15.5.16", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/extras/web/package.json b/extras/web/package.json index a4c4edaa7..e042bc8e6 100644 --- a/extras/web/package.json +++ b/extras/web/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@repo/ui": "workspace:^", - "next": "^15.5.15", + "next": "^15.5.16", "react": "^19.2.3", "react-dom": "^19.2.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1306fd11f..7a369a88a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.15 - version: 15.5.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.16 + version: 15.5.18(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -76,8 +76,8 @@ importers: specifier: workspace:^ version: link:../../repo/ui next: - specifier: ^15.5.15 - version: 15.5.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^15.5.16 + version: 15.5.18(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: ^19.2.3 version: 19.2.3 @@ -963,89 +963,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@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] + libc: [glibc] '@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] + libc: [glibc] '@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] + libc: [glibc] '@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] + libc: [glibc] '@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] + libc: [glibc] '@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] + libc: [glibc] '@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] + libc: [musl] '@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] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1104,56 +1120,60 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.5.15': - resolution: {integrity: sha512-vcmyu5/MyFzN7CdqRHO3uHO44p/QPCZkuTUXroeUmhNP8bL5PHFEhik22JUazt+CDDoD6EpBYRCaS2pISL+/hg==} + '@next/env@15.5.18': + resolution: {integrity: sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==} '@next/eslint-plugin-next@15.5.9': resolution: {integrity: sha512-kUzXx0iFiXw27cQAViE1yKWnz/nF8JzRmwgMRTMh8qMY90crNsdXJRh2e+R0vBpFR3kk1yvAR7wev7+fCCb79Q==} - '@next/swc-darwin-arm64@15.5.15': - resolution: {integrity: sha512-6PvFO2Tzt10GFK2Ro9tAVEtacMqRmTarYMFKAnV2vYMdwWc73xzmDQyAV7SwEdMhzmiRoo7+m88DuiXlJlGeaw==} + '@next/swc-darwin-arm64@15.5.18': + resolution: {integrity: sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.15': - resolution: {integrity: sha512-G+YNV+z6FDZTp/+IdGyIMFqalBTaQSnvAA+X/hrt+eaTRFSznRMz9K7rTmzvM6tDmKegNtyzgufZW0HwVzEqaQ==} + '@next/swc-darwin-x64@15.5.18': + resolution: {integrity: sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.15': - resolution: {integrity: sha512-eVkrMcVIBqGfXB+QUC7jjZ94Z6uX/dNStbQFabewAnk13Uy18Igd1YZ/GtPRzdhtm7QwC0e6o7zOQecul4iC1w==} + '@next/swc-linux-arm64-gnu@15.5.18': + resolution: {integrity: sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] - '@next/swc-linux-arm64-musl@15.5.15': - resolution: {integrity: sha512-RwSHKMQ7InLy5GfkY2/n5PcFycKA08qI1VST78n09nN36nUPqCvGSMiLXlfUmzmpQpF6XeBYP2KRWHi0UW3uNg==} + '@next/swc-linux-arm64-musl@15.5.18': + resolution: {integrity: sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] - '@next/swc-linux-x64-gnu@15.5.15': - resolution: {integrity: sha512-nplqvY86LakS+eeiuWsNWvfmK8pFcOEW7ZtVRt4QH70lL+0x6LG/m1OpJ/tvrbwjmR8HH9/fH2jzW1GlL03TIg==} + '@next/swc-linux-x64-gnu@15.5.18': + resolution: {integrity: sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] - '@next/swc-linux-x64-musl@15.5.15': - resolution: {integrity: sha512-eAgl9NKQ84/sww0v81DQINl/vL2IBxD7sMybd0cWRw6wqgouVI53brVRBrggqBRP/NWeIAE1dm5cbKYoiMlqDQ==} + '@next/swc-linux-x64-musl@15.5.18': + resolution: {integrity: sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] - '@next/swc-win32-arm64-msvc@15.5.15': - resolution: {integrity: sha512-GJVZC86lzSquh0MtvZT+L7G8+jMnJcldloOjA8Kf3wXvBrvb6OGe2MzPuALxFshSm/IpwUtD2mIoof39ymf52A==} + '@next/swc-win32-arm64-msvc@15.5.18': + resolution: {integrity: sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.15': - resolution: {integrity: sha512-nFucjVdwlFqxh/JG3hWSJ4p8+YJV7Ii8aPDuBQULB6DzUF4UNZETXLfEUk+oI2zEznWWULPt7MeuTE6xtK1HSA==} + '@next/swc-win32-x64-msvc@15.5.18': + resolution: {integrity: sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1220,56 +1240,67 @@ packages: resolution: {integrity: sha512-UPMMNeC4LXW7ZSHxeP3Edv09aLsFUMaD1TSVW6n1CWMECnUIJMFFB7+XC2lZTdPtvB36tYC0cJWc86mzSsaviw==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.53.4': resolution: {integrity: sha512-H8uwlV0otHs5Q7WAMSoyvjV9DJPiy5nJ/xnHolY0QptLPjaSsuX7tw+SPIfiYH6cnVx3fe4EWFafo6gH6ekZKA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.53.4': resolution: {integrity: sha512-BLRwSRwICXz0TXkbIbqJ1ibK+/dSBpTJqDClF61GWIrxTXZWQE78ROeIhgl5MjVs4B4gSLPCFeD4xML9vbzvCQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.53.4': resolution: {integrity: sha512-6bySEjOTbmVcPJAywjpGLckK793A0TJWSbIa0sVwtVGfe/Nz6gOWHOwkshUIAp9j7wg2WKcA4Snu7Y1nUZyQew==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.53.4': resolution: {integrity: sha512-U0ow3bXYJZ5MIbchVusxEycBw7bO6C2u5UvD31i5IMTrnt2p4Fh4ZbHSdc/31TScIJQYHwxbj05BpevB3201ug==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.53.4': resolution: {integrity: sha512-iujDk07ZNwGLVn0YIWM80SFN039bHZHCdCCuX9nyx3Jsa2d9V/0Y32F+YadzwbvDxhSeVo9zefkoPnXEImnM5w==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.53.4': resolution: {integrity: sha512-MUtAktiOUSu+AXBpx1fkuG/Bi5rhlorGs3lw5QeJ2X3ziEGAq7vFNdWVde6XGaVqi0LGSvugwjoxSNJfHFTC0g==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.53.4': resolution: {integrity: sha512-btm35eAbDfPtcFEgaXCI5l3c2WXyzwiE8pArhd66SDtoLWmgK5/M7CUxmUglkwtniPzwvWioBKKl6IXLbPf2sQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.53.4': resolution: {integrity: sha512-uJlhKE9ccUTCUlK+HUz/80cVtx2RayadC5ldDrrDUFaJK0SNb8/cCmC9RhBhIWuZ71Nqj4Uoa9+xljKWRogdhA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.53.4': resolution: {integrity: sha512-jjEMkzvASQBbzzlzf4os7nzSBd/cvPrpqXCUOqoeCh1dQ4BP3RZCJk8XBeik4MUln3m+8LeTJcY54C/u8wb3DQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.53.4': resolution: {integrity: sha512-lu90KG06NNH19shC5rBPkrh6mrTpq5kviFylPBXQVpdEu0yzb0mDgyxLr6XdcGdBIQTH/UAhDJnL+APZTBu1aQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.53.4': resolution: {integrity: sha512-dFDcmLwsUzhAm/dn0+dMOQZoONVYBtgik0VuY/d5IJUUb787L3Ko/ibvTvddqhb3RaB7vFEozYevHN4ox22R/w==} @@ -2863,8 +2894,8 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - next@15.5.15: - resolution: {integrity: sha512-VSqCrJwtLVGwAVE0Sb/yikrQfkwkZW9p+lL/J4+xe+G3ZA+QnWPqgcfH1tDUEuk9y+pthzzVFp4L/U8JerMfMQ==} + next@15.5.18: + resolution: {integrity: sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -4429,34 +4460,34 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@next/env@15.5.15': {} + '@next/env@15.5.18': {} '@next/eslint-plugin-next@15.5.9': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.15': + '@next/swc-darwin-arm64@15.5.18': optional: true - '@next/swc-darwin-x64@15.5.15': + '@next/swc-darwin-x64@15.5.18': optional: true - '@next/swc-linux-arm64-gnu@15.5.15': + '@next/swc-linux-arm64-gnu@15.5.18': optional: true - '@next/swc-linux-arm64-musl@15.5.15': + '@next/swc-linux-arm64-musl@15.5.18': optional: true - '@next/swc-linux-x64-gnu@15.5.15': + '@next/swc-linux-x64-gnu@15.5.18': optional: true - '@next/swc-linux-x64-musl@15.5.15': + '@next/swc-linux-x64-musl@15.5.18': optional: true - '@next/swc-win32-arm64-msvc@15.5.15': + '@next/swc-win32-arm64-msvc@15.5.18': optional: true - '@next/swc-win32-x64-msvc@15.5.15': + '@next/swc-win32-x64-msvc@15.5.18': optional: true '@noble/ciphers@1.3.0': {} @@ -6337,9 +6368,9 @@ snapshots: netmask@2.0.2: {} - next@15.5.15(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@15.5.18(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@next/env': 15.5.15 + '@next/env': 15.5.18 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001791 postcss: 8.4.31 @@ -6347,14 +6378,14 @@ snapshots: 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.15 - '@next/swc-darwin-x64': 15.5.15 - '@next/swc-linux-arm64-gnu': 15.5.15 - '@next/swc-linux-arm64-musl': 15.5.15 - '@next/swc-linux-x64-gnu': 15.5.15 - '@next/swc-linux-x64-musl': 15.5.15 - '@next/swc-win32-arm64-msvc': 15.5.15 - '@next/swc-win32-x64-msvc': 15.5.15 + '@next/swc-darwin-arm64': 15.5.18 + '@next/swc-darwin-x64': 15.5.18 + '@next/swc-linux-arm64-gnu': 15.5.18 + '@next/swc-linux-arm64-musl': 15.5.18 + '@next/swc-linux-x64-gnu': 15.5.18 + '@next/swc-linux-x64-musl': 15.5.18 + '@next/swc-win32-arm64-msvc': 15.5.18 + '@next/swc-win32-x64-msvc': 15.5.18 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8b50aefa0..bd308b020 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,4 @@ -minimumReleaseAge: 20160 # 60 * 24 * 7 * 2 = do not install package releases that are not at least 2 weeks old +minimumReleaseAge: 10080 # 60 * 24 * 7 = do not install package releases that are not at least 1 week old # DO NOT REMOVE OR MODIFY minimumReleaseAge without approval # list packages to be excluded from minimum release limitation From fe1d1e5b8b023a87a6cbaed7ddb844c50b507a43 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 15 May 2026 13:41:35 +0200 Subject: [PATCH 133/144] Add Claude review workflow (#1001) --- .github/workflows/claude.yml | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/claude.yml diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml new file mode 100644 index 000000000..5f540c130 --- /dev/null +++ b/.github/workflows/claude.yml @@ -0,0 +1,49 @@ +name: Claude Code + +on: + issue_comment: + types: [created] + pull_request_review_comment: + types: [created] + issues: + types: [opened, assigned] + pull_request_review: + types: [submitted] + +jobs: + claude: + if: | + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || + (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + issues: read + id-token: write + actions: read # Required for Claude to read CI results on PRs + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Run Claude Code + id: claude + uses: anthropics/claude-code-action@v1 + with: + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY_GITHUB_ACTIONS }} + + # This is an optional setting that allows Claude to read CI results on PRs + additional_permissions: | + actions: read + + # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it. + # prompt: 'Update the pull request description to include a summary of changes.' + + # Optional: Add claude_args to customize behavior and configuration + # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md + # or https://code.claude.com/docs/en/cli-reference for available options + # claude_args: '--allowed-tools Bash(gh pr:*)' From e8f62e53f1fc0bad9dc0c43a2c86a9c7b350cdcd Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 21 May 2026 11:51:26 +0200 Subject: [PATCH 134/144] Remove inactive networks (#1003) --- packages/wallet/primitives/src/network.ts | 225 ---------------------- 1 file changed, 225 deletions(-) diff --git a/packages/wallet/primitives/src/network.ts b/packages/wallet/primitives/src/network.ts index 69f40ae4f..498c7a793 100644 --- a/packages/wallet/primitives/src/network.ts +++ b/packages/wallet/primitives/src/network.ts @@ -42,7 +42,6 @@ export const ChainId = { // Polygon POLYGON: 137, - POLYGON_ZKEVM: 1101, POLYGON_AMOY: 80002, // BSC @@ -75,10 +74,6 @@ export const ChainId = { HOMEVERSE_TESTNET: 40875, HOMEVERSE: 19011, - // Xai - XAI: 660279, - XAI_SEPOLIA: 37714555429, - // TELOS TELOS: 40, TELOS_TESTNET: 41, @@ -91,10 +86,6 @@ export const ChainId = { APECHAIN: 33139, APECHAIN_TESTNET: 33111, - // Blast - BLAST: 81457, - BLAST_SEPOLIA: 168587773, - // SKALE Nebula SKALE_NEBULA: 1482601649, SKALE_NEBULA_TESTNET: 37084624, @@ -103,16 +94,12 @@ export const ChainId = { SONEIUM_MINATO: 1946, SONEIUM: 1868, - // TOY Testnet - TOY_TESTNET: 21000000, - // Immutable zkEVM IMMUTABLE_ZKEVM: 13371, IMMUTABLE_ZKEVM_TESTNET: 13473, // ETHERLINK ETHERLINK: 42793, - ETHERLINK_TESTNET: 128123, ETHERLINK_SHADOWNET_TESTNET: 127823, // MOONBEAM @@ -121,22 +108,14 @@ export const ChainId = { // MONAD MONAD: 143, - MONAD_TESTNET: 10143, // SOMNIA SOMNIA_TESTNET: 50312, SOMNIA: 5031, - // INCENTIV - INCENTIV: 24101, - INCENTIV_TESTNET_V2: 28802, - // KATANA KATANA: 747474, - // SANDBOX - SANDBOX_TESTNET: 6252, - // ARC ARC_TESTNET: 5042002, @@ -234,26 +213,6 @@ export const ALL: Network[] = [ multicall3: DEFAULT_MULTICALL3_ADDRESS, }, }, - { - chainId: ChainId.POLYGON_ZKEVM, - type: NetworkType.MAINNET, - name: 'polygon-zkevm', - title: 'Polygon zkEVM', - rpcUrl: getRpcUrl('polygon-zkevm'), - logoUrl: getLogoUrl(ChainId.POLYGON_ZKEVM), - blockExplorer: { - name: 'Polygonscan (zkEVM)', - url: 'https://zkevm.polygonscan.com/', - }, - nativeCurrency: { - symbol: 'ETH', - name: 'Ether', - decimals: 18, - }, - contracts: { - multicall3: DEFAULT_MULTICALL3_ADDRESS, - }, - }, { chainId: ChainId.BSC, type: NetworkType.MAINNET, @@ -534,46 +493,6 @@ export const ALL: Network[] = [ multicall3: SEQUENCE_MULTICALL3_ADDRESS, }, }, - { - chainId: ChainId.XAI, - type: NetworkType.MAINNET, - name: 'xai', - title: 'Xai', - rpcUrl: getRpcUrl('xai'), - logoUrl: getLogoUrl(ChainId.XAI), - blockExplorer: { - name: 'Xai Explorer', - url: 'https://explorer.xai-chain.net/', - }, - nativeCurrency: { - symbol: 'XAI', - name: 'XAI', - decimals: 18, - }, - contracts: { - multicall3: DEFAULT_MULTICALL3_ADDRESS, - }, - }, - { - chainId: ChainId.XAI_SEPOLIA, - type: NetworkType.TESTNET, - name: 'xai-sepolia', - title: 'Xai Sepolia', - rpcUrl: getRpcUrl('xai-sepolia'), - logoUrl: getLogoUrl(ChainId.XAI_SEPOLIA), - blockExplorer: { - name: 'Xai Sepolia Explorer', - url: 'https://testnet-explorer-v2.xai-chain.net/', - }, - nativeCurrency: { - symbol: 'sXAI', - name: 'Sepolia XAI', - decimals: 18, - }, - contracts: { - multicall3: SEQUENCE_MULTICALL3_ADDRESS, - }, - }, { chainId: ChainId.B3, type: NetworkType.MAINNET, @@ -654,46 +573,6 @@ export const ALL: Network[] = [ multicall3: DEFAULT_MULTICALL3_ADDRESS, }, }, - { - chainId: ChainId.BLAST, - type: NetworkType.MAINNET, - name: 'blast', - title: 'Blast', - rpcUrl: getRpcUrl('blast'), - logoUrl: getLogoUrl(ChainId.BLAST), - blockExplorer: { - name: 'Blast Explorer', - url: 'https://blastscan.io/', - }, - nativeCurrency: { - symbol: 'ETH', - name: 'Ether', - decimals: 18, - }, - contracts: { - multicall3: DEFAULT_MULTICALL3_ADDRESS, - }, - }, - { - chainId: ChainId.BLAST_SEPOLIA, - type: NetworkType.TESTNET, - name: 'blast-sepolia', - title: 'Blast Sepolia', - rpcUrl: getRpcUrl('blast-sepolia'), - logoUrl: getLogoUrl(ChainId.BLAST_SEPOLIA), - blockExplorer: { - name: 'Blast Sepolia Explorer', - url: 'https://sepolia.blastexplorer.io/', - }, - nativeCurrency: { - symbol: 'ETH', - name: 'Ether', - decimals: 18, - }, - contracts: { - multicall3: DEFAULT_MULTICALL3_ADDRESS, - }, - }, { chainId: ChainId.TELOS, type: NetworkType.MAINNET, @@ -814,26 +693,6 @@ export const ALL: Network[] = [ multicall3: DEFAULT_MULTICALL3_ADDRESS, }, }, - { - chainId: ChainId.TOY_TESTNET, - type: NetworkType.TESTNET, - name: 'toy-testnet', - title: 'TOY (Testnet)', - rpcUrl: getRpcUrl('toy-testnet'), - logoUrl: getLogoUrl(ChainId.TOY_TESTNET), - blockExplorer: { - name: 'TOY Testnet Explorer', - url: 'https://toy-chain-testnet.explorer.caldera.xyz/', - }, - nativeCurrency: { - symbol: 'TOY', - name: 'TOY', - decimals: 18, - }, - contracts: { - multicall3: DEFAULT_MULTICALL3_ADDRESS, - }, - }, { chainId: ChainId.IMMUTABLE_ZKEVM, type: NetworkType.MAINNET, @@ -974,27 +833,6 @@ export const ALL: Network[] = [ multicall3: DEFAULT_MULTICALL3_ADDRESS, }, }, - { - chainId: ChainId.MONAD_TESTNET, - type: NetworkType.TESTNET, - name: 'monad-testnet', - title: 'Monad Testnet', - rpcUrl: getRpcUrl('monad-testnet'), - logoUrl: getLogoUrl(ChainId.MONAD_TESTNET), - blockExplorer: { - name: 'Monad Testnet Explorer', - url: 'https://testnet.monadexplorer.com/', - }, - nativeCurrency: { - symbol: 'MON', - name: 'MON', - decimals: 18, - }, - contracts: { - multicall3: DEFAULT_MULTICALL3_ADDRESS, - }, - }, - { chainId: ChainId.SOMNIA, type: NetworkType.MAINNET, @@ -1037,48 +875,6 @@ export const ALL: Network[] = [ }, }, - { - chainId: ChainId.INCENTIV, - type: NetworkType.MAINNET, - name: 'incentiv', - title: 'Incentiv', - rpcUrl: getRpcUrl('incentiv'), - logoUrl: getLogoUrl(ChainId.INCENTIV), - blockExplorer: { - name: 'Incentiv Explorer', - url: 'https://explorer.incentiv.io/', - }, - nativeCurrency: { - symbol: 'CENT', - name: 'CENT', - decimals: 18, - }, - contracts: { - multicall3: DEFAULT_MULTICALL3_ADDRESS, - }, - }, - - { - chainId: ChainId.INCENTIV_TESTNET_V2, - type: NetworkType.TESTNET, - name: 'incentiv-testnet-v2', - title: 'Incentiv Testnet', - rpcUrl: getRpcUrl('incentiv-testnet-v2'), - logoUrl: getLogoUrl(ChainId.INCENTIV_TESTNET_V2), - blockExplorer: { - name: 'Incentiv Testnet Explorer', - url: 'https://explorer.testnet.incentiv.net/', - }, - nativeCurrency: { - symbol: 'TCENT', - name: 'TCENT', - decimals: 18, - }, - contracts: { - multicall3: DEFAULT_MULTICALL3_ADDRESS, - }, - }, - { chainId: ChainId.KATANA, type: NetworkType.MAINNET, @@ -1100,27 +896,6 @@ export const ALL: Network[] = [ }, }, - { - chainId: ChainId.SANDBOX_TESTNET, - type: NetworkType.TESTNET, - name: 'sandbox-testnet', - title: 'Sandbox Testnet', - rpcUrl: getRpcUrl('sandbox-testnet'), - logoUrl: getLogoUrl(ChainId.SANDBOX_TESTNET), - blockExplorer: { - name: 'Sandbox Testnet Explorer', - url: 'https://sandbox-testnet.explorer.caldera.xyz/', - }, - nativeCurrency: { - symbol: 'SAND', - name: 'SAND', - decimals: 18, - }, - contracts: { - multicall3: DEFAULT_MULTICALL3_ADDRESS, - }, - }, - { chainId: ChainId.ARC_TESTNET, type: NetworkType.TESTNET, From a62cf4b64a3d96a018ad19c6bf39830bada1c7b1 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 21 May 2026 11:51:35 +0200 Subject: [PATCH 135/144] Add latest relayer.gen.ts (#1004) --- .../src/relayer/rpc-relayer/relayer.gen.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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 8a9ff4a7b..dd3630069 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/relayer.gen.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -// sequence-relayer v0.4.1 0a2503bc893179ba968b0015d7580aabf6a88dd4 +// sequence-relayer v0.4.1 43ed1a26ed167b22a0b0827a8725a0df6fbe6ab4 // -- // Code generated by Webrpc-gen@v0.32.2 with typescript generator. DO NOT EDIT. // @@ -12,7 +12,7 @@ export const WebrpcVersion = 'v1' export const WebrpcSchemaVersion = 'v0.4.1' // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = '0a2503bc893179ba968b0015d7580aabf6a88dd4' +export const WebrpcSchemaHash = '43ed1a26ed167b22a0b0827a8725a0df6fbe6ab4' // // Client interface @@ -390,6 +390,14 @@ export interface MetaTxn { walletAddress: string contract: string input: string + authorization?: EIP7702Authorization +} + +export interface EIP7702Authorization { + chainId: number + implementation: string + nonce: number + signature: string } export interface MetaTxnLog { @@ -586,6 +594,7 @@ export interface GetMetaTxnReceiptArgs { export interface GetMetaTxnReceiptReturn { receipt: MetaTxnReceipt + metaTxnEnqueued: boolean } export interface SimulateArgs { @@ -629,6 +638,7 @@ export interface FeeOptionsArgs { to: string data: string simulate?: boolean + authorization?: EIP7702Authorization } export interface FeeOptionsReturn { @@ -656,6 +666,7 @@ export interface FeeOptionsWithBridgeGasArgs { data: string simulate?: boolean bridgeGas: string + authorization?: EIP7702Authorization } export interface FeeOptionsWithBridgeGasReturn { @@ -696,6 +707,7 @@ export interface RepairSenderReturn {} export interface GetMetaTransactionsArgs { projectId: number page?: Page + includeNonSponsored?: boolean } export interface GetMetaTransactionsReturn { From f806807820377bdb720e8d17f9ba4c96449089a0 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Thu, 21 May 2026 11:56:33 +0200 Subject: [PATCH 136/144] 3.0.10 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 8d7c5dc55..37b4ea332 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index c0fe2135e..d05f1ddbe 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.9", + "version": "3.0.10", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 98b2661e7..1e76b7c90 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 058fda6a5..56f014585 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.9", + "version": "3.0.10", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index b3c436416..d0d37458d 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 35857bea6..3bc3e0f66 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.9", + "version": "3.0.10", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 5575cda0b..845912fe8 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 856d7e329..7c37bbcc3 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.9", + "version": "3.0.10", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index b3233d5c6..693670b22 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 1b0d32023..9833ffaa9 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.9", + "version": "3.0.10", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 4365abb88..b99659fe6 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index f2aed5ef2..1ac1889a4 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.9", + "version": "3.0.10", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 19d5943a1..c284615b6 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index a4ea57696..db4ec068a 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.9", + "version": "3.0.10", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 5e5312a89..507428d5b 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.10 + ## 3.0.9 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 1ba9e2c52..ec2a8dcd9 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.9", + "version": "3.0.10", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 9b41afaa0..139297551 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index bf0e18458..e546d8f22 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.9", + "version": "3.0.10", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index b66fe1270..66866e4e3 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index a226d70fb..34b211947 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.9", + "version": "3.0.10", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 9f44040a1..03d06db61 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface +- Updated dependencies + - @0xsequence/guard@3.0.10 + - @0xsequence/relayer@3.0.10 + - @0xsequence/wallet-primitives@3.0.10 + ## 3.0.9 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 8cbb4eacd..95457a578 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.9", + "version": "3.0.10", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index d037d5636..492c1ec2e 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface +- Updated dependencies + - @0xsequence/guard@3.0.10 + - @0xsequence/relayer@3.0.10 + - @0xsequence/wallet-core@3.0.10 + - @0xsequence/wallet-primitives@3.0.10 + ## 3.0.9 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 82a3c95a2..74b4beeab 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.9", + "version": "3.0.10", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index 9b0a19d85..b2f04d8d5 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface + ## 3.0.9 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 4648ce66a..a34f382e6 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.9", + "version": "3.0.10", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 795eb18ae..47bc13af2 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.0.10 + +### Patch Changes + +- Minor network updates, relayer interface +- Updated dependencies + - @0xsequence/guard@3.0.10 + - @0xsequence/identity-instrument@3.0.10 + - @0xsequence/relayer@3.0.10 + - @0xsequence/wallet-core@3.0.10 + - @0xsequence/wallet-primitives@3.0.10 + ## 3.0.9 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 547bc15c3..65a237c55 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.9", + "version": "3.0.10", "license": "Apache-2.0", "type": "module", "publishConfig": { From 55121afceb45da84019ef565f84b2682cf6c5d44 Mon Sep 17 00:00:00 2001 From: Matt Rintoul Date: Fri, 29 May 2026 03:50:43 -0400 Subject: [PATCH 137/144] Surface relayer sponsorship signal end-to-end (additive, non-breaking) (#1007) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(relayer): propagate sponsored signal and mark swallowed errors `RpcRelayer.feeOptions` now forwards the server's `sponsored: boolean` to callers, and both `feeOptions` and `feeTokens` mark their swallowed-error returns with `failed: true`. The `Relayer` interface and all bundled implementations (Rpc, Sequence, Local, EIP6963, Pk) are widened to match. Additive change: existing consumers ignoring the new fields are unaffected. Downstream sponsorship classifiers should switch from `!feeOption` inference to `sponsored === true` so a real subsidy is no longer indistinguishable from a swallowed `/FeeOptions` error. Co-Authored-By: Claude Opus 4.7 * feat(wallet-wdk): carry sponsored/failed on StandardRelayerOption `StandardRelayerOption` gains optional `sponsored` and `failed` fields, populated on both construction branches in `transactions.ts` from the relayer SDK's new `feeOptions` return. `isStandardRelayerOption` / `isERC4337RelayerOption` are re-exported so consumers can narrow before reading the new fields. UI consumers that classified sponsorship by "no fee option attached" should switch to `sponsored === true` to distinguish a real subsidy from a swallowed `/FeeOptions` error. Co-Authored-By: Claude Opus 4.7 * feat(dapp-client): add isSponsored for explicit sponsorship checks `DappClient.isSponsored(chainId, transactions)` and `ChainSessionManager.isSponsored(calls)` return true only when the relayer's `/FeeOptions` endpoint explicitly reports sponsorship; any error, network failure, or absence of sponsorship returns false. A true result is always safe to surface as "free gas" in UI. Prefer this over inferring sponsorship from an empty `getFeeOptions` array — a swallowed `/FeeOptions` error produces the same empty shape as a real subsidy. `getFeeOptions` is unchanged. Co-Authored-By: Claude Opus 4.7 --------- Co-authored-by: Claude Opus 4.7 --- .changeset/dapp-client-is-sponsored.md | 19 +++++++ .changeset/relayer-sponsored-signal.md | 20 +++++++ .changeset/wdk-sponsored-signal.md | 23 ++++++++ .../services/relayer/src/relayer/relayer.ts | 9 ++- .../relayer/src/relayer/rpc-relayer/index.ts | 15 +++-- .../relayer/src/relayer/standard/eip6963.ts | 9 ++- .../relayer/src/relayer/standard/local.ts | 11 +++- .../src/relayer/standard/pk-relayer.ts | 9 ++- .../relayer/src/relayer/standard/sequence.ts | 12 +++- .../relayer/test/relayer/relayer.test.ts | 55 +++++++++++++++++++ .../dapp-client/src/ChainSessionManager.ts | 48 ++++++++++++++++ packages/wallet/dapp-client/src/DappClient.ts | 24 ++++++++ .../wallet/wdk/src/sequence/transactions.ts | 4 ++ .../wallet/wdk/src/sequence/types/index.ts | 1 + .../src/sequence/types/transaction-request.ts | 2 + packages/wallet/wdk/test/transactions.test.ts | 17 ++++++ 16 files changed, 261 insertions(+), 17 deletions(-) create mode 100644 .changeset/dapp-client-is-sponsored.md create mode 100644 .changeset/relayer-sponsored-signal.md create mode 100644 .changeset/wdk-sponsored-signal.md diff --git a/.changeset/dapp-client-is-sponsored.md b/.changeset/dapp-client-is-sponsored.md new file mode 100644 index 000000000..731c28d3b --- /dev/null +++ b/.changeset/dapp-client-is-sponsored.md @@ -0,0 +1,19 @@ +--- +'@0xsequence/dapp-client': minor +--- + +Add `isSponsored` for explicit sponsorship checks. + +`DappClient.isSponsored(chainId, transactions)` and +`ChainSessionManager.isSponsored(calls)` return `true` only when the relayer's +`/FeeOptions` endpoint explicitly reports sponsorship. Any error, network +failure, or absence of sponsorship returns `false`, so a `true` result is +always safe to surface as "free gas" in UI. + +Prefer this over inferring sponsorship from an empty `getFeeOptions` array — a +swallowed `/FeeOptions` error also produces an empty array, so the inference +can misclassify a failed quote as a real subsidy. The new method uses the +positive `sponsored: boolean` signal from `@0xsequence/relayer`'s widened +`feeOptions` return. + +`getFeeOptions` is unchanged. diff --git a/.changeset/relayer-sponsored-signal.md b/.changeset/relayer-sponsored-signal.md new file mode 100644 index 000000000..f922932ed --- /dev/null +++ b/.changeset/relayer-sponsored-signal.md @@ -0,0 +1,20 @@ +--- +'@0xsequence/relayer': minor +--- + +Surface explicit sponsorship signal on `feeOptions` and an error marker on +`feeOptions` / `feeTokens`. + +- `RpcRelayer.feeOptions` now returns `sponsored: boolean`, forwarded from the + server's `FeeOptionsReturn.sponsored`. The `Relayer` interface and all + bundled implementations (`RpcRelayer`, `SequenceRelayer`, `LocalRelayer`, + `EIP6963Relayer`, `PkRelayer`) carry the new field. +- When `feeOptions` swallows a transport / server error it now returns + `{ options: [], sponsored: false, failed: true }` (was `{ options: [] }`). +- When `feeTokens` swallows an error it now returns + `{ isFeeRequired: false, failed: true }` (was `{ isFeeRequired: false }`). + +These changes are additive — existing consumers that ignore the new fields are +unaffected. Consumers that classified sponsorship by "no fee option attached" +should migrate to `sponsored === true` to distinguish a real subsidy from a +swallowed `/FeeOptions` error. diff --git a/.changeset/wdk-sponsored-signal.md b/.changeset/wdk-sponsored-signal.md new file mode 100644 index 000000000..14d94ddce --- /dev/null +++ b/.changeset/wdk-sponsored-signal.md @@ -0,0 +1,23 @@ +--- +'@0xsequence/wallet-wdk': minor +--- + +Carry `sponsored` / `failed` through `StandardRelayerOption`. + +`StandardRelayerOption` now exposes two optional fields: + +- `sponsored?: boolean` — populated from the relayer SDK's new `feeOptions` + return field. `true` means the server confirmed an active sponsorship policy + match; `false` means it did not (or the quote failed). +- `failed?: boolean` — `true` when the relayer's `feeOptions` call was swallowed + due to a transport or server error. + +Both fields are populated on the empty-options construction branch and the +per-option mapping branch in `transactions.ts`. The new `isStandardRelayerOption` +and `isERC4337RelayerOption` runtime helpers are now re-exported from the +package root for consumers that need to narrow `RelayerOption` before reading +the new fields. + +UI / wallet consumers that previously classified sponsorship by "no `feeOption` +attached" should switch to `sponsored === true` so a real subsidy is no longer +indistinguishable from a swallowed `/FeeOptions` error. diff --git a/packages/services/relayer/src/relayer/relayer.ts b/packages/services/relayer/src/relayer/relayer.ts index 9f648004a..d0c558082 100644 --- a/packages/services/relayer/src/relayer/relayer.ts +++ b/packages/services/relayer/src/relayer/relayer.ts @@ -11,7 +11,12 @@ export interface Relayer { isAvailable(wallet: Address.Address, chainId: number): Promise - feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> + feeTokens(): Promise<{ + isFeeRequired: boolean + tokens?: FeeToken[] + paymentAddress?: Address.Address + failed?: boolean + }> feeOptions( wallet: Address.Address, @@ -19,7 +24,7 @@ export interface Relayer { to: Address.Address, calls: Payload.Call[], data?: Hex.Hex, - ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> + ): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> relay(to: Address.Address, data: Hex.Hex, chainId: number, quote?: FeeQuote): Promise<{ opHash: Hex.Hex }> diff --git a/packages/services/relayer/src/relayer/rpc-relayer/index.ts b/packages/services/relayer/src/relayer/rpc-relayer/index.ts index 814d25bbd..05ba8be76 100644 --- a/packages/services/relayer/src/relayer/rpc-relayer/index.ts +++ b/packages/services/relayer/src/relayer/rpc-relayer/index.ts @@ -123,7 +123,12 @@ export class RpcRelayer implements Relayer { return Promise.resolve(this.chainId === chainId) } - async feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: RpcFeeToken[]; paymentAddress?: Address.Address }> { + async feeTokens(): Promise<{ + isFeeRequired: boolean + tokens?: RpcFeeToken[] + paymentAddress?: Address.Address + failed?: boolean + }> { try { const { isFeeRequired, tokens, paymentAddress } = await this.client.feeTokens() if (isFeeRequired) { @@ -140,7 +145,7 @@ export class RpcRelayer implements Relayer { } } catch (e) { console.warn('RpcRelayer.feeTokens failed:', e) - return { isFeeRequired: false } + return { isFeeRequired: false, failed: true } } } @@ -150,7 +155,7 @@ export class RpcRelayer implements Relayer { to: Address.Address, calls: Payload.Call[], data?: Hex.Hex, - ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { + ): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> { // IMPORTANT: // The relayer FeeOptions endpoint simulates `eth_call(to, data)`. // Callers that already built a wallet transaction should pass its `to` and `data`. @@ -182,10 +187,10 @@ export class RpcRelayer implements Relayer { gasLimit: option.gasLimit, })) - return { options, quote } + return { options, quote, sponsored: result.sponsored } } catch (e) { console.warn('RpcRelayer.feeOptions failed:', e) - return { options: [] } + return { options: [], sponsored: false, failed: true } } } diff --git a/packages/services/relayer/src/relayer/standard/eip6963.ts b/packages/services/relayer/src/relayer/standard/eip6963.ts index a290b2c6f..957b13c44 100644 --- a/packages/services/relayer/src/relayer/standard/eip6963.ts +++ b/packages/services/relayer/src/relayer/standard/eip6963.ts @@ -23,7 +23,12 @@ export class EIP6963Relayer implements Relayer { return this.relayer.isAvailable(wallet, chainId) } - feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> { + feeTokens(): Promise<{ + isFeeRequired: boolean + tokens?: FeeToken[] + paymentAddress?: Address.Address + failed?: boolean + }> { return this.relayer.feeTokens() } @@ -32,7 +37,7 @@ export class EIP6963Relayer implements Relayer { chainId: number, to: Address.Address, calls: Payload.Call[], - ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { + ): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> { return this.relayer.feeOptions(wallet, chainId, to, calls) } diff --git a/packages/services/relayer/src/relayer/standard/local.ts b/packages/services/relayer/src/relayer/standard/local.ts index 4135af3b3..e8066674c 100644 --- a/packages/services/relayer/src/relayer/standard/local.ts +++ b/packages/services/relayer/src/relayer/standard/local.ts @@ -56,7 +56,12 @@ export class LocalRelayer implements Relayer { return new LocalRelayer(new EIP1193ProviderAdapter(provider)) } - feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> { + feeTokens(): Promise<{ + isFeeRequired: boolean + tokens?: FeeToken[] + paymentAddress?: Address.Address + failed?: boolean + }> { return Promise.resolve({ isFeeRequired: false, }) @@ -67,8 +72,8 @@ export class LocalRelayer implements Relayer { _chainId: number, _to: Address.Address, _calls: Payload.Call[], - ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { - return Promise.resolve({ options: [] }) + ): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> { + return Promise.resolve({ options: [], sponsored: false }) } async relay( diff --git a/packages/services/relayer/src/relayer/standard/pk-relayer.ts b/packages/services/relayer/src/relayer/standard/pk-relayer.ts index b1d420a58..28ea0850a 100644 --- a/packages/services/relayer/src/relayer/standard/pk-relayer.ts +++ b/packages/services/relayer/src/relayer/standard/pk-relayer.ts @@ -107,7 +107,12 @@ export class PkRelayer implements Relayer { return providerChainId === chainId } - feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> { + feeTokens(): Promise<{ + isFeeRequired: boolean + tokens?: FeeToken[] + paymentAddress?: Address.Address + failed?: boolean + }> { return this.relayer.feeTokens() } @@ -116,7 +121,7 @@ export class PkRelayer implements Relayer { chainId: number, to: Address.Address, calls: Payload.Call[], - ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { + ): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> { return this.relayer.feeOptions(wallet, chainId, to, calls) } diff --git a/packages/services/relayer/src/relayer/standard/sequence.ts b/packages/services/relayer/src/relayer/standard/sequence.ts index 1ae5ec69b..8519c618a 100644 --- a/packages/services/relayer/src/relayer/standard/sequence.ts +++ b/packages/services/relayer/src/relayer/standard/sequence.ts @@ -17,7 +17,12 @@ export class SequenceRelayer implements Relayer { return true } - async feeTokens(): Promise<{ isFeeRequired: boolean; tokens?: FeeToken[]; paymentAddress?: Address.Address }> { + async feeTokens(): Promise<{ + isFeeRequired: boolean + tokens?: FeeToken[] + paymentAddress?: Address.Address + failed?: boolean + }> { const { isFeeRequired, tokens, paymentAddress } = await this.service.feeTokens() if (isFeeRequired) { Address.assert(paymentAddress) @@ -39,17 +44,18 @@ export class SequenceRelayer implements Relayer { to: Address.Address, calls: Payload.Call[], transactionData?: Hex.Hex, - ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { + ): Promise<{ options: FeeOption[]; quote?: FeeQuote; sponsored: boolean; failed?: boolean }> { const execute = AbiFunction.from('function execute(bytes calldata _payload, bytes calldata _signature)') const payload = Payload.encode({ type: 'call', space: 0n, nonce: 0n, calls }, to) const signature = '0x0001' // TODO: use a stub signature const data = transactionData ?? AbiFunction.encodeData(execute, [Bytes.toHex(payload), signature]) - const { options, quote } = await this.service.feeOptions({ wallet, to, data }) + const { options, quote, sponsored } = await this.service.feeOptions({ wallet, to, data }) return { options, quote: quote ? { _tag: 'FeeQuote', _quote: quote } : undefined, + sponsored, } } diff --git a/packages/services/relayer/test/relayer/relayer.test.ts b/packages/services/relayer/test/relayer/relayer.test.ts index 028ccf32f..cd8c096a3 100644 --- a/packages/services/relayer/test/relayer/relayer.test.ts +++ b/packages/services/relayer/test/relayer/relayer.test.ts @@ -294,6 +294,7 @@ describe('Relayer', () => { vi.mocked(mockRelayer.feeOptions).mockResolvedValue({ options: [], quote: undefined, + sponsored: false, }) vi.mocked(mockRelayer.relay).mockResolvedValue({ opHash: TEST_OP_HASH, @@ -375,6 +376,60 @@ describe('Relayer', () => { data: expectedData, }) }) + + it('should propagate sponsored:true from the server', async () => { + const fetchImpl = vi.fn( + async () => new Response(JSON.stringify({ options: [], sponsored: true }), { status: 200 }), + ) + const relayer = new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl) + + const result = await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall]) + + expect(result.sponsored).toBe(true) + expect(result.options).toEqual([]) + expect(result.failed).toBeUndefined() + }) + + it('should propagate sponsored:false from the server', async () => { + const fetchImpl = vi.fn( + async () => new Response(JSON.stringify({ options: [], sponsored: false }), { status: 200 }), + ) + const relayer = new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl) + + const result = await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall]) + + expect(result.sponsored).toBe(false) + expect(result.failed).toBeUndefined() + }) + + it('should return sponsored:false and failed:true when the server errors', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const fetchImpl = vi.fn( + async () => + new Response(JSON.stringify({ error: 'Aborted', code: 1005, msg: 'simulation failed' }), { status: 400 }), + ) + const relayer = new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl) + + const result = await relayer.feeOptions(TEST_WALLET_ADDRESS, TEST_CHAIN_ID, TEST_TO_ADDRESS, [mockCall]) + + expect(result).toEqual({ options: [], sponsored: false, failed: true }) + expect(warn).toHaveBeenCalled() + warn.mockRestore() + }) + }) + + describe('RpcRelayer.feeTokens', () => { + it('should return failed:true when the server errors', async () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const fetchImpl = vi.fn(async () => new Response('boom', { status: 500 })) + const relayer = new Relayer.RpcRelayer('https://relayer.test', TEST_CHAIN_ID, 'https://rpc.test', fetchImpl) + + const result = await relayer.feeTokens() + + expect(result).toEqual({ isFeeRequired: false, failed: true }) + expect(warn).toHaveBeenCalled() + warn.mockRestore() + }) }) describe('Type compatibility', () => { diff --git a/packages/wallet/dapp-client/src/ChainSessionManager.ts b/packages/wallet/dapp-client/src/ChainSessionManager.ts index dc1f30e23..d2ebd1a8e 100644 --- a/packages/wallet/dapp-client/src/ChainSessionManager.ts +++ b/packages/wallet/dapp-client/src/ChainSessionManager.ts @@ -878,6 +878,54 @@ export class ChainSessionManager { } } + /** + * Checks whether the given transactions would be sponsored by an active + * relayer policy on this chain. + * + * Returns `true` only when the relayer's `/FeeOptions` endpoint explicitly + * reports sponsorship. A failed quote, network error, or absence of + * sponsorship all return `false`, so a `true` result is always safe to + * surface as "free gas" in UI. + */ + async isSponsored(calls: Transaction[]): Promise { + const callsToSend = calls.map((tx) => ({ + to: tx.to, + value: tx.value, + data: tx.data, + gasLimit: tx.gasLimit ?? BigInt(0), + delegateCall: tx.delegateCall ?? false, + onlyFallback: tx.onlyFallback ?? false, + behaviorOnError: tx.behaviorOnError ?? ('revert' as const), + })) + try { + const signedCall = await this._buildAndSignCalls(callsToSend) + const fingerprint = this._fingerprintCalls(callsToSend) + if (fingerprint) { + this.lastSignedCallCache = { + fingerprint, + signedCall, + createdAtMs: Date.now(), + } + } + const walletAddress = this.walletAddress + if (!walletAddress) throw new InitializationError('Wallet is not initialized.') + const feeOptions = await this.relayer.feeOptions( + walletAddress, + this.chainId, + signedCall.to, + callsToSend, + signedCall.data, + ) + return feeOptions.sponsored === true && !feeOptions.failed + } catch (err) { + console.warn( + `isSponsored check failed for chain ${this.chainId}:`, + err instanceof Error ? err.message : String(err), + ) + return false + } + } + /** * 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 e580bd912..cc6bcba4d 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -806,6 +806,30 @@ export class DappClient { return await chainSessionManager.getFeeOptions(transactions) } + /** + * Checks whether the given transactions would be sponsored on `chainId`. + * + * Returns `true` only when the relayer's `/FeeOptions` endpoint explicitly + * reports sponsorship. A failed quote, network error, or absence of + * sponsorship all return `false`, so a `true` result is always safe to + * surface as "free gas" in UI. + * + * Prefer this over inferring sponsorship from an empty `getFeeOptions` + * array — a swallowed `/FeeOptions` error also produces an empty array. + * + * @example + * if (await dappClient.isSponsored(1, transactions)) { + * // safe to show "Free gas, sponsored by app" + * } else { + * const feeOptions = await dappClient.getFeeOptions(1, transactions) + * // present feeOptions[0..n] to the user as payment choices + * } + */ + async isSponsored(chainId: number, transactions: Transaction[]): Promise { + const chainSessionManager = await this.getOrInitializeChainManager(chainId) + return await chainSessionManager.isSponsored(transactions) + } + /** * Fetches fee tokens for a chain. * @returns A promise that resolves with the fee tokens response. {@link GetFeeTokensResponse} diff --git a/packages/wallet/wdk/src/sequence/transactions.ts b/packages/wallet/wdk/src/sequence/transactions.ts index 146d66999..c5549f28d 100644 --- a/packages/wallet/wdk/src/sequence/transactions.ts +++ b/packages/wallet/wdk/src/sequence/transactions.ts @@ -371,6 +371,8 @@ export class Transactions implements TransactionsInterface { id: uuidv7(), relayerType: relayer.type, relayerId: relayer.id, + sponsored: feeOptions.sponsored, + failed: feeOptions.failed, name, icon, } as StandardRelayerOption, @@ -383,6 +385,8 @@ export class Transactions implements TransactionsInterface { feeOption, relayerType: relayer.type, relayerId: relayer.id, + sponsored: feeOptions.sponsored, + failed: feeOptions.failed, quote: feeOptions.quote, })) }), diff --git a/packages/wallet/wdk/src/sequence/types/index.ts b/packages/wallet/wdk/src/sequence/types/index.ts index 066e8a071..946ee9bf3 100644 --- a/packages/wallet/wdk/src/sequence/types/index.ts +++ b/packages/wallet/wdk/src/sequence/types/index.ts @@ -27,5 +27,6 @@ export type { TransactionRequest, TransactionRequested, } from './transaction-request.js' +export { isERC4337RelayerOption, isStandardRelayerOption } from './transaction-request.js' export type { Wallet } from './wallet.js' export type { Module } from './module.js' diff --git a/packages/wallet/wdk/src/sequence/types/transaction-request.ts b/packages/wallet/wdk/src/sequence/types/transaction-request.ts index 51160a049..5511bc61b 100644 --- a/packages/wallet/wdk/src/sequence/types/transaction-request.ts +++ b/packages/wallet/wdk/src/sequence/types/transaction-request.ts @@ -21,6 +21,8 @@ export type StandardRelayerOption = BaseRelayerOption & { kind: 'standard' feeOption?: Relayer.FeeOption quote?: Relayer.FeeQuote + sponsored?: boolean + failed?: boolean name?: string icon?: string } diff --git a/packages/wallet/wdk/test/transactions.test.ts b/packages/wallet/wdk/test/transactions.test.ts index 295d00d01..8d494347d 100644 --- a/packages/wallet/wdk/test/transactions.test.ts +++ b/packages/wallet/wdk/test/transactions.test.ts @@ -1,5 +1,6 @@ import { afterEach, describe, expect, it } from 'vitest' import { + isStandardRelayerOption, Manager, SignerActionable, Transaction, @@ -56,6 +57,14 @@ describe('Transactions', () => { expect(tx.relayerOptions.length).toBe(1) expect(tx.relayerOptions[0]!.id).toBeDefined() + // PkRelayer/LocalRelayer never report sponsorship, so sponsored should be + // explicitly false (not undefined) and failed should remain undefined. + const firstOption = tx.relayerOptions[0]! + if (isStandardRelayerOption(firstOption)) { + expect(firstOption.sponsored).toBe(false) + expect(firstOption.failed).toBeUndefined() + } + const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0]!.id) expect(sigId).toBeDefined() @@ -169,6 +178,14 @@ describe('Transactions', () => { expect(tx.relayerOptions.length).toBe(1) expect(tx.relayerOptions[0]!.id).toBeDefined() + // PkRelayer/LocalRelayer never report sponsorship, so sponsored should be + // explicitly false (not undefined) and failed should remain undefined. + const firstOption = tx.relayerOptions[0]! + if (isStandardRelayerOption(firstOption)) { + expect(firstOption.sponsored).toBe(false) + expect(firstOption.failed).toBeUndefined() + } + const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0]!.id) expect(sigId).toBeDefined() From db978bd670bb759eb02169bdeee17a2d624e90c1 Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Fri, 29 May 2026 12:48:21 +0200 Subject: [PATCH 138/144] 3.0.11 --- .changeset/dapp-client-is-sponsored.md | 19 ----------- .changeset/relayer-sponsored-signal.md | 20 ----------- .changeset/wdk-sponsored-signal.md | 23 ------------- 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 | 26 ++++++++++++++ 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 | 11 ++++++ packages/wallet/core/package.json | 2 +- packages/wallet/dapp-client/CHANGELOG.md | 30 ++++++++++++++++ packages/wallet/dapp-client/package.json | 2 +- packages/wallet/primitives/CHANGELOG.md | 6 ++++ packages/wallet/primitives/package.json | 2 +- packages/wallet/wdk/CHANGELOG.md | 34 +++++++++++++++++++ packages/wallet/wdk/package.json | 2 +- 31 files changed, 175 insertions(+), 76 deletions(-) delete mode 100644 .changeset/dapp-client-is-sponsored.md delete mode 100644 .changeset/relayer-sponsored-signal.md delete mode 100644 .changeset/wdk-sponsored-signal.md diff --git a/.changeset/dapp-client-is-sponsored.md b/.changeset/dapp-client-is-sponsored.md deleted file mode 100644 index 731c28d3b..000000000 --- a/.changeset/dapp-client-is-sponsored.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -'@0xsequence/dapp-client': minor ---- - -Add `isSponsored` for explicit sponsorship checks. - -`DappClient.isSponsored(chainId, transactions)` and -`ChainSessionManager.isSponsored(calls)` return `true` only when the relayer's -`/FeeOptions` endpoint explicitly reports sponsorship. Any error, network -failure, or absence of sponsorship returns `false`, so a `true` result is -always safe to surface as "free gas" in UI. - -Prefer this over inferring sponsorship from an empty `getFeeOptions` array — a -swallowed `/FeeOptions` error also produces an empty array, so the inference -can misclassify a failed quote as a real subsidy. The new method uses the -positive `sponsored: boolean` signal from `@0xsequence/relayer`'s widened -`feeOptions` return. - -`getFeeOptions` is unchanged. diff --git a/.changeset/relayer-sponsored-signal.md b/.changeset/relayer-sponsored-signal.md deleted file mode 100644 index f922932ed..000000000 --- a/.changeset/relayer-sponsored-signal.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -'@0xsequence/relayer': minor ---- - -Surface explicit sponsorship signal on `feeOptions` and an error marker on -`feeOptions` / `feeTokens`. - -- `RpcRelayer.feeOptions` now returns `sponsored: boolean`, forwarded from the - server's `FeeOptionsReturn.sponsored`. The `Relayer` interface and all - bundled implementations (`RpcRelayer`, `SequenceRelayer`, `LocalRelayer`, - `EIP6963Relayer`, `PkRelayer`) carry the new field. -- When `feeOptions` swallows a transport / server error it now returns - `{ options: [], sponsored: false, failed: true }` (was `{ options: [] }`). -- When `feeTokens` swallows an error it now returns - `{ isFeeRequired: false, failed: true }` (was `{ isFeeRequired: false }`). - -These changes are additive — existing consumers that ignore the new fields are -unaffected. Consumers that classified sponsorship by "no fee option attached" -should migrate to `sponsored === true` to distinguish a real subsidy from a -swallowed `/FeeOptions` error. diff --git a/.changeset/wdk-sponsored-signal.md b/.changeset/wdk-sponsored-signal.md deleted file mode 100644 index 14d94ddce..000000000 --- a/.changeset/wdk-sponsored-signal.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'@0xsequence/wallet-wdk': minor ---- - -Carry `sponsored` / `failed` through `StandardRelayerOption`. - -`StandardRelayerOption` now exposes two optional fields: - -- `sponsored?: boolean` — populated from the relayer SDK's new `feeOptions` - return field. `true` means the server confirmed an active sponsorship policy - match; `false` means it did not (or the quote failed). -- `failed?: boolean` — `true` when the relayer's `feeOptions` call was swallowed - due to a transport or server error. - -Both fields are populated on the empty-options construction branch and the -per-option mapping branch in `transactions.ts`. The new `isStandardRelayerOption` -and `isERC4337RelayerOption` runtime helpers are now re-exported from the -package root for consumers that need to narrow `RelayerOption` before reading -the new fields. - -UI / wallet consumers that previously classified sponsorship by "no `feeOption` -attached" should switch to `sponsored === true` so a real subsidy is no longer -indistinguishable from a swallowed `/FeeOptions` error. diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 37b4ea332..abf1bac7a 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index d05f1ddbe..f17292579 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.10", + "version": "3.0.11", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 1e76b7c90..501288464 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 56f014585..84cf23976 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.10", + "version": "3.0.11", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index d0d37458d..f9125f1be 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index 3bc3e0f66..e4c7c1f05 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.10", + "version": "3.0.11", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 845912fe8..7a3f20388 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 7c37bbcc3..2dffdd488 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.10", + "version": "3.0.11", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 693670b22..34389ffed 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index 9833ffaa9..f8b17dac8 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.10", + "version": "3.0.11", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index b99659fe6..56b3ea4a6 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 1ac1889a4..23a7866f8 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.10", + "version": "3.0.11", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index c284615b6..74d47b401 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index db4ec068a..234b7ea9c 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.10", + "version": "3.0.11", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 507428d5b..951a31f26 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,31 @@ # @0xsequence/relayer +## 3.1.0 + +### Minor Changes + +- 55121af: Surface explicit sponsorship signal on `feeOptions` and an error marker on + `feeOptions` / `feeTokens`. + - `RpcRelayer.feeOptions` now returns `sponsored: boolean`, forwarded from the + server's `FeeOptionsReturn.sponsored`. The `Relayer` interface and all + bundled implementations (`RpcRelayer`, `SequenceRelayer`, `LocalRelayer`, + `EIP6963Relayer`, `PkRelayer`) carry the new field. + - When `feeOptions` swallows a transport / server error it now returns + `{ options: [], sponsored: false, failed: true }` (was `{ options: [] }`). + - When `feeTokens` swallows an error it now returns + `{ isFeeRequired: false, failed: true }` (was `{ isFeeRequired: false }`). + + These changes are additive — existing consumers that ignore the new fields are + unaffected. Consumers that classified sponsorship by "no fee option attached" + should migrate to `sponsored === true` to distinguish a real subsidy from a + swallowed `/FeeOptions` error. + +### Patch Changes + +- Fix for relayer sponsored fees +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.11 + ## 3.0.10 ### Patch Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index ec2a8dcd9..284ceae37 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.0.10", + "version": "3.1.0", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index 139297551..ebf00e9eb 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index e546d8f22..0483c76a3 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.10", + "version": "3.0.11", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index 66866e4e3..fca1d35a4 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 34b211947..6b6023abd 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.10", + "version": "3.0.11", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 03d06db61..8c79704d7 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/wallet-core +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees +- Updated dependencies +- Updated dependencies [55121af] + - @0xsequence/guard@3.0.11 + - @0xsequence/relayer@3.1.0 + - @0xsequence/wallet-primitives@3.0.11 + ## 3.0.10 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 95457a578..0c9ca7535 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.10", + "version": "3.0.11", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 492c1ec2e..03750f575 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,35 @@ # @0xsequence/dapp-client +## 3.1.0 + +### Minor Changes + +- 55121af: Add `isSponsored` for explicit sponsorship checks. + + `DappClient.isSponsored(chainId, transactions)` and + `ChainSessionManager.isSponsored(calls)` return `true` only when the relayer's + `/FeeOptions` endpoint explicitly reports sponsorship. Any error, network + failure, or absence of sponsorship returns `false`, so a `true` result is + always safe to surface as "free gas" in UI. + + Prefer this over inferring sponsorship from an empty `getFeeOptions` array — a + swallowed `/FeeOptions` error also produces an empty array, so the inference + can misclassify a failed quote as a real subsidy. The new method uses the + positive `sponsored: boolean` signal from `@0xsequence/relayer`'s widened + `feeOptions` return. + + `getFeeOptions` is unchanged. + +### Patch Changes + +- Fix for relayer sponsored fees +- Updated dependencies +- Updated dependencies [55121af] + - @0xsequence/guard@3.0.11 + - @0xsequence/relayer@3.1.0 + - @0xsequence/wallet-core@3.0.11 + - @0xsequence/wallet-primitives@3.0.11 + ## 3.0.10 ### Patch Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 74b4beeab..6d42b0a89 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.10", + "version": "3.1.0", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index b2f04d8d5..c3ffa3d19 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.11 + +### Patch Changes + +- Fix for relayer sponsored fees + ## 3.0.10 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index a34f382e6..4bd610f9e 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.10", + "version": "3.0.11", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 47bc13af2..891397004 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,39 @@ # @0xsequence/wallet-wdk +## 3.1.0 + +### Minor Changes + +- 55121af: Carry `sponsored` / `failed` through `StandardRelayerOption`. + + `StandardRelayerOption` now exposes two optional fields: + - `sponsored?: boolean` — populated from the relayer SDK's new `feeOptions` + return field. `true` means the server confirmed an active sponsorship policy + match; `false` means it did not (or the quote failed). + - `failed?: boolean` — `true` when the relayer's `feeOptions` call was swallowed + due to a transport or server error. + + Both fields are populated on the empty-options construction branch and the + per-option mapping branch in `transactions.ts`. The new `isStandardRelayerOption` + and `isERC4337RelayerOption` runtime helpers are now re-exported from the + package root for consumers that need to narrow `RelayerOption` before reading + the new fields. + + UI / wallet consumers that previously classified sponsorship by "no `feeOption` + attached" should switch to `sponsored === true` so a real subsidy is no longer + indistinguishable from a swallowed `/FeeOptions` error. + +### Patch Changes + +- Fix for relayer sponsored fees +- Updated dependencies +- Updated dependencies [55121af] + - @0xsequence/guard@3.0.11 + - @0xsequence/identity-instrument@3.0.11 + - @0xsequence/relayer@3.1.0 + - @0xsequence/wallet-core@3.0.11 + - @0xsequence/wallet-primitives@3.0.11 + ## 3.0.10 ### Patch Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 65a237c55..12e5d6dd8 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.0.10", + "version": "3.1.0", "license": "Apache-2.0", "type": "module", "publishConfig": { From fce05da60d54804b55b2dc7aeac8291ad4d7465e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 May 2026 13:03:56 +0200 Subject: [PATCH 139/144] Bump turbo from 2.9.8 to 2.9.14 (#1008) Bumps [turbo](https://github.com/vercel/turborepo) from 2.9.8 to 2.9.14. - [Release notes](https://github.com/vercel/turborepo/releases) - [Changelog](https://github.com/vercel/turborepo/blob/main/RELEASE.md) - [Commits](https://github.com/vercel/turborepo/compare/v2.9.8...v2.9.14) --- updated-dependencies: - dependency-name: turbo dependency-version: 2.9.14 dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 125 +++++++++++++------------------------------------ 2 files changed, 33 insertions(+), 94 deletions(-) diff --git a/package.json b/package.json index 38bc33117..af9b64c38 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "prettier": "^3.8.3", "rimraf": "^6.1.3", "syncpack": "^14.3.1", - "turbo": "^2.9.8", + "turbo": "^2.9.14", "typescript": "^6.0.3" }, "pnpm": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7a369a88a..406d256af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,8 +27,8 @@ importers: specifier: ^14.3.1 version: 14.3.1 turbo: - specifier: ^2.9.8 - version: 2.9.8 + specifier: ^2.9.14 + version: 2.9.14 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -530,7 +530,7 @@ importers: version: 7.0.1(eslint@9.39.2) eslint-plugin-turbo: specifier: ^2.6.3 - version: 2.6.3(eslint@9.39.2)(turbo@2.9.9) + version: 2.6.3(eslint@9.39.2)(turbo@2.9.14) globals: specifier: ^16.5.0 version: 16.5.0 @@ -1357,23 +1357,13 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@turbo/darwin-64@2.9.8': - resolution: {integrity: sha512-zU1P95ygDpsQ+2QHh7CVTqvYwi9UBlhKWzoIyUnP3vUoge7H9SQEzrd8dj+XcTrslAp9Db3vIBcXtMVoTEYDnA==} + '@turbo/darwin-64@2.9.14': + resolution: {integrity: sha512-t7QiPflaEyBE4oayeZtSmu4mEfjgIrcNlNNl1z1dmIVPqEdtA7+CfTf8d7KXsOGPh6aNgWjKxyvQg9uGfDQF+A==} cpu: [x64] os: [darwin] - '@turbo/darwin-64@2.9.9': - resolution: {integrity: sha512-hTEiNu2ABZZOO1qbjnKASI8eF3BdOOzU6iKv5w5uGOK65DDMc10cS40N1kqM99YT0uSAGUwNu6GdFctRPeEeVA==} - cpu: [x64] - os: [darwin] - - '@turbo/darwin-arm64@2.9.8': - resolution: {integrity: sha512-nKRFI5ZhCGUi4eXNlrojzWcT/CehMj0raot1WE4lw5qf66ZxZHbRbBqcwNEy+ZLY7RkJJRY+TaU89fuj3BcgGg==} - cpu: [arm64] - os: [darwin] - - '@turbo/darwin-arm64@2.9.9': - resolution: {integrity: sha512-MinO40EEcP5mJiTVpfjtEulsEBhVeryfq21QhYtJZ8hQJLHGgy459rcmDVAY8/JERe4dkVU4KW+zoLF22o01EA==} + '@turbo/darwin-arm64@2.9.14': + resolution: {integrity: sha512-d23147mC9BsCPA9mJ0h/ubcpbRgcJBXbcG3+Vq7YLhjz3IXuvQsJ1UXH8f4MD76ZjJ4m/E4aRdJV+MW88CDfbw==} cpu: [arm64] os: [darwin] @@ -1381,43 +1371,23 @@ packages: resolution: {integrity: sha512-PK38N1fHhDUyjLi0mUjv0RbX0xXGwDLQeRSGsIlLcVpP1B5fwodSIwIYXc9vJok26Yne94BX5AGjueYsUT3uUw==} hasBin: true - '@turbo/linux-64@2.9.8': - resolution: {integrity: sha512-Wf/kQpVDCaWM3P5d6lKvJnqjYn/ofUBGbT4h4vRFrdC4N6B/nsun03S2kQNJJMXpXg39woeS4CI367RMU3/OAg==} - cpu: [x64] - os: [linux] - - '@turbo/linux-64@2.9.9': - resolution: {integrity: sha512-7JNLw88Isk+gMlbsC8pulLDkrqe2B827ZsKFEHilb17AC6Xn/62pzH7afjY7fEU6Ayp4XP/vGhlRWOzqBvBvIQ==} + '@turbo/linux-64@2.9.14': + resolution: {integrity: sha512-P3ZKB5tuUDdDQWuAsACGUR1qv9W7BNWxdxqVJ0kZNuNNPRaVYTPPikLcp79+GiEcW3npsR+KyP38lnQiBc5aSA==} cpu: [x64] os: [linux] - '@turbo/linux-arm64@2.9.8': - resolution: {integrity: sha512-v6S3HuKVoa9CEx16IxKj1i/+crxXx22A9O80zW1350zyUlcX0T/zLOxVf1k+ruK/7ssXnDJVg8uSYOxlYRedlA==} + '@turbo/linux-arm64@2.9.14': + resolution: {integrity: sha512-ZRTlzcUMrrPv9ZuDzRF9n60Ym13bKeG9jDB8WjxyLhWNzV+AJQN+zdpIk3NJYf2zQsGUm1mNar2P0elRzLw25g==} cpu: [arm64] os: [linux] - '@turbo/linux-arm64@2.9.9': - resolution: {integrity: sha512-0pnXDwPw1rHii98JZPRg7SvsjIzy7jrhkwGU9Jy5fVYoMdYd3P2vbtLfII+OJ0Mm4Ar5yykdHDTz3RWiRI1o9g==} - cpu: [arm64] - os: [linux] - - '@turbo/windows-64@2.9.8': - resolution: {integrity: sha512-JaefWOJNBazDylAn3f+lLB34XMNu8nEBbgPRP/Ewysg81cBubGfcyyyzpQOGVuMwfaqdNAE/kitG7w3AbJn9/g==} - cpu: [x64] - os: [win32] - - '@turbo/windows-64@2.9.9': - resolution: {integrity: sha512-vjDQycz4gQVvIq4n2rPtiiIESwJlAc406qtkiZlqyL+fHZEd9SxYNlBIFYtc5cuMuwrk+sIKrhN7XvwjmvS9YQ==} + '@turbo/windows-64@2.9.14': + resolution: {integrity: sha512-exanwN6sIduZwykYeiTQj8kCmOhazP5WOz3bvXMcYtjhL6Z3iRWLewKrXCBq0bqwSP3iBMb/AerRCnHI4lx46A==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.9.8': - resolution: {integrity: sha512-Or6ljjB4TiiwCdVKDYWew0SokQ9kep5zruL8P3nbum9WdkH5XA41rQID4Ulc215Z+R3DrB+qXSHPsJjU3/n2ng==} - cpu: [arm64] - os: [win32] - - '@turbo/windows-arm64@2.9.9': - resolution: {integrity: sha512-V6NiH43oCctepbOdQFp7UjqLyK8p6Tt824QA+G4TE+B1BBHu80A0W8OCL+H7uBJ3XZjAj/hvPDw3k3l65DoDGw==} + '@turbo/windows-arm64@2.9.14': + resolution: {integrity: sha512-fVdCsnmYoKICsycbWuuGp6Jvi51/3G/UluFWuAUCvR8PIW5IJkAk5BM9UF8PSm0Q2IphWHFZjYEgjHsh3B9y/g==} cpu: [arm64] os: [win32] @@ -3611,12 +3581,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo@2.9.8: - resolution: {integrity: sha512-REEB2rVTVDTf4hav1gJ5dIsGylWZrNonvjXFtk1dCi8gND3PhZtnYkyry1bra/Fo+iP6ctTEZbg6vWfdfHq/1A==} - hasBin: true - - turbo@2.9.9: - resolution: {integrity: sha512-3xfzXE/yTjhh0S5dIWlE+3E+J9A09REpLI1ZqVh2+HrNZoVzZn0pkvjiRgVK/Ev3PF9XnaTwCntTx+CADWXcyA==} + turbo@2.9.14: + resolution: {integrity: sha512-BQqXRr4UoWI3UPFrtznCLykYHxwxWh53iCB57x092jPMjIlW1wnm3N895g5irpiXmnxUhREBB0n6+y8BHhs4nw==} hasBin: true type-check@0.4.0: @@ -4607,16 +4573,10 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/darwin-64@2.9.8': - optional: true - - '@turbo/darwin-64@2.9.9': - optional: true - - '@turbo/darwin-arm64@2.9.8': + '@turbo/darwin-64@2.9.14': optional: true - '@turbo/darwin-arm64@2.9.9': + '@turbo/darwin-arm64@2.9.14': optional: true '@turbo/gen@1.13.4(@types/node@25.3.0)(typescript@6.0.3)': @@ -4639,28 +4599,16 @@ snapshots: - supports-color - typescript - '@turbo/linux-64@2.9.8': - optional: true - - '@turbo/linux-64@2.9.9': - optional: true - - '@turbo/linux-arm64@2.9.8': - optional: true - - '@turbo/linux-arm64@2.9.9': - optional: true - - '@turbo/windows-64@2.9.8': + '@turbo/linux-64@2.9.14': optional: true - '@turbo/windows-64@2.9.9': + '@turbo/linux-arm64@2.9.14': optional: true - '@turbo/windows-arm64@2.9.8': + '@turbo/windows-64@2.9.14': optional: true - '@turbo/windows-arm64@2.9.9': + '@turbo/windows-arm64@2.9.14': optional: true '@turbo/workspaces@1.13.4(@types/node@25.3.0)': @@ -5530,11 +5478,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.9.9): + eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.9.14): dependencies: dotenv: 16.0.3 eslint: 9.39.2 - turbo: 2.9.9 + turbo: 2.9.14 eslint-scope@8.4.0: dependencies: @@ -7206,23 +7154,14 @@ snapshots: tslib@2.8.1: {} - turbo@2.9.8: - optionalDependencies: - '@turbo/darwin-64': 2.9.8 - '@turbo/darwin-arm64': 2.9.8 - '@turbo/linux-64': 2.9.8 - '@turbo/linux-arm64': 2.9.8 - '@turbo/windows-64': 2.9.8 - '@turbo/windows-arm64': 2.9.8 - - turbo@2.9.9: + turbo@2.9.14: optionalDependencies: - '@turbo/darwin-64': 2.9.9 - '@turbo/darwin-arm64': 2.9.9 - '@turbo/linux-64': 2.9.9 - '@turbo/linux-arm64': 2.9.9 - '@turbo/windows-64': 2.9.9 - '@turbo/windows-arm64': 2.9.9 + '@turbo/darwin-64': 2.9.14 + '@turbo/darwin-arm64': 2.9.14 + '@turbo/linux-64': 2.9.14 + '@turbo/linux-arm64': 2.9.14 + '@turbo/windows-64': 2.9.14 + '@turbo/windows-arm64': 2.9.14 type-check@0.4.0: dependencies: From 33c639e84cc98317fcd50f41c57d06a95f5f34d6 Mon Sep 17 00:00:00 2001 From: Matt Rintoul Date: Tue, 23 Jun 2026 08:02:39 -0400 Subject: [PATCH 140/144] Expose add login signer redirect metadata (#1019) * Expose add login signer redirect metadata * Re-export CompleteRedirectWithMetadataArgs and CompleteRedirectMetadataResult from public index --- packages/wallet/wdk/src/sequence/index.ts | 2 + packages/wallet/wdk/src/sequence/wallets.ts | 56 ++++++++++- packages/wallet/wdk/test/wallets.test.ts | 103 ++++++++++++++++++++ 3 files changed, 159 insertions(+), 2 deletions(-) diff --git a/packages/wallet/wdk/src/sequence/index.ts b/packages/wallet/wdk/src/sequence/index.ts index d2afe15a3..b3081a2a9 100644 --- a/packages/wallet/wdk/src/sequence/index.ts +++ b/packages/wallet/wdk/src/sequence/index.ts @@ -15,6 +15,8 @@ export type { MnemonicSignupArgs, EmailOtpSignupArgs, CompleteRedirectArgs, + CompleteRedirectWithMetadataArgs, + CompleteRedirectMetadataResult, SignupArgs, AddLoginSignerArgs, RemoveLoginSignerArgs, diff --git a/packages/wallet/wdk/src/sequence/wallets.ts b/packages/wallet/wdk/src/sequence/wallets.ts index 5746f7a83..2d3af321b 100644 --- a/packages/wallet/wdk/src/sequence/wallets.ts +++ b/packages/wallet/wdk/src/sequence/wallets.ts @@ -101,6 +101,23 @@ export type IdTokenSignupArgs = CommonSignupArgs & { export type CompleteRedirectArgs = CommonSignupArgs & { state: string code: string + includeMetadata?: false +} + +export type CompleteRedirectWithMetadataArgs = Omit & { + includeMetadata: true +} + +export type CompleteRedirectMetadataResult = { + target: string + addedLoginSigner?: { + wallet: Address.Address + signer: { + address: Address.Address + kind: string + email?: string + } + } } export type AuthCodeSignupArgs = CommonSignupArgs & { @@ -278,6 +295,7 @@ export interface WalletsInterface { * @param args The arguments containing the `state` and `code` from the redirect, along with original sign-up options. * @returns A promise that resolves to target path that should be redirected to. */ + completeRedirect(args: CompleteRedirectWithMetadataArgs): Promise completeRedirect(args: CompleteRedirectArgs): Promise /** @@ -923,12 +941,18 @@ export class Wallets implements WalletsInterface { return handler.commitAuth(args.target, { type: 'add-signer', wallet: args.wallet }) } - async completeRedirect(args: CompleteRedirectArgs): Promise { + async completeRedirect(args: CompleteRedirectWithMetadataArgs): Promise + async completeRedirect(args: CompleteRedirectArgs): Promise + async completeRedirect( + args: CompleteRedirectArgs | CompleteRedirectWithMetadataArgs, + ): Promise { const commitment = await this.shared.databases.authCommitments.get(args.state) if (!commitment) { throw new Error('invalid-state') } + let addedLoginSigner: CompleteRedirectMetadataResult['addedLoginSigner'] + switch (commitment.type) { case 'add-signer': { const handlerKind = getSignupHandlerKey(commitment.kind) @@ -949,13 +973,31 @@ export class Wallets implements WalletsInterface { throw new Error('wallet-not-ready') } - const [signer] = await handler.completeAuth(commitment, args.code) + const [signer, metadata] = await handler.completeAuth(commitment, args.code) const signerKind = getSignerKindForSignup(commitment.kind) + const signerAddress = await signer.address await this.addLoginSignerFromPrepared(walletAddress, { signer, extra: { signerKind }, }) + + const addedSigner: { + address: Address.Address + kind: string + email?: string + } = { + address: signerAddress, + kind: signerKind, + } + if (metadata?.email !== undefined) { + addedSigner.email = metadata.email + } + + addedLoginSigner = { + wallet: walletAddress, + signer: addedSigner, + } break } @@ -991,6 +1033,16 @@ export class Wallets implements WalletsInterface { throw new Error('invalid-state') } + if (args.includeMetadata) { + const result: CompleteRedirectMetadataResult = { + target: commitment.target, + } + if (addedLoginSigner) { + result.addedLoginSigner = addedLoginSigner + } + return result + } + return commitment.target } diff --git a/packages/wallet/wdk/test/wallets.test.ts b/packages/wallet/wdk/test/wallets.test.ts index d686ac257..d2d1a6ee8 100644 --- a/packages/wallet/wdk/test/wallets.test.ts +++ b/packages/wallet/wdk/test/wallets.test.ts @@ -163,6 +163,109 @@ describe('Wallets', () => { expect(commitAuthSpy).toHaveBeenCalledWith('/auth/return', { type: 'auth' }) }) + it('Should expose added login signer metadata from redirect when requested', async () => { + manager = newManager({ + identity: { + google: { + enabled: true, + clientId: 'test-google-client-id', + }, + }, + }) + + const wallet = await manager.wallets.signUp({ + mnemonic: Mnemonic.random(Mnemonic.english), + kind: 'mnemonic', + noGuard: true, + }) + expect(wallet).toBeDefined() + + const handler = (manager as any).shared.handlers.get(Kinds.LoginGoogle) as AuthCodePkceHandler + const addedSigner = MnemonicHandler.toSigner(Mnemonic.random(Mnemonic.english)) + if (!addedSigner) { + throw new Error('Failed to create added login signer for test') + } + + const completeAuthSpy = vi + .spyOn(handler, 'completeAuth') + .mockResolvedValue([addedSigner as unknown as IdentitySigner, { email: 'secondary-google-user@example.com' }]) + + const state = 'add-signer-state-with-metadata' + await (manager as any).shared.databases.authCommitments.set({ + id: state, + kind: 'google-pkce', + metadata: {}, + target: '/account/signers', + type: 'add-signer', + wallet: wallet!, + }) + + const result = await manager.wallets.completeRedirect({ + state, + code: 'auth-code', + includeMetadata: true, + }) + + expect(completeAuthSpy).toHaveBeenCalledWith(expect.objectContaining({ id: state }), 'auth-code') + expect(result).toEqual({ + target: '/account/signers', + addedLoginSigner: { + wallet, + signer: { + address: await addedSigner.address, + kind: Kinds.LoginGoogle, + email: 'secondary-google-user@example.com', + }, + }, + }) + }) + + it('Should keep returning the redirect target string when metadata is not requested', async () => { + manager = newManager({ + identity: { + google: { + enabled: true, + clientId: 'test-google-client-id', + }, + }, + }) + + const wallet = await manager.wallets.signUp({ + mnemonic: Mnemonic.random(Mnemonic.english), + kind: 'mnemonic', + noGuard: true, + }) + expect(wallet).toBeDefined() + + const handler = (manager as any).shared.handlers.get(Kinds.LoginGoogle) as AuthCodePkceHandler + const addedSigner = MnemonicHandler.toSigner(Mnemonic.random(Mnemonic.english)) + if (!addedSigner) { + throw new Error('Failed to create added login signer for test') + } + + vi.spyOn(handler, 'completeAuth').mockResolvedValue([ + addedSigner as unknown as IdentitySigner, + { email: 'secondary-google-user@example.com' }, + ]) + + const state = 'add-signer-state-without-metadata' + await (manager as any).shared.databases.authCommitments.set({ + id: state, + kind: 'google-pkce', + metadata: {}, + target: '/account/signers', + type: 'add-signer', + wallet: wallet!, + }) + + const result = await manager.wallets.completeRedirect({ + state, + code: 'auth-code', + }) + + expect(result).toBe('/account/signers') + }) + it('Should reject google-id-token signup when Google is configured for redirect auth', async () => { manager = newManager({ identity: { From eaaca1f408786c3866d2c7db77d6f54c7b4e7a8a Mon Sep 17 00:00:00 2001 From: Taylan Pince Date: Tue, 23 Jun 2026 14:23:43 +0200 Subject: [PATCH 141/144] 3.0.12 --- 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 +- packages/services/identity-instrument/CHANGELOG.md | 6 ++++++ packages/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 +- 28 files changed, 115 insertions(+), 14 deletions(-) diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index abf1bac7a..12115dd1b 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/api +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/services/api/package.json b/packages/services/api/package.json index f17292579..ac1f75fcb 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/api", - "version": "3.0.11", + "version": "3.0.12", "description": "api sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api", "author": "Sequence Platforms ULC", diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md index 501288464..106229a8f 100644 --- a/packages/services/builder/CHANGELOG.md +++ b/packages/services/builder/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/builder +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json index 84cf23976..ee4ae02f8 100644 --- a/packages/services/builder/package.json +++ b/packages/services/builder/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/builder", - "version": "3.0.11", + "version": "3.0.12", "description": "builder sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder", "author": "Sequence Platforms ULC", diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index f9125f1be..31a84379e 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/guard +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json index e4c7c1f05..3c263d217 100644 --- a/packages/services/guard/package.json +++ b/packages/services/guard/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/guard", - "version": "3.0.11", + "version": "3.0.12", "description": "guard sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard", "author": "Sequence Platforms ULC", diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md index 7a3f20388..fc966ce94 100644 --- a/packages/services/identity-instrument/CHANGELOG.md +++ b/packages/services/identity-instrument/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/identity-instrument +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json index 2dffdd488..f6d9038b6 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.11", + "version": "3.0.12", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 34389ffed..c6a1e0d33 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/indexer +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json index f8b17dac8..9aa8ed4f4 100644 --- a/packages/services/indexer/package.json +++ b/packages/services/indexer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/indexer", - "version": "3.0.11", + "version": "3.0.12", "description": "indexer sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer", "author": "Sequence Platforms ULC", diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md index 56b3ea4a6..e7c04d933 100644 --- a/packages/services/marketplace/CHANGELOG.md +++ b/packages/services/marketplace/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/marketplace +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json index 23a7866f8..117539eca 100644 --- a/packages/services/marketplace/package.json +++ b/packages/services/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/marketplace", - "version": "3.0.11", + "version": "3.0.12", "description": "marketplace sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace", "author": "Sequence Platforms ULC", diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index 74d47b401..e2b877a57 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/metadata +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json index 234b7ea9c..d28f855fa 100644 --- a/packages/services/metadata/package.json +++ b/packages/services/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/metadata", - "version": "3.0.11", + "version": "3.0.12", "publishConfig": { "access": "public" }, diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index 951a31f26..321204d54 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -1,5 +1,13 @@ # @0xsequence/relayer +## 3.1.1 + +### Patch Changes + +- WDK fix +- Updated dependencies + - @0xsequence/wallet-primitives@3.0.12 + ## 3.1.0 ### Minor Changes diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json index 284ceae37..e1be3b5da 100644 --- a/packages/services/relayer/package.json +++ b/packages/services/relayer/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/relayer", - "version": "3.1.0", + "version": "3.1.1", "type": "module", "publishConfig": { "access": "public" diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md index ebf00e9eb..0d372c8e2 100644 --- a/packages/services/userdata/CHANGELOG.md +++ b/packages/services/userdata/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/userdata +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json index 0483c76a3..bdbb2d056 100644 --- a/packages/services/userdata/package.json +++ b/packages/services/userdata/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/userdata", - "version": "3.0.11", + "version": "3.0.12", "description": "userdata sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata", "author": "Sequence Platforms ULC", diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index fca1d35a4..dcdd1a635 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/abi +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json index 6b6023abd..9e9e8fb33 100644 --- a/packages/utils/abi/package.json +++ b/packages/utils/abi/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/abi", - "version": "3.0.11", + "version": "3.0.12", "description": "abi sub-package for Sequence", "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi", "author": "Sequence Platforms ULC", diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md index 8c79704d7..24e429424 100644 --- a/packages/wallet/core/CHANGELOG.md +++ b/packages/wallet/core/CHANGELOG.md @@ -1,5 +1,15 @@ # @0xsequence/wallet-core +## 3.0.12 + +### Patch Changes + +- WDK fix +- Updated dependencies + - @0xsequence/guard@3.0.12 + - @0xsequence/relayer@3.1.1 + - @0xsequence/wallet-primitives@3.0.12 + ## 3.0.11 ### Patch Changes diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json index 0c9ca7535..96c286e65 100644 --- a/packages/wallet/core/package.json +++ b/packages/wallet/core/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-core", - "version": "3.0.11", + "version": "3.0.12", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md index 03750f575..7087e36b9 100644 --- a/packages/wallet/dapp-client/CHANGELOG.md +++ b/packages/wallet/dapp-client/CHANGELOG.md @@ -1,5 +1,16 @@ # @0xsequence/dapp-client +## 3.1.1 + +### Patch Changes + +- WDK fix +- Updated dependencies + - @0xsequence/guard@3.0.12 + - @0xsequence/relayer@3.1.1 + - @0xsequence/wallet-core@3.0.12 + - @0xsequence/wallet-primitives@3.0.12 + ## 3.1.0 ### Minor Changes diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json index 6d42b0a89..59ecad054 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.1.0", + "version": "3.1.1", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md index c3ffa3d19..657ffa65c 100644 --- a/packages/wallet/primitives/CHANGELOG.md +++ b/packages/wallet/primitives/CHANGELOG.md @@ -1,5 +1,11 @@ # @0xsequence/wallet-primitives +## 3.0.12 + +### Patch Changes + +- WDK fix + ## 3.0.11 ### Patch Changes diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json index 4bd610f9e..14e64c1b5 100644 --- a/packages/wallet/primitives/package.json +++ b/packages/wallet/primitives/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-primitives", - "version": "3.0.11", + "version": "3.0.12", "license": "Apache-2.0", "type": "module", "publishConfig": { diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md index 891397004..6793c3f98 100644 --- a/packages/wallet/wdk/CHANGELOG.md +++ b/packages/wallet/wdk/CHANGELOG.md @@ -1,5 +1,17 @@ # @0xsequence/wallet-wdk +## 3.1.1 + +### Patch Changes + +- WDK fix +- Updated dependencies + - @0xsequence/guard@3.0.12 + - @0xsequence/identity-instrument@3.0.12 + - @0xsequence/relayer@3.1.1 + - @0xsequence/wallet-core@3.0.12 + - @0xsequence/wallet-primitives@3.0.12 + ## 3.1.0 ### Minor Changes diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json index 12e5d6dd8..875f24c81 100644 --- a/packages/wallet/wdk/package.json +++ b/packages/wallet/wdk/package.json @@ -1,6 +1,6 @@ { "name": "@0xsequence/wallet-wdk", - "version": "3.1.0", + "version": "3.1.1", "license": "Apache-2.0", "type": "module", "publishConfig": { From b0b09efabc43e941e736b38e2d3b904b277fba2e Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 29 Jun 2026 01:00:23 +0700 Subject: [PATCH 142/144] Update packages/wallet/dapp-client/src/DappClient.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- packages/wallet/dapp-client/src/DappClient.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/wallet/dapp-client/src/DappClient.ts b/packages/wallet/dapp-client/src/DappClient.ts index cc6bcba4d..12ec37466 100644 --- a/packages/wallet/dapp-client/src/DappClient.ts +++ b/packages/wallet/dapp-client/src/DappClient.ts @@ -146,6 +146,8 @@ export class DappClient { this.projectAccessKey = projectAccessKey this.nodesUrl = options?.nodesUrl || NODES_URL this.relayerUrl = options?.relayerUrl || RELAYER_URL + this.sequenceSessionStorage = sequenceSessionStorage + this.redirectActionHandler = redirectActionHandler this.origin = origin this.keymachineUrl = keymachineUrl this.sequenceStorage = sequenceStorage From 2c9bff82f0c90d61b060d478439d0b164e86b938 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 29 Jun 2026 01:01:32 +0700 Subject: [PATCH 143/144] 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, From 8bd4a61c5d6ff77193a88fd8e582182d05d40a61 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon, 29 Jun 2026 01:03:07 +0700 Subject: [PATCH 144/144] Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --- packages/wallet/dapp-client/src/DappTransport.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/wallet/dapp-client/src/DappTransport.ts b/packages/wallet/dapp-client/src/DappTransport.ts index 090b1070b..12770e4a4 100644 --- a/packages/wallet/dapp-client/src/DappTransport.ts +++ b/packages/wallet/dapp-client/src/DappTransport.ts @@ -15,22 +15,22 @@ import { 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') } + if (typeof btoa !== 'undefined') { + return btoa(unescape(encodeURIComponent(value))) + } 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') } + if (typeof atob !== 'undefined') { + return decodeURIComponent(escape(atob(value))) + } throw new Error('Base64 decoding is not supported in this environment.') }