diff --git a/packages/game-bridge/build.js b/packages/game-bridge/build.js new file mode 100644 index 0000000000..e94126f0be --- /dev/null +++ b/packages/game-bridge/build.js @@ -0,0 +1,77 @@ +const esbuild = require('esbuild'); +const fs = require('fs'); +const path = require('path'); + +async function build() { + // Clean dist folder + if (fs.existsSync('dist')) { + fs.rmSync('dist', { recursive: true }); + } + fs.mkdirSync('dist/unity', { recursive: true }); + fs.mkdirSync('dist/unreal', { recursive: true }); + + // Build Unity target (IIFE with inline HTML) + console.log('Building Unity target...'); + await esbuild.build({ + entryPoints: ['src/index.ts'], + bundle: true, + platform: 'browser', + target: 'chrome90', + format: 'iife', + globalName: 'ImmutableGameBridge', + outfile: 'dist/unity/bundle.js', + minify: true, + sourcemap: false, + keepNames: true, + define: { + 'process.env.NODE_ENV': '"production"' + }, + logLevel: 'info' + }); + + // Create HTML wrapper for Unity with inlined JS + let htmlTemplate = fs.readFileSync('src/index.html', 'utf-8'); + const bundleJs = fs.readFileSync('dist/unity/bundle.js', 'utf-8'); + + // Find and replace the script section - be explicit about what we're replacing + const scriptStart = htmlTemplate.indexOf(''.length; + + if (scriptStart === -1 || scriptEnd === -1) { + throw new Error('Could not find script tags in HTML template'); + } + + const beforeScript = htmlTemplate.substring(0, scriptStart); + const afterScript = htmlTemplate.substring(scriptEnd); + + const inlineHtml = beforeScript + `` + afterScript; + + fs.writeFileSync('dist/unity/index.html', inlineHtml); + fs.unlinkSync('dist/unity/bundle.js'); + + console.log(`Unity HTML created with ${(bundleJs.length / 1024 / 1024).toFixed(2)}MB of inlined JS`); + + // Build Unreal target (global format JS only) + console.log('Building Unreal target...'); + await esbuild.build({ + entryPoints: ['src/index.ts'], + bundle: true, + platform: 'browser', + target: 'chrome90', + format: 'iife', + globalName: 'ImmutableGameBridge', + outfile: 'dist/unreal/index.js', + minify: true, + sourcemap: false, + define: { + 'process.env.NODE_ENV': '"production"' + } + }); + + console.log('✨ Build complete!'); +} + +build().catch((err) => { + console.error('Build failed:', err); + process.exit(1); +}); diff --git a/packages/game-bridge/package.json b/packages/game-bridge/package.json index e689307734..1b9c5b5275 100644 --- a/packages/game-bridge/package.json +++ b/packages/game-bridge/package.json @@ -10,12 +10,15 @@ "ethers": "^6.13.4" }, "devDependencies": { + "esbuild": "^0.23.1", "eslint": "^8.40.0", + "html-inline": "^1.2.0", "parcel": "^2.8.3" }, "scripts": { - "build": "parcel build --no-cache --no-scope-hoist", - "build:local": "parcel build --no-cache --no-scope-hoist && pnpm updateSdkVersion", + "build": "node build.js", + "build:parcel": "parcel build --no-cache --no-scope-hoist", + "build:local": "node build.js && pnpm updateSdkVersion", "lint": "eslint ./src --ext .ts,.jsx,.tsx --max-warnings=0", "start": "parcel", "updateSdkVersion": "./scripts/updateSdkVersion.sh" diff --git a/packages/game-bridge/src/index.ts b/packages/game-bridge/src/index.ts index 415e27a5ab..353ae68517 100644 --- a/packages/game-bridge/src/index.ts +++ b/packages/game-bridge/src/index.ts @@ -1,4 +1,16 @@ /* eslint-disable no-console */ + +// Catch any errors during module initialization +window.addEventListener('error', (event) => { + console.error('Global error caught:', event.error || event.message); +}); + +window.addEventListener('unhandledrejection', (event) => { + console.error('Unhandled promise rejection:', event.reason); +}); + +console.log('game-bridge loading...'); + import * as passport from '@imtbl/passport'; import * as config from '@imtbl/config'; import * as provider from '@imtbl/x-provider'; @@ -14,12 +26,29 @@ import * as ethers from 'ethers'; // eslint-disable-next-line import/no-duplicates import { BrowserProvider, getAddress } from 'ethers'; +console.log('game-bridge imports loaded'); + // This patches a bundler issue where @0xsequence/core expects -// `ethers.getAddress` to exist on the `ethers` namespace, but Parcel -// fails to attach it in a global build. This ensures the function is +// `ethers.getAddress` to exist on the `ethers` namespace, but some bundlers +// fail to attach it in a global build. This ensures the function is // available before any Passport code executes. -if (typeof ethers === 'object' && !ethers.getAddress) { - (ethers as any).getAddress = getAddress; +try { + if (typeof ethers === 'object' && !ethers.getAddress) { + try { + Object.defineProperty(ethers, 'getAddress', { + value: getAddress, + writable: true, + configurable: true + }); + console.log('ethers.getAddress patched successfully'); + } catch (e) { + // If we can't define the property, create a new object with the patched value + (window as any).ethers = { ...ethers, getAddress }; + console.log('ethers.getAddress patched via window.ethers'); + } + } +} catch (error) { + console.error('Error during ethers patching:', error); } /* eslint-disable no-undef */ @@ -176,7 +205,7 @@ const getProvider = (): provider.IMXProvider => { return providerInstance; }; -const setZkEvmProvider = (zkEvmProvider: passport.Provider | null | undefined): boolean => { +const setEvmProvider = (zkEvmProvider: passport.Provider | null | undefined): boolean => { if (zkEvmProvider !== null && zkEvmProvider !== undefined) { zkEvmProviderInstance = zkEvmProvider; console.log('zkEvm provider set'); @@ -186,7 +215,7 @@ const setZkEvmProvider = (zkEvmProvider: passport.Provider | null | undefined): return false; }; -const getZkEvmProvider = (): passport.Provider => { +const getEvmProvider = (): passport.Provider => { if (zkEvmProviderInstance == null) { throw new Error('No zkEvm provider'); } @@ -263,10 +292,13 @@ window.callFunction = async (jsonData: string) => { }, }), zkEvmRpcUrl: 'https://rpc.dev.immutable.com', - relayerUrl: 'https://api.dev.immutable.com/relayer-mr', + relayerUrl: 'http://localhost:8073/relayer-mr', indexerMrBasePath: 'https://api.dev.immutable.com', orderBookMrBasePath: 'https://api.dev.immutable.com', - passportMrBasePath: 'https://api.dev.immutable.com', + passportMrBasePath: 'http://localhost:8072', + sequenceIdentityInstrumentEndpoint: 'https://next-identity.sequence-dev.app/', + sequenceProjectAccessKey: 'AQAAAAAAAAB5QznGqk9paa4EQjom09ERpJs', + sequenceGuardEndpoint: 'https://guard.sequence.app', }, }; } else { @@ -606,8 +638,11 @@ window.callFunction = async (jsonData: string) => { break; } case PASSPORT_FUNCTIONS.zkEvm.connectEvm: { - const zkEvmProvider = await getPassportClient().connectEvm(); - const providerSet = setZkEvmProvider(zkEvmProvider); + const request = JSON.parse(data); + console.log(`Connecting to EVM chain: ${request.chain}`); + + const zkEvmProvider = await getPassportClient().connectEvm({chain: request.chain}); + const providerSet = setEvmProvider(zkEvmProvider); if (!providerSet) { throw new Error('Failed to connect to EVM'); @@ -626,7 +661,7 @@ window.callFunction = async (jsonData: string) => { } case PASSPORT_FUNCTIONS.zkEvm.sendTransaction: { const transaction = JSON.parse(data); - const transactionHash = await getZkEvmProvider().request({ + const transactionHash = await getEvmProvider().request({ method: 'eth_sendTransaction', params: [transaction], }); @@ -652,7 +687,7 @@ window.callFunction = async (jsonData: string) => { } case PASSPORT_FUNCTIONS.zkEvm.sendTransactionWithConfirmation: { const transaction = JSON.parse(data); - const zkEvmProvider = getZkEvmProvider(); + const zkEvmProvider = getEvmProvider(); const browserProvider = new BrowserProvider(zkEvmProvider); const signer = await browserProvider.getSigner(); @@ -676,10 +711,10 @@ window.callFunction = async (jsonData: string) => { } case PASSPORT_FUNCTIONS.zkEvm.signTypedDataV4: { const payload = JSON.parse(data); - const [address] = await getZkEvmProvider().request({ + const [address] = await getEvmProvider().request({ method: 'eth_requestAccounts', }); - const signature = await getZkEvmProvider().request({ + const signature = await getEvmProvider().request({ method: 'eth_signTypedData_v4', params: [address, payload], }); @@ -703,7 +738,7 @@ window.callFunction = async (jsonData: string) => { break; } case PASSPORT_FUNCTIONS.zkEvm.requestAccounts: { - const result = await getZkEvmProvider().request({ + const result = await getEvmProvider().request({ method: 'eth_requestAccounts', }); const success = result !== null && result !== undefined; @@ -724,7 +759,7 @@ window.callFunction = async (jsonData: string) => { } case PASSPORT_FUNCTIONS.zkEvm.getBalance: { const request = JSON.parse(data); - const result = await getZkEvmProvider().request({ + const result = await getEvmProvider().request({ method: 'eth_getBalance', params: [request.address, request.blockNumberOrTag], }); @@ -746,7 +781,7 @@ window.callFunction = async (jsonData: string) => { } case PASSPORT_FUNCTIONS.zkEvm.getTransactionReceipt: { const request = JSON.parse(data); - const response = await getZkEvmProvider().request({ + const response = await getEvmProvider().request({ method: 'eth_getTransactionReceipt', params: [request.txHash], }); diff --git a/packages/internal/generated-clients/src/config/config.ts b/packages/internal/generated-clients/src/config/config.ts index b05dc269bd..20bab0cf07 100644 --- a/packages/internal/generated-clients/src/config/config.ts +++ b/packages/internal/generated-clients/src/config/config.ts @@ -6,7 +6,7 @@ import { } from '../imx'; // eslint-disable-next-line @typescript-eslint/naming-convention -const defaultHeaders = { 'x-sdk-version': 'ts-immutable-sdk-__SDK_VERSION__' }; +const defaultHeaders = { 'x-sdk-version': 'ts-immutable-sdk-1.0.0' }; /** * Configuration for generated clients @@ -78,7 +78,7 @@ export const multiRollupConfig = { basePath: 'https://api.sandbox.immutable.com', }), passport: createConfig({ - basePath: 'https://api.sandbox.immutable.com', + basePath: 'http://localhost:8072', }), }), }; diff --git a/packages/internal/generated-clients/src/mr-api-clients.ts b/packages/internal/generated-clients/src/mr-api-clients.ts index 36c8f2b181..07c38774d2 100644 --- a/packages/internal/generated-clients/src/mr-api-clients.ts +++ b/packages/internal/generated-clients/src/mr-api-clients.ts @@ -9,7 +9,7 @@ import { PassportProfileApi, GuardianApi, } from './multi-rollup'; -import { MultiRollupAPIConfiguration } from './config'; +import { createConfig, MultiRollupAPIConfiguration } from './config'; export class MultiRollupApiClients { public config: MultiRollupAPIConfiguration; @@ -42,6 +42,9 @@ export class MultiRollupApiClients { this.ordersApi = new OrdersApi(config.orderBook); this.passportApi = new PassportApi(config.passport); this.passportProfileApi = new PassportProfileApi(config.passport); - this.guardianApi = new GuardianApi(config.passport); + // this.guardianApi = new GuardianApi(config.passport); + this.guardianApi = new GuardianApi(createConfig({ + basePath: 'http://localhost:8074', + })); } } diff --git a/packages/internal/generated-clients/src/multi-rollup/models/transaction-approval-request.ts b/packages/internal/generated-clients/src/multi-rollup/models/transaction-approval-request.ts index 2effa8ccb3..3bc786f9d9 100644 --- a/packages/internal/generated-clients/src/multi-rollup/models/transaction-approval-request.ts +++ b/packages/internal/generated-clients/src/multi-rollup/models/transaction-approval-request.ts @@ -42,7 +42,8 @@ export interface TransactionApprovalRequest { export const TransactionApprovalRequestChainTypeEnum = { Starkex: 'starkex', - Evm: 'evm' + Evm: 'evm', + ArbitrumOne: 'arbitrum_one' } as const; export type TransactionApprovalRequestChainTypeEnum = typeof TransactionApprovalRequestChainTypeEnum[keyof typeof TransactionApprovalRequestChainTypeEnum]; diff --git a/packages/passport/sdk-sample-app/src/components/arbone/ArbOneRequest.tsx b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneRequest.tsx new file mode 100644 index 0000000000..411d98f8cd --- /dev/null +++ b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneRequest.tsx @@ -0,0 +1,181 @@ +import React, { useState } from 'react'; +import { + Form, Offcanvas, Spinner, Stack, +} from 'react-bootstrap'; +import { Heading } from '@biom3/react'; +import { ModalProps } from '@/types'; +import { useStatusProvider } from '@/context/StatusProvider'; +import { usePassportProvider } from '@/context/PassportProvider'; +import { RequestArguments } from '@imtbl/passport'; +import WorkflowButton from '@/components/WorkflowButton'; + +enum EthereumParamType { + string = 'string', + object = 'object', +} + +interface EthereumParam { + name: string; + type?: EthereumParamType; + default?: string; + placeholder?: string; +} + +interface EthereumMethod { + name: string; + params?: Array; +} + +// Simplified Ethereum methods for ArbOne - only the essential ones +const ArbOneEthereumMethods: EthereumMethod[] = [ + { name: 'eth_requestAccounts' }, + { + name: 'eth_getBalance', + params: [ + { name: 'address' }, + { name: 'blockNumber/tag', default: 'latest' }, + ], + }, + { + name: 'eth_sendTransaction', + params: [ + { + name: 'transaction', + type: EthereumParamType.object, + placeholder: '{ "to": "0x...", "value": "0x0", "data": "0x" }', + }, + ], + }, +]; + +function ArbOneRequest({ showModal, setShowModal }: ModalProps) { + const [selectedEthMethod, setSelectedEthMethod] = useState(ArbOneEthereumMethods[0]); + const [params, setParams] = useState([]); + const [loadingRequest, setLoadingRequest] = useState(false); + const [isInvalid, setInvalid] = useState(undefined); + + const { addMessage } = useStatusProvider(); + const { arbOneProvider } = usePassportProvider(); + + const resetForm = () => { + setParams([]); + setInvalid(false); + }; + + const handleClose = () => { + resetForm(); + setShowModal(false); + }; + + const performRequest = async (request: RequestArguments) => { + setInvalid(false); + setLoadingRequest(true); + try { + const result = await arbOneProvider?.request(request); + setLoadingRequest(false); + addMessage(request.method, result); + handleClose(); + } catch (err) { + addMessage('Request', err); + handleClose(); + } + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + e.stopPropagation(); + + const form = e.currentTarget; + if (form.checkValidity()) { + await performRequest({ + method: selectedEthMethod?.name || '', + params: params.map((param, i) => { + switch (selectedEthMethod.params![i].type) { + case EthereumParamType.object: { + return JSON.parse(param); + } + default: { + return param; + } + } + }), + }); + } else { + setInvalid(true); + } + }; + + const handleSetEthMethod = (e: React.ChangeEvent) => { + resetForm(); + const ethMethod = ArbOneEthereumMethods.find((method) => method.name === e.target.value); + if (!ethMethod) { + console.error('Invalid eth method'); + } else { + setSelectedEthMethod(ethMethod); + setParams(ethMethod.params ? ethMethod.params.map((param) => param.default || '') : []); + } + }; + + return ( + + + ArbOne Request + + + + + Ethereum Method + + { + ArbOneEthereumMethods.map((method) => ( + {method.name} + )) + } + + + + { + selectedEthMethod?.params?.map((param, index) => ( + + {param.name} + { + const newParams = [...params]; + newParams[index] = e.target.value; + setParams(newParams); + }} + placeholder={param.placeholder} + /> + + )) + } + + + + Submit + + { loadingRequest && } + + + + + ); +} + +export default ArbOneRequest; diff --git a/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx new file mode 100644 index 0000000000..4f0b5d1eaf --- /dev/null +++ b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx @@ -0,0 +1,78 @@ +import React, { + ChangeEvent, + useCallback, + useState, +} from 'react'; +import { Stack } from 'react-bootstrap'; +import { usePassportProvider } from '@/context/PassportProvider'; +import ArbOneRequest from '@/components/arbone/ArbOneRequest'; +import CardStack from '@/components/CardStack'; +import { useStatusProvider } from '@/context/StatusProvider'; +import WorkflowButton from '@/components/WorkflowButton'; +import { FormControl, Toggle } from '@biom3/react'; +import { ProviderEvent } from '@imtbl/passport'; + +function ArbOneWorkflow() { + const [showRequest, setShowRequest] = useState(false); + + const { isLoading, addMessage } = useStatusProvider(); + const { connectArbOne, arbOneProvider } = usePassportProvider(); + + const handleRequest = () => { + setShowRequest(true); + }; + + const arbOneEventHandler = useCallback((eventName: string) => (args: any[]) => { + addMessage(`Provider Event: ${eventName}`, args); + }, [addMessage]); + + const onHandleEventsChanged = useCallback((event: ChangeEvent) => { + if (event.target.checked) { + Object.values(ProviderEvent).forEach((eventName) => { + arbOneProvider?.on(eventName, arbOneEventHandler(eventName)); + }); + } else { + Object.values(ProviderEvent).forEach((eventName) => { + arbOneProvider?.removeListener(eventName, arbOneEventHandler(eventName)); + }); + } + }, [arbOneEventHandler, arbOneProvider]); + + return ( + + + {arbOneProvider && ( + <> + + request + + {showRequest + && ( + + )} + + + Log out events + + > + )} + {!arbOneProvider && ( + + Connect Arbitrum Sepolia + + )} + + + ); +} + +export default ArbOneWorkflow; diff --git a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx index 6e4a3099d4..92d661855f 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -136,10 +136,13 @@ const getPassportConfig = (environment: EnvironmentNames): PassportModuleConfigu })), immutableXClient: new IMXClient(getSdkConfig(EnvironmentNames.DEV)), zkEvmRpcUrl: 'https://rpc.dev.immutable.com', - relayerUrl: 'https://api.dev.immutable.com/relayer-mr', + relayerUrl: 'http://localhost:8073/relayer-mr', indexerMrBasePath: 'https://api.dev.immutable.com', orderBookMrBasePath: 'https://api.dev.immutable.com', - passportMrBasePath: 'https://api.dev.immutable.com', + passportMrBasePath: 'http://localhost:8072', + sequenceIdentityInstrumentEndpoint: 'https://next-identity.sequence-dev.app/', + sequenceProjectAccessKey: 'AQAAAAAAAAB5QznGqk9paa4EQjom09ERpJs', + sequenceGuardEndpoint: 'https://guard.sequence.app', }, ...sharedConfigurationValues, }; diff --git a/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx b/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx index afdc50cbb5..6bacfbbf01 100644 --- a/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx @@ -3,7 +3,7 @@ import React, { } from 'react'; import { IMXProvider } from '@imtbl/x-provider'; import { - LinkedWallet, LinkWalletParams, Provider, UserProfile, MarketingConsentStatus, + LinkedWallet, LinkWalletParams, Provider, UserProfile, MarketingConsentStatus, EvmChain, } from '@imtbl/passport'; import { useImmutableProvider } from '@/context/ImmutableProvider'; import { useStatusProvider } from '@/context/StatusProvider'; @@ -11,8 +11,10 @@ import { useStatusProvider } from '@/context/StatusProvider'; const PassportContext = createContext<{ imxProvider: IMXProvider | undefined; zkEvmProvider: Provider | undefined; + arbOneProvider: Provider | undefined; connectImx:() => void; connectZkEvm: () => void; + connectArbOne: () => void; logout: () => void; login: () => void; popupRedirect: () => void; @@ -30,8 +32,10 @@ const PassportContext = createContext<{ }>({ imxProvider: undefined, zkEvmProvider: undefined, + arbOneProvider: undefined, connectImx: () => undefined, connectZkEvm: () => undefined, + connectArbOne: () => undefined, logout: () => undefined, login: () => Promise.resolve(undefined), popupRedirect: () => Promise.resolve(undefined), @@ -53,6 +57,7 @@ export function PassportProvider({ }: { children: JSX.Element | JSX.Element[] }) { const [imxProvider, setImxProvider] = useState(); const [zkEvmProvider, setZkEvmProvider] = useState(); + const [arbOneProvider, setArbOneProvider] = useState(); const { addMessage, setIsLoading } = useStatusProvider(); const { passportClient } = useImmutableProvider(); @@ -86,6 +91,18 @@ export function PassportProvider({ setIsLoading(false); }, [passportClient, setIsLoading, addMessage]); + const connectArbOne = useCallback(async () => { + setIsLoading(true); + const provider = await passportClient.connectEvm({ chain: EvmChain.ARBITRUM_ONE }); + if (provider) { + setArbOneProvider(provider); + addMessage('ConnectArbOne', 'Connected'); + } else { + addMessage('ConnectArbOne', 'Failed to connect'); + } + setIsLoading(false); + }, [passportClient, setIsLoading, addMessage]); + const getIdToken = useCallback(async () => { setIsLoading(true); const idToken = await passportClient.getIdToken(); @@ -141,6 +158,7 @@ export function PassportProvider({ await passportClient.logout(); setImxProvider(undefined); setZkEvmProvider(undefined); + setArbOneProvider(undefined); } catch (err) { addMessage('Logout', err); console.error(err); @@ -291,8 +309,10 @@ export function PassportProvider({ const providerValues = useMemo(() => ({ imxProvider, zkEvmProvider, + arbOneProvider, connectImx, connectZkEvm, + connectArbOne, logout, popupRedirect, popupRedirectGoogle, @@ -310,8 +330,10 @@ export function PassportProvider({ }), [ imxProvider, zkEvmProvider, + arbOneProvider, connectImx, connectZkEvm, + connectArbOne, logout, popupRedirect, popupRedirectGoogle, @@ -339,8 +361,10 @@ export function usePassportProvider() { const { imxProvider, zkEvmProvider, + arbOneProvider, connectImx, connectZkEvm, + connectArbOne, logout, popupRedirect, popupRedirectGoogle, @@ -359,8 +383,10 @@ export function usePassportProvider() { return { imxProvider, zkEvmProvider, + arbOneProvider, connectImx, connectZkEvm, + connectArbOne, logout, popupRedirect, popupRedirectGoogle, diff --git a/packages/passport/sdk-sample-app/src/pages/index.tsx b/packages/passport/sdk-sample-app/src/pages/index.tsx index 29c089adab..2b171b9dc5 100644 --- a/packages/passport/sdk-sample-app/src/pages/index.tsx +++ b/packages/passport/sdk-sample-app/src/pages/index.tsx @@ -10,10 +10,11 @@ import { useStatusProvider } from '@/context/StatusProvider'; import { BASE_PATH } from '@/config'; import PassportMethods from '@/components/PassportMethods'; import ZkEvmWorkflow from '@/components/zkevm/ZkEvmWorkflow'; +import ArbOneWorkflow from '@/components/arbone/ArbOneWorkflow'; export default function Home() { const { isLoading } = useStatusProvider(); - const { imxProvider, zkEvmProvider } = usePassportProvider(); + const { imxProvider, zkEvmProvider, arbOneProvider } = usePassportProvider(); return ( <> @@ -26,7 +27,7 @@ export default function Home() { - + @@ -37,6 +38,9 @@ export default function Home() { + + + diff --git a/packages/passport/sdk/package.json b/packages/passport/sdk/package.json index 99ed34572a..6c427484cc 100644 --- a/packages/passport/sdk/package.json +++ b/packages/passport/sdk/package.json @@ -5,8 +5,15 @@ "author": "Immutable", "bugs": "https://github.com/immutable/ts-immutable-sdk/issues", "dependencies": { - "@0xsequence/abi": "^2.0.25", - "@0xsequence/core": "^2.0.25", + "@0xsequence/abi": "2.3.34", + "@0xsequence/core": "2.3.34", + "@0xsequence/identity-instrument": "3.0.0-beta.5", + "@0xsequence/network": "^2.3.35", + "@0xsequence/wallet-wdk": "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", + "@0xsequence/guard": "3.0.0-beta.5", "@imtbl/config": "workspace:*", "@imtbl/generated-clients": "workspace:*", "@imtbl/metrics": "workspace:*", @@ -23,6 +30,7 @@ "localforage": "^1.10.0", "magic-sdk": "^29.0.5", "oidc-client-ts": "3.3.0", + "ox": "^0.9.14", "uuid": "^8.3.2" }, "devDependencies": { diff --git a/packages/passport/sdk/src/Passport.int.test.ts b/packages/passport/sdk/src/Passport.int.test.ts index 4bd44d85ac..c4e6d7b137 100644 --- a/packages/passport/sdk/src/Passport.int.test.ts +++ b/packages/passport/sdk/src/Passport.int.test.ts @@ -195,6 +195,9 @@ describe('Passport', () => { orderBookMrBasePath: 'orderBookMrBasePath123', passportMrBasePath: 'passportMrBasePath123', immutableXClient, + sequenceIdentityInstrumentEndpoint: 'sequenceIdentityInstrumentEndpoint123', + sequenceProjectAccessKey: 'sequenceProjectAccessKey123', + sequenceGuardEndpoint: 'sequenceGuardEndpoint123', }; const { passportImxProviderFactory } = buildPrivateVars({ diff --git a/packages/passport/sdk/src/Passport.test.ts b/packages/passport/sdk/src/Passport.test.ts index f3faeed012..0cc70b2721 100644 --- a/packages/passport/sdk/src/Passport.test.ts +++ b/packages/passport/sdk/src/Passport.test.ts @@ -127,6 +127,9 @@ describe('Passport', () => { orderBookMrBasePath: 'orderBookMrBasePath123', passportMrBasePath: 'passportMrBasePath123', immutableXClient, + sequenceIdentityInstrumentEndpoint: 'sequenceIdentityInstrumentEndpoint123', + sequenceProjectAccessKey: 'sequenceProjectAccessKey123', + sequenceGuardEndpoint: 'sequenceGuardEndpoint123', }, ...oidcConfiguration, }); diff --git a/packages/passport/sdk/src/Passport.ts b/packages/passport/sdk/src/Passport.ts index 2859862830..072196f105 100644 --- a/packages/passport/sdk/src/Passport.ts +++ b/packages/passport/sdk/src/Passport.ts @@ -12,6 +12,7 @@ import { import { isAxiosError } from 'axios'; import AuthManager from './authManager'; import MagicTEESigner from './magic/magicTEESigner'; +// SequenceSigner imported dynamically to avoid SSR issues with wallet-wdk import { PassportImxProviderFactory } from './starkEx'; import { PassportConfiguration } from './config'; import { @@ -38,6 +39,8 @@ import logger from './utils/logger'; import { announceProvider, passportProviderInfo } from './zkEvm/provider/eip6963'; import { isAPIError, PassportError, PassportErrorType } from './errors/passportError'; import { withMetricsAsync } from './utils/metrics'; +import { EvmChain } from './types'; +import { SequenceProvider, SequenceSigner } from './sequence'; const buildImxClientConfig = (passportModuleConfiguration: PassportModuleConfiguration) => { if (passportModuleConfiguration.overrides) { @@ -68,6 +71,8 @@ export const buildPrivateVars = (passportModuleConfiguration: PassportModuleConf magicProviderId: config.magicProviderId, }); const magicTEESigner = new MagicTEESigner(authManager, magicTeeApiClients); + const sequenceSigner = new SequenceSigner(authManager, config); + const multiRollupApiClients = new MultiRollupApiClients(config.multiRollupConfig); const passportEventEmitter = new TypedEventEmitter(); @@ -80,6 +85,7 @@ export const buildPrivateVars = (passportModuleConfiguration: PassportModuleConf config, authManager, guardianApi: multiRollupApiClients.guardianApi, + multiRollupApiClients, }); const imxApiClients = buildImxApiClients(passportModuleConfiguration); @@ -97,6 +103,7 @@ export const buildPrivateVars = (passportModuleConfiguration: PassportModuleConf config, authManager, magicTEESigner, + sequenceSigner, confirmationScreen, embeddedLoginPrompt, immutableXClient, @@ -120,6 +127,8 @@ export class Passport { private readonly magicTEESigner: MagicTEESigner; + private sequenceSigner: SequenceSigner; + private readonly multiRollupApiClients: MultiRollupApiClients; private readonly passportImxProviderFactory: PassportImxProviderFactory; @@ -134,6 +143,7 @@ export class Passport { this.config = privateVars.config; this.authManager = privateVars.authManager; this.magicTEESigner = privateVars.magicTEESigner; + this.sequenceSigner = privateVars.sequenceSigner; this.confirmationScreen = privateVars.confirmationScreen; this.embeddedLoginPrompt = privateVars.embeddedLoginPrompt; this.immutableXClient = privateVars.immutableXClient; @@ -167,26 +177,44 @@ export class Passport { * Connects to EVM and optionally announces the provider. * @param {Object} options - Configuration options * @param {boolean} options.announceProvider - Whether to announce the provider via EIP-6963 for wallet discovery (defaults to true) + * @param {EvmChain} options.chain - The EVM chain to connect to (defaults to ZKEVM) * @returns {Promise} The EVM provider instance */ - public async connectEvm(options: ConnectEvmArguments = { announceProvider: true }): Promise { + public async connectEvm(options: ConnectEvmArguments = { announceProvider: true, chain: EvmChain.ZKEVM }): Promise { return withMetricsAsync(async () => { let user: User | null = null; try { user = await this.authManager.getUser(); } catch (error) { - // Initialise the zkEvmProvider without a user + // Initialise the provider without a user } - const provider = new ZkEvmProvider({ - passportEventEmitter: this.passportEventEmitter, - authManager: this.authManager, - config: this.config, - multiRollupApiClients: this.multiRollupApiClients, - guardianClient: this.guardianClient, - ethSigner: this.magicTEESigner, - user, - }); + const chain = options?.chain || EvmChain.ZKEVM; + + let provider: Provider; + + if (chain !== EvmChain.ZKEVM) { + provider = new SequenceProvider({ + passportEventEmitter: this.passportEventEmitter, + authManager: this.authManager, + config: this.config, + multiRollupApiClients: this.multiRollupApiClients, + guardianClient: this.guardianClient, + ethSigner: this.sequenceSigner, + user, + chain, + }); + } else { + provider = new ZkEvmProvider({ + passportEventEmitter: this.passportEventEmitter, + authManager: this.authManager, + config: this.config, + multiRollupApiClients: this.multiRollupApiClients, + guardianClient: this.guardianClient, + ethSigner: this.magicTEESigner, + user, + }); + } if (options?.announceProvider) { announceProvider({ diff --git a/packages/passport/sdk/src/authManager.ts b/packages/passport/sdk/src/authManager.ts index 640d2ab6a4..6379666b7f 100644 --- a/packages/passport/sdk/src/authManager.ts +++ b/packages/passport/sdk/src/authManager.ts @@ -26,6 +26,7 @@ import { isUserZkEvm, UserImx, isUserImx, + EvmChain, } from './types'; import { PassportConfiguration } from './config'; import ConfirmationOverlay from './overlay/confirmationOverlay'; @@ -159,6 +160,18 @@ export default class AuthManager { userAdminAddress: passport?.zkevm_user_admin_address, }; } + + const chains = Object.values(EvmChain).filter(chain => chain !== EvmChain.ZKEVM); + for (const chain of chains) { + const chainMetadata = passport?.[chain]; + if (chainMetadata?.eth_address && chainMetadata?.user_admin_address) { + user[chain] = { + ethAddress: chainMetadata.eth_address, + userAdminAddress: chainMetadata.user_admin_address, + }; + } + } + return user; }; @@ -642,7 +655,6 @@ export default class AuthManager { if (!user) { throw new Error('Failed to obtain a User with the required ZkEvm attributes'); } - return user; } diff --git a/packages/passport/sdk/src/config/config.test.ts b/packages/passport/sdk/src/config/config.test.ts index 4a9b048b49..d15c4951e5 100644 --- a/packages/passport/sdk/src/config/config.test.ts +++ b/packages/passport/sdk/src/config/config.test.ts @@ -31,6 +31,9 @@ describe('Config', () => { indexerMrBasePath: 'indexerMrBasePath123', orderBookMrBasePath: 'orderBookMrBasePath123', passportMrBasePath: 'passportMrBasePath123', + sequenceIdentityInstrumentEndpoint: 'sequenceIdentityInstrumentEndpoint123', + sequenceProjectAccessKey: 'sequenceProjectAccessKey123', + sequenceGuardEndpoint: 'sequenceGuardEndpoint123' }; const defaultHeaders = { 'x-sdk-version': 'ts-immutable-sdk-__SDK_VERSION__' }; diff --git a/packages/passport/sdk/src/config/config.ts b/packages/passport/sdk/src/config/config.ts index 3d1cdee7b2..e379a81a96 100644 --- a/packages/passport/sdk/src/config/config.ts +++ b/packages/passport/sdk/src/config/config.ts @@ -50,6 +50,12 @@ export class PassportConfiguration { readonly relayerUrl: string; + readonly sequenceProjectAccessKey: string; + + readonly sequenceIdentityInstrumentEndpoint: string; + + readonly sequenceGuardEndpoint: string; + readonly multiRollupConfig: MultiRollupAPIConfiguration; readonly crossSdkBridgeEnabled: boolean; @@ -104,6 +110,9 @@ export class PassportConfiguration { this.magicProviderId = overrides.magicProviderId; this.zkEvmRpcUrl = overrides.zkEvmRpcUrl; this.relayerUrl = overrides.relayerUrl; + this.sequenceIdentityInstrumentEndpoint = overrides.sequenceIdentityInstrumentEndpoint; + this.sequenceProjectAccessKey = overrides.sequenceProjectAccessKey; + this.sequenceGuardEndpoint = overrides.sequenceGuardEndpoint; this.multiRollupConfig = { indexer: createConfig({ basePath: overrides.indexerMrBasePath, @@ -125,6 +134,9 @@ export class PassportConfiguration { this.imxPublicApiDomain = 'https://api.immutable.com'; this.zkEvmRpcUrl = 'https://rpc.immutable.com'; this.relayerUrl = 'https://api.immutable.com/relayer-mr'; + this.sequenceIdentityInstrumentEndpoint = 'https://next-identity.sequence.app/'; + this.sequenceProjectAccessKey = 'AQAAAAAAAAB5QznGqk9paa4EQjom09ERpJs'; + this.sequenceGuardEndpoint = 'https://guard.sequence.app'; this.multiRollupConfig = multiRollupConfig.getProduction(); break; } @@ -136,7 +148,10 @@ export class PassportConfiguration { this.passportDomain = 'https://passport.sandbox.immutable.com'; this.imxPublicApiDomain = 'https://api.sandbox.immutable.com'; this.zkEvmRpcUrl = 'https://rpc.testnet.immutable.com'; - this.relayerUrl = 'https://api.sandbox.immutable.com/relayer-mr'; + this.relayerUrl = 'http://localhost:8073/relayer-mr'; + this.sequenceIdentityInstrumentEndpoint = 'https://next-identity.sequence-dev.app/'; + this.sequenceProjectAccessKey = 'AQAAAAAAAAB5QznGqk9paa4EQjom09ERpJs'; + this.sequenceGuardEndpoint = 'https://guard.sequence.app'; this.multiRollupConfig = multiRollupConfig.getSandbox(); break; } diff --git a/packages/passport/sdk/src/confirmation/confirmation.ts b/packages/passport/sdk/src/confirmation/confirmation.ts index f8069ca7cb..4c37d3a448 100644 --- a/packages/passport/sdk/src/confirmation/confirmation.ts +++ b/packages/passport/sdk/src/confirmation/confirmation.ts @@ -105,7 +105,7 @@ export default class ConfirmationScreen { if (chainType === GeneratedClients.mr.TransactionApprovalRequestChainTypeEnum.Starkex) { href = this.getHref('transaction', { transactionId, etherAddress, chainType }); } else { - href = this.getHref('zkevm/transaction', { + href = this.getHref(`${chainType.replace('_', '-')}/transaction`, { transactionID: transactionId, etherAddress, chainType, chainID: chainId, }); } @@ -228,6 +228,7 @@ export default class ConfirmationScreen { } showConfirmationScreen(href: string, messageHandler: MessageHandler, resolve: Function) { + console.log(`show confirmation screen for href: ${href}`); // If popup blocked, the confirmation window will not exist if (this.confirmationWindow) { this.confirmationWindow.location.href = href; @@ -235,6 +236,7 @@ export default class ConfirmationScreen { // This indicates the user closed the overlay so the transaction should be rejected if (!this.overlay) { + console.log('overlay is not defined'); this.overlayClosed = false; resolve({ confirmed: false }); return; @@ -243,6 +245,7 @@ export default class ConfirmationScreen { // https://stackoverflow.com/questions/9388380/capture-the-close-event-of-popup-window-in-javascript/48240128#48240128 const timerCallback = () => { if (this.confirmationWindow?.closed || this.overlayClosed) { + console.log('confirmation window closed or overlay closed'); clearInterval(this.timer); window.removeEventListener('message', messageHandler); resolve({ confirmed: false }); diff --git a/packages/passport/sdk/src/guardian/index.test.ts b/packages/passport/sdk/src/guardian/index.test.ts index f0aecd1168..478e3e7645 100644 --- a/packages/passport/sdk/src/guardian/index.test.ts +++ b/packages/passport/sdk/src/guardian/index.test.ts @@ -44,8 +44,21 @@ describe('Guardian', () => { authManager: { getUserImx: getUserImxMock, getUserZkEvm: getUserZkEvmMock, + getUser: jest.fn().mockResolvedValue(mockUserZkEvm), } as unknown as AuthManager, guardianApi: guardianApi as GeneratedClients.mr.GuardianApi, + multiRollupApiClients: { + chainsApi: { + listChains: jest.fn().mockResolvedValue({ + data: { + result: [ + { id: 'eip155:13473', name: 'imtbl-zkevm-testnet' }, + { id: 'eip155:421614', name: 'arbitrum-sepolia' }, + ], + }, + }), + }, + } as any, }); }; diff --git a/packages/passport/sdk/src/guardian/index.ts b/packages/passport/sdk/src/guardian/index.ts index d5fc6cebdf..38fdb3fa53 100644 --- a/packages/passport/sdk/src/guardian/index.ts +++ b/packages/passport/sdk/src/guardian/index.ts @@ -9,12 +9,15 @@ import { MetaTransaction, TypedDataPayload } from '../zkEvm/types'; import { PassportConfiguration } from '../config'; import { getEip155ChainId } from '../zkEvm/walletHelpers'; import { PassportError, PassportErrorType } from '../errors/passportError'; +import { RollupType } from '../types'; +import { getEvmChainFromChainId } from '../sequence/chainConfig'; export type GuardianClientParams = { confirmationScreen: ConfirmationScreen; config: PassportConfiguration; authManager: AuthManager; guardianApi: GeneratedClients.mr.GuardianApi; + multiRollupApiClients: GeneratedClients.MultiRollupApiClients; }; export type GuardianEvaluateImxTransactionParams = { @@ -41,6 +44,8 @@ type GuardianERC191MessageEvaluationParams = { const transactionRejectedCrossSdkBridgeError = 'Transaction requires confirmation but this functionality is not' + ' supported in this environment. Please contact Immutable support if you need to enable this feature.'; +const IMTBL_ZKEVM_CHAIN_PREFIX = 'imtbl-zkevm'; + export const convertBigNumberishToString = ( value: BigNumberish, ): string => BigInt(value).toString(); @@ -75,13 +80,80 @@ export default class GuardianClient { private readonly authManager: AuthManager; + private readonly multiRollupApiClients: GeneratedClients.MultiRollupApiClients; + + private chainIdToKeyCache: Map = new Map(); + constructor({ - confirmationScreen, config, authManager, guardianApi, + confirmationScreen, config, authManager, guardianApi, multiRollupApiClients, }: GuardianClientParams) { this.confirmationScreen = confirmationScreen; this.crossSdkBridgeEnabled = config.crossSdkBridgeEnabled; this.guardianApi = guardianApi; this.authManager = authManager; + this.multiRollupApiClients = multiRollupApiClients; + } + + /** + * Get chain key from EIP-155 chainId by querying listChains API + * Converts API format (dashes) to User object format (underscores) + */ + private async getChainKeyFromId(chainId: string): Promise { + // Check cache first + if (this.chainIdToKeyCache.has(chainId)) { + return this.chainIdToKeyCache.get(chainId)!; + } + + try { + const chainListResponse = await this.multiRollupApiClients.chainsApi.listChains(); + const chain = chainListResponse.data?.result?.find((c) => c.id === chainId); + + if (!chain?.name) { + // Fallback to zkEvm if chain not found + return RollupType.ZKEVM; + } + + // Convert API format (arbitrum-sepolia, imtbl-zkevm-testnet) to User key format (arbitrum_sepolia, zkEvm) + let chainKey: string; + if (chain.name.startsWith(IMTBL_ZKEVM_CHAIN_PREFIX)) { + chainKey = RollupType.ZKEVM; + } else { + chainKey = getEvmChainFromChainId(chainId); + } + + this.chainIdToKeyCache.set(chainId, chainKey); + return chainKey; + } catch (error) { + // Fallback to zkEvm on error + return RollupType.ZKEVM; + } + } + + /** + * Get user and extract eth address for the given EIP-155 chainId + */ + private async getUserForChain(chainId: string): Promise<{ user: any; ethAddress: string }> { + const user = await this.authManager.getUser(); + if (!user) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + 'User not logged in', + ); + } + + const chainKey = await this.getChainKeyFromId(chainId); + const ethAddress = (user as any)[chainKey]?.ethAddress; + // TODO remove, this is for local testing + // const ethAddress = '0x3fadd1f6f02408c0fad35e362e3d5c65e722b67a'; + + if (!ethAddress) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + `User not registered for chain ${chainId}`, + ); + } + + return { user, ethAddress }; } /** @@ -178,7 +250,7 @@ export default class GuardianClient { nonce, metaTransactions, }: GuardianEVMTxnEvaluationParams): Promise { - const user = await this.authManager.getUserZkEvm(); + const { user, ethAddress } = await this.getUserForChain(chainId); const headers = { Authorization: `Bearer ${user.accessToken}` }; const guardianTransactions = transformGuardianTransactions(metaTransactions); try { @@ -190,7 +262,7 @@ export default class GuardianClient { chainId, transactionData: { nonce, - userAddress: user.zkEvm.ethAddress, + userAddress: ethAddress, metaTransactions: guardianTransactions, }, }, @@ -225,6 +297,11 @@ export default class GuardianClient { }); const { confirmationRequired, transactionId } = transactionEvaluationResponse; + + console.log(`confirmationRequired ${confirmationRequired}`); + console.log(`transactionId ${transactionId}`); + console.log(`crossSdkBridgeEnabled ${this.crossSdkBridgeEnabled}`); + if (confirmationRequired && this.crossSdkBridgeEnabled) { throw new JsonRpcError( RpcErrorCode.TRANSACTION_REJECTED, @@ -233,14 +310,17 @@ export default class GuardianClient { } if (confirmationRequired && !!transactionId) { - const user = await this.authManager.getUserZkEvm(); + const { ethAddress } = await this.getUserForChain(chainId); + const chainType = getEvmChainFromChainId(chainId); const confirmationResult = await this.confirmationScreen.requestConfirmation( transactionId, - user.zkEvm.ethAddress, - GeneratedClients.mr.TransactionApprovalRequestChainTypeEnum.Evm, + ethAddress, + chainType as GeneratedClients.mr.TransactionApprovalRequestChainTypeEnum, chainId, ); + console.log(`confirmationResult 2: ${JSON.stringify(confirmationResult)}`); + if (!confirmationResult.confirmed) { throw new JsonRpcError( RpcErrorCode.TRANSACTION_REJECTED, @@ -258,13 +338,7 @@ export default class GuardianClient { { chainID, payload }: GuardianEIP712MessageEvaluationParams, ): Promise { try { - const user = await this.authManager.getUserZkEvm(); - if (user === null) { - throw new JsonRpcError( - ProviderErrorCode.UNAUTHORIZED, - 'User not logged in. Please log in first.', - ); - } + const { user } = await this.getUserForChain(chainID); const messageEvalResponse = await this.guardianApi.evaluateMessage( { messageEvaluationRequest: { chainID, payload } }, { headers: { Authorization: `Bearer ${user.accessToken}` } }, @@ -285,10 +359,10 @@ export default class GuardianClient { throw new JsonRpcError(RpcErrorCode.TRANSACTION_REJECTED, transactionRejectedCrossSdkBridgeError); } if (confirmationRequired && !!messageId) { - const user = await this.authManager.getUserZkEvm(); + const { ethAddress } = await this.getUserForChain(chainID); const confirmationResult = await this.confirmationScreen.requestMessageConfirmation( messageId, - user.zkEvm.ethAddress, + ethAddress, 'eip712', ); @@ -307,17 +381,12 @@ export default class GuardianClient { { chainID, payload }: GuardianERC191MessageEvaluationParams, ): Promise { try { - const user = await this.authManager.getUserZkEvm(); - if (user === null) { - throw new JsonRpcError( - ProviderErrorCode.UNAUTHORIZED, - 'User not logged in. Please log in first.', - ); - } + const eip155ChainId = getEip155ChainId(Number(chainID)); + const { user } = await this.getUserForChain(eip155ChainId); const messageEvalResponse = await this.guardianApi.evaluateErc191Message( { eRC191MessageEvaluationRequest: { - chainID: getEip155ChainId(Number(chainID)), + chainID: eip155ChainId, payload, }, }, @@ -339,10 +408,11 @@ export default class GuardianClient { throw new JsonRpcError(RpcErrorCode.TRANSACTION_REJECTED, transactionRejectedCrossSdkBridgeError); } if (confirmationRequired && !!messageId) { - const user = await this.authManager.getUserZkEvm(); + const eip155ChainId = getEip155ChainId(Number(chainID)); + const { ethAddress } = await this.getUserForChain(eip155ChainId); const confirmationResult = await this.confirmationScreen.requestMessageConfirmation( messageId, - user.zkEvm.ethAddress, + ethAddress, 'erc191', ); diff --git a/packages/passport/sdk/src/index.ts b/packages/passport/sdk/src/index.ts index ac8c9c24dd..55a40402ee 100644 --- a/packages/passport/sdk/src/index.ts +++ b/packages/passport/sdk/src/index.ts @@ -27,7 +27,15 @@ export type { DeviceTokenResponse, DirectLoginOptions, DirectLoginMethod, + User, + UserImx, + UserZkEvm, } from './types'; export { MarketingConsentStatus, + PassportEvents, + RollupType, + EvmChain, + isUserImx, + isUserZkEvm, } from './types'; diff --git a/packages/passport/sdk/src/sequence/chainConfig.ts b/packages/passport/sdk/src/sequence/chainConfig.ts new file mode 100644 index 0000000000..88575b8028 --- /dev/null +++ b/packages/passport/sdk/src/sequence/chainConfig.ts @@ -0,0 +1,53 @@ +import { EvmChain } from "../types"; +import { Environment } from "@imtbl/config"; + +export type ChainConfig = { + chainId: number; + relayerUrl: string; + nodeUrl: string; + rpcUrl: string; +}; + +const CHAIN_CONFIGS: Record, Record> = { + [EvmChain.ARBITRUM_ONE]: { + [Environment.PRODUCTION]: { + chainId: 42161, + relayerUrl: 'https://next-arbitrum-one-relayer.sequence.app', + nodeUrl: 'https://next-nodes.sequence.app/arbitrum-one', + rpcUrl: 'https://arb1.arbitrum.io/rpc', + }, + [Environment.SANDBOX]: { + chainId: 421614, + relayerUrl: 'https://next-arbitrum-sepolia-relayer.sequence.app', + nodeUrl: 'https://next-nodes.sequence.app/arbitrum-sepolia', + rpcUrl: 'https://sepolia-rollup.arbitrum.io/rpc', + } + }, +}; + +export function getChainConfig(chain: EvmChain, environment: Environment): ChainConfig { + if (chain === EvmChain.ZKEVM) { + throw new Error('ZKEVM does not use Sequence relayer'); + } + + const config = CHAIN_CONFIGS[chain as Exclude]; + if (!config) { + throw new Error(`Chain ${chain} is not supported`); + } + + return config[environment]; +} + +export function getEvmChainFromChainId(chainId: string): EvmChain { + const numericChainId = parseInt(chainId.includes(':') ? chainId.split(':')[1] : chainId, 10); + + for (const [evmChain, envConfigs] of Object.entries(CHAIN_CONFIGS)) { + for (const config of Object.values(envConfigs)) { + if (config.chainId === numericChainId) { + return evmChain as EvmChain; + } + } + } + + throw new Error(`Chain ${chainId} is not supported`); +} \ No newline at end of file diff --git a/packages/passport/sdk/src/sequence/index.ts b/packages/passport/sdk/src/sequence/index.ts new file mode 100644 index 0000000000..9155772d09 --- /dev/null +++ b/packages/passport/sdk/src/sequence/index.ts @@ -0,0 +1,8 @@ +export { default as SequenceSigner } from './sequenceSigner'; +export { SequenceProvider } from './sequenceProvider'; +export { SequenceRelayerClient } from './sequenceRelayerClient'; +export { sendTransaction } from './sendTransaction'; +export * from './types'; +export * from './transactionHelpers'; +export * from './walletHelpers'; + diff --git a/packages/passport/sdk/src/sequence/sendTransaction.ts b/packages/passport/sdk/src/sequence/sendTransaction.ts new file mode 100644 index 0000000000..c90d447f84 --- /dev/null +++ b/packages/passport/sdk/src/sequence/sendTransaction.ts @@ -0,0 +1,38 @@ +import { prepareAndSignTransaction, TransactionParams } from './transactionHelpers'; +import { EvmChain } from '../types'; +import { Environment } from '@imtbl/config'; + +type EthSendTransactionParams = TransactionParams & { + params: Array; + chain: EvmChain; + environment: Environment; +}; + +export const sendTransaction = async ({ + params, + sequenceSigner, + oxRpcProvider, + relayerClient, + guardianClient, + walletAddress, + flow, + authManager, + chain, + environment, +}: EthSendTransactionParams): Promise => { + const transactionRequest = params[0]; + + const { to, data } = await prepareAndSignTransaction({ + transactionRequest, + sequenceSigner, + oxRpcProvider, + relayerClient, + guardianClient, + walletAddress, + flow, + authManager, + }); + + const txHash = await relayerClient.postToRelayer(chain, environment, to, data, flow); + return txHash; +}; diff --git a/packages/passport/sdk/src/sequence/sequenceProvider.ts b/packages/passport/sdk/src/sequence/sequenceProvider.ts new file mode 100644 index 0000000000..0c6ae44d7a --- /dev/null +++ b/packages/passport/sdk/src/sequence/sequenceProvider.ts @@ -0,0 +1,503 @@ +import { Provider as OxProvider, RpcTransport } from 'ox'; +import { + Provider, + ProviderEvent, + ProviderEventMap, + RequestArguments, +} from './types'; +import AuthManager from '../authManager'; +import TypedEventEmitter from '../utils/typedEventEmitter'; +import { PassportConfiguration } from '../config'; +import { + PassportEventMap, + PassportEvents, + User, + EvmChain, + IdTokenPayload, +} from '../types'; +import { SequenceRelayerClient } from './sequenceRelayerClient'; +import { JsonRpcError, ProviderErrorCode, RpcErrorCode } from '../zkEvm/JsonRpcError'; +import { identify, trackError, trackFlow } from '@imtbl/metrics'; +import { sendTransaction } from './sendTransaction'; +import { registerUser } from './user'; +import { MultiRollupApiClients } from '@imtbl/generated-clients'; +import { SequenceSigner } from './index'; +import { getChainConfig } from './chainConfig'; +import GuardianClient from '../guardian'; +import { JsonRpcProvider } from 'ethers'; +import { PassportError, PassportErrorType } from '../errors/passportError'; +import jwt_decode from 'jwt-decode'; + +export type SequenceProviderInput = { + authManager: AuthManager; + config: PassportConfiguration; + multiRollupApiClients: MultiRollupApiClients; + passportEventEmitter: TypedEventEmitter; + guardianClient: GuardianClient; + ethSigner: SequenceSigner; + user: User | null; + chain: Exclude; +}; + +type WithRequired = T & { [P in K]-?: T[P] }; +type UserWithChain> = WithRequired; + +const isUserRegisteredForChain = >( + user: User, + chain: C +): user is UserWithChain => { + return chain in user; +}; + +export class SequenceProvider implements Provider { + readonly #authManager: AuthManager; + + readonly #config: PassportConfiguration; + + readonly #providerEventEmitter: TypedEventEmitter; + + readonly #passportEventEmitter: TypedEventEmitter; + + readonly #guardianClient: GuardianClient; + + readonly #rpcProvider: JsonRpcProvider; + + readonly #oxRpcProvider: OxProvider.Provider; + + readonly #multiRollupApiClients: MultiRollupApiClients; + + readonly #relayerClient: SequenceRelayerClient; + + readonly #ethSigner: SequenceSigner; + + readonly #chain: Exclude; + + public readonly isPassport: boolean = true; + + // TODO: for demo purposes only as we're using local database + userWalletAddress: string | undefined = undefined; + + walletPopup: Window | null = null; + // walletAddress: string | null = null; + walletOrigin = 'http://localhost:5173'; + + constructor({ + authManager, + config, + multiRollupApiClients, + passportEventEmitter, + guardianClient, + ethSigner, + user, + chain, + }: SequenceProviderInput) { + this.#authManager = authManager; + this.#config = config; + this.#guardianClient = guardianClient; + this.#passportEventEmitter = passportEventEmitter; + this.#ethSigner = ethSigner; + this.#chain = chain; + + const chainConfig = getChainConfig(chain, config.baseConfig.environment); + this.#rpcProvider = new JsonRpcProvider(chainConfig.rpcUrl, undefined, { + staticNetwork: true, + }); + this.#oxRpcProvider = OxProvider.from(RpcTransport.fromHttp(chainConfig.nodeUrl)); + + this.#relayerClient = new SequenceRelayerClient({ config: this.#config }); + + this.#multiRollupApiClients = multiRollupApiClients; + this.#providerEventEmitter = new TypedEventEmitter(); + + passportEventEmitter.on(PassportEvents.LOGGED_OUT, this.#handleLogout); + } + + #handleLogout = () => { + this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, []); + }; + + async #getWalletAddress() { + try { + const user = await this.#authManager.getUser(); + if (user && isUserRegisteredForChain(user, this.#chain)) { + return user[this.#chain].ethAddress; + } + return undefined; + } catch { + return undefined; + } + } + + async #performRequest(request: RequestArguments): Promise { + switch (request.method) { + case 'eth_requestAccounts': { + console.log(`sequence eth_requestAccounts`); + const signerAddress = await this.#ethSigner.getAddress(); + console.log(`sequence signerAddress = ${signerAddress}`); + + const walletAddress = await this.#getWalletAddress(); + console.log(`eth_requestAccounts 1 walletAddress = ${walletAddress}`); + this.userWalletAddress = walletAddress; + if (walletAddress) return [walletAddress]; + + const flow = trackFlow('passport', `ethRequestAccounts_${this.#chain}`); + + try { + const user = await this.#authManager.getUserOrLogin(); + flow.addEvent('endGetUserOrLogin'); + + let userEthAddress: string | undefined; + + if (!isUserRegisteredForChain(user, this.#chain)) { + flow.addEvent('startUserRegistration'); + + const address = await this.#ethSigner.getAddress(); + userEthAddress = address; + + userEthAddress = await registerUser({ + ethSigner: this.#ethSigner, + authManager: this.#authManager, + multiRollupApiClients: this.#multiRollupApiClients, + accessToken: user.accessToken, + rpcProvider: this.#rpcProvider, + flow, + }); + + this.userWalletAddress = userEthAddress; + + flow.addEvent('endUserRegistration'); + } else { + userEthAddress = user[this.#chain].ethAddress; + + this.userWalletAddress = userEthAddress; + } + + if (userEthAddress) { + this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, [ + userEthAddress, + ]); + } + + identify({ + passportId: user.profile.sub, + }); + + return [userEthAddress]; + } catch (error) { + console.log(`sequence eth_requestAccounts error: ${error}`, (error as Error)?.stack); + if (error instanceof Error) { + trackError('passport', `ethRequestAccounts_${this.#chain}`, error, { flowId: flow.details.flowId }); + } else { + flow.addEvent('errored'); + } + throw error; + } finally { + flow.addEvent('End'); + } + } + + case 'eth_sendTransaction': { + console.log(`sequence eth_sendTransaction ${this.userWalletAddress}`); + const walletAddress = '0xc07a2904e04d9184cd3839dea00e32179bad47d7';//'0x3fadd1f6f02408c0fad35e362e3d5c65e722b67a'//'0x3fadd1f6f02408c0fad35e362e3d5c65e722b67a';//this.userWalletAddress; + // const walletAddress = this.userWalletAddress; + // const walletAddress = await this.#getWalletAddress(); + + if (!walletAddress) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + `Unauthorised - call eth_requestAccounts first`, + ); + } + + const flow = trackFlow('passport', `ethSendTransaction_${this.#chain}`); + + try { + // return await sendTransaction({ + // params: request.params || [], + // sequenceSigner: this.#ethSigner, + // oxRpcProvider: this.#oxRpcProvider, + // relayerClient: this.#relayerClient, + // guardianClient: this.#guardianClient, + // walletAddress, + // flow, + // authManager: this.#authManager, + // chain: this.#chain, + // }); + + /*const params = request.params || []; + const transactionRequest = params[0]; + const { to, value, data } = transactionRequest; + console.log(`to = ${to}`) + console.log(`value = ${value}`) + console.log(`data = ${data}`) + + await this.#authManager.forceUserRefresh(); // TODO shouldn't have to refresh all the time + + const authenticatedUser = await this.#authManager.getUser(); + + if (!authenticatedUser?.idToken) { + throw new PassportError( + 'User idToken not available', + PassportErrorType.NOT_LOGGED_IN_ERROR, + ); + } + + const idToken = authenticatedUser.idToken; + const decoded = jwt_decode(idToken); + const issuer = decoded.iss; + const audience = decoded.aud; + + try { + const wallet = await this.authenticateAndSendTransaction(idToken, issuer, audience, + { + to: to, + value: `${value}`, + data: `${data}`, + chainId: 421614, + } + ) + console.log(`wallet from pop up = ${wallet}`) + console.log('Authenticated! Wallet:', wallet) + } catch (err) { + console.error('Auth failed:', err) + return + }*/ + + return await this.#guardianClient.withConfirmationScreen({ + width: 480, + height: 720, + })(async () => await sendTransaction({ + params: request.params || [], + sequenceSigner: this.#ethSigner, + oxRpcProvider: this.#oxRpcProvider, + relayerClient: this.#relayerClient, + guardianClient: this.#guardianClient, + walletAddress, + flow, + authManager: this.#authManager, + chain: this.#chain, + environment: this.#config.baseConfig.environment, + })); + } catch (error) { + if (error instanceof Error) { + trackError('passport', `ethSendTransaction_${this.#chain}`, error, { flowId: flow.details.flowId }); + } else { + flow.addEvent('errored'); + } + throw error; + } finally { + flow.addEvent('End'); + } + } + + // Pass through methods + case 'eth_getBalance': + case 'eth_getCode': + case 'eth_getTransactionCount': { + const [address, blockNumber] = request.params || []; + return this.#rpcProvider.send(request.method, [ + address, + blockNumber || 'latest', + ]); + } + case 'eth_getStorageAt': { + const [address, storageSlot, blockNumber] = request.params || []; + return this.#rpcProvider.send(request.method, [ + address, + storageSlot, + blockNumber || 'latest', + ]); + } + case 'eth_call': + case 'eth_estimateGas': { + const [transaction, blockNumber] = request.params || []; + return this.#rpcProvider.send(request.method, [ + transaction, + blockNumber || 'latest', + ]); + } + case 'eth_gasPrice': + case 'eth_blockNumber': + case 'eth_getBlockByHash': + case 'eth_getBlockByNumber': + case 'eth_getTransactionByHash': + case 'eth_getTransactionReceipt': { + return this.#rpcProvider.send(request.method, request.params || []); + } + + default: { + throw new JsonRpcError( + ProviderErrorCode.UNSUPPORTED_METHOD, + 'Method not supported', + ); + } + } + } + + public async request(request: RequestArguments): Promise { + try { + return await this.#performRequest(request); + } catch (error: unknown) { + if (error instanceof JsonRpcError) { + throw error; + } + if (error instanceof Error) { + throw new JsonRpcError(RpcErrorCode.INTERNAL_ERROR, error.message); + } + + throw new JsonRpcError(RpcErrorCode.INTERNAL_ERROR, 'Internal error'); + } + } + + public on(event: string, listener: (...args: any[]) => void): void { + this.#providerEventEmitter.on(event, listener); + } + + public removeListener( + event: string, + listener: (...args: any[]) => void, + ): void { + this.#providerEventEmitter.removeListener(event, listener); + } + + async authenticateAndSendTransaction(idToken: string, issuer: string, audience: string, tx: any) { + return new Promise((resolve, reject) => { + const sessionId = crypto.randomUUID() + const requestId = crypto.randomUUID() + const stateConfigRequestId = crypto.randomUUID() + let authCompleted = false // Track auth state + let stateConfigSet = false + + const popup = window.open( + `${this.walletOrigin}/auth/idtoken?origin=${window.location.origin}`, + 'wallet', + 'popup,width=400,height=600' + ) + + const handleMessage = (event: MessageEvent) => { + if (event.origin !== this.walletOrigin) return + console.log('[SDK] Received:', event.data) + + // Step 1: Auth ready + if (event.data.type === 'IDTOKEN_AUTH_READY') { + popup?.postMessage({ + type: 'IDTOKEN_AUTH', + idToken, + issuer, + audience, + redirect: 'none', + customStateConfig: { + walletAddress: '0xce86c5be4c5ff2c2530c626f7aa81604b7618717', + deploymentSalt: '0xc97a40f09209c878837cf2742fa66685fabc3a9d436e8759142e2a0f8259aec9', // <-- Your deployment salt + realImageHash: '0x70be4a1f980f96997dff0583567db5e51e8ab68e5473405316ce1def5ee83b36', + } + }, this.walletOrigin) + } + + // Step 2: Auth complete - now navigate popup to wallet root for tx + if (event.data.type === 'IDTOKEN_AUTH_RESULT' && event.data.success) { + this.userWalletAddress = event.data.wallet + authCompleted = true // Mark auth as done + console.log('[SDK] Auth complete, navigating to transaction route') + + // Navigate the popup to wallet root (which will send WALLET_OPENED) + // Wait 3 seconds for all signing to complete before navigating + setTimeout(() => { + console.log('[SDK] Navigating to transaction route') + if (popup) { + popup.location.href = `${this.walletOrigin}/request/transaction?sessionId=${sessionId}` + } + }, 3000) + } + + // Step 3: Wallet opened - send tx request + if (event.data.type === 'WALLET_OPENED' && authCompleted) { + popup?.postMessage({ + id: crypto.randomUUID(), + type: 'INIT', + sessionId, + }, this.walletOrigin) + + // popup?.postMessage({ + // id: requestId, + // type: 'REQUEST', + // sessionId, + // action: 'signMessage', // Changed from 'sendWalletTransaction' + // payload: { + // address: this.userWalletAddress, + // chainId: tx.chainId, // Optional for signing + // message: 'Hellooooo, sign this message', // Hex-encoded message to sign + // } + // }, this.walletOrigin) + + popup?.postMessage({ + id: requestId, + type: 'REQUEST', + sessionId, + action: 'sendWalletTransaction', + payload: { + address: this.userWalletAddress, + chainId: tx.chainId, + transactionRequest: { + to: "0x35beC1b2E8a30aF9bfd138555a633245519b607C", + value: '0', + data: "0x1e957f1e", + } + } + }, this.walletOrigin) + } + + // Step 4: Transaction response + // TODO handle confirmation here <<<<< + // Step 4: Transaction CONFIRMED (not signed/sent yet) + // if (event.data.type === 'RESPONSE' && event.data.id === requestId) { + // window.removeEventListener('message', handleMessage) + // popup?.close() + + // if (event.data.error) { + // reject(new Error(event.data.error.message || event.data.error)) + // return + // } + + // const payload = event.data.payload + + // // Check if this is a confirmation-only response + // if (payload?.confirmed === true) { + // console.log('[SDK] Transaction CONFIRMED by user:', payload) + + // // Now YOU sign and send the transaction on your side + // // payload contains: { confirmed, walletAddress, chainId, transaction: { to, value, data } } + // resolve({ + // confirmed: true, + // walletAddress: payload.walletAddress, + // chainId: payload.chainId, + // transaction: payload.transaction, + // }) + + // // TODO: Your code to sign and send: + // // const txHash = await yourWdk.signAndSend(payload.transaction) + // console.log(`payload = ${JSON.stringify(payload.transaction)}`) + + // } else if (payload?.transactionHash) { + // // Legacy: full sign+relay flow (if you ever re-enable it) + // resolve({ txHash: payload.transactionHash }) + // } else { + // reject(new Error('Unknown response format')) + // } + // } + if (event.data.type === 'RESPONSE' && event.data.id === requestId) { + window.removeEventListener('message', handleMessage) + popup?.close() + if (event.data.error) { + reject(new Error(event.data.error.message)) + } else { + resolve({ txHash: event.data.payload?.txHash }) + } + } + } + + window.addEventListener('message', handleMessage) + }) + } +} + diff --git a/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts b/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts new file mode 100644 index 0000000000..12b36b7199 --- /dev/null +++ b/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts @@ -0,0 +1,77 @@ +import { PassportConfiguration } from '../config'; +import { Relayer } from '@0xsequence/relayer'; +import { Address, Hex } from 'ox'; +import { JsonRpcError, RpcErrorCode } from '../zkEvm/JsonRpcError'; +import { EvmChain } from '../types'; +import { getChainConfig, ChainConfig } from './chainConfig'; +import { Flow } from '@imtbl/metrics'; +import { Environment } from '@imtbl/config'; + +export type RelayerClientInput = { + config: PassportConfiguration, +}; + +export class SequenceRelayerClient { + private readonly config: PassportConfiguration; + private readonly relayers: Map = new Map(); + + constructor({ config }: RelayerClientInput) { + this.config = config; + } + + private getRelayer(chain: EvmChain, chainConfig: ChainConfig): Relayer.RpcRelayer { + let relayer = this.relayers.get(chain); + + if (!relayer) { + relayer = new Relayer.RpcRelayer( + chainConfig.relayerUrl, + chainConfig.chainId, + chainConfig.nodeUrl, + fetch, + this.config.sequenceProjectAccessKey, + ); + + this.relayers.set(chain, relayer); + } + + return relayer; + } + + async postToRelayer( + chain: EvmChain, + environment: Environment, + to: Address.Address, + data: Hex.Hex, + flow: Flow, + ): Promise { + flow.addEvent('startSubmitToRelayer'); + + const chainConfig = getChainConfig(chain, environment); + + const relayer = this.getRelayer(chain, chainConfig); + console.log(`postToRelayer relayer ${JSON.stringify(relayer)}`); + const { opHash } = await relayer.relay(to, data, chainConfig.chainId); + console.log(`postToRelayer opHash ${opHash}`); + + const wait = (ms: number) => new Promise((res) => setTimeout(res, ms)); + + let transactionHash: string; + while (true) { + const status = await relayer.status(opHash, chainConfig.chainId); + console.log(`postToRelayer status ${JSON.stringify(status)}`); + if (status.status === "confirmed") { + transactionHash = `${status.transactionHash}`; + flow.addEvent('endSubmitToRelayer'); + break; + } else if (status.status === "failed") { + let errorMessage = `Transaction failed to submit with status ${status.reason}.`; + throw new JsonRpcError(RpcErrorCode.RPC_SERVER_ERROR, errorMessage); + } + process.stdout.write("."); + await wait(1500); + } + + return transactionHash; + } +} + diff --git a/packages/passport/sdk/src/sequence/sequenceSigner.ts b/packages/passport/sdk/src/sequence/sequenceSigner.ts new file mode 100644 index 0000000000..3885fd78d7 --- /dev/null +++ b/packages/passport/sdk/src/sequence/sequenceSigner.ts @@ -0,0 +1,42 @@ +import AuthManager from '../authManager'; +import { PassportConfiguration } from '../config'; +import { Wallet } from "@0xsequence/wallet-core"; +import { + Config, + Payload, + Signature as SequenceSignature, +} from "@0xsequence/wallet-primitives"; +import { ISigner } from './signer/ISigner'; +import { IdentityInstrumentSigner } from './signer/identityInstrumentSigner'; +import { PrivateKeySigner } from './signer/privateKeySigner'; +import { Address } from 'ox'; + +export default class SequenceSigner implements ISigner { + private readonly identityInstrumentSigner: IdentityInstrumentSigner; + private readonly privateKeySigner: PrivateKeySigner; + private readonly useIdentityInstrument: boolean; + + constructor(authManager: AuthManager, config: PassportConfiguration) { + this.identityInstrumentSigner = new IdentityInstrumentSigner(authManager, config); + this.privateKeySigner = new PrivateKeySigner(authManager); + this.useIdentityInstrument = config.authenticationDomain !== 'https://auth.dev.immutable.com'; + } + + async getAddress(): Promise { + return this.useIdentityInstrument + ? this.identityInstrumentSigner.getAddress() + : this.privateKeySigner.getAddress(); + } + + async signPayload(walletAddress: Address.Address, chainId: number, payload: Payload.Parented): Promise { + return this.useIdentityInstrument + ? this.identityInstrumentSigner.signPayload(walletAddress, chainId, payload) + : this.privateKeySigner.signPayload(walletAddress, chainId, payload); + } + + async signMessage(message: string | Uint8Array): Promise { + return this.useIdentityInstrument + ? this.identityInstrumentSigner.signMessage(message) + : this.privateKeySigner.signMessage(message); + } +} diff --git a/packages/passport/sdk/src/sequence/signer/ISigner.ts b/packages/passport/sdk/src/sequence/signer/ISigner.ts new file mode 100644 index 0000000000..ddcd4bb9f6 --- /dev/null +++ b/packages/passport/sdk/src/sequence/signer/ISigner.ts @@ -0,0 +1,9 @@ +import { Config, Payload, Signature as SequenceSignature } from '@0xsequence/wallet-primitives'; +import { Address } from 'ox'; + +export interface ISigner { + getAddress(): Promise; + signPayload(walletAddress: Address.Address, chainId: number, payload: Payload.Parented): Promise; + signMessage(message: string | Uint8Array): Promise; +} + diff --git a/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts b/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts new file mode 100644 index 0000000000..dde3225ff8 --- /dev/null +++ b/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts @@ -0,0 +1,174 @@ +import { toUtf8Bytes, hashMessage, toBeHex, concat, getBytes } from 'ethers'; +import { Identity } from '@0xsequence/wallet-wdk'; +import { IdentityInstrument, IdTokenChallenge } from '@0xsequence/identity-instrument'; +import { PassportError, PassportErrorType } from '../../errors/passportError'; +import AuthManager from '../../authManager'; +import { PassportConfiguration } from '../../config'; +import { User } from '../../types'; +import { Hex, Address } from 'ox'; +import jwt_decode from 'jwt-decode'; +import { IdTokenPayload } from '../../types'; +import { + Payload, + Signature as SequenceSignature, +} from '@0xsequence/wallet-primitives'; +import { ISigner } from './ISigner'; + +interface AuthKey { + address: string; + privateKey: CryptoKey; + identitySigner: string; + expiresAt: Date; +} + +interface UserWallet { + userIdentifier: string; + signerAddress: string; + authKey: AuthKey; + identityInstrument: IdentityInstrument; +} + +export class IdentityInstrumentSigner implements ISigner { + private readonly authManager: AuthManager; + private readonly config: PassportConfiguration; + private userWallet: UserWallet | null = null; + private createWalletPromise: Promise | null = null; + + constructor(authManager: AuthManager, config: PassportConfiguration) { + this.authManager = authManager; + this.config = config; + } + + private async getUserOrThrow(): Promise { + const user = await this.authManager.getUser(); + if (!user) { + throw new PassportError( + 'User not authenticated', + PassportErrorType.NOT_LOGGED_IN_ERROR, + ); + } + return user; + } + + private async getUserWallet(): Promise { + let { userWallet } = this; + if (!userWallet) { + userWallet = await this.createWallet(); + } + + const user = await this.getUserOrThrow(); + if (user.profile.sub !== userWallet.userIdentifier) { + userWallet = await this.createWallet(user); + } + + return userWallet; + } + + private async createWallet(user?: User): Promise { + if (this.createWalletPromise) return this.createWalletPromise; + + this.createWalletPromise = new Promise(async (resolve, reject) => { + try { + this.userWallet = null; + await this.authManager.forceUserRefresh(); // TODO shouldn't have to refresh all the time + + const authenticatedUser = user || await this.getUserOrThrow(); + + if (!authenticatedUser.idToken) { + throw new PassportError( + 'User idToken not available', + PassportErrorType.NOT_LOGGED_IN_ERROR, + ); + } + + const idToken = authenticatedUser.idToken; + const decoded = jwt_decode(idToken); + const issuer = decoded.iss; + const audience = decoded.aud; + + const keyPair = await window.crypto.subtle.generateKey( + { name: 'ECDSA', namedCurve: 'P-256' }, + false, + ['sign', 'verify'] + ); + + const publicKey = await window.crypto.subtle.exportKey('raw', keyPair.publicKey); + const authKey: AuthKey = { + address: Hex.fromBytes(new Uint8Array(publicKey)), + privateKey: keyPair.privateKey, + identitySigner: '', + expiresAt: new Date(Date.now() + 3600000), + }; + + const identityInstrument = new IdentityInstrument(this.config.sequenceIdentityInstrumentEndpoint, "@14:test"); + const challenge = new IdTokenChallenge(issuer, audience, idToken); + + await identityInstrument.commitVerifier( + Identity.toIdentityAuthKey(authKey), + challenge + ); + + const result = await identityInstrument.completeAuth( + Identity.toIdentityAuthKey(authKey), + challenge + ); + + const signerAddress = result.signer.address; + authKey.identitySigner = signerAddress; + + this.userWallet = { + userIdentifier: authenticatedUser.profile.sub, + signerAddress: signerAddress, + authKey, + identityInstrument, + }; + + return resolve(this.userWallet!); + } catch (error) { + const errorMessage = `Identity Instrument: Failed to create signer: ${(error as Error).message}`; + console.error('[IdentityInstrumentSigner] Error:', errorMessage, error); + return reject(new PassportError(errorMessage, PassportErrorType.WALLET_CONNECTION_ERROR)); + } finally { + this.createWalletPromise = null; + } + }); + + return this.createWalletPromise; + } + + async getAddress(): Promise { + const wallet = await this.getUserWallet(); + return wallet.signerAddress; + } + + async signPayload(walletAddress: Address.Address, chainId: number, payload: Payload.Parented): Promise { + const wallet = await this.getUserWallet(); + + const signer = new Identity.IdentitySigner( + wallet.identityInstrument, + wallet.authKey + ); + + return signer.sign(walletAddress, chainId, payload); + } + + async signMessage(message: string | Uint8Array): Promise { + const wallet = await this.getUserWallet(); + + const signer = new Identity.IdentitySigner( + wallet.identityInstrument, + wallet.authKey + ); + + const digest = hashMessage(message); + + const signature = await signer.signDigest(getBytes(digest)); + + const r = toBeHex(signature.r, 32); + const s = toBeHex(signature.s, 32); + const v = toBeHex(signature.yParity + 27, 1); + + return concat([r, s, v]); + } +} + diff --git a/packages/passport/sdk/src/sequence/signer/privateKeySigner.ts b/packages/passport/sdk/src/sequence/signer/privateKeySigner.ts new file mode 100644 index 0000000000..522fc8bb64 --- /dev/null +++ b/packages/passport/sdk/src/sequence/signer/privateKeySigner.ts @@ -0,0 +1,109 @@ +import { toUtf8Bytes, keccak256, hashMessage, SigningKey } from 'ethers'; +import { PassportError, PassportErrorType } from '../../errors/passportError'; +import AuthManager from '../../authManager'; +import { User } from '../../types'; +import { Signers } from '@0xsequence/wallet-core'; +import { + Config, + Payload, + Signature as SequenceSignature, +} from '@0xsequence/wallet-primitives'; +import { ISigner } from './ISigner'; +import { Address } from 'ox'; + +interface PrivateKeyWallet { + userIdentifier: string; + signerAddress: string; + signer: Signers.Pk.Pk; +} + +export class PrivateKeySigner implements ISigner { + private readonly authManager: AuthManager; + private privateKeyWallet: PrivateKeyWallet | null = null; + private createWalletPromise: Promise | null = null; + + constructor(authManager: AuthManager) { + this.authManager = authManager; + } + + private async getUserOrThrow(): Promise { + const user = await this.authManager.getUser(); + if (!user) { + throw new PassportError( + 'User not authenticated', + PassportErrorType.NOT_LOGGED_IN_ERROR, + ); + } + return user; + } + + private async getWalletInstance(): Promise { + let { privateKeyWallet } = this; + if (!privateKeyWallet) { + privateKeyWallet = await this.createWallet(); + } + + const user = await this.getUserOrThrow(); + if (user.profile.sub !== privateKeyWallet.userIdentifier) { + privateKeyWallet = await this.createWallet(user); + } + + return privateKeyWallet; + } + + private async createWallet(user?: User): Promise { + if (this.createWalletPromise) return this.createWalletPromise; + + this.createWalletPromise = new Promise(async (resolve, reject) => { + try { + this.privateKeyWallet = null; + const authenticatedUser = user || await this.getUserOrThrow(); + + const privateKeyHash = keccak256(toUtf8Bytes(`${authenticatedUser.profile.sub}-sequence-arb-one`)) as `0x${string}`; + console.log(`privateKeyHash = ${privateKeyHash}`); + let signer = new Signers.Pk.Pk(privateKeyHash); + + const signerAddress = signer.address; + + this.privateKeyWallet = { + userIdentifier: authenticatedUser.profile.sub, + signerAddress, + signer, + }; + + return resolve(this.privateKeyWallet!); + } catch (error) { + const errorMessage = `Failed to create private key wallet: ${(error as Error).message}`; + return reject(new PassportError(errorMessage, PassportErrorType.WALLET_CONNECTION_ERROR)); + } finally { + this.createWalletPromise = null; + } + }); + + return this.createWalletPromise; + } + + async getAddress(): Promise { + console.log('getAddress'); + const wallet = await this.getWalletInstance(); + const privateKey = keccak256(toUtf8Bytes(`${wallet.userIdentifier}-sequence-arb-one`)); + console.log(`sequence privateKey = ${privateKey}`); + console.log(`sequence wallet.signerAddress = ${wallet.signerAddress}`); + return wallet.signerAddress; + } + + async signPayload(walletAddress: Address.Address, chainId: number, payload: Payload.Parented): Promise { + const pkWallet = await this.getWalletInstance(); + return pkWallet.signer.sign(walletAddress, chainId, payload); + } + + async signMessage(message: string | Uint8Array): Promise { + const pkWallet = await this.getWalletInstance(); + + const privateKeyHash = keccak256(toUtf8Bytes(`${pkWallet.userIdentifier}-sequence-arb-one`)) as `0x${string}`; + const signingKey = new SigningKey(privateKeyHash); + + return signingKey.sign(hashMessage(message)).serialized; + } +} + diff --git a/packages/passport/sdk/src/sequence/signer/signerHelpers.ts b/packages/passport/sdk/src/sequence/signer/signerHelpers.ts new file mode 100644 index 0000000000..f6c42ef6c4 --- /dev/null +++ b/packages/passport/sdk/src/sequence/signer/signerHelpers.ts @@ -0,0 +1,96 @@ +import { Context, Config } from '@0xsequence/wallet-primitives'; +import { State } from '@0xsequence/wallet-core'; +import { Address, Hex } from 'ox'; + +export const SEQUENCE_CONTEXT: Context.Context = { + factory: '0x1cf579D15a3fA90b144bc4E9016606781A7b3bCb', + stage1: '0x2D2B49799985A9EABb3640b384FE082560b6D6B3', + stage2: '0x592D6B6581B2808390CC08894C5249116B4DF162', + creationCode: "0x6054600f3d396034805130553df3fe63906111273d3560e01c14602b57363d3d373d3d3d3d369030545af43d82803e156027573d90f35b3d90fd5b30543d5260203df3", +}; + +const immutableSignerContractAddress = '0x8bea3E180bEab544c9295a0C0b8eC1628614A2b3'; + +const stateProviderUrl = "https://keymachine.sequence.app"; + +export const createWalletConfig = (signerAddress: Address.Address): Config.Config => { + const signers = [Address.from(immutableSignerContractAddress), signerAddress]; + + if (signers[0].toLowerCase() > signers[1].toLowerCase()) { + [signers[0], signers[1]] = [signers[1], signers[0]]; + } + + return { + threshold: 2n, + checkpoint: 0n, + topology: [ + { + type: "signer", + address: signers[0], + weight: 1n, + }, + { + type: "signer", + address: signers[1], + weight: 1n, + }, + ], + }; +}; + +export const createStateProvider = (walletAddress: Address.Address, deploymentSalt: string, realImageHash: Hex.Hex): State.Provider => { + const baseStateProvider = new State.Sequence.Provider(stateProviderUrl); + + return new Proxy(baseStateProvider, { + get(target, prop) { + // Override getDeploy to return custom deployment info + if (prop === 'getDeploy') { + return async (wallet: Address.Address) => { + if (wallet === walletAddress) { + return { + imageHash: deploymentSalt, + context: SEQUENCE_CONTEXT, + }; + } + return target.getDeploy(wallet); + }; + } + + // Override getConfiguration to map custom salt back to real imageHash + if (prop === 'getConfiguration') { + return async (queryImageHash: Hex.Hex) => { + // If querying for custom salt, return config for real imageHash + if (queryImageHash === deploymentSalt) { + return target.getConfiguration(realImageHash); + } + return target.getConfiguration(queryImageHash); + }; + } + + // Override getConfigurationUpdates to return empty array for custom salt wallets + if (prop === 'getConfigurationUpdates') { + return async (wallet: Address.Address, fromImageHash: Hex.Hex, options?: any) => { + if (wallet === walletAddress) { + return []; + } + return target.getConfigurationUpdates(wallet, fromImageHash, options); + }; + } + + // Delegate all other methods to the base provider + const value = (target as any)[prop]; + if (typeof value === 'function') { + return value.bind(target); + } + return value; + }, + }) as State.Provider; +}; + +export const saveWalletConfig = async ( + walletConfig: Config.Config, + stateProvider: State.Provider +): Promise => { + await stateProvider.saveWallet(walletConfig, SEQUENCE_CONTEXT as any); +}; + diff --git a/packages/passport/sdk/src/sequence/transactionHelpers.ts b/packages/passport/sdk/src/sequence/transactionHelpers.ts new file mode 100644 index 0000000000..7ccec5a598 --- /dev/null +++ b/packages/passport/sdk/src/sequence/transactionHelpers.ts @@ -0,0 +1,246 @@ +import { Flow } from '@imtbl/metrics'; +import { BigNumberish, TransactionRequest } from 'ethers'; +import { Address, Bytes, Hex, Provider } from 'ox'; +import { getEip155ChainId, getNonce, isWalletDeployed } from './walletHelpers'; +import { JsonRpcError, ProviderErrorCode, RpcErrorCode } from '../zkEvm/JsonRpcError'; +import SequenceSigner from './sequenceSigner'; +import { Payload, Config, Context } from '@0xsequence/wallet-primitives'; +import { Wallet } from '@0xsequence/wallet-core'; +import { SequenceRelayerClient } from './sequenceRelayerClient'; +import AuthManager from '../authManager'; +import { createStateProvider, createWalletConfig, saveWalletConfig, SEQUENCE_CONTEXT } from './signer/signerHelpers'; +import GuardianClient, { convertBigNumberishToString } from '../guardian'; +import { MetaTransaction } from '../zkEvm/types'; + +export type TransactionParams = { + sequenceSigner: SequenceSigner; + oxRpcProvider: Provider.Provider; + guardianClient: GuardianClient; + relayerClient: SequenceRelayerClient; + walletAddress: string; + flow: Flow; + authManager: AuthManager; + nonceSpace?: bigint; + isBackgroundTransaction?: boolean; +}; + +const buildMetaTransaction = async ( + transactionRequest: TransactionRequest, + rpcProvider: Provider.Provider, + walletAddress: string, + nonceSpace?: bigint, +): Promise => { + if (!transactionRequest.to) { + throw new JsonRpcError( + RpcErrorCode.INVALID_PARAMS, + 'eth_sendTransaction requires a "to" field', + ); + } + + const metaTransaction: MetaTransaction = { + to: transactionRequest.to.toString(), + data: transactionRequest.data, + nonce: BigInt(0), // NOTE: We don't need a valid nonce to estimate the fee + value: transactionRequest.value, + revertOnError: true, + }; + + // Get the nonce from the smart wallet + const nonce = await getNonce(rpcProvider, walletAddress, nonceSpace); + + // Build the meta transactions array with a valid nonce + return { + ...metaTransaction, + nonce, + }; +}; + +const createWallet = async ( + authManager: AuthManager, + walletAddress: Address.Address, + sequenceSigner: SequenceSigner, +): Promise => { + const user = await authManager.getUser(); + if (!user?.accessToken) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + 'No access token found', + ); + } + const deploymentSalt = await fetchDeploymentSalt(user.accessToken); + console.log(`deployment salt = ${deploymentSalt}`); + + const signerAddress = await sequenceSigner.getAddress(); + const walletConfig = createWalletConfig(Address.from(signerAddress)); + const realImageHash = Bytes.toHex(Config.hashConfiguration(walletConfig)); + console.log(`realImageHash = ${realImageHash}`); + + const stateProvider = createStateProvider(walletAddress, deploymentSalt, realImageHash); + const wallet = new Wallet(walletAddress, { + stateProvider: stateProvider, + knownContexts: [SEQUENCE_CONTEXT as Context.KnownContext], + }); + await saveWalletConfig(walletConfig, stateProvider); + + return wallet; +}; + +export const prepareAndSignTransaction = async ({ + transactionRequest, + sequenceSigner, + oxRpcProvider, + guardianClient, + relayerClient, + walletAddress, + flow, + authManager, + nonceSpace, + isBackgroundTransaction, +}: TransactionParams & { transactionRequest: TransactionRequest }): Promise<{ to: Address.Address; data: Hex.Hex; }> => { + const user = await authManager.getUser(); + if (!user?.accessToken) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + 'No access token found', + ); + } + + const chainId = await oxRpcProvider.request({ method: 'eth_chainId' }); + + const metaTransaction = await buildMetaTransaction( + transactionRequest, + oxRpcProvider, + walletAddress, + nonceSpace, + ); + flow.addEvent('endBuildMetaTransactions'); + + const { nonce } = metaTransaction; + if (typeof nonce === 'undefined') { + throw new Error('Failed to retrieve nonce from the smart wallet'); + } + + const validateTransaction = async () => { + await guardianClient.validateEVMTransaction({ + chainId: getEip155ChainId(Number(chainId)), + nonce: convertBigNumberishToString(nonce), + metaTransactions: [metaTransaction], + isBackgroundTransaction, + }); + flow.addEvent('endValidateEVMTransaction'); + }; + + const signTransaction = async () => { + const signed = await signMetaTransaction( + walletAddress, + metaTransaction, + authManager, + oxRpcProvider, + sequenceSigner, + chainId, + flow, + nonce, + ); + flow.addEvent('endSignMetaTransaction'); + return signed; + } + + const [ _, signature] = await Promise.all([ + validateTransaction(), + signTransaction(), + ]); + + const response = await fetch('http://localhost:8073/relayer-mr/v1/build-guest-module-calldata', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${user.accessToken}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + chain_id: getEip155ChainId(Number(chainId)), + to: transactionRequest.to, + value: Hex.fromNumber(BigInt(transactionRequest.value ?? 0)), + data: transactionRequest.data ?? '0x', + user_ecdsa_signature: signature, + }), + }); + + if (!response.ok) { + throw new Error(`Failed to build guest module calldata: ${response.statusText}`); + } + + const result = await response.json(); + + flow.addEvent('endBuildGuestModuleMulticall'); + + console.log(`response ${JSON.stringify(result)}`); + + return { to: result.to, data: result.data }; +}; + +const signMetaTransaction = async ( + walletAddress: string, + metaTransaction: MetaTransaction, + authManager: AuthManager, + rpcProvider: Provider.Provider, + sequenceSigner: SequenceSigner, + chainId: string, + flow: Flow, + nonce: BigNumberish, +): Promise => { + flow.addEvent('startSignMetaTransaction'); + + const wallet = await createWallet(authManager, Address.from(walletAddress), sequenceSigner); + + const call: Payload.Call = { + to: metaTransaction.to as `0x${string}`, + value: BigInt(metaTransaction.value || 0), + data: (metaTransaction.data || '0x') as `0x${string}`, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: "revert", + }; + + const envelope = await wallet.prepareTransaction(rpcProvider as any, [call], { noConfigUpdate: true }); + + const isDeployed = await isWalletDeployed(rpcProvider, walletAddress); + + // Adjust nonce to 1 for user transaction (bootstrap transaction uses nonce 0) + const adjustedEnvelope = { + ...envelope, + payload: { + ...envelope.payload, + nonce: isDeployed ? BigInt(nonce) : 1n, + }, + }; + + // Encode payload to bytes and sign with EIP-191 prefix + const payloadDigest = Payload.hash(Address.from(walletAddress), Number(chainId), adjustedEnvelope.payload); + const signature = await sequenceSigner.signMessage(payloadDigest) as `0x${string}`; + + flow.addEvent('endSignMetaTransaction'); + + return signature; +}; + +async function fetchDeploymentSalt( + accessToken: string +): Promise { + const apiUrl = 'http://localhost:8072/passport-mr/v1/counterfactual-salt'; + + const response = await fetch(apiUrl, { + method: 'GET', + headers: { + 'Authorization': `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + }, + }); + + if (!response.ok) { + throw new Error(`Failed to fetch deployment salt: ${response.statusText}`); + } + + const data = await response.json(); + return data.salt; +} \ No newline at end of file diff --git a/packages/passport/sdk/src/sequence/types.ts b/packages/passport/sdk/src/sequence/types.ts new file mode 100644 index 0000000000..4587de41f3 --- /dev/null +++ b/packages/passport/sdk/src/sequence/types.ts @@ -0,0 +1,24 @@ +export interface RequestArguments { + method: string; + params?: Array; +} + +export type Provider = { + request: (request: RequestArguments) => Promise; + on: (event: string, listener: (...args: any[]) => void) => void; + removeListener: (event: string, listener: (...args: any[]) => void) => void; + isPassport: boolean; +}; + +export enum ProviderEvent { + ACCOUNTS_CHANGED = 'accountsChanged', + CHAIN_CHANGED = 'chainChanged', +} + +export type AccountsChangedEvent = Array; +export type ChainChangedEvent = string; + +export interface ProviderEventMap extends Record { + [ProviderEvent.ACCOUNTS_CHANGED]: [AccountsChangedEvent]; + [ProviderEvent.CHAIN_CHANGED]: [ChainChangedEvent]; +} diff --git a/packages/passport/sdk/src/sequence/user/index.ts b/packages/passport/sdk/src/sequence/user/index.ts new file mode 100644 index 0000000000..6718859763 --- /dev/null +++ b/packages/passport/sdk/src/sequence/user/index.ts @@ -0,0 +1,2 @@ +export { registerUser, type RegisterUserInput } from './registerUser'; + diff --git a/packages/passport/sdk/src/sequence/user/registerUser.ts b/packages/passport/sdk/src/sequence/user/registerUser.ts new file mode 100644 index 0000000000..747ffcd680 --- /dev/null +++ b/packages/passport/sdk/src/sequence/user/registerUser.ts @@ -0,0 +1,89 @@ +import { Flow } from '@imtbl/metrics'; +import AuthManager from '../../authManager'; +import { MultiRollupApiClients } from '@imtbl/generated-clients'; +import { getEip155ChainId } from '../walletHelpers'; +import { JsonRpcError, RpcErrorCode } from '../../zkEvm/JsonRpcError'; +import SequenceSigner from '../sequenceSigner'; +import { JsonRpcProvider } from 'ethers'; + +export type RegisterUserInput = { + authManager: AuthManager; + multiRollupApiClients: MultiRollupApiClients; + accessToken: string; + rpcProvider: JsonRpcProvider; + ethSigner: SequenceSigner; + flow: Flow; +}; + +const MESSAGE_TO_SIGN = 'Only sign this message from Immutable Passport'; + +export async function registerUser({ + authManager, + multiRollupApiClients, + accessToken, + rpcProvider, + ethSigner, + flow, +}: RegisterUserInput): Promise { + const getAddressPromise = ethSigner.getAddress(); + getAddressPromise.then(() => flow.addEvent('endGetAddress')); + + const signMessagePromise = ethSigner.signMessage(MESSAGE_TO_SIGN).then((signature) => { + const sig = signature.startsWith('0x') ? signature.slice(2) : signature; + const r = sig.substring(0, 64); + const s = sig.substring(64, 128); + const v = sig.substring(128, 130); + + const vNum = parseInt(v, 16); + const recoveryParam = vNum >= 27 ? vNum - 27 : vNum; + const vHex = recoveryParam.toString(16).padStart(2, '0'); + + return `0x${r}${s}${vHex}`; + }); + signMessagePromise.then(() => flow.addEvent('endSignRaw')); + + // const detectNetworkPromise = rpcProvider.getNetwork(); + // detectNetworkPromise.then(() => flow.addEvent('endDetectNetwork')); + + // const listChainsPromise = multiRollupApiClients.chainsApi.listChains(); + // listChainsPromise.then(() => flow.addEvent('endListChains')); + + const [ethereumAddress, ethereumSignature/* , network, chainListResponse */] = await Promise.all([ + getAddressPromise, + signMessagePromise, + // detectNetworkPromise, + // listChainsPromise, + ]); + + // const eipChainId = getEip155ChainId(Number(network.chainId)); + // const chainName = chainListResponse.data?.result?.find((chain) => chain.id === eipChainId)?.name; + // if (!chainName) { + // throw new JsonRpcError( + // RpcErrorCode.INTERNAL_ERROR, + // `Chain name does not exist on for chain id ${network.chainId}`, + // ); + // } + + try { + console.log(`sequence registerUser createCounterfactualAddressV2`); + const registrationResponse = await multiRollupApiClients.passportApi.createCounterfactualAddressV2({ + chainName: "arbitrum-sepolia", + createCounterfactualAddressRequest: { + ethereum_address: ethereumAddress, + ethereum_signature: ethereumSignature, + }, + }, { + headers: { Authorization: `Bearer ${accessToken}` }, + }); + flow.addEvent('endCreateCounterfactualAddress'); + + authManager.forceUserRefreshInBackground(); + + return registrationResponse.data.counterfactual_address; + } catch (error) { + console.log(`sequence registerUser error: ${error}`, (error as Error)?.stack); + + flow.addEvent('errorRegisteringUser'); + throw error; + } +} diff --git a/packages/passport/sdk/src/sequence/walletHelpers.ts b/packages/passport/sdk/src/sequence/walletHelpers.ts new file mode 100644 index 0000000000..7d9d88ae2d --- /dev/null +++ b/packages/passport/sdk/src/sequence/walletHelpers.ts @@ -0,0 +1,50 @@ +import { Address, Abi, AbiFunction, Provider } from 'ox'; +import { BigNumberish } from 'ethers'; + +const READ_NONCE = Abi.from(['function readNonce(uint256 _space) external view returns (uint256)'])[0] + +export const isWalletDeployed = async ( + rpcProvider: Provider.Provider, + walletAddress: string, +): Promise => { + return (await rpcProvider.request({ method: 'eth_getCode', params: [Address.from(walletAddress), 'pending'] })) !== '0x' +}; + +export const encodeNonce = (nonceSpace: BigNumberish, nonce: BigNumberish): bigint => { + const space = BigInt(nonceSpace.toString()); + const n = BigInt(nonce.toString()); + const shiftedSpace = space * (2n ** 96n); + return n + shiftedSpace; +}; + +export const getNonce = async ( + rpcProvider: Provider.Provider, + walletAddress: string, + nonceSpace?: bigint, +): Promise => { + const rawSpace = nonceSpace ? (nonceSpace >> 96n) : 0n; + + const deployed = await isWalletDeployed(rpcProvider, walletAddress); + if (!deployed) { + return encodeNonce(rawSpace, 0n); + } + + const callData = AbiFunction.encodeData(READ_NONCE, [rawSpace]); + + const result = await rpcProvider.request({ + method: 'eth_call', + params: [ + { + to: Address.from(walletAddress), + data: callData, + }, + 'latest', + ], + }); + + const nonce = AbiFunction.decodeResult(READ_NONCE, result); + + return encodeNonce(rawSpace, nonce); +}; + +export const getEip155ChainId = (chainId: number): string => `eip155:${chainId}`; diff --git a/packages/passport/sdk/src/types.ts b/packages/passport/sdk/src/types.ts index 43c929def8..cb923fab2f 100644 --- a/packages/passport/sdk/src/types.ts +++ b/packages/passport/sdk/src/types.ts @@ -56,6 +56,16 @@ export type User = { ethAddress: string; userAdminAddress: string; }; +} & { + [K in Exclude]?: { + ethAddress: string; + userAdminAddress: string; + }; +}; + +export type PassportChainMetadata = { + eth_address: string; + user_admin_address: string; }; export type PassportMetadata = { @@ -64,8 +74,9 @@ export type PassportMetadata = { imx_user_admin_address: string; zkevm_eth_address: string; zkevm_user_admin_address: string; +} & { + [K in Exclude]: PassportChainMetadata; }; - export interface OidcConfiguration { clientId: string; logoutRedirectUri?: string; @@ -85,6 +96,9 @@ export interface PassportOverrides { immutableXClient: IMXClient; zkEvmRpcUrl: string; relayerUrl: string; + sequenceIdentityInstrumentEndpoint: string; + sequenceProjectAccessKey: string; + sequenceGuardEndpoint: string; indexerMrBasePath: string; orderBookMrBasePath: string; passportMrBasePath: string; @@ -178,8 +192,14 @@ export type LinkedWallet = { clientName: string; }; +export enum EvmChain { + ZKEVM = 'zkevm', + ARBITRUM_ONE = 'arbitrum_one', +} + export type ConnectEvmArguments = { - announceProvider: boolean; + announceProvider?: boolean; + chain?: EvmChain; }; export type LoginArguments = { diff --git a/packages/passport/sdk/src/zkEvm/relayerClient.ts b/packages/passport/sdk/src/zkEvm/relayerClient.ts index 8ce076d259..cc71020ff3 100644 --- a/packages/passport/sdk/src/zkEvm/relayerClient.ts +++ b/packages/passport/sdk/src/zkEvm/relayerClient.ts @@ -3,6 +3,7 @@ import AuthManager from '../authManager'; import { PassportConfiguration } from '../config'; import { FeeOption, RelayerTransaction, TypedDataPayload } from './types'; import { getEip155ChainId } from './walletHelpers'; +import { JsonRpcError, ProviderErrorCode, RpcErrorCode } from './JsonRpcError'; export type RelayerClientInput = { config: PassportConfiguration, @@ -115,7 +116,13 @@ export class RelayerClient { ...request, }; - const user = await this.authManager.getUserZkEvm(); + const user = await this.authManager.getUser(); + if (!user?.accessToken) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + 'No access token found', + ); + } const response = await fetch(`${this.config.relayerUrl}/v1/transactions`, { method: 'POST', diff --git a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts index beba2623c0..4af2d14fec 100644 --- a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts +++ b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts @@ -68,6 +68,9 @@ export class ZkEvmProvider implements Provider { public readonly isPassport: boolean = true; + // TODO: for demo purposes only as we're using local database + userWalletAddress: string | undefined = undefined; + constructor({ authManager, config, @@ -96,20 +99,20 @@ export class ZkEvmProvider implements Provider { this.#multiRollupApiClients = multiRollupApiClients; this.#providerEventEmitter = new TypedEventEmitter(); - if (user && isZkEvmUser(user)) { - this.#callSessionActivity(user.zkEvm.ethAddress); - } + // if (user && isZkEvmUser(user)) { + // this.#callSessionActivity(user.zkEvm.ethAddress); + // } passportEventEmitter.on(PassportEvents.LOGGED_IN, (loggedInUser: User) => { - if (isZkEvmUser(loggedInUser)) { - this.#callSessionActivity(loggedInUser.zkEvm.ethAddress); - } + // if (isZkEvmUser(loggedInUser)) { + // this.#callSessionActivity(loggedInUser.zkEvm.ethAddress); + // } }); passportEventEmitter.on(PassportEvents.LOGGED_OUT, this.#handleLogout); - passportEventEmitter.on( - PassportEvents.ACCOUNTS_REQUESTED, - trackSessionActivity, - ); + // passportEventEmitter.on( + // PassportEvents.ACCOUNTS_REQUESTED, + // trackSessionActivity, + // ); } #handleLogout = () => { @@ -159,7 +162,12 @@ export class ZkEvmProvider implements Provider { switch (request.method) { case 'eth_requestAccounts': { + console.log(`zkevm eth_requestAccounts`); + const signerAddress = await this.#ethSigner.getAddress(); + console.log(`zkevm signerAddress = ${signerAddress}`); + const zkEvmAddress = await this.#getZkEvmAddress(); + this.userWalletAddress = zkEvmAddress; if (zkEvmAddress) return [zkEvmAddress]; const flow = trackFlow('passport', 'ethRequestAccounts'); @@ -181,9 +189,14 @@ export class ZkEvmProvider implements Provider { rpcProvider: this.#rpcProvider, flow, }); + + this.userWalletAddress = userZkEvmEthAddress; + flow.addEvent('endUserRegistration'); } else { userZkEvmEthAddress = user.zkEvm.ethAddress; + + this.userWalletAddress = userZkEvmEthAddress; } this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, [ @@ -206,7 +219,8 @@ export class ZkEvmProvider implements Provider { } } case 'eth_sendTransaction': { - const zkEvmAddress = await this.#getZkEvmAddress(); + console.log(`zkevm eth_sendTransaction`); + const zkEvmAddress = this.userWalletAddress;//await this.#getZkEvmAddress(); if (!zkEvmAddress) { throw new JsonRpcError( ProviderErrorCode.UNAUTHORIZED, @@ -216,7 +230,17 @@ export class ZkEvmProvider implements Provider { const flow = trackFlow('passport', 'ethSendTransaction'); + console.log(`request.params ${JSON.stringify(request.params)}`); try { + // return await sendTransaction({ + // params: request.params || [], + // ethSigner: this.#ethSigner, + // guardianClient: this.#guardianClient, + // rpcProvider: this.#rpcProvider, + // relayerClient: this.#relayerClient, + // zkEvmAddress, + // flow, + // }); return await this.#guardianClient.withConfirmationScreen({ width: 480, height: 720, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f559ae5bdd..61737a884a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,7 +65,7 @@ importers: version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-react-refresh: specifier: latest - version: 0.4.19(eslint@8.57.0) + version: 0.4.24(eslint@8.57.0) events: specifier: ^3.1.0 version: 3.3.0 @@ -132,7 +132,7 @@ importers: version: 0.25.21(@emotion/react@11.11.3(@types/react@18.3.12)(react@18.3.1))(@rive-app/react-canvas-lite@4.9.0(react@18.3.1))(embla-carousel-react@8.1.5(react@18.3.1))(framer-motion@11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@imtbl/sdk': specifier: latest - version: 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) next: specifier: 14.2.25 version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -777,7 +777,7 @@ importers: version: 18.3.1(react@18.3.1) wagmi: specifier: ^2.11.3 - version: 2.12.1(@tanstack/query-core@5.51.15)(@tanstack/react-query@5.51.15(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 2.12.1(@tanstack/query-core@5.51.15)(@tanstack/react-query@5.51.15(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) devDependencies: '@playwright/test': specifier: ^1.45.2 @@ -835,7 +835,7 @@ importers: version: 18.3.1(react@18.3.1) wagmi: specifier: ^2.11.3 - version: 2.12.1(@tanstack/query-core@5.51.15)(@tanstack/react-query@5.51.15(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 2.12.1(@tanstack/query-core@5.51.15)(@tanstack/react-query@5.51.15(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) devDependencies: '@playwright/test': specifier: ^1.45.3 @@ -1311,7 +1311,7 @@ importers: version: 5.0.7(rollup@4.28.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.28.0)(tslib@2.7.0)(typescript@5.6.2) + version: 11.1.6(rollup@4.28.0)(tslib@2.8.1)(typescript@5.6.2) '@segment/analytics-next': specifier: ^1.53.2 version: 1.54.0(encoding@0.1.13) @@ -1537,9 +1537,15 @@ importers: specifier: ^6.13.4 version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) devDependencies: + esbuild: + specifier: ^0.23.1 + version: 0.23.1 eslint: specifier: ^8.40.0 version: 8.57.0 + html-inline: + specifier: ^1.2.0 + version: 1.2.0 parcel: specifier: ^2.8.3 version: 2.9.3(@swc/helpers@0.5.13)(postcss@8.4.49)(relateurl@0.2.7)(srcset@4.0.0)(terser@5.34.1)(typescript@5.6.2) @@ -2070,11 +2076,32 @@ importers: packages/passport/sdk: dependencies: '@0xsequence/abi': - specifier: ^2.0.25 - version: 2.2.13 + specifier: 2.3.34 + version: 2.3.34 '@0xsequence/core': - specifier: ^2.0.25 - version: 2.2.13(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + specifier: 2.3.34 + version: 2.3.34(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@0xsequence/guard': + specifier: 3.0.0-beta.5 + version: 3.0.0-beta.5(typescript@5.6.2) + '@0xsequence/identity-instrument': + specifier: 3.0.0-beta.5 + version: 3.0.0-beta.5(typescript@5.6.2) + '@0xsequence/network': + specifier: ^2.3.35 + version: 2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@0xsequence/relayer': + specifier: 3.0.0-beta.5 + version: 3.0.0-beta.5(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-core': + specifier: 3.0.0-beta.5 + version: 3.0.0-beta.5(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': + specifier: 3.0.0-beta.5 + version: 3.0.0-beta.5(typescript@5.6.2) + '@0xsequence/wallet-wdk': + specifier: 3.0.0-beta.5 + version: 3.0.0-beta.5(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) '@imtbl/config': specifier: workspace:* version: link:../../config @@ -2123,6 +2150,9 @@ importers: oidc-client-ts: specifier: 3.3.0 version: 3.3.0 + ox: + specifier: ^0.9.14 + version: 0.9.14(typescript@5.6.2) uuid: specifier: ^8.3.2 version: 8.3.2 @@ -2684,19 +2714,66 @@ importers: packages: - '@0xsequence/abi@2.2.13': - resolution: {integrity: sha512-cZDR83SNxpXTD9vZoJAtmn6/YgvttN0gmeB8feQ5cpo8yd+AeJvQpUGMPR6Ud1MQGsvcPTLnTwKkL432Pc6UGQ==} + '@0xsequence/abi@2.3.34': + resolution: {integrity: sha512-mOQHXUgRRFBZwt+j0f0mjI/4gicL5dZ3Nf3iLnrB7AEF97hchD0g+gkkzHkyyvPcswCnlCkCKBuud6gEnsHGLQ==} + + '@0xsequence/abi@2.3.35': + resolution: {integrity: sha512-HsnFWr/SHfqn3Zkx+ohFPVx3tDwpxBAAdHOVU/wbd8iQ7IRW8w3YZc80ceWOoPOJ/GiOky3B1li+/2/CuDoSJw==} + + '@0xsequence/core@2.3.34': + resolution: {integrity: sha512-VpXO4bQsMwP+y64Ba6C/wNKYUFGksmCYUZQMS1s/ncXAPTmZLLk3pZfmY4Djc8aDqZYYy6Yo0Mq90VPaqYI7Hg==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/core@2.3.35': + resolution: {integrity: sha512-+y9Rs3nCOi6CELttMGHU98XsBEaehUOKrdkPDttMCPtMJiAQo0dObz5D4thGxIGNyKyNotJ4y7ILgtv5Tk34gg==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/guard@3.0.0-beta.5': + resolution: {integrity: sha512-pJLHBGnedWG9ZH0e5sB0Ru2Si+a+aF3TWLEJPKz9ISNgUuNEoAENAnK2k/KrvrNQ9q5iyVeS4RfMtpAvzqayXw==} + + '@0xsequence/identity-instrument@3.0.0-beta.5': + resolution: {integrity: sha512-eZUDubZVU8WDd7zLNqjXN/sIcMBSgS3+VDzpJa9WbXu0Unq84Dr7juFJ7+0Z5fX72Cv9gEkNORrUYor/ksJzuw==} + + '@0xsequence/indexer@2.3.35': + resolution: {integrity: sha512-zqjGRzRzFWC8jf26WsagHz0zPP6V8ieAUBDrEKItPb0rgzNX+KiMl6wMZXW/zQp+DGuCfvFfeL0NSALmFxmjRg==} - '@0xsequence/core@2.2.13': - resolution: {integrity: sha512-tu6OEGbDLg1KfMb+YOn0Z5BsYbK3UFBjuPVHRx7SpmCsZPEApJqqRKHpTYah2T3bmYIJy9tRBtqstfTsniSgng==} + '@0xsequence/network@2.3.35': + resolution: {integrity: sha512-xn3pLk778EPiM+xHkYQWdY00xDlgWZxz1U8RxEqRi8IjMcC8N6rqNWTupIXWUVOxNCMtlF+Qtme95+slhHAQUQ==} peerDependencies: ethers: '>=6' - '@0xsequence/utils@2.2.13': - resolution: {integrity: sha512-V4uip1fCZAzp5O2S+nkKnwrqmzzC7em1Mc4HJvUX+fqT0jzw20BZt0CNlX34DgW6E6MzBvWnrX+DTfz/+alBWQ==} + '@0xsequence/relayer@2.3.35': + resolution: {integrity: sha512-9kld9zQ2kxh2QqKDaaTmCzdzLGx8fykgID/YlxqDV62J9G5/5g8xTpO0LsGamheQ75l1Orhw2lRNkuyiAib9jg==} peerDependencies: ethers: '>=6' + '@0xsequence/relayer@3.0.0-beta.5': + resolution: {integrity: sha512-dYRBDUzEfVLcgHJnSpKDc9xBEPYq+MZiMOhDrDRdqmgIuFVrReMAxzxEqfSLGcY5m8Cb3JcHfHnWxh4wD8fMCQ==} + + '@0xsequence/tee-verifier@0.1.2': + resolution: {integrity: sha512-7sKr8/T4newknx6LAukjlRI3siGiGhBnZohz2Z3jX0zb0EBQdKUq0L//A7CPSckHFPxTg/QvQU2v8e9x9GfkDw==} + + '@0xsequence/utils@2.3.34': + resolution: {integrity: sha512-4vJUNbQ1UNgr0XcipSOsMB4EglJyj3XlndNfuqRxMuXZAAyEmMVESyC6XjtDIdN26OclUJLj7EYOSlsRkS12Hw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/utils@2.3.35': + resolution: {integrity: sha512-e9DwgLnPcA+gY8pmgQ5GoS0ssY0myi76hyUhk4DGxytSWa2u+NeMEWTjFWwh9nYxTf4zhhWTQhF3cn8F1bkcJQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/wallet-core@3.0.0-beta.5': + resolution: {integrity: sha512-ZpAolXDEGuHjBsLhxKesdG8t6xzGN6l9TaxONs32t4TKY4hINeoTmotaFAK9k4XUm7DSG1zhG8BvSw31ybTrCw==} + + '@0xsequence/wallet-primitives@3.0.0-beta.5': + resolution: {integrity: sha512-+J7piX6C3dfBb/ftGBZi6D9uVe3XdXLt60vCOBzKkMICX5jr6Te7EJ8CmUpO9+qkdxtDLwLO36++ZsCTTVjKmA==} + + '@0xsequence/wallet-wdk@3.0.0-beta.5': + resolution: {integrity: sha512-Vvc599E0x9QsEWwPzbLXvOFflCjYc0phXdrmyeRxCeiDIff9q1GeLoxX399cJCBmvLWUzzLABcT23EhMdw/IUw==} + '@0xsquid/sdk@2.8.25': resolution: {integrity: sha512-fSMKVdKIX8G3qFpoTf3WfcyjhGdc9hE0uSu1bs1gsh4+iG19ILguDdrY8g87dUknt9PCKBb6TIt1QeYEgbXjdA==} @@ -2724,6 +2801,9 @@ packages: '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -3634,9 +3714,11 @@ packages: '@cosmjs/crypto@0.31.3': resolution: {integrity: sha512-vRbvM9ZKR2017TO73dtJ50KxoGcFzKtKI7C8iO302BQ5p+DuB+AirUg1952UpSoLfv5ki9O416MFANNg8UN/EQ==} + deprecated: This uses elliptic for cryptographic operations, which contains several security-relevant bugs. To what degree this affects your application is something you need to carefully investigate. See https://github.com/cosmos/cosmjs/issues/1708 for further pointers. Starting with version 0.34.0 the cryptographic library has been replaced. However, private keys might still be at risk. '@cosmjs/crypto@0.32.4': resolution: {integrity: sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==} + deprecated: This uses elliptic for cryptographic operations, which contains several security-relevant bugs. To what degree this affects your application is something you need to carefully investigate. See https://github.com/cosmos/cosmjs/issues/1708 for further pointers. Starting with version 0.34.0 the cryptographic library has been replaced. However, private keys might still be at risk. '@cosmjs/encoding@0.31.3': resolution: {integrity: sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg==} @@ -4364,18 +4446,18 @@ packages: resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} - '@imtbl/blockchain-data@2.1.11': - resolution: {integrity: sha512-FZtCxgBoDwNONdbLT61MiOzTG1+rMHC/Zt3ed0K79elISf73/v65SzhyHgumngOWkcUs25TiHw+jm2uU52JyBw==} + '@imtbl/blockchain-data@2.10.6': + resolution: {integrity: sha512-bYYsU3UzLn5gfTntKelk6QEcTcWnFLlUW9EmAS7wXJRq7YUOBpQa+bUiL7E0oNf7zFjRP3zhPqMsayg0AS3fcw==} - '@imtbl/bridge-sdk@2.1.11': - resolution: {integrity: sha512-EaXeMG+Ge17CT089wHipwYoJsGz/EeCLcEztTgIYpijA6R+4wb/jOtwnoCnOAWLHJE4Ep7wi366Xf7be5jTJWQ==} + '@imtbl/bridge-sdk@2.10.6': + resolution: {integrity: sha512-Wynb0Ze5IrFn1K9u0D0fm7p1ijmE+c5FwPfyA1rMe/jiHHeUNRkCngPfwAzuf0fwYRx8NeWtYzdfB/5xVgQyMg==} engines: {node: '>=20.11.0'} - '@imtbl/checkout-sdk@2.1.11': - resolution: {integrity: sha512-8PvuLX7T/3fGygug6fGGnAWRXFHpXkzV3wHgBcBekOe4K16Dl1wobgzyHoal6K90N/LId/ox38Hu3gPwe/yR6Q==} + '@imtbl/checkout-sdk@2.10.6': + resolution: {integrity: sha512-sPyeYobNmk3BZ4qNWucIhPKcrJJTRy+Nb25wrh5Pb2XJNYj7czbAkn+idrMKVpahlhx5PYFhbHmdFiJyfGcvcw==} - '@imtbl/config@2.1.11': - resolution: {integrity: sha512-6qJ579F6teAGn8Rsdi+lIHejh4KoyYoG5QPiykMwFV+vbX7rok4pT6cNkNDLHFu/ZGcNMP+w5+W3vzaOnG0pcQ==} + '@imtbl/config@2.10.6': + resolution: {integrity: sha512-ctRqrnT4r+5S62IZWqsMAXs1wCf/Ir48k+DrEf6B/VDF5+VZSEVtROrXT4urLuzR9B2VXE4EnnZtNLFpzu3k6w==} engines: {node: '>=20.11.0'} '@imtbl/contracts@2.2.17': @@ -4384,51 +4466,51 @@ packages: '@imtbl/contracts@2.2.6': resolution: {integrity: sha512-2cfE3Tojfp4GnxwVKSwoZY1CWd+/drCIbCKawyH9Nh2zASXd7VC71lo27aD5RnCweXHkZVhPzjqwQf/xrtnmIQ==} - '@imtbl/dex-sdk@2.1.11': - resolution: {integrity: sha512-Neo2/ZaeT/DW6xm9xJ4GCFAvVOuBDjawKpWu2jRcu2t15Kmjj0qHHv1yKF5DHlSRq20fktytd+uJQyqtnx/+WA==} + '@imtbl/dex-sdk@2.10.6': + resolution: {integrity: sha512-01z7n0nu5KeYB3G45zWwMd4Kx5VYHFDcPTciZ632NO8wThKbV3H7cUxJjxwbV0cSbZjYIxYGf1qzVwi24yJsGQ==} engines: {node: '>=20.11.0'} - '@imtbl/generated-clients@2.1.11': - resolution: {integrity: sha512-r0xEwQiLYE9hOYCB/q37yPIkREpvRF+JeqQ3tXELQcqMwgH7Rb30ISAN2dMuxXMgvLa9pG2P9rSEisQXLemjJQ==} + '@imtbl/generated-clients@2.10.6': + resolution: {integrity: sha512-5CGynaSzjz2q/nthzn7rE9wYAEqUT1putvOE2DXElBnod+nOBgfOO1XcYQOawMADv9bE7Q74RhEctcSOwyRCkw==} engines: {node: '>=20.11.0'} '@imtbl/image-resizer-utils@0.0.3': resolution: {integrity: sha512-/EOJKMJF4gD/Dv0qNhpUTpp2AgWeQ7XgYK9Xjl+xP2WWgaarNv1SHe1aeqSb8aZT5W7wSXdUGzn6TIxNsuCWGw==} - '@imtbl/metrics@2.1.11': - resolution: {integrity: sha512-d+WYjjbV4ufYL1xKr5mmxnbbkgWS5LKsJbZ8dTF0O7pICrsH2WY5J74R2RGjCVgfoWk28E67WTjsTJYwP+M5CA==} + '@imtbl/metrics@2.10.6': + resolution: {integrity: sha512-8uDkrTw4scfHBlztZbiD8HpTuTkkZNG6iyVjv28JpW9KbbktDEm41RboW6excbe1NDynsDFtHHZHsRDO94xjrA==} engines: {node: '>=20.11.0'} - '@imtbl/minting-backend@2.1.11': - resolution: {integrity: sha512-SgfOT+4nDMAxj5dq0pIrPyaXZ5fhUVgbfOGDoYGJd6x8jJ7utADFemLWWxZHII1/gTe5hg3xSkYR7uluzxvv+Q==} + '@imtbl/minting-backend@2.10.6': + resolution: {integrity: sha512-eEqBZVDPZXBK98lHqkDNBmwfYpYNreGE9lyG8m0QjgvNawemE23fvB/ccnSO5b2tJTq55PkUqOi5mzfomM2KYg==} - '@imtbl/orderbook@2.1.11': - resolution: {integrity: sha512-QKt+oc0AU4kQYCzRSBc0BRwkioZ30cfsmqzthtKU4OLg8H2ngjtt7qN9f6fylflJfHCI3T8spMJPvurH9qsK+w==} + '@imtbl/orderbook@2.10.6': + resolution: {integrity: sha512-fBhqH/r6E9HADyfggCnpTXC3lak0eSfYDLBHvA5SlegHnA/s5sbVaKLiGVCbbGrV0SrSmx5I7G39dxAAb2gTjQ==} - '@imtbl/passport@2.1.11': - resolution: {integrity: sha512-62bc8Dn/RwLJBQtGC8rR+UJ9wEPNUr1z9OlOK/YOezHR2RR9EAVyXaDkhquCN4LkZuw+iqYbu2OWWJ0ST3K8Eg==} + '@imtbl/passport@2.10.6': + resolution: {integrity: sha512-sy+67xSO2udtyXrP4tdjPhuWZprD5BxuGRdRFlRR5ofoKXVvwx7dgU4Ig/0eL0fkL9E6Jv7KXIdlTqLIHzr6jw==} engines: {node: '>=20.11.0'} '@imtbl/react-analytics@0.3.4-alpha': resolution: {integrity: sha512-4VWvfm8RZtpLub7+x2D2wNQ507nIVBCSAPA7B5lxdb0cKrHEujM6Y/HScMImHZHvgjUFQT1jiD9b2BL/DS43Pg==} - '@imtbl/sdk@2.1.11': - resolution: {integrity: sha512-w3oYF+THX6kL3kV/gRsAa9ca18QXb66jlGUPt//rEwOqu6M2mcpWb5V4R+SzR/gKp79OuSCzkPFKYF7kNqQOJw==} + '@imtbl/sdk@2.10.6': + resolution: {integrity: sha512-iLbxFlQgB3g298p5k7VxRVwPlddi78ujHKh2aROCtPc4WRfQyTyUgRQu0KJEv4UjiEDdvUami+NY+aHUdHWydQ==} engines: {node: '>=20.0.0'} - '@imtbl/toolkit@2.1.11': - resolution: {integrity: sha512-krQRFKF+UL7qDca2eWBwRwDLWv0p+JlNs/bCO8q9xvv5gOkUvTplbm0hA+SfTsacboDJ13MekN96n83TRvvCPg==} + '@imtbl/toolkit@2.10.6': + resolution: {integrity: sha512-UgPdxnRrdAFKkRqog4yXweqz8StQkz/RPfHu/33dHQvuOOE+dummEqcqdEiw09PDqZD6LY64b9fe9bsCbjfUgg==} engines: {node: '>=20.11.0'} - '@imtbl/webhook@2.1.11': - resolution: {integrity: sha512-0uoXONxwroH1VYuNwKbqxxyLE83EZRZSUz1Gvya7uZk4RG8vAmSFqsPnEfqca64B4SYePoa0qeu0Bq8+P24AJg==} + '@imtbl/webhook@2.10.6': + resolution: {integrity: sha512-g0a53tHSLHrfSu+qzy+qvCiGlBXnprQGe4CROlG7MPM9mEUDhSYYXCf8OmmbuOrDTWOB4SXv8MVK5qY9uCF/2A==} - '@imtbl/x-client@2.1.11': - resolution: {integrity: sha512-HLYbj6dqfFvry5xfI1d+Q2GF+w5w9UTmAD4G29vTW6rsQQGXeBtJE5R8foY+c1OIz4+kDuTZrrfXxiGnkQ4DRQ==} + '@imtbl/x-client@2.10.6': + resolution: {integrity: sha512-oNG1aI9e1q/GnkW3X72HZvrIb29h7T6OC6l/XdvqezI+1K4g4v/tPbHthu28nX2TyxAzBrxrN0xIZ3izuSN5QQ==} engines: {node: '>=20.11.0'} - '@imtbl/x-provider@2.1.11': - resolution: {integrity: sha512-MdAv353DLWJf2S4JeBJpbLsfDbBjRcEc7baLTLxZUesfVTO6Mh0KLvuZ2U0vPtyOv37rG0oeXzcmWaq8a3CGgQ==} + '@imtbl/x-provider@2.10.6': + resolution: {integrity: sha512-CJCmOPICd9vSRXs+7XmDrtS7VXrSVNNI5SpMicUhXx/MIO8eJTaAVnPitwws0qlYmCTP0fcIgNPfUoMSMBZ2nw==} engines: {node: '>=20.11.0'} '@ioredis/commands@1.2.0': @@ -4718,9 +4800,6 @@ packages: resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} engines: {node: '>=8'} - '@magic-ext/oidc@12.0.2': - resolution: {integrity: sha512-k7KdSprnOFQjyjO24qJX4qnrhZJjZBva2f32REpvo5sb37AbWaYcmA4F+FfhWhMXxwdHlzFwSkeWHgFvzInEgw==} - '@magic-ext/oidc@12.0.5': resolution: {integrity: sha512-EAmmRRZn/c5jmxHZ1H3IHtEqUKHYrsRtH9O+WuMFOZMv0llef/9MBa4DiRZkpnB0EPKb2hwsY7us8qk/LaFRNA==} @@ -5024,6 +5103,10 @@ packages: '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} @@ -5033,6 +5116,14 @@ packages: '@noble/curves@1.4.2': resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + '@noble/curves@1.9.1': + 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.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -5048,6 +5139,10 @@ packages: resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -6100,18 +6195,27 @@ packages: '@scure/base@1.1.7': resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@segment/analytics-core@1.3.0': resolution: {integrity: sha512-ujScWZH49NK1hYlp2/EMw45nOPEh+pmTydAnR6gSkRNucZD4fuinvpPL03rmFCw8ibaMuKLAdgPJfQ0gkLKZ5A==} @@ -7526,6 +7630,7 @@ packages: '@uniswap/swap-router-contracts@1.3.1': resolution: {integrity: sha512-mh/YNbwKb7Mut96VuEtL+Z5bRe0xVIbjjiryn+iMMrK2sFKhR4duk/86mEz0UO5gSx4pQIw9G5276P5heY/7Rg==} engines: {node: '>=10'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@uniswap/v2-core@1.0.1': resolution: {integrity: sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==} @@ -7588,6 +7693,7 @@ packages: '@walletconnect/ethereum-provider@2.13.0': resolution: {integrity: sha512-dnpW8mmLpWl1AZUYGYZpaAfGw1HFkL0WSlhk5xekx3IJJKn4pLacX2QeIOo0iNkzNQxZfux1AK4Grl1DvtzZEA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' '@walletconnect/events@1.0.1': resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} @@ -7629,6 +7735,7 @@ packages: '@walletconnect/modal@2.6.2': resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} + deprecated: Please follow the migration guide on https://docs.reown.com/appkit/upgrade/wcm '@walletconnect/relay-api@1.0.10': resolution: {integrity: sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw==} @@ -7641,6 +7748,7 @@ packages: '@walletconnect/sign-client@2.13.0': resolution: {integrity: sha512-En7KSvNUlQFx20IsYGsFgkNJ2lpvDvRsSFOT5PTdGskwCkUfOpB33SQJ6nCrN19gyoKPNvWg80Cy6MJI0TjNYA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} @@ -7750,6 +7858,28 @@ packages: zod: optional: true + abitype@1.1.0: + resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.1.2: + resolution: {integrity: sha512-mqpSSIuddHs7t3IgsAweIZgYIQT4RhpIzrdcSN4fvHp9d77O0mglAAQ7fnI3r/hHIvgMwdpJAKr2T9K9leccYw==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -8066,6 +8196,10 @@ packages: asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + asn1js@3.0.7: + resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==} + engines: {node: '>=12.0.0'} + assert@2.0.0: resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} @@ -8384,6 +8518,9 @@ packages: bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -8539,6 +8676,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + bytestreamjs@2.0.1: + 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'} @@ -8559,10 +8700,22 @@ packages: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} engines: {node: '>=4'} @@ -8614,6 +8767,10 @@ packages: caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + cbor2@1.12.0: + resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} + engines: {node: '>=18.7'} + cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} @@ -9230,6 +9387,9 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + cssauron@1.4.0: + resolution: {integrity: sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw==} + cssdb@7.6.0: resolution: {integrity: sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w==} @@ -9658,6 +9818,13 @@ packages: resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==} engines: {node: '>=4'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer2@0.0.2: + resolution: {integrity: sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==} + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -9821,6 +9988,10 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -9839,6 +10010,10 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} @@ -10081,8 +10256,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-refresh@0.4.19: - resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==} + eslint-plugin-react-refresh@0.4.24: + resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} peerDependencies: eslint: '>=8.40' @@ -10598,6 +10773,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} @@ -10776,6 +10955,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -10798,6 +10981,10 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} @@ -10925,6 +11112,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} @@ -11008,6 +11199,10 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -11110,6 +11305,10 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-inline@1.2.0: + resolution: {integrity: sha512-7W6IV2bQVesdyJkrrZyu2Wk8jPQ1FyCa2y9xDURqHrCrI1HkJK85D1jzCuBTJhal6rQB+t3YBAqcDgSnohTzTw==} + hasBin: true + html-minifier-terser@6.1.0: resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} engines: {node: '>=12'} @@ -11118,6 +11317,14 @@ packages: html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + html-select@2.3.24: + resolution: {integrity: sha512-kQ+YZoVQ8Aux6bUqMVc0iufcZOv03+xYZ4J5v2beT5wkNrW/e2roZ8pnU4LunVOVBGFkbodFKR0TvuMkTdyrJQ==} + hasBin: true + + html-tokenize@1.2.5: + resolution: {integrity: sha512-7sCme3w9Hiv/kfL6sO6ePTGAV5fY6P7WDZyOs0zfXXU8vsS1ps1CQfGe0J1yuAdcCnOJ9h66RLYX/e9Cife8yw==} + hasBin: true + html-webpack-plugin@5.5.3: resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} engines: {node: '>=10.13.0'} @@ -11281,6 +11488,9 @@ packages: idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + idb@8.0.3: + resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} + identity-obj-proxy@3.0.0: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} engines: {node: '>=4'} @@ -11327,6 +11537,9 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + indexof@0.0.1: + resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -11619,6 +11832,10 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -11663,6 +11880,9 @@ packages: resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} engines: {node: '>=18'} + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -11701,6 +11921,11 @@ packages: peerDependencies: ws: '*' + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -12253,6 +12478,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-canonicalize@2.0.0: + resolution: {integrity: sha512-yyrnK/mEm6Na3ChbJUWueXdapueW0p380RUyTW87XGb1ww8l8hU0pRrGC3vSWHe9CxrbPHX2fGUOZpNiHR0IIg==} + json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -12701,6 +12929,10 @@ packages: marky@1.2.5: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} @@ -12899,6 +13131,12 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@0.0.10: + resolution: {integrity: sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==} + + minimist@1.1.3: + resolution: {integrity: sha512-2RbeLaM/Hbo9vJ1+iRrxzfDnX9108qb2m923U+s+Ot2eMey0IYGdSjzHmvtg2XsxoCuMnzOMw7qc573RvnLgwg==} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -13300,6 +13538,9 @@ packages: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} + object-keys@0.4.0: + resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -13348,10 +13589,6 @@ packages: ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} - oidc-client-ts@2.4.0: - resolution: {integrity: sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==} - engines: {node: '>=12.13.0'} - oidc-client-ts@3.3.0: resolution: {integrity: sha512-t13S540ZwFOEZKLYHJwSfITugupW4uYLwuQSSXyKH/wHwZ+7FvgHE7gnNJh1YQIZ1Yd1hKSRjqeXGSUtS0r9JA==} engines: {node: '>=18'} @@ -13446,6 +13683,30 @@ packages: outvariant@1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} + ox@0.9.14: + resolution: {integrity: sha512-lxZYCzGH00WtIPPrqXCrbSW/ZiKjigfII6R0Vu1eH2GpobmcwVheiivbCvsBZzmVZcNpwkabSamPP+ZNtdnKIQ==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.9.17: + resolution: {integrity: sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.9.6: + resolution: {integrity: sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + oxc-resolver@1.11.0: resolution: {integrity: sha512-N3qMse2AM7uST8PaiUMXZkcACyGAMN073tomyvzHTICSzaOqKHvVS0IZ3vj/OqoE140QP4CyOiWmgC1Hw5Urmg==} @@ -13761,6 +14022,10 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + pkijs@3.3.3: + resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==} + engines: {node: '>=16.0.0'} + playwright-core@1.45.3: resolution: {integrity: sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==} engines: {node: '>=18'} @@ -14428,6 +14693,13 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -14668,6 +14940,12 @@ packages: resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} engines: {node: '>=10.13'} + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -14683,6 +14961,9 @@ packages: resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} engines: {node: '>=8'} + readable-wrap@1.0.0: + resolution: {integrity: sha512-/8n0Mr10S+HGKFygQ42Z40JIXwafPH3A72pwmlNClThgsImV5LJJiCue5Je1asxwY082sYxq/+kTxH6nTn0w3g==} + readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} @@ -15199,6 +15480,11 @@ packages: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + sha1@1.1.1: resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} @@ -15407,6 +15693,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -15455,6 +15742,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} @@ -15532,6 +15822,9 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + stream-splicer@1.3.2: + resolution: {integrity: sha512-nmUMEbdm/sZYqe9dZs7mqJvTYpunsDbIWI5FiBCMc/hMVd6vwzy+ITmo7C3gcLYqrn+uQ1w+EJwooWvJ997JAA==} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -15611,6 +15904,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -15931,6 +16227,15 @@ packages: throat@6.0.2: resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + through2@0.4.2: + resolution: {integrity: sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==} + + through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + + through2@1.1.1: + resolution: {integrity: sha512-zEbpaeSMHxczpTzO1KkMHjBC1enTA68ojeaZGG4toqdASpb9t4xUZaYFBq2/9OHo5nTGFVSYd4c910OR+6wxbQ==} + through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -15983,6 +16288,10 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + to-object-path@0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} @@ -16044,6 +16353,9 @@ packages: resolution: {integrity: sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==} engines: {node: '>=12'} + trumpet@1.7.2: + resolution: {integrity: sha512-hqVDLz5yp+vhRGjAvbomuo4+pjzQIbXe9JE/HPm9s4iEuf2Ew5jzgwQf+2HLpqFXZpRD8VgKPOYM8wyKmqIklg==} + tryer@1.0.1: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} @@ -16164,6 +16476,9 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} @@ -16266,6 +16581,10 @@ packages: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} @@ -16563,6 +16882,10 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -16617,6 +16940,14 @@ packages: typescript: optional: true + viem@2.41.2: + resolution: {integrity: sha512-LYliajglBe1FU6+EH9mSWozp+gRA/QcHfxeD9Odf83AdH5fwUS7DroH4gHvlv6Sshqi1uXrYFA2B/EOczxd15g==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + vite-plugin-node-polyfills@0.16.0: resolution: {integrity: sha512-uj1ymOmk7TliMxiivmXokpMY5gVMBpFPSZPLQSCv/LjkJGGKwyLjpbFL64dbYZEdFSUQ3tM7pbrxNh25yvhqOA==} peerDependencies: @@ -16847,6 +17178,10 @@ packages: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -17010,6 +17345,18 @@ packages: utf-8-validate: optional: true + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + 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 + ws@8.5.0: resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} engines: {node: '>=10.0.0'} @@ -17043,6 +17390,10 @@ packages: xstream@11.14.0: resolution: {integrity: sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==} + xtend@2.1.2: + resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} + engines: {node: '>=0.4'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -17138,19 +17489,121 @@ packages: snapshots: - '@0xsequence/abi@2.2.13': {} + '@0xsequence/abi@2.3.34': {} + + '@0xsequence/abi@2.3.35': {} + + '@0xsequence/core@2.3.34(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.34 + '@0xsequence/utils': 2.3.34(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + '@0xsequence/core@2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.35 + '@0xsequence/utils': 2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + '@0xsequence/guard@3.0.0-beta.5(typescript@5.6.2)': + dependencies: + ox: 0.9.17(typescript@5.6.2) + transitivePeerDependencies: + - typescript + - zod + + '@0xsequence/identity-instrument@3.0.0-beta.5(typescript@5.6.2)': + dependencies: + json-canonicalize: 2.0.0 + jwt-decode: 4.0.0 + ox: 0.9.17(typescript@5.6.2) + transitivePeerDependencies: + - typescript + - zod + + '@0xsequence/indexer@2.3.35': {} - '@0xsequence/core@2.2.13(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@0xsequence/network@2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - '@0xsequence/abi': 2.2.13 - '@0xsequence/utils': 2.2.13(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@0xsequence/core': 2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@0xsequence/indexer': 2.3.35 + '@0xsequence/relayer': 2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@0xsequence/utils@2.2.13(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@0xsequence/relayer@2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.35 + '@0xsequence/core': 2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + '@0xsequence/relayer@3.0.0-beta.5(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/wallet-primitives': 3.0.0-beta.5(typescript@5.6.2) + mipd: 0.0.7(typescript@5.6.2) + ox: 0.9.17(typescript@5.6.2) + viem: 2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@0xsequence/tee-verifier@0.1.2': + dependencies: + cbor2: 1.12.0 + pkijs: 3.3.3 + + '@0xsequence/utils@2.3.34(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) js-base64: 3.7.7 + '@0xsequence/utils@2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + js-base64: 3.7.7 + + '@0xsequence/wallet-core@3.0.0-beta.5(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/guard': 3.0.0-beta.5(typescript@5.6.2) + '@0xsequence/relayer': 3.0.0-beta.5(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': 3.0.0-beta.5(typescript@5.6.2) + mipd: 0.0.7(typescript@5.6.2) + ox: 0.9.17(typescript@5.6.2) + viem: 2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@0xsequence/wallet-primitives@3.0.0-beta.5(typescript@5.6.2)': + dependencies: + ox: 0.9.17(typescript@5.6.2) + transitivePeerDependencies: + - typescript + - zod + + '@0xsequence/wallet-wdk@3.0.0-beta.5(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/guard': 3.0.0-beta.5(typescript@5.6.2) + '@0xsequence/identity-instrument': 3.0.0-beta.5(typescript@5.6.2) + '@0xsequence/relayer': 3.0.0-beta.5(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/tee-verifier': 0.1.2 + '@0xsequence/wallet-core': 3.0.0-beta.5(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': 3.0.0-beta.5(typescript@5.6.2) + idb: 8.0.3 + jwt-decode: 4.0.0 + ox: 0.9.17(typescript@5.6.2) + uuid: 13.0.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + '@0xsquid/sdk@2.8.25(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@cosmjs/cosmwasm-stargate': 0.32.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -17198,6 +17651,8 @@ snapshots: '@adraffy/ens-normalize@1.10.1': {} + '@adraffy/ens-normalize@1.11.1': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.2.1': @@ -19055,7 +19510,7 @@ snapshots: '@coinbase/wallet-sdk@3.9.3': dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 buffer: 6.0.3 clsx: 1.2.1 eth-block-tracker: 7.1.0 @@ -19063,7 +19518,7 @@ snapshots: eventemitter3: 5.0.1 keccak: 3.0.4 preact: 10.23.1 - sha.js: 2.4.11 + sha.js: 2.4.12 transitivePeerDependencies: - supports-color @@ -19078,7 +19533,7 @@ snapshots: '@confio/ics23@0.6.8': dependencies: - '@noble/hashes': 1.5.0 + '@noble/hashes': 1.8.0 protobufjs: 6.11.4 '@cosmjs/amino@0.31.3': @@ -19117,8 +19572,8 @@ snapshots: '@cosmjs/encoding': 0.31.3 '@cosmjs/math': 0.31.3 '@cosmjs/utils': 0.31.3 - '@noble/hashes': 1.5.0 - bn.js: 5.2.1 + '@noble/hashes': 1.8.0 + bn.js: 5.2.2 elliptic: 6.6.1 libsodium-wrappers-sumo: 0.7.15 @@ -19127,7 +19582,7 @@ snapshots: '@cosmjs/encoding': 0.32.4 '@cosmjs/math': 0.32.4 '@cosmjs/utils': 0.32.4 - '@noble/hashes': 1.5.0 + '@noble/hashes': 1.8.0 bn.js: 5.2.1 elliptic: 6.6.1 libsodium-wrappers-sumo: 0.7.15 @@ -19161,7 +19616,7 @@ snapshots: '@cosmjs/math@0.31.3': dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 '@cosmjs/math@0.32.4': dependencies: @@ -20041,17 +20496,17 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} - '@imtbl/blockchain-data@2.1.11': + '@imtbl/blockchain-data@2.10.6': dependencies: - '@imtbl/config': 2.1.11 - '@imtbl/generated-clients': 2.1.11 + '@imtbl/config': 2.10.6 + '@imtbl/generated-clients': 2.10.6 axios: 1.7.7 transitivePeerDependencies: - debug - '@imtbl/bridge-sdk@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/bridge-sdk@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.1.11 + '@imtbl/config': 2.10.6 '@jest/globals': 29.7.0 axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20061,16 +20516,16 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/checkout-sdk@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/checkout-sdk@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/blockchain-data': 2.1.11 - '@imtbl/bridge-sdk': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/config': 2.1.11 - '@imtbl/dex-sdk': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/generated-clients': 2.1.11 - '@imtbl/metrics': 2.1.11 - '@imtbl/orderbook': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/passport': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/blockchain-data': 2.10.6 + '@imtbl/bridge-sdk': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/config': 2.10.6 + '@imtbl/dex-sdk': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/generated-clients': 2.10.6 + '@imtbl/metrics': 2.10.6 + '@imtbl/orderbook': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/passport': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metamask/detect-provider': 2.0.0 axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20083,9 +20538,9 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/config@2.1.11': + '@imtbl/config@2.10.6': dependencies: - '@imtbl/metrics': 2.1.11 + '@imtbl/metrics': 2.10.6 transitivePeerDependencies: - debug @@ -20132,9 +20587,9 @@ snapshots: - typescript - utf-8-validate - '@imtbl/dex-sdk@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/dex-sdk@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.1.11 + '@imtbl/config': 2.10.6 '@uniswap/sdk-core': 3.2.3 '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) @@ -20145,7 +20600,7 @@ snapshots: - hardhat - utf-8-validate - '@imtbl/generated-clients@2.1.11': + '@imtbl/generated-clients@2.10.6': dependencies: axios: 1.7.7 transitivePeerDependencies: @@ -20155,7 +20610,7 @@ snapshots: dependencies: buffer: 6.0.3 - '@imtbl/metrics@2.1.11': + '@imtbl/metrics@2.10.6': dependencies: axios: 1.7.7 global-const: 0.1.2 @@ -20163,13 +20618,13 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/minting-backend@2.1.11': + '@imtbl/minting-backend@2.10.6': dependencies: - '@imtbl/blockchain-data': 2.1.11 - '@imtbl/config': 2.1.11 - '@imtbl/generated-clients': 2.1.11 - '@imtbl/metrics': 2.1.11 - '@imtbl/webhook': 2.1.11 + '@imtbl/blockchain-data': 2.10.6 + '@imtbl/config': 2.10.6 + '@imtbl/generated-clients': 2.10.6 + '@imtbl/metrics': 2.10.6 + '@imtbl/webhook': 2.10.6 uuid: 8.3.2 optionalDependencies: pg: 8.11.5 @@ -20178,10 +20633,10 @@ snapshots: - debug - pg-native - '@imtbl/orderbook@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/orderbook@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.1.11 - '@imtbl/metrics': 2.1.11 + '@imtbl/config': 2.10.6 + '@imtbl/metrics': 2.10.6 '@opensea/seaport-js': 4.0.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20192,17 +20647,17 @@ snapshots: - debug - utf-8-validate - '@imtbl/passport@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': - dependencies: - '@0xsequence/abi': 2.2.13 - '@0xsequence/core': 2.2.13(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@imtbl/config': 2.1.11 - '@imtbl/generated-clients': 2.1.11 - '@imtbl/metrics': 2.1.11 - '@imtbl/toolkit': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-client': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-provider': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@magic-ext/oidc': 12.0.2 + '@imtbl/passport@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/abi': 2.3.34 + '@0xsequence/core': 2.3.34(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@imtbl/config': 2.10.6 + '@imtbl/generated-clients': 2.10.6 + '@imtbl/metrics': 2.10.6 + '@imtbl/toolkit': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-provider': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@magic-ext/oidc': 12.0.5 '@magic-sdk/provider': 29.0.5(localforage@1.10.0) '@metamask/detect-provider': 2.0.0 axios: 1.7.7 @@ -20211,7 +20666,7 @@ snapshots: jwt-decode: 3.1.2 localforage: 1.10.0 magic-sdk: 29.0.5 - oidc-client-ts: 2.4.0 + oidc-client-ts: 3.3.0 uuid: 8.3.2 transitivePeerDependencies: - bufferutil @@ -20226,17 +20681,17 @@ snapshots: - encoding - supports-color - '@imtbl/sdk@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/sdk@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/blockchain-data': 2.1.11 - '@imtbl/checkout-sdk': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/config': 2.1.11 - '@imtbl/minting-backend': 2.1.11 - '@imtbl/orderbook': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/passport': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/webhook': 2.1.11 - '@imtbl/x-client': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-provider': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/blockchain-data': 2.10.6 + '@imtbl/checkout-sdk': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/config': 2.10.6 + '@imtbl/minting-backend': 2.10.6 + '@imtbl/orderbook': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/passport': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/webhook': 2.10.6 + '@imtbl/x-client': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-provider': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -20245,37 +20700,37 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/toolkit@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/toolkit@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/x-client': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@magic-ext/oidc': 12.0.2 + '@imtbl/x-client': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@magic-ext/oidc': 12.0.5 '@metamask/detect-provider': 2.0.0 axios: 1.7.7 - bn.js: 5.2.1 + bn.js: 5.2.2 enc-utils: 3.0.0 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) magic-sdk: 29.0.5 - oidc-client-ts: 2.4.0 + oidc-client-ts: 3.3.0 transitivePeerDependencies: - bufferutil - debug - utf-8-validate - '@imtbl/webhook@2.1.11': + '@imtbl/webhook@2.10.6': dependencies: - '@imtbl/config': 2.1.11 - '@imtbl/generated-clients': 2.1.11 + '@imtbl/config': 2.10.6 + '@imtbl/generated-clients': 2.10.6 sns-validator: 0.3.5 transitivePeerDependencies: - debug - '@imtbl/x-client@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/x-client@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethereumjs/wallet': 2.0.4 - '@imtbl/config': 2.1.11 - '@imtbl/generated-clients': 2.1.11 + '@imtbl/config': 2.10.6 + '@imtbl/generated-clients': 2.10.6 axios: 1.7.7 - bn.js: 5.2.1 + bn.js: 5.2.2 elliptic: 6.6.1 enc-utils: 3.0.0 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20285,19 +20740,19 @@ snapshots: - debug - utf-8-validate - '@imtbl/x-provider@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/x-provider@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.1.11 - '@imtbl/generated-clients': 2.1.11 - '@imtbl/toolkit': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-client': 2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@magic-ext/oidc': 12.0.2 + '@imtbl/config': 2.10.6 + '@imtbl/generated-clients': 2.10.6 + '@imtbl/toolkit': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@magic-ext/oidc': 12.0.5 '@metamask/detect-provider': 2.0.0 axios: 1.7.7 enc-utils: 3.0.0 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) magic-sdk: 29.0.5 - oidc-client-ts: 2.4.0 + oidc-client-ts: 3.3.0 transitivePeerDependencies: - bufferutil - debug @@ -20978,8 +21433,6 @@ snapshots: dependencies: '@lukeed/csprng': 1.1.0 - '@magic-ext/oidc@12.0.2': {} - '@magic-ext/oidc@12.0.5': {} '@magic-sdk/commons@25.0.5(@magic-sdk/provider@29.0.5(localforage@1.10.0))(@magic-sdk/types@24.18.1)': @@ -21150,8 +21603,8 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@metamask/superstruct': 3.1.0 - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 '@types/debug': 4.1.8 debug: 4.3.7(supports-color@8.1.1) pony-cause: 2.1.11 @@ -21164,8 +21617,8 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@metamask/superstruct': 3.1.0 - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 '@types/debug': 4.1.8 debug: 4.3.7(supports-color@8.1.1) pony-cause: 2.1.11 @@ -21210,13 +21663,13 @@ snapshots: '@motionone/easing@10.17.0': dependencies: '@motionone/utils': 10.17.0 - tslib: 2.7.0 + tslib: 2.8.1 '@motionone/generators@10.17.0': dependencies: '@motionone/types': 10.17.0 '@motionone/utils': 10.17.0 - tslib: 2.7.0 + tslib: 2.8.1 '@motionone/svelte@10.16.4': dependencies: @@ -21363,6 +21816,8 @@ snapshots: dependencies: eslint-scope: 5.1.1 + '@noble/ciphers@1.3.0': {} + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 @@ -21375,6 +21830,14 @@ snapshots: dependencies: '@noble/hashes': 1.4.0 + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} @@ -21383,6 +21846,8 @@ snapshots: '@noble/hashes@1.5.0': {} + '@noble/hashes@1.8.0': {} + '@noble/secp256k1@1.7.1': {} '@nodelib/fs.scandir@2.1.5': @@ -22809,14 +23274,14 @@ snapshots: optionalDependencies: rollup: 4.28.0 - '@rollup/plugin-typescript@11.1.6(rollup@4.28.0)(tslib@2.7.0)(typescript@5.6.2)': + '@rollup/plugin-typescript@11.1.6(rollup@4.28.0)(tslib@2.8.1)(typescript@5.6.2)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.28.0) resolve: 1.22.8 typescript: 5.6.2 optionalDependencies: rollup: 4.28.0 - tslib: 2.7.0 + tslib: 2.8.1 '@rollup/pluginutils@3.1.0(rollup@2.79.1)': dependencies: @@ -22902,7 +23367,7 @@ snapshots: '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.22.1 - viem: 2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + viem: 2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - typescript @@ -22913,6 +23378,8 @@ snapshots: '@scure/base@1.1.7': {} + '@scure/base@1.2.6': {} + '@scure/bip32@1.1.5': dependencies: '@noble/hashes': 1.2.0 @@ -22925,6 +23392,12 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.7 + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 @@ -22935,6 +23408,11 @@ snapshots: '@noble/hashes': 1.4.0 '@scure/base': 1.1.7 + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@segment/analytics-core@1.3.0': dependencies: '@lukeed/uuid': 2.0.1 @@ -24799,17 +25277,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@wagmi/connectors@5.1.1(@types/react@18.3.12)(@wagmi/core@2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@wagmi/connectors@5.1.1(@types/react@18.3.12)(@wagmi/core@2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@coinbase/wallet-sdk': 4.0.4 '@metamask/sdk': 0.26.5(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) - '@wagmi/core': 2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@wagmi/core': 2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) '@walletconnect/ethereum-provider': 2.13.0(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10) '@walletconnect/modal': 2.6.2(@types/react@18.3.12)(react@18.3.1) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + viem: 2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -24836,11 +25314,11 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@wagmi/core@2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.6.2) - viem: 2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + viem: 2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) zustand: 4.4.1(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1) optionalDependencies: '@tanstack/query-core': 5.51.15 @@ -25267,6 +25745,14 @@ snapshots: optionalDependencies: typescript: 5.6.2 + abitype@1.1.0(typescript@5.6.2): + optionalDependencies: + typescript: 5.6.2 + + abitype@1.1.2(typescript@5.6.2): + optionalDependencies: + typescript: 5.6.2 + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -25609,6 +26095,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 + asn1js@3.0.7: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + assert@2.0.0: dependencies: es6-object-assign: 1.1.0 @@ -25624,7 +26116,7 @@ snapshots: ast-types@0.15.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 astral-regex@1.0.0: {} @@ -25636,7 +26128,7 @@ snapshots: async-mutex@0.2.6: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 async@1.5.2: {} @@ -26108,6 +26600,8 @@ snapshots: bn.js@5.2.1: {} + bn.js@5.2.2: {} + body-parser@1.20.1: dependencies: bytes: 3.1.2 @@ -26219,12 +26713,12 @@ snapshots: browserify-rsa@4.1.0: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 randombytes: 2.1.0 browserify-sign@4.2.1: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 browserify-rsa: 4.1.0 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -26318,6 +26812,8 @@ snapshots: bytes@3.1.2: {} + bytestreamjs@2.0.1: {} + cac@6.7.14: {} cacache@17.1.3: @@ -26359,6 +26855,11 @@ snapshots: normalize-url: 6.1.0 responselike: 2.0.1 + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -26367,6 +26868,18 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + caller-callsite@2.0.0: dependencies: callsites: 2.0.0 @@ -26409,6 +26922,8 @@ snapshots: caseless@0.12.0: {} + cbor2@1.12.0: {} + cbor@8.1.0: dependencies: nofilter: 3.1.0 @@ -26902,7 +27417,7 @@ snapshots: inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 - sha.js: 2.4.11 + sha.js: 2.4.12 create-hmac@1.1.7: dependencies: @@ -26911,7 +27426,7 @@ snapshots: inherits: 2.0.4 ripemd160: 2.0.2 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: @@ -27109,6 +27624,10 @@ snapshots: css.escape@1.5.1: {} + cssauron@1.4.0: + dependencies: + through: 2.3.8 + cssdb@7.6.0: {} cssesc@3.0.0: {} @@ -27537,6 +28056,16 @@ snapshots: dset@3.1.2: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer2@0.0.2: + dependencies: + readable-stream: 1.1.14 + duplexer@0.1.2: {} duplexify@4.1.2: @@ -27740,6 +28269,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-get-iterator@1.1.3: @@ -27777,6 +28308,10 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 @@ -28378,7 +28913,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react-refresh@0.4.19(eslint@8.57.0): + eslint-plugin-react-refresh@0.4.24(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -28711,7 +29246,7 @@ snapshots: ethereumjs-util@7.1.5: dependencies: '@types/bn.js': 5.1.6 - bn.js: 5.2.1 + bn.js: 5.2.2 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 @@ -29270,6 +29805,10 @@ snapshots: dependencies: is-callable: 1.2.7 + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + for-in@1.0.2: {} foreground-child@3.1.1: @@ -29473,6 +30012,19 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-own-enumerable-property-symbols@3.0.2: {} get-package-type@0.1.0: {} @@ -29485,6 +30037,11 @@ snapshots: get-port@5.1.1: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@3.0.0: {} get-stream@4.1.0: @@ -29661,6 +30218,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + got@11.8.6: dependencies: '@sindresorhus/is': 4.6.0 @@ -29908,6 +30467,8 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -30014,6 +30575,12 @@ snapshots: html-escaper@2.0.2: {} + html-inline@1.2.0: + dependencies: + minimist: 1.1.3 + through2: 0.6.5 + trumpet: 1.7.2 + html-minifier-terser@6.1.0: dependencies: camel-case: 4.1.2 @@ -30028,6 +30595,24 @@ snapshots: dependencies: void-elements: 3.1.0 + html-select@2.3.24: + dependencies: + cssauron: 1.4.0 + duplexer2: 0.0.2 + inherits: 2.0.4 + minimist: 0.0.10 + readable-stream: 1.1.14 + split: 0.3.3 + stream-splicer: 1.3.2 + through2: 1.1.1 + + html-tokenize@1.2.5: + dependencies: + inherits: 2.0.4 + minimist: 0.0.10 + readable-stream: 1.0.34 + through2: 0.4.2 + html-webpack-plugin@5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -30217,6 +30802,8 @@ snapshots: idb@7.1.1: {} + idb@8.0.3: {} + identity-obj-proxy@3.0.0: dependencies: harmony-reflect: 1.6.2 @@ -30254,6 +30841,8 @@ snapshots: indent-string@4.0.0: {} + indexof@0.0.1: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -30512,6 +31101,10 @@ snapshots: dependencies: which-typed-array: 1.1.15 + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: {} @@ -30547,6 +31140,8 @@ snapshots: dependencies: system-architecture: 0.1.0 + isarray@0.0.1: {} + isarray@1.0.0: {} isarray@2.0.5: {} @@ -30578,6 +31173,10 @@ snapshots: dependencies: ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + isows@1.0.7(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@4.0.3: @@ -32168,6 +32767,8 @@ snapshots: json-buffer@3.0.1: {} + json-canonicalize@2.0.0: {} + json-parse-better-errors@1.0.2: {} json-parse-even-better-errors@2.3.1: {} @@ -32551,7 +33152,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 lowercase-keys@2.0.0: {} @@ -32649,6 +33250,8 @@ snapshots: marky@1.2.5: {} + math-intrinsics@1.1.0: {} + md5.js@1.3.5: dependencies: hash-base: 3.1.0 @@ -32950,6 +33553,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimist@0.0.10: {} + + minimist@1.1.3: {} + minimist@1.2.8: {} minipass-collect@1.0.2: @@ -33234,7 +33841,7 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.7.0 + tslib: 2.8.1 nocache@3.0.4: {} @@ -33501,6 +34108,8 @@ snapshots: call-bind: 1.0.7 define-properties: 1.2.1 + object-keys@0.4.0: {} + object-keys@1.1.1: {} object-visit@1.0.1: @@ -33563,11 +34172,6 @@ snapshots: ohash@1.1.3: {} - oidc-client-ts@2.4.0: - dependencies: - crypto-js: 4.2.0 - jwt-decode: 3.1.2 - oidc-client-ts@3.3.0: dependencies: jwt-decode: 4.0.0 @@ -33689,6 +34293,51 @@ snapshots: outvariant@1.4.0: {} + ox@0.9.14(typescript@5.6.2): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.1.2(typescript@5.6.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - zod + + ox@0.9.17(typescript@5.6.2): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.1.2(typescript@5.6.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - zod + + ox@0.9.6(typescript@5.6.2): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.1.2(typescript@5.6.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - zod + oxc-resolver@1.11.0: optionalDependencies: '@oxc-resolver/binding-darwin-arm64': 1.11.0 @@ -33825,7 +34474,7 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 pascalcase@0.1.1: {} @@ -33875,7 +34524,7 @@ snapshots: create-hmac: 1.1.7 ripemd160: 2.0.2 safe-buffer: 5.2.1 - sha.js: 2.4.11 + sha.js: 2.4.12 peek-readable@5.1.0: {} @@ -34035,6 +34684,15 @@ snapshots: dependencies: find-up: 3.0.0 + pkijs@3.3.3: + dependencies: + '@noble/hashes': 1.4.0 + asn1js: 3.0.7 + bytestreamjs: 2.0.1 + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + playwright-core@1.45.3: {} playwright@1.45.3: @@ -34709,6 +35367,12 @@ snapshots: pure-rand@6.1.0: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.5: {} + q@1.5.1: {} qr-code-styling@1.6.0-rc.1: @@ -35301,6 +35965,20 @@ snapshots: js-yaml: 4.1.0 strip-bom: 4.0.0 + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@1.1.14: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -35329,6 +36007,10 @@ snapshots: dependencies: readable-stream: 3.6.2 + readable-wrap@1.0.0: + dependencies: + readable-stream: 1.1.14 + readdir-glob@1.1.3: dependencies: minimatch: 5.1.6 @@ -35350,7 +36032,7 @@ snapshots: ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.7.0 + tslib: 2.8.1 rechoir@0.6.2: dependencies: @@ -35552,7 +36234,7 @@ snapshots: rlp@2.2.7: dependencies: - bn.js: 5.2.1 + bn.js: 5.2.2 rollup-plugin-polyfill-node@0.13.0(rollup@4.28.0): dependencies: @@ -35916,6 +36598,12 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + sha1@1.1.1: dependencies: charenc: 0.0.2 @@ -36236,6 +36924,10 @@ snapshots: split2@4.2.0: {} + split@0.3.3: + dependencies: + through: 2.3.8 + split@1.0.1: dependencies: through: 2.3.8 @@ -36312,6 +37004,15 @@ snapshots: stream-shift@1.0.3: {} + stream-splicer@1.3.2: + dependencies: + indexof: 0.0.1 + inherits: 2.0.4 + isarray: 0.0.1 + readable-stream: 1.1.14 + readable-wrap: 1.0.0 + through2: 1.1.1 + streamsearch@1.1.0: {} streamx@2.18.0: @@ -36421,6 +37122,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string_decoder@0.10.31: {} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -36883,6 +37586,21 @@ snapshots: throat@6.0.2: {} + through2@0.4.2: + dependencies: + readable-stream: 1.0.34 + xtend: 2.1.2 + + through2@0.6.5: + dependencies: + readable-stream: 1.0.34 + xtend: 4.0.2 + + through2@1.1.1: + dependencies: + readable-stream: 1.1.14 + xtend: 4.0.2 + through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -36923,6 +37641,12 @@ snapshots: tmpl@1.0.5: {} + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + to-object-path@0.3.0: dependencies: kind-of: 3.2.2 @@ -36983,6 +37707,15 @@ snapshots: dependencies: escape-string-regexp: 5.0.0 + trumpet@1.7.2: + dependencies: + duplexer2: 0.0.2 + html-select: 2.3.24 + html-tokenize: 1.2.5 + inherits: 2.0.4 + readable-stream: 1.1.14 + through2: 1.1.1 + tryer@1.0.1: {} ts-command-line-args@2.5.1: @@ -37240,6 +37973,8 @@ snapshots: tslib@2.7.0: {} + tslib@2.8.1: {} + tsort@0.0.1: {} tsup@8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0): @@ -37338,6 +38073,12 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.13 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -37611,6 +38352,8 @@ snapshots: utils-merge@1.0.1: {} + uuid@13.0.0: {} + uuid@8.3.2: {} uuid@9.0.1: {} @@ -37670,6 +38413,23 @@ snapshots: - utf-8-validate - zod + viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10): + 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.6.2) + isows: 1.0.7(ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + ox: 0.9.6(typescript@5.6.2) + ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + vite-plugin-node-polyfills@0.16.0(rollup@4.28.0)(vite@5.4.7(@types/node@18.15.13)(lightningcss@1.21.5)(terser@5.34.1)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.28.0) @@ -37709,14 +38469,14 @@ snapshots: dependencies: xml-name-validator: 4.0.0 - wagmi@2.12.1(@tanstack/query-core@5.51.15)(@tanstack/react-query@5.51.15(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)): + wagmi@2.12.1(@tanstack/query-core@5.51.15)(@tanstack/react-query@5.51.15(react@18.3.1))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)): dependencies: '@tanstack/react-query': 5.51.15(react@18.3.1) - '@wagmi/connectors': 5.1.1(@types/react@18.3.12)(@wagmi/core@2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@wagmi/core': 2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@wagmi/connectors': 5.1.1(@types/react@18.3.12)(@wagmi/core@2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.3(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.28.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@wagmi/core': 2.13.1(@tanstack/query-core@5.51.15)(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1)(typescript@5.6.2)(viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) react: 18.3.1 use-sync-external-store: 1.2.0(react@18.3.1) - viem: 2.18.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + viem: 2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -37989,6 +38749,16 @@ snapshots: gopd: 1.0.1 has-tostringtag: 1.0.2 + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@1.3.1: dependencies: isexe: 2.0.0 @@ -38207,6 +38977,11 @@ snapshots: bufferutil: 4.0.8 utf-8-validate: 5.0.10 + ws@8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + ws@8.5.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.8 @@ -38237,6 +39012,10 @@ snapshots: globalthis: 1.0.4 symbol-observable: 2.0.3 + xtend@2.1.2: + dependencies: + object-keys: 0.4.0 + xtend@4.0.2: {} xxhash-wasm@0.4.2: {} diff --git a/tsup.config.js b/tsup.config.js index 91eb602d97..f39a590fe5 100644 --- a/tsup.config.js +++ b/tsup.config.js @@ -25,7 +25,19 @@ export default defineConfig((options) => { target: 'es2022', minify: true, bundle: true, - noExternal: ['@uniswap/swap-router-contracts'], + noExternal: [ + '@uniswap/swap-router-contracts', + '@0xsequence/abi', + '@0xsequence/core', + '@0xsequence/identity-instrument', + '@0xsequence/relayer', + '@0xsequence/wallet-core', + '@0xsequence/wallet-primitives', + '@0xsequence/wallet-wdk', + '@0xsequence/guard', + 'ox', + 'jwt-decode' + ], treeshake: true, esbuildPlugins: [ nodeModulesPolyfillPlugin({