From 64727e38675c6812b1039e8eda657a04c099ad83 Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Tue, 25 Nov 2025 10:09:15 +1300 Subject: [PATCH 01/10] spike: sequence provider --- .../generated-clients/src/config/config.ts | 2 +- .../passport/sdk-sample-app/next.config.js | 65 + packages/passport/sdk-sample-app/package.json | 6 +- .../src/components/arbone/ArbOneRequest.tsx | 182 ++ .../src/components/arbone/ArbOneWorkflow.tsx | 79 + .../src/context/ImmutableProvider.tsx | 35 +- .../src/context/PassportProvider.tsx | 45 +- .../sdk-sample-app/src/pages/index.tsx | 8 +- packages/passport/sdk/package.json | 10 +- packages/passport/sdk/src/Passport.ts | 62 +- .../passport/sdk/src/arbOne/JsonRpcError.ts | 38 + .../passport/sdk/src/arbOne/arbOneProvider.ts | 401 +++++ packages/passport/sdk/src/arbOne/examples.ts | 365 ++++ packages/passport/sdk/src/arbOne/index.ts | 6 + .../passport/sdk/src/arbOne/relayerClient.ts | 228 +++ .../sdk/src/arbOne/sendTransaction.ts | 41 + .../sdk/src/arbOne/transactionHelpers.ts | 201 +++ packages/passport/sdk/src/arbOne/types.ts | 88 + .../passport/sdk/src/arbOne/user/index.ts | 2 + .../sdk/src/arbOne/user/registerArbOneUser.ts | 76 + .../passport/sdk/src/arbOne/walletHelpers.ts | 152 ++ packages/passport/sdk/src/config/config.ts | 12 +- packages/passport/sdk/src/index.ts | 10 + packages/passport/sdk/src/sequence/index.ts | 2 + .../sdk/src/sequence/sequenceSigner.ts | 290 ++++ packages/passport/sdk/src/types.ts | 17 +- .../passport/sdk/src/zkEvm/zkEvmProvider.ts | 1 + pnpm-lock.yaml | 1544 ++++++++++++----- sdk/src/index.browser.ts | 4 +- 29 files changed, 3485 insertions(+), 487 deletions(-) create mode 100644 packages/passport/sdk-sample-app/src/components/arbone/ArbOneRequest.tsx create mode 100644 packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx create mode 100644 packages/passport/sdk/src/arbOne/JsonRpcError.ts create mode 100644 packages/passport/sdk/src/arbOne/arbOneProvider.ts create mode 100644 packages/passport/sdk/src/arbOne/examples.ts create mode 100644 packages/passport/sdk/src/arbOne/index.ts create mode 100644 packages/passport/sdk/src/arbOne/relayerClient.ts create mode 100644 packages/passport/sdk/src/arbOne/sendTransaction.ts create mode 100644 packages/passport/sdk/src/arbOne/transactionHelpers.ts create mode 100644 packages/passport/sdk/src/arbOne/types.ts create mode 100644 packages/passport/sdk/src/arbOne/user/index.ts create mode 100644 packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts create mode 100644 packages/passport/sdk/src/arbOne/walletHelpers.ts create mode 100644 packages/passport/sdk/src/sequence/index.ts create mode 100644 packages/passport/sdk/src/sequence/sequenceSigner.ts diff --git a/packages/internal/generated-clients/src/config/config.ts b/packages/internal/generated-clients/src/config/config.ts index b05dc269bd..22acedac82 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 diff --git a/packages/passport/sdk-sample-app/next.config.js b/packages/passport/sdk-sample-app/next.config.js index 6f4b2c2c11..d8b6ecd479 100644 --- a/packages/passport/sdk-sample-app/next.config.js +++ b/packages/passport/sdk-sample-app/next.config.js @@ -17,6 +17,71 @@ const nextConfig = { }, output: 'export', reactStrictMode: true, + // Transpile workspace packages and Sequence packages to handle SSR properly + transpilePackages: [ + '@imtbl/passport', + '@imtbl/config', + '@imtbl/toolkit', + '@imtbl/x-client', + '@imtbl/orderbook', + '@imtbl/blockchain-data', + '@imtbl/generated-clients', + '@imtbl/x-provider', + '@0xsequence/wallet-wdk', + '@0xsequence/identity-instrument', + '@0xsequence/wallet-core', + '@0xsequence/abi', + '@0xsequence/core', + '@0xsequence/auth', + '@0xsequence/network', + ], + // Configure webpack to handle these packages + webpack: (config, { isServer, webpack }) => { + // Prefer source files over built files for workspace packages in development + config.resolve.alias = { + ...config.resolve.alias, + '@imtbl/passport': require('path').resolve(__dirname, '../sdk/src'), + '@imtbl/config': require('path').resolve(__dirname, '../../config/src'), + '@imtbl/toolkit': require('path').resolve(__dirname, '../../internal/toolkit/src'), + '@imtbl/x-client': require('path').resolve(__dirname, '../../x-client/src'), + '@imtbl/orderbook': require('path').resolve(__dirname, '../../orderbook/src'), + '@imtbl/blockchain-data': require('path').resolve(__dirname, '../../blockchain-data/sdk/src'), + '@imtbl/generated-clients': require('path').resolve(__dirname, '../../internal/generated-clients/src'), + '@imtbl/x-provider': require('path').resolve(__dirname, '../../x-provider/src'), + }; + + // Add workspace root node_modules to resolution paths so @0xsequence packages can be found + // (pnpm hoists packages to workspace root) + config.resolve.modules = [ + ...(config.resolve.modules || []), + require('path').resolve(__dirname, '../../../node_modules'), + require('path').resolve(__dirname, '../sdk/node_modules'), + require('path').resolve(__dirname, 'node_modules'), + ]; + + // Ensure crypto is properly polyfilled for @0xsequence packages + config.plugins.push( + new webpack.ProvidePlugin({ + Buffer: ['buffer', 'Buffer'], + process: 'process/browser', + }) + ); + + if (!isServer) { + // Ensure these packages are bundled for the client + config.resolve.fallback = { + ...config.resolve.fallback, + fs: false, + net: false, + tls: false, + crypto: require.resolve('crypto-browserify'), + stream: require.resolve('stream-browserify'), + buffer: require.resolve('buffer'), + process: require.resolve('process/browser'), + }; + } + return config; + }, }; module.exports = nextConfig diff --git a/packages/passport/sdk-sample-app/package.json b/packages/passport/sdk-sample-app/package.json index 84bde0dbed..197391de17 100644 --- a/packages/passport/sdk-sample-app/package.json +++ b/packages/passport/sdk-sample-app/package.json @@ -5,7 +5,7 @@ "@biom3/design-tokens": "^0.4.5", "@biom3/react": "^0.29.4", "@imtbl/blockchain-data": "workspace:*", - "@imtbl/config": "workspace:*", + "@imtbl/config": "file:/Users/natalie/Development/ts-immutable-sdk/packages/config", "@imtbl/generated-clients": "workspace:*", "@imtbl/orderbook": "workspace:*", "@imtbl/passport": "workspace:*", @@ -31,9 +31,13 @@ "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", + "buffer": "^5.5.0||^6.0.0", "concurrently": "^8.2.2", + "crypto-browserify": "^3.12.1", "eslint": "^8.40.0", "eslint-config-next": "13.3.1", + "process": "^0.11.10", + "stream-browserify": "^3.0.0", "typescript": "^5.6.2" }, "private": true, 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..1c53ebbc89 --- /dev/null +++ b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneRequest.tsx @@ -0,0 +1,182 @@ +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) => ( + + )) + } + + + + { + 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..ea7408e35e --- /dev/null +++ b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx @@ -0,0 +1,79 @@ +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 ArbOne + + )} + + + ); +} + +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..5ad33e29c9 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -136,10 +136,12 @@ 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:8070/relayer-mr', indexerMrBasePath: 'https://api.dev.immutable.com', orderBookMrBasePath: 'https://api.dev.immutable.com', - passportMrBasePath: 'https://api.dev.immutable.com', + passportMrBasePath: 'http://localhost:8071', + sequenceIdentityInstrumentEndpoint: 'https://next-identity.sequence-dev.app/', + arbOneRpcUrl: 'https://sepolia-rollup.arbitrum.io/rpc', }, ...sharedConfigurationValues, }; @@ -184,7 +186,7 @@ const getOrderbookConfig = (environment: EnvironmentNames): ModuleConfiguration< }; const ImmutableContext = createContext<{ - passportClient: Passport, + passportClient: Passport | null, sdkClient: ImmutableX, orderbookClient: Orderbook, blockchainData: BlockchainData, @@ -193,7 +195,7 @@ const ImmutableContext = createContext<{ }>({ sdkClient: new ImmutableX(getSdkConfig(EnvironmentNames.DEV)), orderbookClient: new Orderbook(getOrderbookConfig(EnvironmentNames.DEV)), - passportClient: new Passport(getPassportConfig(EnvironmentNames.DEV)), + passportClient: null, // Initialize as null during SSR environment: EnvironmentNames.DEV, blockchainData: new BlockchainData(getBlockchainDataConfig(EnvironmentNames.DEV)), }); @@ -211,8 +213,8 @@ export function ImmutableProvider({ const [orderbookClient, setOrderbookClient] = useState( useContext(ImmutableContext).orderbookClient, ); - const [passportClient, setPassportClient] = useState( - useContext(ImmutableContext).passportClient, + const [passportClient, setPassportClient] = useState( + null, // Start as null for SSR ); const [blockchainData, setBlockchainData] = useState( @@ -220,15 +222,18 @@ export function ImmutableProvider({ ); useEffect(() => { - const passportInstance = new Passport(getPassportConfig(environment)); - Object.defineProperty(window, 'passport', { - configurable: true, - value: passportInstance, - }); - setSdkClient(new ImmutableX(getSdkConfig(environment))); - setOrderbookClient(new Orderbook(getOrderbookConfig(environment))); - setPassportClient(passportInstance); - setBlockchainData(new BlockchainData(getBlockchainDataConfig(environment))); + // Only initialize Passport on the client side + if (typeof window !== 'undefined') { + const passportInstance = new Passport(getPassportConfig(environment)); + Object.defineProperty(window, 'passport', { + configurable: true, + value: passportInstance, + }); + setSdkClient(new ImmutableX(getSdkConfig(environment))); + setOrderbookClient(new Orderbook(getOrderbookConfig(environment))); + setPassportClient(passportInstance); + setBlockchainData(new BlockchainData(getBlockchainDataConfig(environment))); + } }, [environment]); const providerValues = useMemo(() => ({ diff --git a/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx b/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx index afdc50cbb5..9c6108794f 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,11 +57,13 @@ 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(); const connectImx = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); const provider = await passportClient.connectImx(); @@ -75,6 +81,7 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const connectZkEvm = useCallback(async () => { + if (!passportClient) return; setIsLoading(true); const provider = await passportClient.connectEvm(); if (provider) { @@ -86,7 +93,21 @@ export function PassportProvider({ setIsLoading(false); }, [passportClient, setIsLoading, addMessage]); + const connectArbOne = useCallback(async () => { + if (!passportClient) return; + setIsLoading(true); + const provider = await passportClient.connectEvm({ chain: EvmChain.ARBONE }); + if (provider) { + setArbOneProvider(provider); + addMessage('ConnectArbOne', 'Connected'); + } else { + addMessage('ConnectArbOne', 'Failed to connect'); + } + setIsLoading(false); + }, [passportClient, setIsLoading, addMessage]); + const getIdToken = useCallback(async () => { + if (!passportClient) return; setIsLoading(true); const idToken = await passportClient.getIdToken(); addMessage('Get ID token', idToken); @@ -96,6 +117,7 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const getAccessToken = useCallback(async () => { + if (!passportClient) return; setIsLoading(true); const accessToken = await passportClient.getAccessToken(); addMessage('Get Access token', accessToken); @@ -105,6 +127,7 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const getUserInfo = useCallback(async () => { + if (!passportClient) return; setIsLoading(true); const userInfo = await passportClient.getUserInfo(); addMessage('Get User Info', userInfo); @@ -114,6 +137,7 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const getLinkedAddresses = useCallback(async () => { + if (!passportClient) return; setIsLoading(true); const linkedAddresses = await passportClient.getLinkedAddresses(); addMessage('Get Linked Addresses', linkedAddresses); @@ -123,6 +147,7 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const linkWallet = useCallback(async (params: LinkWalletParams) => { + if (!passportClient) return; setIsLoading(true); let linkedWallet; try { @@ -136,11 +161,13 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const logout = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); await passportClient.logout(); setImxProvider(undefined); setZkEvmProvider(undefined); + setArbOneProvider(undefined); } catch (err) { addMessage('Logout', err); console.error(err); @@ -150,6 +177,7 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const popupRedirect = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login(); @@ -163,6 +191,7 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const login = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ useRedirectFlow: true }); @@ -177,6 +206,7 @@ export function PassportProvider({ // Popup redirect methods (provider-specific) const popupRedirectGoogle = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -195,6 +225,7 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const popupRedirectApple = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -213,6 +244,7 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const popupRedirectFacebook = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -232,6 +264,7 @@ export function PassportProvider({ // Login (redirect) methods const loginGoogle = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -251,6 +284,7 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const loginApple = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -270,6 +304,7 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const loginFacebook = useCallback(async () => { + if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -291,8 +326,10 @@ export function PassportProvider({ const providerValues = useMemo(() => ({ imxProvider, zkEvmProvider, + arbOneProvider, connectImx, connectZkEvm, + connectArbOne, logout, popupRedirect, popupRedirectGoogle, @@ -310,8 +347,10 @@ export function PassportProvider({ }), [ imxProvider, zkEvmProvider, + arbOneProvider, connectImx, connectZkEvm, + connectArbOne, logout, popupRedirect, popupRedirectGoogle, @@ -339,8 +378,10 @@ export function usePassportProvider() { const { imxProvider, zkEvmProvider, + arbOneProvider, connectImx, connectZkEvm, + connectArbOne, logout, popupRedirect, popupRedirectGoogle, @@ -359,8 +400,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..0bc6c4e2c5 100644 --- a/packages/passport/sdk/package.json +++ b/packages/passport/sdk/package.json @@ -5,8 +5,13 @@ "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": "0.0.0-20251120164619", + "@0xsequence/network": "^2.3.35", + "@0xsequence/wallet-core": "0.0.0-20251120164619", + "@0xsequence/wallet-primitives": "0.0.0-20251120164619", + "@0xsequence/wallet-wdk": "0.0.0-20251120164619", "@imtbl/config": "workspace:*", "@imtbl/generated-clients": "workspace:*", "@imtbl/metrics": "workspace:*", @@ -23,6 +28,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.ts b/packages/passport/sdk/src/Passport.ts index 2859862830..4cc6e6bc84 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 { @@ -32,12 +33,14 @@ import { import { ConfirmationScreen, EmbeddedLoginPrompt } from './confirmation'; import { ZkEvmProvider } from './zkEvm'; import { Provider } from './zkEvm/types'; +import { ArbOneProvider } from './arbOne'; import TypedEventEmitter from './utils/typedEventEmitter'; import GuardianClient from './guardian'; 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'; const buildImxClientConfig = (passportModuleConfiguration: PassportModuleConfiguration) => { if (passportModuleConfiguration.overrides) { @@ -68,6 +71,9 @@ export const buildPrivateVars = (passportModuleConfiguration: PassportModuleConf magicProviderId: config.magicProviderId, }); const magicTEESigner = new MagicTEESigner(authManager, magicTeeApiClients); + // SequenceSigner will be loaded lazily to avoid SSR issues + let sequenceSigner: any = null; + const multiRollupApiClients = new MultiRollupApiClients(config.multiRollupConfig); const passportEventEmitter = new TypedEventEmitter(); @@ -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: any; // Lazy-loaded to avoid SSR issues + 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; // Initially null this.confirmationScreen = privateVars.confirmationScreen; this.embeddedLoginPrompt = privateVars.embeddedLoginPrompt; this.immutableXClient = privateVars.immutableXClient; @@ -163,30 +173,60 @@ export class Passport { return withMetricsAsync(() => this.passportImxProviderFactory.getProvider(), 'connectImx', false); } + /** + * Lazy-loads SequenceSigner to avoid SSR issues with wallet-wdk + */ + private async getSequenceSigner() { + if (!this.sequenceSigner) { + // Dynamic import to avoid loading wallet-wdk during SSR + const { default: SequenceSigner } = await import('./sequence/sequenceSigner'); + this.sequenceSigner = new SequenceSigner(this.authManager, this.config); + } + return this.sequenceSigner; + } + /** * 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.ARBONE) { + // Lazy-load SequenceSigner for ArbOne + const sequenceSigner = await this.getSequenceSigner(); + provider = new ArbOneProvider({ + passportEventEmitter: this.passportEventEmitter, + authManager: this.authManager, + config: this.config, + multiRollupApiClients: this.multiRollupApiClients, + ethSigner: sequenceSigner, + user, + }); + } 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/arbOne/JsonRpcError.ts b/packages/passport/sdk/src/arbOne/JsonRpcError.ts new file mode 100644 index 0000000000..a67e99a4ce --- /dev/null +++ b/packages/passport/sdk/src/arbOne/JsonRpcError.ts @@ -0,0 +1,38 @@ +export enum ProviderErrorCode { + UNSUPPORTED_METHOD = 4200, + UNAUTHORIZED = 4100, + USER_REJECTED_REQUEST = 4001, +} + +export enum RpcErrorCode { + INTERNAL_ERROR = -32603, + INVALID_PARAMS = -32602, + INVALID_REQUEST = -32600, +} + +export class JsonRpcError extends Error { + public code: number; + + public data?: any; + + constructor(code: number, message: string, data?: any) { + super(message); + this.code = code; + this.data = data; + this.name = 'JsonRpcError'; + + // Maintains proper stack trace for where our error was thrown (only available on V8) + if (Error.captureStackTrace) { + Error.captureStackTrace(this, JsonRpcError); + } + } + + public toJSON() { + return { + code: this.code, + message: this.message, + data: this.data, + }; + } +} + diff --git a/packages/passport/sdk/src/arbOne/arbOneProvider.ts b/packages/passport/sdk/src/arbOne/arbOneProvider.ts new file mode 100644 index 0000000000..3b9cdef384 --- /dev/null +++ b/packages/passport/sdk/src/arbOne/arbOneProvider.ts @@ -0,0 +1,401 @@ +import { JsonRpcProvider, toBeHex, Signer } from 'ethers'; +import { + Provider, + ProviderEvent, + ProviderEventMap, + RequestArguments, +} from './types'; +import AuthManager from '../authManager'; +import TypedEventEmitter from '../utils/typedEventEmitter'; +import { PassportConfiguration } from '../config'; +import { + PassportEventMap, PassportEvents, User, UserArbOne, +} from '../types'; +import { ArbOneRelayerClient } from './relayerClient'; +import { JsonRpcError, ProviderErrorCode, RpcErrorCode } from './JsonRpcError'; +import { Flow, identify, trackError, trackFlow } from '@imtbl/metrics'; +import { sendTransaction } from './sendTransaction'; +import { getNonce } from './walletHelpers'; +import { registerArbOneUser } from './user'; +import { MultiRollupApiClients } from '@imtbl/generated-clients'; + +export type ArbOneProviderInput = { + authManager: AuthManager; + config: PassportConfiguration; + multiRollupApiClients: MultiRollupApiClients; + passportEventEmitter: TypedEventEmitter; + ethSigner: Signer; + user: User | null; +}; + +const isArbOneUser = (user: User): user is UserArbOne => 'arbOne' in user; + +export class ArbOneProvider implements Provider { + readonly #authManager: AuthManager; + + readonly #config: PassportConfiguration; + + /** + * EIP-1193 provider event emitter + * Emits standard provider events (accountsChanged, chainChanged, etc) + */ + readonly #providerEventEmitter: TypedEventEmitter; + + /** + * Internal Passport event emitter + * Listens to Passport events (login, logout) and updates provider state + */ + readonly #passportEventEmitter: TypedEventEmitter; + + // JSON-RPC provider for direct Arbitrum One RPC calls + readonly #rpcProvider: JsonRpcProvider; + + readonly #multiRollupApiClients: MultiRollupApiClients; + + // Relayer client for submitting transactions via backend relayer + readonly #relayerClient: ArbOneRelayerClient; + + // Sequence signer for signing transactions and messages (analogous to ethSigner in zkEVM) + readonly #ethSigner: Signer; + + // Identifies this as a Passport provider (for wallet detection) + public readonly isPassport: boolean = true; + + constructor({ + authManager, + config, + multiRollupApiClients, + passportEventEmitter, + ethSigner, + user, + }: ArbOneProviderInput) { + this.#authManager = authManager; + this.#config = config; + this.#passportEventEmitter = passportEventEmitter; + this.#ethSigner = ethSigner; + + this.#rpcProvider = new JsonRpcProvider(this.#config.arbOneRpcUrl, undefined, { + staticNetwork: true, + }); + + this.#relayerClient = new ArbOneRelayerClient({ + config: this.#config, + rpcProvider: this.#rpcProvider, + authManager: this.#authManager, + }); + + this.#multiRollupApiClients = multiRollupApiClients; + this.#providerEventEmitter = new TypedEventEmitter(); + + passportEventEmitter.on(PassportEvents.LOGGED_IN, (loggedInUser: User) => { + if (isArbOneUser(loggedInUser)) { + this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, [ + loggedInUser.arbOne.ethAddress, + ]); + } + }); + + passportEventEmitter.on(PassportEvents.LOGGED_OUT, this.#handleLogout); + } + + #handleLogout = () => { + this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, []); + }; + + // Get the current ArbOne address from the User session + async #getArbOneAddress() { + // return "0x83e14c79776f468a23d99ef112d9de7fbec24b00"; + // TODO remove + try { + const user = await this.#authManager.getUser(); + if (user && isArbOneUser(user)) { + return user.arbOne.ethAddress; + } + return undefined; + } catch { + return undefined; + } + } + + async #performRequest(request: RequestArguments): Promise { + switch (request.method) { + case 'eth_requestAccounts': { + const arbOneAddress = await this.#getArbOneAddress(); + if (arbOneAddress) return [arbOneAddress]; + + const flow = trackFlow('passport', 'ethRequestAccounts_arbOne'); + + try { + const user = await this.#authManager.getUserOrLogin(); + flow.addEvent('endGetUserOrLogin'); + + let userArbOneEthAddress: string | undefined; + + if (!isArbOneUser(user)) { + console.log('startUserRegistration'); + flow.addEvent('startUserRegistration'); + + // Get address from Sequence signer + const address = await this.#ethSigner.getAddress(); + userArbOneEthAddress = address; + + // This should register the Sequence wallet address with the user's Passport account + // await registerArbOneUser({...}) + userArbOneEthAddress = await registerArbOneUser({ + ethSigner: this.#ethSigner, + authManager: this.#authManager, + multiRollupApiClients: this.#multiRollupApiClients, + accessToken: user.accessToken, + rpcProvider: this.#rpcProvider, + flow, + }); + + flow.addEvent('endUserRegistration'); + } else { + userArbOneEthAddress = user.arbOne.ethAddress; + } + + if (userArbOneEthAddress) { + this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, [ + userArbOneEthAddress, + ]); + } + + identify({ + passportId: user.profile.sub, + }); + + return [userArbOneEthAddress]; + } catch (error) { + if (error instanceof Error) { + trackError('passport', 'ethRequestAccounts_arbOne', error, { flowId: flow.details.flowId }); + } else { + flow.addEvent('errored'); + } + throw error; + } finally { + flow.addEvent('End'); + } + } + + case 'eth_sendTransaction': { + // Get user's Arbitrum One wallet address + const arbOneAddress = '0xa0925a0817dac9eb8c99bcebefd09461c459eb3f';//await this.#getArbOneAddress(); + if (!arbOneAddress) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + `Unauthorised - call eth_requestAccounts first`, + ); + } + + + const flow = trackFlow('passport', 'ethSendTransaction_arbOne'); + + try { + const signerAddress = await this.#ethSigner.getAddress(); + const tx = { + to: '0x04E55fc6fBD722703074D4E19374c201596f3CB4',//signerAddress,// '0x04E55fc6fBD722703074D4E19374c201596f3CB4', //'0x04E55fc6fBD722703074D4E19374c201596f3CB4' + value: 0n, + data: "0x" + } + + return await sendTransaction({ + params: [tx], // request.params || [] + sequenceSigner: this.#ethSigner, + rpcProvider: this.#rpcProvider, + relayerClient: this.#relayerClient, + arbOneAddress, + flow, + }); + } catch (error) { + if (error instanceof Error) { + trackError('passport', 'ethSendTransaction_arbOne', error, { flowId: flow.details.flowId }); + } else { + flow.addEvent('errored'); + } + throw error; + } finally { + flow.addEvent('End'); + } + } + + case 'eth_accounts': { + const arbOneAddress = await this.#getArbOneAddress(); + return arbOneAddress ? [arbOneAddress] : []; + } + + case 'personal_sign': { + // Get user's Arbitrum One wallet address + const arbOneAddress = await this.#getArbOneAddress(); + if (!arbOneAddress) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + 'Unauthorised - call eth_requestAccounts first', + ); + } + + const flow = trackFlow('passport', 'personalSign_arbOne'); + + try { + const [message] = request.params || []; + + if (!message) { + throw new JsonRpcError( + RpcErrorCode.INVALID_PARAMS, + 'Message is required for personal_sign', + ); + } + + // Sign message with Sequence wallet + // + // Flow: + // 1. User signs message with Sequence wallet + // 2. Signature is returned directly (no relayer needed for simple signatures) + // + // Note: For EIP-1271 smart contract signatures (used in transactions), + // the relayer handles the 2x2 multisig. But for personal_sign, + // the relayer's imSign endpoint manages the signature creation. + const signature = await this.#relayerClient.imSign(arbOneAddress, message); + return signature; + } catch (error) { + if (error instanceof Error) { + trackError('passport', 'personalSign_arbOne', error, { flowId: flow.details.flowId }); + } else { + flow.addEvent('errored'); + } + throw error; + } finally { + flow.addEvent('End'); + } + } + + case 'eth_signTypedData': + case 'eth_signTypedData_v4': { + // Get user's Arbitrum One wallet address + const arbOneAddress = await this.#getArbOneAddress(); + if (!arbOneAddress) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + 'Unauthorised - call eth_requestAccounts first', + ); + } + + const flow = trackFlow('passport', 'ethSignTypedDataV4_arbOne'); + + try { + const [address, typedDataString] = request.params || []; + + if (!typedDataString) { + throw new JsonRpcError( + RpcErrorCode.INVALID_PARAMS, + 'Typed data is required', + ); + } + + // Sign EIP-712 typed data with Sequence wallet + // + // Flow: + // 1. Parse typed data (EIP-712 format) + // 2. User signs with Sequence wallet + // 3. Signature is returned via relayer endpoint + // + // Used for structured data signing (e.g., permit, meta-transactions) + // The relayer handles the signature creation for the smart contract wallet. + + const typedData = typeof typedDataString === 'string' + ? JSON.parse(typedDataString) + : typedDataString; + + // Use relayer's typed data signing endpoint + const signature = await this.#relayerClient.imSignTypedData(arbOneAddress, typedData); + return signature; + } catch (error) { + if (error instanceof Error) { + trackError('passport', 'ethSignTypedDataV4_arbOne', error, { flowId: flow.details.flowId }); + } else { + flow.addEvent('errored'); + } + throw error; + } finally { + flow.addEvent('End'); + } + } + + case 'eth_chainId': { + const { chainId } = await this.#rpcProvider.getNetwork(); + return toBeHex(chainId); + } + + // Pass through methods to RPC provider + 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); + } +} diff --git a/packages/passport/sdk/src/arbOne/examples.ts b/packages/passport/sdk/src/arbOne/examples.ts new file mode 100644 index 0000000000..1de637da92 --- /dev/null +++ b/packages/passport/sdk/src/arbOne/examples.ts @@ -0,0 +1,365 @@ +/** + * Example usage of Arbitrum One provider with Sequence wallet integration + * + * This file contains examples of how to use the ArbOneProvider to interact + * with Arbitrum One using Passport authentication and Sequence wallet infrastructure. + */ + +import { Environment } from '@imtbl/config'; +import { Passport, EvmChain } from '../index'; + +// ============================================================================ +// Example 1: Basic Connection to Arbitrum One +// ============================================================================ + +export async function connectToArbOne() { + const passport = new Passport({ + baseConfig: { environment: Environment.SANDBOX }, + clientId: 'YOUR_CLIENT_ID', + redirectUri: 'http://localhost:3000/callback', + }); + + // Connect to Arbitrum One + const provider = await passport.connectEvm({ + announceProvider: true, + chain: EvmChain.ARBONE, + }); + + // Request accounts (triggers login if not already logged in) + const accounts = await provider.request({ + method: 'eth_requestAccounts', + }); + + console.log('Connected to Arbitrum One with account:', accounts[0]); + return { passport, provider, accounts }; +} + +// ============================================================================ +// Example 2: Sending a Transaction +// ============================================================================ + +export async function sendTransaction() { + const { provider, accounts } = await connectToArbOne(); + + const txHash = await provider.request({ + method: 'eth_sendTransaction', + params: [{ + from: accounts[0], + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb', + value: '0x29a2241af62c0000', // 0.005 ETH in hex + data: '0x', + }], + }); + + console.log('Transaction sent:', txHash); + return txHash; +} + +// ============================================================================ +// Example 3: Getting Account Balance +// ============================================================================ + +export async function getBalance() { + const { provider, accounts } = await connectToArbOne(); + + const balance = await provider.request({ + method: 'eth_getBalance', + params: [accounts[0], 'latest'], + }); + + console.log('Balance:', balance); + return balance; +} + +// ============================================================================ +// Example 4: Personal Sign +// ============================================================================ + +export async function signMessage() { + const { provider, accounts } = await connectToArbOne(); + + const message = 'Hello from Arbitrum One!'; + + const signature = await provider.request({ + method: 'personal_sign', + params: [message, accounts[0]], + }); + + console.log('Message signed:', signature); + return signature; +} + +// ============================================================================ +// Example 5: Sign Typed Data (EIP-712) +// ============================================================================ + +export async function signTypedData() { + const { provider, accounts } = await connectToArbOne(); + + const typedData = { + domain: { + name: 'My DApp', + version: '1', + chainId: 42161, // Arbitrum One mainnet + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallet', type: 'address' }, + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person' }, + { name: 'contents', type: 'string' }, + ], + }, + primaryType: 'Mail', + message: { + from: { + name: 'Alice', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + }, + contents: 'Hello, Bob!', + }, + }; + + const signature = await provider.request({ + method: 'eth_signTypedData_v4', + params: [accounts[0], JSON.stringify(typedData)], + }); + + console.log('Typed data signed:', signature); + return signature; +} + +// ============================================================================ +// Example 6: Estimating Gas +// ============================================================================ + +export async function estimateGas() { + const { provider, accounts } = await connectToArbOne(); + + const gasEstimate = await provider.request({ + method: 'eth_estimateGas', + params: [{ + from: accounts[0], + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb', + value: '0x29a2241af62c0000', + data: '0x', + }], + }); + + console.log('Estimated gas:', gasEstimate); + return gasEstimate; +} + +// ============================================================================ +// Example 7: Calling a Contract (Read Operation) +// ============================================================================ + +export async function callContract() { + const { provider } = await connectToArbOne(); + + // Example: Reading totalSupply from an ERC20 contract + const contractAddress = '0x...' // Your contract address + const totalSupplySelector = '0x18160ddd'; // totalSupply() function selector + + const result = await provider.request({ + method: 'eth_call', + params: [{ + to: contractAddress, + data: totalSupplySelector, + }, 'latest'], + }); + + console.log('Contract call result:', result); + return result; +} + +// ============================================================================ +// Example 8: Getting Chain ID +// ============================================================================ + +export async function getChainId() { + const { provider } = await connectToArbOne(); + + const chainId = await provider.request({ + method: 'eth_chainId', + }); + + console.log('Chain ID:', chainId); + return chainId; +} + +// ============================================================================ +// Example 9: Multi-Chain Application (zkEVM + Arbitrum One) +// ============================================================================ + +export async function multiChainExample() { + const passport = new Passport({ + baseConfig: { environment: Environment.SANDBOX }, + clientId: 'YOUR_CLIENT_ID', + redirectUri: 'http://localhost:3000/callback', + }); + + // Connect to zkEVM + const zkEvmProvider = await passport.connectEvm({ + announceProvider: false, + chain: EvmChain.ZKEVM, + }); + + const zkEvmAccounts = await zkEvmProvider.request({ + method: 'eth_requestAccounts', + }); + + console.log('zkEVM account:', zkEvmAccounts[0]); + + // Connect to Arbitrum One + const arbOneProvider = await passport.connectEvm({ + announceProvider: false, + chain: EvmChain.ARBONE, + }); + + const arbOneAccounts = await arbOneProvider.request({ + method: 'eth_requestAccounts', + }); + + console.log('Arbitrum One account:', arbOneAccounts[0]); + + return { + zkEvm: { provider: zkEvmProvider, accounts: zkEvmAccounts }, + arbOne: { provider: arbOneProvider, accounts: arbOneAccounts }, + }; +} + +// ============================================================================ +// Example 10: Listening to Events +// ============================================================================ + +export async function listenToEvents() { + const { provider } = await connectToArbOne(); + + // Listen for account changes + provider.on('accountsChanged', (accounts: string[]) => { + console.log('Accounts changed:', accounts); + }); + + // Listen for chain changes + provider.on('chainChanged', (chainId: string) => { + console.log('Chain changed:', chainId); + }); + + console.log('Event listeners registered'); +} + +// ============================================================================ +// Example 11: Error Handling +// ============================================================================ + +export async function errorHandlingExample() { + try { + const { provider } = await connectToArbOne(); + + // Try to send a transaction without proper parameters + await provider.request({ + method: 'eth_sendTransaction', + params: [{}], // Invalid parameters + }); + } catch (error: any) { + console.error('Error occurred:'); + console.error('- Code:', error.code); + console.error('- Message:', error.message); + + // Handle specific error codes + if (error.code === 4001) { + console.log('User rejected the request'); + } else if (error.code === 4100) { + console.log('Unauthorized - need to call eth_requestAccounts'); + } else if (error.code === 4200) { + console.log('Method not supported'); + } + } +} + +// ============================================================================ +// Example 12: Using with React +// ============================================================================ + +export function ReactExample() { + // This is a conceptual example for React usage + /* + import { useState, useEffect } from 'react'; + import { Passport, EvmChain } from '@imtbl/passport'; + + function ArbOneWallet() { + const [provider, setProvider] = useState(null); + const [account, setAccount] = useState(''); + + useEffect(() => { + const initPassport = async () => { + const passport = new Passport({ + baseConfig: { environment: 'sandbox' }, + clientId: 'YOUR_CLIENT_ID', + redirectUri: 'http://localhost:3000/callback', + }); + + const arbProvider = await passport.connectEvm({ + chain: EvmChain.ARBONE, + }); + + setProvider(arbProvider); + + // Listen to account changes + arbProvider.on('accountsChanged', (accounts) => { + setAccount(accounts[0] || ''); + }); + }; + + initPassport(); + }, []); + + const connect = async () => { + if (!provider) return; + + const accounts = await provider.request({ + method: 'eth_requestAccounts', + }); + + setAccount(accounts[0]); + }; + + const sendTx = async () => { + if (!provider || !account) return; + + const txHash = await provider.request({ + method: 'eth_sendTransaction', + params: [{ + from: account, + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb', + value: '0x29a2241af62c0000', + }], + }); + + console.log('Transaction:', txHash); + }; + + return ( +
+ + {account && ( + <> +

Connected: {account}

+ + + )} +
+ ); + } + */ +} + diff --git a/packages/passport/sdk/src/arbOne/index.ts b/packages/passport/sdk/src/arbOne/index.ts new file mode 100644 index 0000000000..b69d22aa78 --- /dev/null +++ b/packages/passport/sdk/src/arbOne/index.ts @@ -0,0 +1,6 @@ +export { ArbOneProvider, type ArbOneProviderInput } from './arbOneProvider'; +export { ArbOneRelayerClient } from './relayerClient'; +export { sendTransaction } from './sendTransaction'; +export { JsonRpcError, ProviderErrorCode, RpcErrorCode } from './JsonRpcError'; +export type { Provider, RequestArguments, RelayerTransaction } from './types'; + diff --git a/packages/passport/sdk/src/arbOne/relayerClient.ts b/packages/passport/sdk/src/arbOne/relayerClient.ts new file mode 100644 index 0000000000..b31ad22902 --- /dev/null +++ b/packages/passport/sdk/src/arbOne/relayerClient.ts @@ -0,0 +1,228 @@ +import { BytesLike, JsonRpcProvider } from 'ethers'; +import AuthManager from '../authManager'; +import { PassportConfiguration } from '../config'; +import { FeeOption, RelayerTransaction, TypedDataPayload } from './types'; + +export type RelayerClientInput = { + config: PassportConfiguration, + rpcProvider: JsonRpcProvider, + authManager: AuthManager +}; + +// JsonRpc base Types +type JsonRpc = { + id: number; + jsonrpc: '2.0'; +}; + +// EthSendTransaction types +type EthSendTransactionRequest = { + method: 'eth_sendTransaction'; + params: { + to: string; + data: BytesLike; + chainId: string; + }[]; +}; + +type EthSendTransactionResponse = JsonRpc & { + result: string; +}; + +// ImGetTransactionByHash types +type ImGetTransactionByHashRequest = { + method: 'im_getTransactionByHash'; + params: string[]; +}; + +type ImGetTransactionByHashResponse = JsonRpc & { + result: RelayerTransaction; +}; + +// ImGetFeeOptions types +type ImGetFeeOptionsRequest = { + method: 'im_getFeeOptions'; + params: { + userAddress: string; + data: BytesLike; + chainId: string; + }[]; +}; + +type ImGetFeeOptionsResponse = JsonRpc & { + result: FeeOption[] | undefined +}; + +// ImSign types +type ImSignRequest = { + method: 'im_sign'; + params: { + chainId: string; + address: string; + message: string; + }[]; +}; + +type ImSignResponse = JsonRpc & { + result: string; +}; + +// ImSignTypedData types +type ImSignTypedDataRequest = { + method: 'im_signTypedData'; + params: { + chainId: string; + address: string; + eip712Payload: TypedDataPayload; + }[]; +}; + +type ImSignTypedDataResponse = JsonRpc & { + result: string; +}; + +export type RelayerTransactionRequest = + | EthSendTransactionRequest + | ImGetTransactionByHashRequest + | ImGetFeeOptionsRequest + | ImSignTypedDataRequest + | ImSignRequest; + +/** + * RelayerClient for Arbitrum One + * Similar to zkEVM RelayerClient but works with Arbitrum One chain + */ +export class ArbOneRelayerClient { + private readonly config: PassportConfiguration; + + private readonly rpcProvider: JsonRpcProvider; + + private readonly authManager: AuthManager; + + constructor({ config, rpcProvider, authManager }: RelayerClientInput) { + this.config = config; + this.rpcProvider = rpcProvider; + this.authManager = authManager; + } + + private static getResponsePreview(text: string): string { + return text.length > 100 + ? `${text.substring(0, 50)}...${text.substring(text.length - 50)}` + : text; + } + + private getEip155ChainId(chainId: number): string { + return `eip155:${chainId}`; + } + + private async postToRelayer(request: RelayerTransactionRequest): Promise { + const body: RelayerTransactionRequest & JsonRpc = { + id: 1, + jsonrpc: '2.0', + ...request, + }; + + const user = await this.authManager.getUser(); + if (!user) { + throw new Error('User not authenticated'); + } + + // TODO: Update this URL when backend adds ArbOne support + // For now, using the same relayer URL but backend will need to support ArbOne chain + const response = await fetch(`${this.config.relayerUrl}/v1/transactions`, { + method: 'POST', + headers: { + Authorization: `Bearer ${user.accessToken}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }); + + const responseText = await response.text(); + + if (!response.ok) { + const preview = ArbOneRelayerClient.getResponsePreview(responseText); + throw new Error(`Relayer HTTP error: ${response.status}. Content: "${preview}"`); + } + + let jsonResponse; + try { + jsonResponse = JSON.parse(responseText); + } catch (parseError) { + const preview = ArbOneRelayerClient.getResponsePreview(responseText); + throw new Error(`Relayer JSON parse error: ${parseError instanceof Error ? parseError.message : 'Unknown error'}. Content: "${preview}"`); + } + + if (jsonResponse.error) { + throw new Error(jsonResponse.error); + } + + return jsonResponse; + } + + public async ethSendTransaction(to: string, data: BytesLike): Promise { + const { chainId } = await this.rpcProvider.getNetwork(); + const payload: EthSendTransactionRequest = { + method: 'eth_sendTransaction', + params: [{ + to, + data, + chainId: this.getEip155ChainId(Number(chainId)), + }], + }; + const { result } = await this.postToRelayer(payload); + return result; + } + + public async imGetTransactionByHash(hash: string): Promise { + const payload: ImGetTransactionByHashRequest = { + method: 'im_getTransactionByHash', + params: [hash], + }; + const { result } = await this.postToRelayer(payload); + return result; + } + + public async imGetFeeOptions(userAddress: string, data: BytesLike): Promise { + const { chainId } = await this.rpcProvider.getNetwork(); + const payload: ImGetFeeOptionsRequest = { + method: 'im_getFeeOptions', + params: [{ + userAddress, + data, + chainId: this.getEip155ChainId(Number(chainId)), + }], + }; + const { result } = await this.postToRelayer(payload); + return result; + } + + public async imSignTypedData(address: string, eip712Payload: TypedDataPayload): Promise { + const { chainId } = await this.rpcProvider.getNetwork(); + const payload: ImSignTypedDataRequest = { + method: 'im_signTypedData', + params: [{ + address, + eip712Payload, + chainId: this.getEip155ChainId(Number(chainId)), + }], + }; + const { result } = await this.postToRelayer(payload); + return result; + } + + public async imSign(address: string, message: string): Promise { + const { chainId } = await this.rpcProvider.getNetwork(); + const payload: ImSignRequest = { + method: 'im_sign', + params: [{ + address, + message, + chainId: this.getEip155ChainId(Number(chainId)), + }], + }; + const { result } = await this.postToRelayer(payload); + return result; + } +} + diff --git a/packages/passport/sdk/src/arbOne/sendTransaction.ts b/packages/passport/sdk/src/arbOne/sendTransaction.ts new file mode 100644 index 0000000000..7bb067f6cd --- /dev/null +++ b/packages/passport/sdk/src/arbOne/sendTransaction.ts @@ -0,0 +1,41 @@ +import { prepareAndSignTransaction, pollRelayerTransaction, TransactionParams } from './transactionHelpers'; + +type EthSendTransactionParams = TransactionParams & { + params: Array; +}; + +/** + * Send transaction on Arbitrum One using Sequence wallet and relayer + * Similar flow to zkEVM: + * 1. User signs with Sequence wallet (EOA signature) + * 2. Relayer adds its signature (2x2 multisig) + * 3. Relayer submits on-chain + * 4. First transaction auto-deploys the smart contract wallet + */ +export const sendTransaction = async ({ + params, + sequenceSigner, + rpcProvider, + relayerClient, + arbOneAddress, + flow, + nonceSpace, + isBackgroundTransaction = false, +}: EthSendTransactionParams): Promise => { + const transactionRequest = params[0]; + + const { relayerId } = await prepareAndSignTransaction({ + transactionRequest, + sequenceSigner, + rpcProvider, + relayerClient, + arbOneAddress, + flow, + nonceSpace, + isBackgroundTransaction, + }); + + const { hash } = await pollRelayerTransaction(relayerClient, relayerId, flow); + return hash; +}; + diff --git a/packages/passport/sdk/src/arbOne/transactionHelpers.ts b/packages/passport/sdk/src/arbOne/transactionHelpers.ts new file mode 100644 index 0000000000..5b9d41c89a --- /dev/null +++ b/packages/passport/sdk/src/arbOne/transactionHelpers.ts @@ -0,0 +1,201 @@ +import { Flow } from '@imtbl/metrics'; +import { + Signer, TransactionRequest, JsonRpcProvider, +} from 'ethers'; +import { + getNonce, + getNormalisedTransactions, + signMetaTransactions, +} from './walletHelpers'; +import { ArbOneRelayerClient } from './relayerClient'; +import { + FeeOption, + MetaTransaction, + RelayerTransactionStatus, +} from './types'; +import { JsonRpcError, RpcErrorCode } from './JsonRpcError'; +import { retryWithDelay } from '../network/retry'; + +const MAX_TRANSACTION_HASH_RETRIEVAL_RETRIES = 30; +const TRANSACTION_HASH_RETRIEVAL_WAIT = 1000; + +export type TransactionParams = { + sequenceSigner: Signer; + rpcProvider: JsonRpcProvider; + relayerClient: ArbOneRelayerClient; + arbOneAddress: string; + flow: Flow; + nonceSpace?: bigint; + isBackgroundTransaction?: boolean; +}; + +// Fee payment no longer needed - relayer sponsors gas +// const getFeeOption = async ( +// metaTransaction: MetaTransaction, +// walletAddress: string, +// relayerClient: ArbOneRelayerClient, +// ): Promise => { +// const normalisedMetaTransaction = getNormalisedTransactions([ +// metaTransaction, +// ]); +// const transactions = encodedTransactions(normalisedMetaTransaction); +// const feeOptions = await relayerClient.imGetFeeOptions( +// walletAddress, +// transactions, +// ); +// +// if (!feeOptions || !Array.isArray(feeOptions)) { +// throw new Error('Invalid fee options received from relayer'); +// } +// +// console.log('feeOptions', JSON.stringify(feeOptions)); +// +// // For Arbitrum One, look for ETH fee option (instead of IMX) +// const ethFeeOption = feeOptions.find( +// (feeOption) => feeOption.tokenSymbol === 'ETH', +// ); +// if (!ethFeeOption) { +// throw new Error('Failed to retrieve fees for ETH token'); +// } +// +// return ethFeeOption; +// }; + +/** + * Build meta transactions for Arbitrum One + * No fee transaction needed - relayer sponsors gas + */ +const buildMetaTransactions = async ( + transactionRequest: TransactionRequest, + rpcProvider: JsonRpcProvider, + relayerClient: ArbOneRelayerClient, + arbOneAddress: string, + nonceSpace?: bigint, +): Promise<[MetaTransaction, ...MetaTransaction[]]> => { + if (!transactionRequest.to) { + throw new JsonRpcError( + RpcErrorCode.INVALID_PARAMS, + 'eth_sendTransaction requires a "to" field', + ); + } + + // Get the nonce from the smart wallet + const nonce = await getNonce(rpcProvider, arbOneAddress, nonceSpace); + console.log('buildMetaTransactions nonce', nonce); + + const metaTransaction: MetaTransaction = { + to: transactionRequest.to.toString(), + data: transactionRequest.data, + nonce, + value: transactionRequest.value, + revertOnError: true, + }; + + // Return just the user's transaction - no fee transaction needed + return [metaTransaction]; +}; + +/** + * Prepare and sign transaction using Sequence wallet + * This generates the user's signature which relayer will combine with its own (2x2 multisig) + * Supports both V1 and V3 contract formats + */ +export const prepareAndSignTransaction = async ({ + transactionRequest, + sequenceSigner, + rpcProvider, + relayerClient, + arbOneAddress, + flow, + nonceSpace, +}: TransactionParams & { transactionRequest: TransactionRequest }): Promise<{ relayerId: string }> => { + flow.addEvent('startBuildMetaTransactions'); + + const metaTransactions = await buildMetaTransactions( + transactionRequest, + rpcProvider, + relayerClient, + arbOneAddress, + nonceSpace, + ); + + flow.addEvent('endBuildMetaTransactions'); + + const nonce = metaTransactions[0].nonce!; + + flow.addEvent('startSignMetaTransactions'); + + const { chainId } = await rpcProvider.getNetwork(); + + const signedTransaction = await signMetaTransactions( + metaTransactions, + nonce, + BigInt(chainId.toString()), + arbOneAddress, + sequenceSigner, + ); + + flow.addEvent('endSignMetaTransactions'); + + flow.addEvent('startSubmitToRelayer'); + + // Send to relayer - relayer will add its own signature and submit on-chain + // On first transaction, this will deploy the smart contract wallet + const relayerId = await relayerClient.ethSendTransaction( + arbOneAddress, + signedTransaction, + ); + + flow.addEvent('endSubmitToRelayer'); + + return { relayerId }; +}; + +/** + * Poll relayer for transaction status + * Same as zkEVM - waits for relayer to process and submit transaction + */ +export const pollRelayerTransaction = async ( + relayerClient: ArbOneRelayerClient, + relayerId: string, + flow: Flow, +): Promise<{ hash: string }> => { + flow.addEvent('startPollRelayerTransaction'); + + const result = await retryWithDelay( + async () => { + const transaction = await relayerClient.imGetTransactionByHash(relayerId); + + if (transaction.status === RelayerTransactionStatus.SUCCESSFUL) { + return { hash: transaction.hash }; + } + + if ( + transaction.status === RelayerTransactionStatus.FAILED + || transaction.status === RelayerTransactionStatus.REVERTED + || transaction.status === RelayerTransactionStatus.CANCELLED + ) { + throw new JsonRpcError( + RpcErrorCode.INTERNAL_ERROR, + transaction.statusMessage || 'Transaction failed', + ); + } + + // Transaction still pending, retry + throw new Error('Transaction pending'); + }, + { + retries: MAX_TRANSACTION_HASH_RETRIEVAL_RETRIES, + interval: TRANSACTION_HASH_RETRIEVAL_WAIT, + finalErr: new JsonRpcError( + RpcErrorCode.INTERNAL_ERROR, + 'Transaction polling timeout', + ), + }, + ); + + flow.addEvent('endPollRelayerTransaction'); + + return result; +}; + diff --git a/packages/passport/sdk/src/arbOne/types.ts b/packages/passport/sdk/src/arbOne/types.ts new file mode 100644 index 0000000000..89e20bcb54 --- /dev/null +++ b/packages/passport/sdk/src/arbOne/types.ts @@ -0,0 +1,88 @@ +import { BigNumberish } from 'ethers'; + +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]; +} + +// Relayer types (matching zkEVM) +export enum RelayerTransactionStatus { + PENDING = 'PENDING', + SUBMITTED = 'SUBMITTED', + SUCCESSFUL = 'SUCCESSFUL', + REVERTED = 'REVERTED', + FAILED = 'FAILED', + CANCELLED = 'CANCELLED', +} + +export interface RelayerTransaction { + status: RelayerTransactionStatus; + chainId: string; + relayerId: string; + hash: string; + statusMessage?: string; +} + +export interface FeeOption { + tokenPrice: string; + tokenSymbol: string; + tokenDecimals: number; + tokenAddress: string; + recipientAddress: string; +} + +export interface MetaTransaction { + to: string; + value?: BigNumberish | null; + data?: string | null; + nonce?: BigNumberish; + gasLimit?: BigNumberish; + delegateCall?: boolean; + revertOnError?: boolean; +} + +export interface MetaTransactionNormalised { + delegateCall: boolean; + revertOnError: boolean; + gasLimit: BigNumberish; + target: string; + value: BigNumberish; + data: string; +} + +// https://eips.ethereum.org/EIPS/eip-712 +export interface TypedDataPayload { + types: { + EIP712Domain: Array<{ name: string; type: string }>; + [key: string]: Array<{ name: string; type: string }>; + }; + domain: { + name?: string; + version?: string; + chainId?: number | string; + verifyingContract?: string; + salt?: string; + }; + primaryType: string; + message: Record; +} diff --git a/packages/passport/sdk/src/arbOne/user/index.ts b/packages/passport/sdk/src/arbOne/user/index.ts new file mode 100644 index 0000000000..d7b177cdd2 --- /dev/null +++ b/packages/passport/sdk/src/arbOne/user/index.ts @@ -0,0 +1,2 @@ +export { registerArbOneUser, type RegisterArbOneUserInput } from './registerArbOneUser'; + diff --git a/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts b/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts new file mode 100644 index 0000000000..b87518f34b --- /dev/null +++ b/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts @@ -0,0 +1,76 @@ +import { JsonRpcProvider, Signer } from 'ethers'; +import { Flow } from '@imtbl/metrics'; +import AuthManager from '../../authManager'; +import { MultiRollupApiClients } from '@imtbl/generated-clients'; +import { signRaw } from '@imtbl/toolkit'; +import { getEip155ChainId } from '../walletHelpers'; +import { JsonRpcError, RpcErrorCode } from '../JsonRpcError'; + +export type RegisterArbOneUserInput = { + authManager: AuthManager; + multiRollupApiClients: MultiRollupApiClients; + accessToken: string; + rpcProvider: JsonRpcProvider; + ethSigner: Signer; + flow: Flow; +}; + +const MESSAGE_TO_SIGN = 'Only sign this message from Immutable Passport'; + +export async function registerArbOneUser({ + authManager, + multiRollupApiClients, + accessToken, + rpcProvider, + ethSigner, + flow, +}: RegisterArbOneUserInput): Promise { + const getAddressPromise = ethSigner.getAddress(); + getAddressPromise.then(() => flow.addEvent('endGetAddress')); + + const signRawPromise = signRaw(MESSAGE_TO_SIGN, ethSigner); + signRawPromise.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, + signRawPromise, + 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 { + const registrationResponse = await multiRollupApiClients.passportApi.createCounterfactualAddressV2({ + chainName: 'arbitrum-sepolia', //chainName, + createCounterfactualAddressRequest: { + ethereum_address: ethereumAddress, + ethereum_signature: ethereumSignature, + }, + }, { + headers: { Authorization: `Bearer ${accessToken}` }, + }); + flow.addEvent('endCreateCounterfactualAddress'); + + authManager.forceUserRefreshInBackground(); + + return registrationResponse.data.counterfactual_address; + } catch (error) { + flow.addEvent('errorRegisteringArbOneUser'); + throw error; + } +} + diff --git a/packages/passport/sdk/src/arbOne/walletHelpers.ts b/packages/passport/sdk/src/arbOne/walletHelpers.ts new file mode 100644 index 0000000000..4a112cab85 --- /dev/null +++ b/packages/passport/sdk/src/arbOne/walletHelpers.ts @@ -0,0 +1,152 @@ +import { walletContracts } from '@0xsequence/abi'; +import { v1 as sequenceCoreV1 } from '@0xsequence/core'; +import { Payload, Signature } from '@0xsequence/wallet-primitives'; +import { Bytes, Hex, Address } from 'ox'; +import { + BigNumberish, Contract, getBytes, + Interface, Signer, ZeroAddress, + JsonRpcProvider, AbiCoder, concat, +} from 'ethers'; +import { MetaTransaction, MetaTransactionNormalised, TypedDataPayload } from './types'; + +const SIGNATURE_WEIGHT = 1; // Weight of a single signature in the multi-sig + +// Legacy V1/V2 functions - kept for potential backwards compatibility +export const getNormalisedTransactions = (txs: MetaTransaction[]): MetaTransactionNormalised[] => txs.map((t) => ({ + delegateCall: t.delegateCall === true, + revertOnError: t.revertOnError === true, + gasLimit: t.gasLimit ?? BigInt(0), + target: t.to ?? ZeroAddress, + value: t.value ?? BigInt(0), + data: t.data ?? '0x', +})); + +export const coerceNonceSpace = (nonceSpace?: bigint): bigint => nonceSpace || 0n; + +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; +}; + +/** + * Get nonce from Sequence smart contract wallet on Arbitrum One + * Similar to zkEVM but works with Arbitrum One chain + */ +export const getNonce = async ( + rpcProvider: JsonRpcProvider, + arbOneAddress: string, + nonceSpace?: bigint, +): Promise => { + const rawSpace = nonceSpace ? (nonceSpace >> 96n) : 0n; + + // Check if smart contract wallet is deployed + const code = await rpcProvider.getCode(arbOneAddress); + if (code === '0x') { + // Wallet not deployed yet, nonce is 0 + return encodeNonce(rawSpace, 0n); + } + + // Wallet is deployed, get nonce from contract + const walletInterface = new Interface(walletContracts.mainModule.abi); + const walletContract = new Contract(arbOneAddress, walletInterface, rpcProvider); + + const nonce = await walletContract.readNonce(rawSpace); + return encodeNonce(rawSpace, BigInt(nonce.toString())); +}; + +export const getEip155ChainId = (chainId: number): string => `eip155:${chainId}`; + +/** + * Convert MetaTransaction to Sequence Payload.Call format + */ +const toSequenceCall = (tx: MetaTransaction): Payload.Call => ({ + to: Address.from(tx.to || ZeroAddress), + value: tx.value ? BigInt(tx.value.toString()) : 0n, + data: (tx.data || '0x') as Hex.Hex, + gasLimit: tx.gasLimit ? BigInt(tx.gasLimit.toString()) : 0n, + delegateCall: tx.delegateCall ?? false, + onlyFallback: false, + behaviorOnError: tx.revertOnError ? 'revert' : 'ignore', +}); + +/** + * Sign meta-transactions using Sequence V3 SDK primitives + * Uses EIP-712 typed data for signing and compact binary encoding for payload + * Returns fully encoded transaction data ready for relayer submission + */ +export const signMetaTransactions = async ( + metaTransactions: MetaTransaction[], + encodedNonce: BigNumberish, + chainId: bigint, + walletAddress: string, + sequenceSigner: Signer, +): Promise => { + const encodedNonceBigInt = BigInt(encodedNonce.toString()); + const space = encodedNonceBigInt >> 96n; + const nonce = encodedNonceBigInt & ((1n << 96n) - 1n); + + // Convert to Sequence call format + const calls = metaTransactions.map(toSequenceCall); + + // Create Sequence payload using SDK + const payload = Payload.fromCall(nonce, space, calls); + + // Encode payload using SDK (compact binary format) + // Pass wallet address for self-call optimization + const encodedPayload = Payload.encode(payload, Address.from(walletAddress)); + + // Hash payload using SDK (EIP-712 typed data hash) + const payloadHash = Payload.hash( + Address.from(walletAddress), + Number(chainId), + payload + ); + + // Sign with ETH_SIGN (adds Ethereum message prefix) + const signature = await sequenceSigner.signMessage(payloadHash); + + // Parse signature to extract r, s, yParity + const sigBytes = Bytes.fromHex(signature as Hex.Hex); + const r = Bytes.toBigInt(sigBytes.slice(0, 32)); + const s = Bytes.toBigInt(sigBytes.slice(32, 64)); + const v = sigBytes[64]!; + const yParity = v >= 27 ? v - 27 : v; + + // Create signed signer leaf for topology + const signedLeaf: Signature.SignedSignerLeaf = { + type: 'signer', + address: Address.from(await sequenceSigner.getAddress()), + weight: BigInt(SIGNATURE_WEIGHT), + signed: true, + signature: { + type: 'eth_sign', + r, + s, + yParity, + }, + }; + + // Create raw signature configuration + const rawSignature: Signature.RawSignature = { + noChainId: false, + configuration: { + threshold: BigInt(SIGNATURE_WEIGHT), + checkpoint: 0n, + topology: signedLeaf, + }, + }; + + // Encode signature using SDK + const encodedSignature = Signature.encodeSignature(rawSignature); + + // Encode the execute call: execute(bytes payload, bytes signature) + const executeSelector = '0x61c2926c'; // keccak256("execute(bytes,bytes)")[:4] + const encodedParams = AbiCoder.defaultAbiCoder().encode( + ['bytes', 'bytes'], + [Bytes.toHex(encodedPayload), Bytes.toHex(encodedSignature)] + ); + + return concat([executeSelector, encodedParams]); +}; diff --git a/packages/passport/sdk/src/config/config.ts b/packages/passport/sdk/src/config/config.ts index 3d1cdee7b2..625cbe7fa8 100644 --- a/packages/passport/sdk/src/config/config.ts +++ b/packages/passport/sdk/src/config/config.ts @@ -50,6 +50,10 @@ export class PassportConfiguration { readonly relayerUrl: string; + readonly arbOneRpcUrl: string; + + readonly sequenceIdentityInstrumentEndpoint?: string; + readonly multiRollupConfig: MultiRollupAPIConfiguration; readonly crossSdkBridgeEnabled: boolean; @@ -103,7 +107,9 @@ export class PassportConfiguration { this.magicPublishableApiKey = overrides.magicPublishableApiKey; this.magicProviderId = overrides.magicProviderId; this.zkEvmRpcUrl = overrides.zkEvmRpcUrl; - this.relayerUrl = overrides.relayerUrl; + this.relayerUrl = 'http://localhost:8070/relayer-mr';//overrides.relayerUrl; + this.arbOneRpcUrl = 'https://sepolia-rollup.arbitrum.io/rpc';//overrides.arbOneRpcUrl || 'https://arb1.arbitrum.io/rpc'; + this.sequenceIdentityInstrumentEndpoint = overrides.sequenceIdentityInstrumentEndpoint; this.multiRollupConfig = { indexer: createConfig({ basePath: overrides.indexerMrBasePath, @@ -112,7 +118,7 @@ export class PassportConfiguration { basePath: overrides.orderBookMrBasePath, }), passport: createConfig({ - basePath: overrides.passportMrBasePath, + basePath: 'http://localhost:8071',//overrides.passportMrBasePath, }), }; } else { @@ -125,6 +131,7 @@ export class PassportConfiguration { this.imxPublicApiDomain = 'https://api.immutable.com'; this.zkEvmRpcUrl = 'https://rpc.immutable.com'; this.relayerUrl = 'https://api.immutable.com/relayer-mr'; + this.arbOneRpcUrl = 'https://arb1.arbitrum.io/rpc'; this.multiRollupConfig = multiRollupConfig.getProduction(); break; } @@ -137,6 +144,7 @@ export class PassportConfiguration { this.imxPublicApiDomain = 'https://api.sandbox.immutable.com'; this.zkEvmRpcUrl = 'https://rpc.testnet.immutable.com'; this.relayerUrl = 'https://api.sandbox.immutable.com/relayer-mr'; + this.arbOneRpcUrl = 'https://sepolia-rollup.arbitrum.io/rpc'; this.multiRollupConfig = multiRollupConfig.getSandbox(); break; } diff --git a/packages/passport/sdk/src/index.ts b/packages/passport/sdk/src/index.ts index ac8c9c24dd..c33c4861b0 100644 --- a/packages/passport/sdk/src/index.ts +++ b/packages/passport/sdk/src/index.ts @@ -27,7 +27,17 @@ export type { DeviceTokenResponse, DirectLoginOptions, DirectLoginMethod, + User, + UserImx, + UserZkEvm, + UserArbOne, } from './types'; export { MarketingConsentStatus, + PassportEvents, + RollupType, + EvmChain, + isUserImx, + isUserZkEvm, + isUserArbOne, } from './types'; diff --git a/packages/passport/sdk/src/sequence/index.ts b/packages/passport/sdk/src/sequence/index.ts new file mode 100644 index 0000000000..47158796e1 --- /dev/null +++ b/packages/passport/sdk/src/sequence/index.ts @@ -0,0 +1,2 @@ +export { default as SequenceSigner } from './sequenceSigner'; + diff --git a/packages/passport/sdk/src/sequence/sequenceSigner.ts b/packages/passport/sdk/src/sequence/sequenceSigner.ts new file mode 100644 index 0000000000..88a857d171 --- /dev/null +++ b/packages/passport/sdk/src/sequence/sequenceSigner.ts @@ -0,0 +1,290 @@ +import { AbstractSigner, Signer, TypedDataDomain, TypedDataField, hexlify, toUtf8Bytes, getBytes, Wallet, keccak256, hashMessage, toBeHex, concat } 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, Bytes } from 'ox' +import jwtDecode from 'jwt-decode'; +import { IdTokenPayload } from '../types'; + +interface AuthKey { + address: string; + privateKey: CryptoKey; + identitySigner: string; + expiresAt: Date; +} + +interface UserWallet { + userIdentifier: string; + walletAddress: string; + authKey: AuthKey; + identityInstrument: IdentityInstrument; +} + +// Private key wallet for non-Identity Instrument mode +interface PrivateKeyWallet { + userIdentifier: string; + walletAddress: string; + wallet: Wallet; +} + +export default class SequenceSigner extends AbstractSigner { + private readonly authManager: AuthManager; + private readonly config: PassportConfiguration; + + // Identity Instrument mode + private userWallet: UserWallet | null = null; + private createWalletPromise: Promise | null = null; + + // Private key mode + private privateKeyWallet: PrivateKeyWallet | null = null; + private createPrivateKeyWalletPromise: Promise | null = null; + + private useIdentityInstrument: boolean = false; + + constructor(authManager: AuthManager, config: PassportConfiguration) { + super(); + this.authManager = authManager; + this.config = config; + } + + 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; + // Need a new ID token to call identity instrument, TODO: improve thi + await this.authManager.forceUserRefresh(); + const authenticatedUser = user || await this.getUserOrThrow(); + + if (!authenticatedUser.idToken) { + throw new PassportError( + 'User idToken not available', + PassportErrorType.NOT_LOGGED_IN_ERROR, + ); + } + + const identityInstrumentEndpoint = 'https://next-identity.sequence-dev.app/';//this.config.sequenceIdentityInstrumentEndpoint + //|| 'https://identity.sequence.app/'; + + // OIDC credentials from Passport config + const idToken = authenticatedUser.idToken; + const decoded = jwtDecode(idToken) + const issuer = decoded.iss; + const audience = decoded.aud; + + // Generate NEW ephemeral authKey for this session + // Note: authKey is ephemeral and not reused. The identity signer address is deterministic. + 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), // 1 hour + }; + + const identityInstrument = new IdentityInstrument(identityInstrumentEndpoint, "@14:test"); + const challenge = new IdTokenChallenge(issuer, audience, idToken); + + console.log('[SequenceSigner] Registering authKey with Identity Instrument...'); + + // Register this ephemeral authKey with the user's identity + await identityInstrument.commitVerifier( + Identity.toIdentityAuthKey(authKey), + challenge + ); + + console.log('[SequenceSigner] Completing auth to get identity signer...'); + + // Get the deterministic identity signer address for this user + const result = await identityInstrument.completeAuth( + Identity.toIdentityAuthKey(authKey), + challenge + ); + + const signerAddress = result.signer.address; + authKey.identitySigner = signerAddress; + + console.log('[SequenceSigner] Identity signer established:', signerAddress); + + this.userWallet = { + userIdentifier: authenticatedUser.profile.sub, + walletAddress: signerAddress, + authKey, + identityInstrument, + }; + + return resolve(this.userWallet!); + } catch (error) { + const errorMessage = `Identity Instrument: Failed to create signer: ${(error as Error).message}`; + console.error('[SequenceSigner] Error:', errorMessage, error); + return reject(new PassportError(errorMessage, PassportErrorType.WALLET_CONNECTION_ERROR)); + } finally { + this.createWalletPromise = null; + } + }); + + return this.createWalletPromise; + } + + private async getPrivateKeyWallet(): Promise { + let { privateKeyWallet } = this; + if (!privateKeyWallet) { + privateKeyWallet = await this.createPrivateKeyWallet(); + } + + const user = await this.getUserOrThrow(); + if (user.profile.sub !== privateKeyWallet.userIdentifier) { + privateKeyWallet = await this.createPrivateKeyWallet(user); + } + + return privateKeyWallet; + } + + private async createPrivateKeyWallet(user?: User): Promise { + if (this.createPrivateKeyWalletPromise) return this.createPrivateKeyWalletPromise; + + this.createPrivateKeyWalletPromise = new Promise(async (resolve, reject) => { + try { + this.privateKeyWallet = null; + const authenticatedUser = user || await this.getUserOrThrow(); + + // Derive deterministic private key from user identity + const seed = `${authenticatedUser.profile.sub}-sequence-arb-one`; + const privateKeyHash = keccak256(toUtf8Bytes(seed)); + + const wallet = new Wallet(privateKeyHash); + const walletAddress = await wallet.getAddress(); + + this.privateKeyWallet = { + userIdentifier: authenticatedUser.profile.sub, + walletAddress, + wallet, + }; + + 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.createPrivateKeyWalletPromise = null; + } + }); + + return this.createPrivateKeyWalletPromise; + } + + 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; + } + + async getAddress(): Promise { + if (this.useIdentityInstrument) { + const wallet = await this.getUserWallet(); + return wallet.walletAddress; + } else { + const wallet = await this.getPrivateKeyWallet(); + return wallet.walletAddress; + } + } + + async signMessage(message: string | Uint8Array): Promise { + if (this.useIdentityInstrument) { + // Identity Instrument mode + const wallet = await this.getUserWallet(); + + const signer = new Identity.IdentitySigner( + wallet.identityInstrument, + wallet.authKey + ); + + // Convert message to 32-byte hash digest + // signMessage expects the message to be hashed with Ethereum prefix + let messageBytes: Uint8Array; + if (typeof message === 'string') { + messageBytes = toUtf8Bytes(message); + } else { + messageBytes = message; + } + + // Hash with Ethereum message prefix: keccak256("\x19Ethereum Signed Message:\n" + len(message) + message) + const digest = hashMessage(messageBytes); + + // Sign using Identity Instrument (expects 32-byte hash) + const signature = await signer.signDigest(getBytes(digest)); + + // Convert signature object to hex string in standard ECDSA format + // Identity Instrument returns: { r: bigint, s: bigint, yParity: number, type: "hash" } + // We need: 0x + r (32 bytes) + s (32 bytes) + v (1 byte) + const r = toBeHex(signature.r, 32); + const s = toBeHex(signature.s, 32); + const v = toBeHex(signature.yParity + 27, 1); // Standard Ethereum: v = 27 or 28 + + return concat([r, s, v]); + } else { + // Private key mode + const pkWallet = await this.getPrivateKeyWallet(); + return pkWallet.wallet.signMessage(message); + } + } + + async signTransaction(): Promise { + throw new PassportError( + 'signTransaction not supported - use signMessage for EIP-712 signing', + PassportErrorType.WALLET_CONNECTION_ERROR, + ); + } + + async signTypedData( + domain: TypedDataDomain, + types: Record, + value: Record, + ): Promise { + if (this.useIdentityInstrument) { + throw new PassportError( + 'signTypedData not yet implemented for Identity Instrument', + PassportErrorType.WALLET_CONNECTION_ERROR, + ); + } else { + // Private key mode + const pkWallet = await this.getPrivateKeyWallet(); + return pkWallet.wallet.signTypedData(domain, types, value); + } + } + + connect(): Signer { + throw new PassportError( + 'connect() not supported', + PassportErrorType.WALLET_CONNECTION_ERROR, + ); + } +} diff --git a/packages/passport/sdk/src/types.ts b/packages/passport/sdk/src/types.ts index 43c929def8..dd02037f13 100644 --- a/packages/passport/sdk/src/types.ts +++ b/packages/passport/sdk/src/types.ts @@ -39,6 +39,7 @@ export type UserProfile = { export enum RollupType { IMX = 'imx', ZKEVM = 'zkEvm', + ARBONE = 'arbOne', } export type User = { @@ -56,6 +57,9 @@ export type User = { ethAddress: string; userAdminAddress: string; }; + [RollupType.ARBONE]?: { + ethAddress: string; + }; }; export type PassportMetadata = { @@ -64,6 +68,7 @@ export type PassportMetadata = { imx_user_admin_address: string; zkevm_eth_address: string; zkevm_user_admin_address: string; + arbone_eth_address?: string; }; export interface OidcConfiguration { @@ -85,6 +90,8 @@ export interface PassportOverrides { immutableXClient: IMXClient; zkEvmRpcUrl: string; relayerUrl: string; + arbOneRpcUrl?: string; + sequenceIdentityInstrumentEndpoint?: string; indexerMrBasePath: string; orderBookMrBasePath: string; passportMrBasePath: string; @@ -130,9 +137,11 @@ type WithRequired = T & { [P in K]-?: T[P] }; export type UserImx = WithRequired; export type UserZkEvm = WithRequired; +export type UserArbOne = WithRequired; export const isUserZkEvm = (user: User): user is UserZkEvm => !!user[RollupType.ZKEVM]; export const isUserImx = (user: User): user is UserImx => !!user[RollupType.IMX]; +export const isUserArbOne = (user: User): user is UserArbOne => !!user[RollupType.ARBONE]; export type DeviceTokenResponse = { access_token: string; @@ -178,8 +187,14 @@ export type LinkedWallet = { clientName: string; }; +export enum EvmChain { + ZKEVM = 'zkevm', + ARBONE = 'arbone', +} + export type ConnectEvmArguments = { - announceProvider: boolean; + announceProvider?: boolean; + chain?: EvmChain; }; export type LoginArguments = { diff --git a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts index beba2623c0..4f2f7ebc10 100644 --- a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts +++ b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts @@ -216,6 +216,7 @@ export class ZkEvmProvider implements Provider { const flow = trackFlow('passport', 'ethSendTransaction'); + console.log(`request.params ${JSON.stringify(request.params)}`); try { return await this.#guardianClient.withConfirmationScreen({ width: 480, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f559ae5bdd..102291df07 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 @@ -114,13 +114,13 @@ importers: version: 29.7.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) typescript: specifier: ^5 version: 5.6.2 @@ -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)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(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.39.3(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.39.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) devDependencies: '@playwright/test': specifier: ^1.45.3 @@ -1196,7 +1196,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -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) @@ -1362,7 +1362,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1374,7 +1374,7 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2070,11 +2070,26 @@ 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/identity-instrument': + specifier: 0.0.0-20251120164619 + version: 0.0.0-20251120164619(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/wallet-core': + specifier: 0.0.0-20251120164619 + version: 0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': + specifier: 0.0.0-20251120164619 + version: 0.0.0-20251120164619(typescript@5.6.2) + '@0xsequence/wallet-wdk': + specifier: 0.0.0-20251120164619 + version: 0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10) '@imtbl/config': specifier: workspace:* version: link:../../config @@ -2123,6 +2138,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 @@ -2165,7 +2183,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2180,7 +2198,7 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) tsup: specifier: 8.3.0 version: 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) @@ -2200,8 +2218,8 @@ importers: specifier: workspace:* version: link:../../blockchain-data/sdk '@imtbl/config': - specifier: workspace:* - version: link:../../config + specifier: file:/Users/natalie/Development/ts-immutable-sdk/packages/config + version: file:packages/config '@imtbl/generated-clients': specifier: workspace:* version: link:../../internal/generated-clients @@ -2272,15 +2290,27 @@ importers: '@typescript-eslint/parser': specifier: ^5.57.1 version: 5.62.0(eslint@8.57.0)(typescript@5.6.2) + buffer: + specifier: ^5.5.0||^6.0.0 + version: 6.0.3 concurrently: specifier: ^8.2.2 version: 8.2.2 + crypto-browserify: + specifier: ^3.12.1 + version: 3.12.1 eslint: specifier: ^8.40.0 version: 8.57.0 eslint-config-next: specifier: 13.3.1 version: 13.3.1(eslint@8.57.0)(typescript@5.6.2) + process: + specifier: ^0.11.10 + version: 0.11.10 + stream-browserify: + specifier: ^3.0.0 + version: 3.0.0 typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2684,19 +2714,84 @@ importers: packages: - '@0xsequence/abi@2.2.13': - resolution: {integrity: sha512-cZDR83SNxpXTD9vZoJAtmn6/YgvttN0gmeB8feQ5cpo8yd+AeJvQpUGMPR6Ud1MQGsvcPTLnTwKkL432Pc6UGQ==} + '@0xsequence/abi@0.0.0-coolcats-0.36.12-20220711222640': + resolution: {integrity: sha512-4SU6ttoNSA4sXtCU6H9EbQlqr2oyeOMrh0bay9G+XncwLhikaXL9DUQCXHMzIWAM5v7I+glfakkRZytnUdieiw==} + + '@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/config@0.0.0-coolcats-0.36.12-20220711222640': + resolution: {integrity: sha512-X0zrcxyx9EWZ8Q761m5obNxuMeTEl5QgN2/dD/fRfDx4nFeRYUQwDOnVwhfVBvsg4RSudwGXcbr7i8in63aFVg==} + + '@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@0.0.0-coolcats-0.36.12-20220711222640': + resolution: {integrity: sha512-Rv1+PhIHT/CTTA/ICK1el1BOmLO3sfE7eSUs5nXWvJceCqq0suRreylsBxs2K8niwNS2XrOqxbH8I3Iu5O0spw==} + + '@0xsequence/identity-instrument@0.0.0-20251120164619': + resolution: {integrity: sha512-FCcfiKf3zSC9RzF2xkJQ+pdMaTRGDDOrE/GywsljvfjX5twUtKIyWCqiyLlPZ3img68XH/NXIS6RXQqg+/g6/A==} - '@0xsequence/core@2.2.13': - resolution: {integrity: sha512-tu6OEGbDLg1KfMb+YOn0Z5BsYbK3UFBjuPVHRx7SpmCsZPEApJqqRKHpTYah2T3bmYIJy9tRBtqstfTsniSgng==} + '@0xsequence/indexer@2.3.35': + resolution: {integrity: sha512-zqjGRzRzFWC8jf26WsagHz0zPP6V8ieAUBDrEKItPb0rgzNX+KiMl6wMZXW/zQp+DGuCfvFfeL0NSALmFxmjRg==} + + '@0xsequence/multicall@0.0.0-coolcats-0.36.12-20220711222640': + resolution: {integrity: sha512-jo2oWa7ChPyCvunqLO6n2467j0kZa+Qu2Xvypk5X+0fYzY8K8daaugTPVwnADl3bhYmJtmIZHcMNoBEVYqmZJA==} + + '@0xsequence/network@0.0.0-coolcats-0.36.12-20220711222640': + resolution: {integrity: sha512-VlQvPBVtk04iW0avieEEPHK4ijx84KC+WTOqfRsb+5o5fpvx6mmqpOoI6baUnLxNuOqB04yTmd4vqLuXtn4vFw==} + + '@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@0.0.0-coolcats-0.36.12-20220711222640': + resolution: {integrity: sha512-kQQDQ6ofT2eoLxieAUhO9HllueSymTCdyt5kbISprjbJJjQco5ekPD50Wt8x2bazgulaAR5VlIvzqme67kbR3g==} + + '@0xsequence/relayer@2.3.35': + resolution: {integrity: sha512-9kld9zQ2kxh2QqKDaaTmCzdzLGx8fykgID/YlxqDV62J9G5/5g8xTpO0LsGamheQ75l1Orhw2lRNkuyiAib9jg==} peerDependencies: ethers: '>=6' + '@0xsequence/tee-verifier@0.1.2': + resolution: {integrity: sha512-7sKr8/T4newknx6LAukjlRI3siGiGhBnZohz2Z3jX0zb0EBQdKUq0L//A7CPSckHFPxTg/QvQU2v8e9x9GfkDw==} + + '@0xsequence/transactions@0.0.0-coolcats-0.36.12-20220711222640': + resolution: {integrity: sha512-RMSNQmr2rmZhpgViqs42Q6ABc8yKDheEVi2j1lPrXVnTCnQ3tF492eUDkaAJGRQ2Pjt57u60LhejNIz8B3YrkA==} + + '@0xsequence/utils@0.0.0-coolcats-0.36.12-20220711222640': + resolution: {integrity: sha512-8MaLwpFnKQAP6aOKxt4fWKFxhduTjvYxgV664iHRL7dMpzH5XuTJbuQhMuGbtJKZSB7bWQE9sYUhXxjMkQ0jlw==} + + '@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@0.0.0-20251120164619': + resolution: {integrity: sha512-aRpDSB47kjcXhgn88srUMz6YpQhi1AuQLWTjScuue7iBZ/6ELiYDErevn9wY8kq5B6VMpUJbsaQri6aQjox0ug==} + + '@0xsequence/wallet-primitives@0.0.0-20251120164619': + resolution: {integrity: sha512-VW+XnCNe0O8oasqHsnWnx1Bl4M87KyZX3cytijaiqngTF1OYlhGfqVBQVYoLp6qy5zOFksT8vbO8jojOkaD/MA==} + + '@0xsequence/wallet-wdk@0.0.0-20251120164619': + resolution: {integrity: sha512-uUAbSTjlzEaPF+tnEUkFb4Asj9+AutubeMHXKiP+AVhlpQllAEygmimIo4w/y14y0qa9FcY5+RPacysjCDQkew==} + '@0xsquid/sdk@2.8.25': resolution: {integrity: sha512-fSMKVdKIX8G3qFpoTf3WfcyjhGdc9hE0uSu1bs1gsh4+iG19ILguDdrY8g87dUknt9PCKBb6TIt1QeYEgbXjdA==} @@ -2724,6 +2819,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 +3732,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 +4464,22 @@ 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/config@file:packages/config': + resolution: {directory: packages/config, type: directory} engines: {node: '>=20.11.0'} '@imtbl/contracts@2.2.17': @@ -4384,51 +4488,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 +4822,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 +5125,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 +5138,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 +5161,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 +6217,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 +7652,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 +7715,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 +7757,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 +7770,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 +7880,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'} @@ -8060,12 +8212,19 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + asn1js@3.0.6: + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + engines: {node: '>=12.0.0'} + assert@2.0.0: resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} @@ -8384,6 +8543,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} @@ -8451,9 +8613,17 @@ packages: browserify-rsa@4.1.0: resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} + browserify-sign@4.2.1: resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + browserify-sign@4.2.5: + resolution: {integrity: sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==} + engines: {node: '>= 0.10'} + browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} @@ -8539,6 +8709,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 +8733,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 +8800,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'} @@ -9128,6 +9318,10 @@ packages: crypto-browserify@3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + crypto-browserify@3.12.1: + resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} + engines: {node: '>= 0.10'} + crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} @@ -9658,6 +9852,10 @@ 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'} + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -9821,6 +10019,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 +10041,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 +10287,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' @@ -10468,6 +10674,9 @@ packages: picomatch: optional: true + fetch-ponyfill@7.1.0: + resolution: {integrity: sha512-FhbbL55dj/qdVO3YNK7ZEkshvj3eQ7EuIGV2I6ic/2YiocvyWv+7jg2s4AyS0wdRU75s3tA8ZxI/xPigb0v5Aw==} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -10598,6 +10807,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 +10989,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 +11015,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 +11146,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 +11233,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'} @@ -11031,10 +11260,18 @@ packages: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} + hash-base@3.0.5: + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} + hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} + hash-base@3.1.2: + resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} + engines: {node: '>= 0.8'} + hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} @@ -11619,6 +11856,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==} @@ -11701,6 +11942,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 +12499,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 +12950,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==} @@ -13133,6 +13386,15 @@ packages: node-fetch-native@1.6.2: resolution: {integrity: sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==} + node-fetch@2.6.13: + resolution: {integrity: sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -13348,10 +13610,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 +13704,30 @@ packages: outvariant@1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} + ox@0.7.2: + resolution: {integrity: sha512-JJHxdef3KqwQ8xW9H+UVLWaQiCUh/DeFN/Ii65XwbHTvSuXZveihTV2gs9hhLw5XEWPBrcH7sQBM0rqG7/QurQ==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.9.14: + resolution: {integrity: sha512-lxZYCzGH00WtIPPrqXCrbSW/ZiKjigfII6R0Vu1eH2GpobmcwVheiivbCvsBZzmVZcNpwkabSamPP+ZNtdnKIQ==} + 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==} @@ -13529,6 +13811,10 @@ packages: parse-asn1@5.1.6: resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + parse-asn1@5.1.9: + resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} + engines: {node: '>= 0.10'} + parse-cache-control@1.0.1: resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} @@ -13622,6 +13908,10 @@ packages: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} + pbkdf2@3.1.5: + resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} + engines: {node: '>= 0.10'} + peek-readable@5.1.0: resolution: {integrity: sha512-Tq2I+yoz6Xq3S09E2PyjzOy/oYuNg5v7wyjmrw7OQYSKc7QnDs63q4RXFXraMoI6LZyiEOJ/wDEYzGDPhWwNPA==} engines: {node: '>=14.16'} @@ -13761,6 +14051,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 +14722,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'} @@ -14929,6 +15230,10 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + ripemd160@2.0.3: + resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} + engines: {node: '>= 0.8'} + rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true @@ -15199,6 +15504,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 +15717,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==} @@ -15983,6 +16294,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'} @@ -16164,6 +16479,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 +16584,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 +16885,10 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -16617,6 +16943,14 @@ packages: typescript: optional: true + viem@2.39.3: + resolution: {integrity: sha512-s11rPQRvUEdc5qHK3xT4fIk4qvgPAaLwaTFq+EbFlcJJD+Xn3R4mc9H6B6fquEiHl/mdsdbG/uKCnYpoNtHNHw==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + vite-plugin-node-polyfills@0.16.0: resolution: {integrity: sha512-uj1ymOmk7TliMxiivmXokpMY5gVMBpFPSZPLQSCv/LjkJGGKwyLjpbFL64dbYZEdFSUQ3tM7pbrxNh25yvhqOA==} peerDependencies: @@ -16847,6 +17181,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 +17348,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'} @@ -17138,18 +17488,173 @@ packages: snapshots: - '@0xsequence/abi@2.2.13': {} + '@0xsequence/abi@0.0.0-coolcats-0.36.12-20220711222640': {} + + '@0xsequence/abi@2.3.34': {} + + '@0xsequence/abi@2.3.35': {} + + '@0xsequence/config@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/abi': 0.0.0-coolcats-0.36.12-20220711222640 + '@0xsequence/multicall': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@0xsequence/network': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@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@0.0.0-coolcats-0.36.12-20220711222640': {} + + '@0xsequence/identity-instrument@0.0.0-20251120164619(typescript@5.6.2)': + dependencies: + json-canonicalize: 2.0.0 + jwt-decode: 4.0.0 + ox: 0.7.2(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/multicall@0.0.0-coolcats-0.36.12-20220711222640(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/abi': 0.0.0-coolcats-0.36.12-20220711222640 + '@0xsequence/network': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@0xsequence/network@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@0xsequence/network@2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@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@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/abi': 0.0.0-coolcats-0.36.12-20220711222640 + '@0xsequence/config': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@0xsequence/transactions': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + fetch-ponyfill: 7.1.0(encoding@0.1.13) + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@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/tee-verifier@0.1.2': + dependencies: + cbor2: 1.12.0 + pkijs: 3.3.3 + + '@0xsequence/transactions@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/abi': 0.0.0-coolcats-0.36.12-20220711222640 + '@0xsequence/network': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/abi': 5.7.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@0xsequence/utils@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/properties': 5.7.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) js-base64: 3.7.7 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@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@0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/guard': 0.0.0-coolcats-0.36.12-20220711222640 + '@0xsequence/relayer': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': 0.0.0-20251120164619(typescript@5.6.2) + mipd: 0.0.7(typescript@5.6.2) + ox: 0.7.2(typescript@5.6.2) + viem: 2.39.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + '@0xsequence/wallet-primitives@0.0.0-20251120164619(typescript@5.6.2)': + dependencies: + ox: 0.7.2(typescript@5.6.2) + transitivePeerDependencies: + - typescript + - zod + + '@0xsequence/wallet-wdk@0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10)': + dependencies: + '@0xsequence/guard': 0.0.0-coolcats-0.36.12-20220711222640 + '@0xsequence/identity-instrument': 0.0.0-20251120164619(typescript@5.6.2) + '@0xsequence/relayer': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@0xsequence/tee-verifier': 0.1.2 + '@0xsequence/wallet-core': 0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': 0.0.0-20251120164619(typescript@5.6.2) + idb: 7.1.1 + jwt-decode: 4.0.0 + ox: 0.7.2(typescript@5.6.2) + uuid: 11.1.0 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod '@0xsquid/sdk@2.8.25(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: @@ -17198,6 +17703,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 +19562,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 +19570,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 +19585,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 +19624,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 +19634,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 +19668,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 +20548,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 +20568,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)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(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)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(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,12 +20590,16 @@ 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 + '@imtbl/config@file:packages/config': + dependencies: + '@imtbl/metrics': link:packages/internal/metrics + '@imtbl/contracts@2.2.17(bufferutil@4.0.8)(eslint@9.16.0(jiti@1.21.0))(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 @@ -20132,12 +20643,12 @@ 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)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(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)) + '@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@20.14.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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -20145,7 +20656,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 +20666,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 +20674,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 +20689,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 +20703,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 +20722,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 +20737,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)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(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)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(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 +20756,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 +20796,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 @@ -20781,7 +21292,7 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': + '@jest/test-sequencer@26.6.3': dependencies: '@jest/test-result': 26.6.2 graceful-fs: 4.2.11 @@ -20789,11 +21300,7 @@ snapshots: jest-runner: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - ts-node - - utf-8-validate '@jest/test-sequencer@27.5.1': dependencies: @@ -20978,8 +21485,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 +21655,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 +21669,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 +21715,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 +21868,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 +21882,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 +21898,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 +23326,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 +23419,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.39.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - typescript @@ -22913,6 +23430,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 +23444,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 +23460,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 @@ -24558,25 +25088,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - debug: 4.3.7(supports-color@8.1.1) - eslint: 9.16.0(jiti@1.21.0) - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -24749,6 +25260,17 @@ snapshots: transitivePeerDependencies: - hardhat + '@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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + dependencies: + '@openzeppelin/contracts': 3.4.2 + '@uniswap/v2-core': 1.0.1 + '@uniswap/v3-core': 1.0.0 + '@uniswap/v3-periphery': 1.4.4 + dotenv: 14.3.2 + hardhat-watcher: 2.5.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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - hardhat + '@uniswap/v2-core@1.0.1': {} '@uniswap/v3-core@1.0.0': {} @@ -24782,6 +25304,19 @@ snapshots: transitivePeerDependencies: - hardhat + '@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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@uniswap/sdk-core': 4.0.6 + '@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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/v3-periphery': 1.4.3 + '@uniswap/v3-staker': 1.0.0 + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + transitivePeerDependencies: + - hardhat + '@uniswap/v3-staker@1.0.0': dependencies: '@openzeppelin/contracts': 3.4.2 @@ -24799,17 +25334,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.39.3(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.39.3(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.39.3(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.39.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -24836,11 +25371,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.39.3(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.39.3(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 +25802,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 @@ -25598,6 +26141,12 @@ snapshots: asap@2.0.6: {} + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + asn1.js@5.4.1: dependencies: bn.js: 4.12.0 @@ -25609,6 +26158,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 + asn1js@3.0.6: + 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 +26179,7 @@ snapshots: ast-types@0.15.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 astral-regex@1.0.0: {} @@ -25636,7 +26191,7 @@ snapshots: async-mutex@0.2.6: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 async@1.5.2: {} @@ -25782,6 +26337,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.26.9) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 @@ -25982,6 +26551,13 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.10) + babel-preset-jest@29.6.3(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) + optional: true + babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.26.9 @@ -26108,6 +26684,8 @@ snapshots: bn.js@5.2.1: {} + bn.js@5.2.2: {} + body-parser@1.20.1: dependencies: bytes: 3.1.2 @@ -26222,9 +26800,15 @@ snapshots: bn.js: 5.2.1 randombytes: 2.1.0 + browserify-rsa@4.1.1: + dependencies: + bn.js: 5.2.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + 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 @@ -26234,6 +26818,18 @@ snapshots: readable-stream: 3.6.2 safe-buffer: 5.2.1 + browserify-sign@4.2.5: + dependencies: + bn.js: 5.2.2 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.6.1 + inherits: 2.0.4 + parse-asn1: 5.1.9 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + browserify-zlib@0.2.0: dependencies: pako: 1.0.11 @@ -26318,6 +26914,8 @@ snapshots: bytes@3.1.2: {} + bytestreamjs@2.0.1: {} + cac@6.7.14: {} cacache@17.1.3: @@ -26359,6 +26957,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 +26970,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.0 + get-intrinsic: 1.2.4 + 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 +27024,8 @@ snapshots: caseless@0.12.0: {} + cbor2@1.12.0: {} + cbor@8.1.0: dependencies: nofilter: 3.1.0 @@ -27010,6 +27627,21 @@ snapshots: randombytes: 2.1.0 randomfill: 1.0.4 + crypto-browserify@3.12.1: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.5 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + hash-base: 3.0.5 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + crypto-js@4.2.0: {} crypto-random-string@2.0.0: {} @@ -27537,6 +28169,12 @@ 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 + duplexer@0.1.2: {} duplexify@4.1.2: @@ -27740,6 +28378,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 +28417,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 @@ -27894,7 +28538,7 @@ snapshots: dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 @@ -27905,13 +28549,13 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-config-airbnb@19.0.4(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-plugin-jsx-a11y@6.9.0(eslint@8.57.0))(eslint-plugin-react-hooks@5.0.0(eslint@8.57.0))(eslint-plugin-react@7.35.0(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0(eslint@8.57.0) @@ -27925,8 +28569,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -27945,7 +28589,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -27964,7 +28608,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -27981,8 +28625,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -27999,8 +28643,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28010,45 +28654,18 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) - '@rushstack/eslint-patch': 1.10.4 - '@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) - babel-preset-react-app: 10.0.1 - confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) - eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.35.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-jest: 25.7.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))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) @@ -28064,23 +28681,23 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@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) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 9.16.0(jiti@1.21.0) - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-testing-library: 5.11.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -28105,25 +28722,7 @@ snapshots: enhanced-resolve: 5.15.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) - get-tsconfig: 4.6.2 - globby: 13.2.2 - is-core-module: 2.15.0 - is-glob: 4.0.3 - synckit: 0.8.5 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): - dependencies: - debug: 4.3.7(supports-color@8.1.1) - enhanced-resolve: 5.15.0 - eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) get-tsconfig: 4.6.2 globby: 13.2.2 is-core-module: 2.15.0 @@ -28146,27 +28745,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): dependencies: debug: 3.2.7 @@ -28177,14 +28755,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0): - dependencies: - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - eslint: 8.57.0 - lodash: 4.17.21 - string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) @@ -28193,15 +28763,15 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) - eslint: 9.16.0(jiti@1.21.0) + eslint: 8.57.0 lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -28228,33 +28798,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)) - hasown: 2.0.2 - is-core-module: 2.15.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): dependencies: array-includes: 3.1.8 @@ -28304,17 +28847,6 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - transitivePeerDependencies: - - supports-color - - typescript - eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -28378,7 +28910,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 +29243,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 @@ -29123,6 +29655,12 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fetch-ponyfill@7.1.0(encoding@0.1.13): + dependencies: + node-fetch: 2.6.13(encoding@0.1.13) + transitivePeerDependencies: + - encoding + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -29270,6 +29808,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 +30015,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 +30040,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 +30221,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + got@11.8.6: dependencies: '@sindresorhus/is': 4.6.0 @@ -29728,6 +30290,11 @@ snapshots: chokidar: 3.6.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) + hardhat-watcher@2.5.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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): + dependencies: + chokidar: 3.6.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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + 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): dependencies: '@ethersproject/abi': 5.7.0 @@ -29908,6 +30475,8 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -29933,12 +30502,24 @@ snapshots: is-number: 3.0.0 kind-of: 4.0.0 + hash-base@3.0.5: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + hash-base@3.1.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 safe-buffer: 5.2.1 + hash-base@3.1.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + hash.js@1.1.7: dependencies: inherits: 2.0.4 @@ -30512,6 +31093,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: {} @@ -30578,6 +31163,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: @@ -30890,7 +31479,7 @@ snapshots: jest-config@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 - '@jest/test-sequencer': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/test-sequencer': 26.6.3 '@jest/types': 26.6.2 babel-jest: 26.6.3(@babel/core@7.26.10) chalk: 4.1.2 @@ -32168,6 +32757,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 +33142,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 lowercase-keys@2.0.0: {} @@ -32649,6 +33240,8 @@ snapshots: marky@1.2.5: {} + math-intrinsics@1.1.0: {} + md5.js@1.3.5: dependencies: hash-base: 3.1.0 @@ -33234,7 +33827,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: {} @@ -33261,6 +33854,12 @@ snapshots: node-fetch-native@1.6.2: {} + node-fetch@2.6.13(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -33563,11 +34162,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 +34283,51 @@ snapshots: outvariant@1.4.0: {} + ox@0.7.2(typescript@5.6.2): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.1.2(typescript@5.6.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - zod + + 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.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 @@ -33800,6 +34439,14 @@ snapshots: pbkdf2: 3.1.2 safe-buffer: 5.2.1 + parse-asn1@5.1.9: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.5 + safe-buffer: 5.2.1 + parse-cache-control@1.0.1: {} parse-json@4.0.0: @@ -33825,7 +34472,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: {} @@ -33877,6 +34524,15 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 + pbkdf2@3.1.5: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + to-buffer: 1.2.2 + peek-readable@5.1.0: {} performance-now@2.1.0: {} @@ -34035,6 +34691,15 @@ snapshots: dependencies: find-up: 3.0.0 + pkijs@3.3.3: + dependencies: + '@noble/hashes': 1.4.0 + asn1js: 3.0.6 + 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 +35374,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: @@ -35006,92 +35677,6 @@ snapshots: '@remix-run/router': 1.7.2 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): - dependencies: - '@babel/core': 7.26.9 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.26.9) - babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) - babel-preset-react-app: 10.0.1 - bfj: 7.0.2 - browserslist: 4.23.3 - camelcase: 6.3.0 - case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss: 8.4.49 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) - postcss-preset-env: 7.8.3(postcss@8.4.49) - prompts: 2.4.2 - react: 18.3.1 - react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - react-refresh: 0.11.0 - resolve: 1.22.8 - resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - optionalDependencies: - fsevents: 2.3.3 - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - '@parcel/css' - - '@swc/core' - - '@types/babel__core' - - '@types/webpack' - - bufferutil - - canvas - - clean-css - - csso - - debug - - esbuild - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - fibers - - node-notifier - - node-sass - - rework - - rework-visit - - sass - - sass-embedded - - sockjs-client - - supports-color - - ts-node - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-hot-middleware - - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 @@ -35178,7 +35763,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35195,9 +35780,9 @@ snapshots: css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + eslint: 8.57.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35214,7 +35799,7 @@ snapshots: prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 @@ -35350,7 +35935,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: @@ -35550,9 +36135,14 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 + ripemd160@2.0.3: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + 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 +36506,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 @@ -36923,6 +37519,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 @@ -37002,12 +37604,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37022,12 +37624,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37042,12 +37644,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37062,12 +37664,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37076,10 +37678,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.9 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) + babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.23.1 ts-mockito@2.6.1: @@ -37240,6 +37842,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 +37942,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 +38221,8 @@ snapshots: utils-merge@1.0.1: {} + uuid@11.1.0: {} + uuid@8.3.2: {} uuid@9.0.1: {} @@ -37670,6 +38282,23 @@ snapshots: - utf-8-validate - zod + viem@2.39.3(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 +38338,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.39.3(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.39.3(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.39.3(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.39.3(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.39.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -37989,6 +38618,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 +38846,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 diff --git a/sdk/src/index.browser.ts b/sdk/src/index.browser.ts index 9b0f285d2a..5955b6651c 100644 --- a/sdk/src/index.browser.ts +++ b/sdk/src/index.browser.ts @@ -1,6 +1,8 @@ export * as config from './config'; export * as blockchainData from './blockchain_data'; -export * as passport from './passport'; +// Passport excluded from IIFE browser bundle due to experimental @0xsequence dependencies +// Use ESM/CJS builds for Passport support +// export * as passport from './passport'; export * as orderbook from './orderbook'; export * as checkout from './checkout'; export * as x from './x'; From e3bc425d762b9d04edddc751ff241f16f4e4b731 Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Wed, 26 Nov 2025 13:57:01 +1300 Subject: [PATCH 02/10] fix: sequence signing and nonce for first transaction --- .../passport/sdk/src/arbOne/arbOneProvider.ts | 5 ++-- .../sdk/src/arbOne/user/registerArbOneUser.ts | 8 ++--- .../passport/sdk/src/arbOne/walletHelpers.ts | 23 +++++++++++--- packages/passport/sdk/src/authManager.ts | 30 +++++++++++++++---- .../sdk/src/sequence/sequenceSigner.ts | 12 +++++++- .../passport/sdk/src/zkEvm/zkEvmProvider.ts | 2 +- 6 files changed, 63 insertions(+), 17 deletions(-) diff --git a/packages/passport/sdk/src/arbOne/arbOneProvider.ts b/packages/passport/sdk/src/arbOne/arbOneProvider.ts index 3b9cdef384..8b5c48985c 100644 --- a/packages/passport/sdk/src/arbOne/arbOneProvider.ts +++ b/packages/passport/sdk/src/arbOne/arbOneProvider.ts @@ -180,7 +180,8 @@ export class ArbOneProvider implements Provider { case 'eth_sendTransaction': { // Get user's Arbitrum One wallet address - const arbOneAddress = '0xa0925a0817dac9eb8c99bcebefd09461c459eb3f';//await this.#getArbOneAddress(); + // eoa: 0xD56294DdC6439D1A404F4C193a40aE3821165d69 + const arbOneAddress = '0x33e406618478b434faa66d24a50c75884d0be601';//await this.#getArbOneAddress(); if (!arbOneAddress) { throw new JsonRpcError( ProviderErrorCode.UNAUTHORIZED, @@ -194,7 +195,7 @@ export class ArbOneProvider implements Provider { try { const signerAddress = await this.#ethSigner.getAddress(); const tx = { - to: '0x04E55fc6fBD722703074D4E19374c201596f3CB4',//signerAddress,// '0x04E55fc6fBD722703074D4E19374c201596f3CB4', //'0x04E55fc6fBD722703074D4E19374c201596f3CB4' + to: '0xD56294DdC6439D1A404F4C193a40aE3821165d69', // Your EOA value: 0n, data: "0x" } diff --git a/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts b/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts index b87518f34b..0d974fcca2 100644 --- a/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts +++ b/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts @@ -34,14 +34,14 @@ export async function registerArbOneUser({ const detectNetworkPromise = rpcProvider.getNetwork(); detectNetworkPromise.then(() => flow.addEvent('endDetectNetwork')); - const listChainsPromise = multiRollupApiClients.chainsApi.listChains(); - listChainsPromise.then(() => flow.addEvent('endListChains')); + // const listChainsPromise = multiRollupApiClients.chainsApi.listChains(); + // listChainsPromise.then(() => flow.addEvent('endListChains')); - const [ethereumAddress, ethereumSignature, network, chainListResponse] = await Promise.all([ + const [ethereumAddress, ethereumSignature, network] = await Promise.all([ getAddressPromise, signRawPromise, detectNetworkPromise, - listChainsPromise, + // listChainsPromise, ]); // const eipChainId = getEip155ChainId(Number(network.chainId)); diff --git a/packages/passport/sdk/src/arbOne/walletHelpers.ts b/packages/passport/sdk/src/arbOne/walletHelpers.ts index 4a112cab85..9065d68386 100644 --- a/packages/passport/sdk/src/arbOne/walletHelpers.ts +++ b/packages/passport/sdk/src/arbOne/walletHelpers.ts @@ -6,8 +6,11 @@ import { BigNumberish, Contract, getBytes, Interface, Signer, ZeroAddress, JsonRpcProvider, AbiCoder, concat, + SigningKey, } from 'ethers'; import { MetaTransaction, MetaTransactionNormalised, TypedDataPayload } from './types'; +import { hashMessage } from 'ethers'; +import SequenceSigner from '../sequence/sequenceSigner'; const SIGNATURE_WEIGHT = 1; // Weight of a single signature in the multi-sig @@ -45,7 +48,9 @@ export const getNonce = async ( const code = await rpcProvider.getCode(arbOneAddress); if (code === '0x') { // Wallet not deployed yet, nonce is 0 - return encodeNonce(rawSpace, 0n); + // on sequence first transaction is to update image hash which nonce is 0 + // so this needs to be 1 + return encodeNonce(rawSpace, 1n); } // Wallet is deployed, get nonce from contract @@ -105,10 +110,20 @@ export const signMetaTransactions = async ( ); // Sign with ETH_SIGN (adds Ethereum message prefix) - const signature = await sequenceSigner.signMessage(payloadHash); - + // const signature = await sequenceSigner.signMessage(payloadHash); + const privateKey = await (sequenceSigner as SequenceSigner).getPrivateKey(); + const signingKey = new SigningKey(privateKey); + const ethSignDigest = hashMessage(payloadHash); + const signature = signingKey.sign(ethSignDigest); + + console.log('[signMetaTransactions] signature', signature); // Parse signature to extract r, s, yParity - const sigBytes = Bytes.fromHex(signature as Hex.Hex); + // Safely convert signature to hex string before parsing bytes + const sigHex = + typeof signature === 'string' + ? signature + : (signature as any)?.serialized || (signature as any)?.compact || ''; + const sigBytes = Bytes.fromHex(sigHex); const r = Bytes.toBigInt(sigBytes.slice(0, 32)); const s = Bytes.toBigInt(sigBytes.slice(32, 64)); const v = sigBytes[64]!; diff --git a/packages/passport/sdk/src/authManager.ts b/packages/passport/sdk/src/authManager.ts index 640d2ab6a4..bdda25901b 100644 --- a/packages/passport/sdk/src/authManager.ts +++ b/packages/passport/sdk/src/authManager.ts @@ -26,6 +26,7 @@ import { isUserZkEvm, UserImx, isUserImx, + RollupType, } from './types'; import { PassportConfiguration } from './config'; import ConfirmationOverlay from './overlay/confirmationOverlay'; @@ -638,12 +639,31 @@ export default class AuthManager { } public async getUserZkEvm(): Promise { - const user = await this.getUser(isUserZkEvm); - if (!user) { - throw new Error('Failed to obtain a User with the required ZkEvm attributes'); - } + // TODO: Uncomment when ZkEvm attributes are populated + // const user = await this.getUser(isUserZkEvm); + // if (!user) { + // throw new Error('Failed to obtain a User with the required ZkEvm attributes'); + // } + // return user; - return user; + const oidcUser = await this.userManager.getUser(); + if (!oidcUser) { + throw new Error('User not authenticated'); + } + + const ethAddress = '0xa6df9053c888404ada7d05409cbe6f4440e9750e'; + const userAdminAddress = '0x5055cd32253f6fd0702ca3983425f520e23bf473'; + + // Add ZkEvm attributes to the OIDC user + const userWithZkEvm = { + ...oidcUser, + [RollupType.ZKEVM]: { + ethAddress, + userAdminAddress, + } + } as unknown as UserZkEvm; + + return userWithZkEvm; } public async getUserImx(): Promise { diff --git a/packages/passport/sdk/src/sequence/sequenceSigner.ts b/packages/passport/sdk/src/sequence/sequenceSigner.ts index 88a857d171..8cef42d324 100644 --- a/packages/passport/sdk/src/sequence/sequenceSigner.ts +++ b/packages/passport/sdk/src/sequence/sequenceSigner.ts @@ -8,7 +8,7 @@ import { User } from '../types'; import { Hex, Bytes } from 'ox' import jwtDecode from 'jwt-decode'; import { IdTokenPayload } from '../types'; - +import { SigningKey } from 'ethers'; interface AuthKey { address: string; privateKey: CryptoKey; @@ -213,10 +213,20 @@ export default class SequenceSigner extends AbstractSigner { return wallet.walletAddress; } else { const wallet = await this.getPrivateKeyWallet(); + console.log('[SequenceSigner] wallet.walletAddress', wallet.walletAddress); return wallet.walletAddress; } } + async getPrivateKey(): Promise { + if (this.useIdentityInstrument) { + return Promise.resolve(''); + } else { + const wallet = await this.getPrivateKeyWallet(); + return wallet.wallet.privateKey; + } + } + async signMessage(message: string | Uint8Array): Promise { if (this.useIdentityInstrument) { // Identity Instrument mode diff --git a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts index 4f2f7ebc10..48883b1f88 100644 --- a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts +++ b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts @@ -206,7 +206,7 @@ export class ZkEvmProvider implements Provider { } } case 'eth_sendTransaction': { - const zkEvmAddress = await this.#getZkEvmAddress(); + const zkEvmAddress = '0xa6df9053c888404ada7d05409cbe6f4440e9750e';//await this.#getZkEvmAddress(); if (!zkEvmAddress) { throw new JsonRpcError( ProviderErrorCode.UNAUTHORIZED, From b01bf5b815723a52a4eb8d2a804c2a70ac60e756 Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Fri, 28 Nov 2025 10:44:38 +1300 Subject: [PATCH 03/10] spike: identity instrument --- .../generated-clients/src/config/config.ts | 2 +- .../passport/sdk/src/arbOne/arbOneProvider.ts | 6 ++--- .../passport/sdk/src/arbOne/walletHelpers.ts | 26 ++++++++++++------- packages/passport/sdk/src/config/config.ts | 2 +- .../sdk/src/sequence/sequenceSigner.ts | 9 +++++-- .../sdk/src/zkEvm/transactionHelpers.ts | 22 ++++++++-------- .../passport/sdk/src/zkEvm/zkEvmProvider.ts | 2 +- 7 files changed, 40 insertions(+), 29 deletions(-) diff --git a/packages/internal/generated-clients/src/config/config.ts b/packages/internal/generated-clients/src/config/config.ts index 22acedac82..5bd9e362a4 100644 --- a/packages/internal/generated-clients/src/config/config.ts +++ b/packages/internal/generated-clients/src/config/config.ts @@ -78,7 +78,7 @@ export const multiRollupConfig = { basePath: 'https://api.sandbox.immutable.com', }), passport: createConfig({ - basePath: 'https://api.sandbox.immutable.com', + basePath: 'http://localhost:8071', }), }), }; diff --git a/packages/passport/sdk/src/arbOne/arbOneProvider.ts b/packages/passport/sdk/src/arbOne/arbOneProvider.ts index 8b5c48985c..c844644fac 100644 --- a/packages/passport/sdk/src/arbOne/arbOneProvider.ts +++ b/packages/passport/sdk/src/arbOne/arbOneProvider.ts @@ -180,8 +180,8 @@ export class ArbOneProvider implements Provider { case 'eth_sendTransaction': { // Get user's Arbitrum One wallet address - // eoa: 0xD56294DdC6439D1A404F4C193a40aE3821165d69 - const arbOneAddress = '0x33e406618478b434faa66d24a50c75884d0be601';//await this.#getArbOneAddress(); + // eoa: 0x94C87AAB8F415D7eCb28503C6A79B35a49b88f86 + const arbOneAddress = '0x93b034db58f16d9c22df136cac0d133af6cce1c6';//'0x9b77b115890ac0c9e2ea5d456bc84b333c7533e1';//await this.#getArbOneAddress(); if (!arbOneAddress) { throw new JsonRpcError( ProviderErrorCode.UNAUTHORIZED, @@ -195,7 +195,7 @@ export class ArbOneProvider implements Provider { try { const signerAddress = await this.#ethSigner.getAddress(); const tx = { - to: '0xD56294DdC6439D1A404F4C193a40aE3821165d69', // Your EOA + to: '0x896ad3cff6c29f0d43b1930267c1abed6a88a034',//'0x94C87AAB8F415D7eCb28503C6A79B35a49b88f86', // Your EOA value: 0n, data: "0x" } diff --git a/packages/passport/sdk/src/arbOne/walletHelpers.ts b/packages/passport/sdk/src/arbOne/walletHelpers.ts index 9065d68386..0091805657 100644 --- a/packages/passport/sdk/src/arbOne/walletHelpers.ts +++ b/packages/passport/sdk/src/arbOne/walletHelpers.ts @@ -91,30 +91,36 @@ export const signMetaTransactions = async ( const encodedNonceBigInt = BigInt(encodedNonce.toString()); const space = encodedNonceBigInt >> 96n; const nonce = encodedNonceBigInt & ((1n << 96n) - 1n); - + // Convert to Sequence call format const calls = metaTransactions.map(toSequenceCall); - + // Create Sequence payload using SDK const payload = Payload.fromCall(nonce, space, calls); - + // Encode payload using SDK (compact binary format) // Pass wallet address for self-call optimization - const encodedPayload = Payload.encode(payload, Address.from(walletAddress)); - + const encodedPayload = Payload.encode(payload, Address.from(walletAddress)) // Hash payload using SDK (EIP-712 typed data hash) const payloadHash = Payload.hash( Address.from(walletAddress), Number(chainId), payload ); - + console.log('[signMetaTransactions] payloadHash', payloadHash); // Sign with ETH_SIGN (adds Ethereum message prefix) // const signature = await sequenceSigner.signMessage(payloadHash); - const privateKey = await (sequenceSigner as SequenceSigner).getPrivateKey(); - const signingKey = new SigningKey(privateKey); - const ethSignDigest = hashMessage(payloadHash); - const signature = signingKey.sign(ethSignDigest); + let signature; + if ((sequenceSigner as SequenceSigner).useIdentityInstrument) { + signature = await (sequenceSigner as SequenceSigner).signMessage(payloadHash); + console.log('[signMetaTransactions] signature', signature); + } else { + const privateKey = await (sequenceSigner as SequenceSigner).getPrivateKey(); + console.log('[signMetaTransactions] privateKey', privateKey); + const signingKey = new SigningKey(privateKey); + const ethSignDigest = hashMessage(payloadHash); + signature = signingKey.sign(ethSignDigest); // This returns a Signature object + } console.log('[signMetaTransactions] signature', signature); // Parse signature to extract r, s, yParity diff --git a/packages/passport/sdk/src/config/config.ts b/packages/passport/sdk/src/config/config.ts index 625cbe7fa8..72d17c27f6 100644 --- a/packages/passport/sdk/src/config/config.ts +++ b/packages/passport/sdk/src/config/config.ts @@ -143,7 +143,7 @@ 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:8070/relayer-mr'; this.arbOneRpcUrl = 'https://sepolia-rollup.arbitrum.io/rpc'; this.multiRollupConfig = multiRollupConfig.getSandbox(); break; diff --git a/packages/passport/sdk/src/sequence/sequenceSigner.ts b/packages/passport/sdk/src/sequence/sequenceSigner.ts index 8cef42d324..90bb31a873 100644 --- a/packages/passport/sdk/src/sequence/sequenceSigner.ts +++ b/packages/passport/sdk/src/sequence/sequenceSigner.ts @@ -42,7 +42,7 @@ export default class SequenceSigner extends AbstractSigner { private privateKeyWallet: PrivateKeyWallet | null = null; private createPrivateKeyWalletPromise: Promise | null = null; - private useIdentityInstrument: boolean = false; + useIdentityInstrument: boolean = true; constructor(authManager: AuthManager, config: PassportConfiguration) { super(); @@ -69,8 +69,10 @@ export default class SequenceSigner extends AbstractSigner { this.createWalletPromise = new Promise(async (resolve, reject) => { try { this.userWallet = null; - // Need a new ID token to call identity instrument, TODO: improve thi + // Need a new ID token to call identity instrument + // TODO: improve this await this.authManager.forceUserRefresh(); + const authenticatedUser = user || await this.getUserOrThrow(); if (!authenticatedUser.idToken) { @@ -229,6 +231,7 @@ export default class SequenceSigner extends AbstractSigner { async signMessage(message: string | Uint8Array): Promise { if (this.useIdentityInstrument) { + console.log('[SequenceSigner] signMessage - Identity Instrument mode'); // Identity Instrument mode const wallet = await this.getUserWallet(); @@ -236,6 +239,8 @@ export default class SequenceSigner extends AbstractSigner { wallet.identityInstrument, wallet.authKey ); + + console.log('[SequenceSigner] getting message bytes...'); // Convert message to 32-byte hash digest // signMessage expects the message to be hashed with Ethereum prefix diff --git a/packages/passport/sdk/src/zkEvm/transactionHelpers.ts b/packages/passport/sdk/src/zkEvm/transactionHelpers.ts index 8ddaec4055..633db6a80d 100644 --- a/packages/passport/sdk/src/zkEvm/transactionHelpers.ts +++ b/packages/passport/sdk/src/zkEvm/transactionHelpers.ts @@ -197,15 +197,15 @@ export const prepareAndSignTransaction = async ({ // Parallelize the validation and signing of the transaction // without waiting for the validation to complete - const validateTransaction = async () => { - await guardianClient.validateEVMTransaction({ - chainId: getEip155ChainId(Number(chainId)), - nonce: convertBigNumberishToString(nonce), - metaTransactions, - isBackgroundTransaction, - }); - flow.addEvent('endValidateEVMTransaction'); - }; + // const validateTransaction = async () => { + // await guardianClient.validateEVMTransaction({ + // chainId: getEip155ChainId(Number(chainId)), + // nonce: convertBigNumberishToString(nonce), + // metaTransactions, + // isBackgroundTransaction, + // }); + // flow.addEvent('endValidateEVMTransaction'); + // }; // NOTE: We sign again because we now are adding the fee transaction, so the // whole payload is different and needs a new signature. @@ -221,8 +221,8 @@ export const prepareAndSignTransaction = async ({ return signed; }; - const [, signedTransactions] = await Promise.all([ - validateTransaction(), + const [signedTransactions] = await Promise.all([ + // validateTransaction(), signTransaction(), ]); diff --git a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts index 48883b1f88..ecf8245d34 100644 --- a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts +++ b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts @@ -206,7 +206,7 @@ export class ZkEvmProvider implements Provider { } } case 'eth_sendTransaction': { - const zkEvmAddress = '0xa6df9053c888404ada7d05409cbe6f4440e9750e';//await this.#getZkEvmAddress(); + const zkEvmAddress = '0x775396532ac01f6013c0118a5a9d4568aaa92cfe';//await this.#getZkEvmAddress(); if (!zkEvmAddress) { throw new JsonRpcError( ProviderErrorCode.UNAUTHORIZED, From dc8e46a54d8f2a24d86e0a175f0e97a3fcf54c7d Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Tue, 2 Dec 2025 18:32:49 +1300 Subject: [PATCH 04/10] feat: sequence siger and provider --- .../src/components/arbone/ArbOneWorkflow.tsx | 4 +- .../src/context/ImmutableProvider.tsx | 2 +- .../src/context/PassportProvider.tsx | 2 +- packages/passport/sdk/package.json | 9 +- .../passport/sdk/src/Passport.int.test.ts | 2 + packages/passport/sdk/src/Passport.test.ts | 2 + packages/passport/sdk/src/Passport.ts | 30 +- .../passport/sdk/src/arbOne/JsonRpcError.ts | 38 -- .../passport/sdk/src/arbOne/arbOneProvider.ts | 402 ----------- packages/passport/sdk/src/arbOne/examples.ts | 365 ---------- packages/passport/sdk/src/arbOne/index.ts | 6 - .../passport/sdk/src/arbOne/relayerClient.ts | 228 ------- .../sdk/src/arbOne/sendTransaction.ts | 41 -- .../sdk/src/arbOne/transactionHelpers.ts | 201 ------ packages/passport/sdk/src/arbOne/types.ts | 88 --- .../passport/sdk/src/arbOne/user/index.ts | 2 - .../sdk/src/arbOne/user/registerArbOneUser.ts | 76 --- .../passport/sdk/src/arbOne/walletHelpers.ts | 173 ----- packages/passport/sdk/src/authManager.ts | 42 +- .../passport/sdk/src/config/config.test.ts | 2 + packages/passport/sdk/src/config/config.ts | 16 +- packages/passport/sdk/src/index.ts | 2 - .../passport/sdk/src/sequence/chainConfig.ts | 36 + packages/passport/sdk/src/sequence/index.ts | 6 + .../sdk/src/sequence/sendTransaction.ts | 36 + .../sdk/src/sequence/sequenceProvider.ts | 254 +++++++ .../sdk/src/sequence/sequenceRelayerClient.ts | 72 ++ .../sdk/src/sequence/sequenceSigner.ts | 323 +-------- .../sdk/src/sequence/signer/ISigner.ts | 10 + .../signer/identityInstrumentSigner.ts | 186 ++++++ .../src/sequence/signer/privateKeySigner.ts | 113 ++++ .../sdk/src/sequence/signer/signerHelpers.ts | 79 +++ .../sdk/src/sequence/transactionHelpers.ts | 372 +++++++++++ packages/passport/sdk/src/sequence/types.ts | 24 + .../passport/sdk/src/sequence/user/index.ts | 2 + .../sdk/src/sequence/user/registerUser.ts | 86 +++ .../sdk/src/sequence/walletHelpers.ts | 48 ++ packages/passport/sdk/src/types.ts | 23 +- .../passport/sdk/src/zkEvm/relayerClient.ts | 9 +- .../passport/sdk/src/zkEvm/sendTransaction.ts | 2 - .../passport/sdk/src/zkEvm/zkEvmProvider.ts | 47 +- pnpm-lock.yaml | 629 ++++++++++-------- 42 files changed, 1813 insertions(+), 2277 deletions(-) delete mode 100644 packages/passport/sdk/src/arbOne/JsonRpcError.ts delete mode 100644 packages/passport/sdk/src/arbOne/arbOneProvider.ts delete mode 100644 packages/passport/sdk/src/arbOne/examples.ts delete mode 100644 packages/passport/sdk/src/arbOne/index.ts delete mode 100644 packages/passport/sdk/src/arbOne/relayerClient.ts delete mode 100644 packages/passport/sdk/src/arbOne/sendTransaction.ts delete mode 100644 packages/passport/sdk/src/arbOne/transactionHelpers.ts delete mode 100644 packages/passport/sdk/src/arbOne/types.ts delete mode 100644 packages/passport/sdk/src/arbOne/user/index.ts delete mode 100644 packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts delete mode 100644 packages/passport/sdk/src/arbOne/walletHelpers.ts create mode 100644 packages/passport/sdk/src/sequence/chainConfig.ts create mode 100644 packages/passport/sdk/src/sequence/sendTransaction.ts create mode 100644 packages/passport/sdk/src/sequence/sequenceProvider.ts create mode 100644 packages/passport/sdk/src/sequence/sequenceRelayerClient.ts create mode 100644 packages/passport/sdk/src/sequence/signer/ISigner.ts create mode 100644 packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts create mode 100644 packages/passport/sdk/src/sequence/signer/privateKeySigner.ts create mode 100644 packages/passport/sdk/src/sequence/signer/signerHelpers.ts create mode 100644 packages/passport/sdk/src/sequence/transactionHelpers.ts create mode 100644 packages/passport/sdk/src/sequence/types.ts create mode 100644 packages/passport/sdk/src/sequence/user/index.ts create mode 100644 packages/passport/sdk/src/sequence/user/registerUser.ts create mode 100644 packages/passport/sdk/src/sequence/walletHelpers.ts diff --git a/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx index ea7408e35e..eb109b9fc4 100644 --- a/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx +++ b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx @@ -39,7 +39,7 @@ function ArbOneWorkflow() { }, [arbOneEventHandler, arbOneProvider]); return ( - + {arbOneProvider && ( <> @@ -67,7 +67,7 @@ function ArbOneWorkflow() { disabled={isLoading} onClick={connectArbOne} > - Connect ArbOne + Connect Arbitrum Sepolia )} diff --git a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx index 5ad33e29c9..0d1b6f7044 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -141,7 +141,7 @@ const getPassportConfig = (environment: EnvironmentNames): PassportModuleConfigu orderBookMrBasePath: 'https://api.dev.immutable.com', passportMrBasePath: 'http://localhost:8071', sequenceIdentityInstrumentEndpoint: 'https://next-identity.sequence-dev.app/', - arbOneRpcUrl: 'https://sepolia-rollup.arbitrum.io/rpc', + sequenceProjectAccessKey: 'AQAAAAAAAAB5QznGqk9paa4EQjom09ERpJs', }, ...sharedConfigurationValues, }; diff --git a/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx b/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx index 9c6108794f..cd960cda2f 100644 --- a/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx @@ -96,7 +96,7 @@ export function PassportProvider({ const connectArbOne = useCallback(async () => { if (!passportClient) return; setIsLoading(true); - const provider = await passportClient.connectEvm({ chain: EvmChain.ARBONE }); + const provider = await passportClient.connectEvm({ chain: EvmChain.ARBITRUM_SEPOLIA }); if (provider) { setArbOneProvider(provider); addMessage('ConnectArbOne', 'Connected'); diff --git a/packages/passport/sdk/package.json b/packages/passport/sdk/package.json index 0bc6c4e2c5..241630dc33 100644 --- a/packages/passport/sdk/package.json +++ b/packages/passport/sdk/package.json @@ -7,11 +7,12 @@ "dependencies": { "@0xsequence/abi": "2.3.34", "@0xsequence/core": "2.3.34", - "@0xsequence/identity-instrument": "0.0.0-20251120164619", + "@0xsequence/identity-instrument": "3.0.0-beta.1", "@0xsequence/network": "^2.3.35", - "@0xsequence/wallet-core": "0.0.0-20251120164619", - "@0xsequence/wallet-primitives": "0.0.0-20251120164619", - "@0xsequence/wallet-wdk": "0.0.0-20251120164619", + "@0xsequence/wallet-wdk": "3.0.0-beta.1", + "@0xsequence/relayer": "3.0.0-beta.1", + "@0xsequence/wallet-core": "3.0.0-beta.1", + "@0xsequence/wallet-primitives": "3.0.0-beta.1", "@imtbl/config": "workspace:*", "@imtbl/generated-clients": "workspace:*", "@imtbl/metrics": "workspace:*", diff --git a/packages/passport/sdk/src/Passport.int.test.ts b/packages/passport/sdk/src/Passport.int.test.ts index 4bd44d85ac..0534596268 100644 --- a/packages/passport/sdk/src/Passport.int.test.ts +++ b/packages/passport/sdk/src/Passport.int.test.ts @@ -195,6 +195,8 @@ describe('Passport', () => { orderBookMrBasePath: 'orderBookMrBasePath123', passportMrBasePath: 'passportMrBasePath123', immutableXClient, + sequenceIdentityInstrumentEndpoint: 'sequenceIdentityInstrumentEndpoint123', + sequenceProjectAccessKey: 'sequenceProjectAccessKey123', }; const { passportImxProviderFactory } = buildPrivateVars({ diff --git a/packages/passport/sdk/src/Passport.test.ts b/packages/passport/sdk/src/Passport.test.ts index f3faeed012..6f966f8768 100644 --- a/packages/passport/sdk/src/Passport.test.ts +++ b/packages/passport/sdk/src/Passport.test.ts @@ -127,6 +127,8 @@ describe('Passport', () => { orderBookMrBasePath: 'orderBookMrBasePath123', passportMrBasePath: 'passportMrBasePath123', immutableXClient, + sequenceIdentityInstrumentEndpoint: 'sequenceIdentityInstrumentEndpoint123', + sequenceProjectAccessKey: 'sequenceProjectAccessKey123', }, ...oidcConfiguration, }); diff --git a/packages/passport/sdk/src/Passport.ts b/packages/passport/sdk/src/Passport.ts index 4cc6e6bc84..4a8479ae87 100644 --- a/packages/passport/sdk/src/Passport.ts +++ b/packages/passport/sdk/src/Passport.ts @@ -33,7 +33,6 @@ import { import { ConfirmationScreen, EmbeddedLoginPrompt } from './confirmation'; import { ZkEvmProvider } from './zkEvm'; import { Provider } from './zkEvm/types'; -import { ArbOneProvider } from './arbOne'; import TypedEventEmitter from './utils/typedEventEmitter'; import GuardianClient from './guardian'; import logger from './utils/logger'; @@ -41,6 +40,7 @@ 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) { @@ -71,8 +71,7 @@ export const buildPrivateVars = (passportModuleConfiguration: PassportModuleConf magicProviderId: config.magicProviderId, }); const magicTEESigner = new MagicTEESigner(authManager, magicTeeApiClients); - // SequenceSigner will be loaded lazily to avoid SSR issues - let sequenceSigner: any = null; + const sequenceSigner = new SequenceSigner(authManager, config); const multiRollupApiClients = new MultiRollupApiClients(config.multiRollupConfig); const passportEventEmitter = new TypedEventEmitter(); @@ -127,7 +126,7 @@ export class Passport { private readonly magicTEESigner: MagicTEESigner; - private sequenceSigner: any; // Lazy-loaded to avoid SSR issues + private sequenceSigner: SequenceSigner; private readonly multiRollupApiClients: MultiRollupApiClients; @@ -143,7 +142,7 @@ export class Passport { this.config = privateVars.config; this.authManager = privateVars.authManager; this.magicTEESigner = privateVars.magicTEESigner; - this.sequenceSigner = privateVars.sequenceSigner; // Initially null + this.sequenceSigner = privateVars.sequenceSigner; this.confirmationScreen = privateVars.confirmationScreen; this.embeddedLoginPrompt = privateVars.embeddedLoginPrompt; this.immutableXClient = privateVars.immutableXClient; @@ -173,18 +172,6 @@ export class Passport { return withMetricsAsync(() => this.passportImxProviderFactory.getProvider(), 'connectImx', false); } - /** - * Lazy-loads SequenceSigner to avoid SSR issues with wallet-wdk - */ - private async getSequenceSigner() { - if (!this.sequenceSigner) { - // Dynamic import to avoid loading wallet-wdk during SSR - const { default: SequenceSigner } = await import('./sequence/sequenceSigner'); - this.sequenceSigner = new SequenceSigner(this.authManager, this.config); - } - return this.sequenceSigner; - } - /** * Connects to EVM and optionally announces the provider. * @param {Object} options - Configuration options @@ -205,16 +192,15 @@ export class Passport { let provider: Provider; - if (chain === EvmChain.ARBONE) { - // Lazy-load SequenceSigner for ArbOne - const sequenceSigner = await this.getSequenceSigner(); - provider = new ArbOneProvider({ + if (chain !== EvmChain.ZKEVM) { + provider = new SequenceProvider({ passportEventEmitter: this.passportEventEmitter, authManager: this.authManager, config: this.config, multiRollupApiClients: this.multiRollupApiClients, - ethSigner: sequenceSigner, + ethSigner: this.sequenceSigner, user, + chain, }); } else { provider = new ZkEvmProvider({ diff --git a/packages/passport/sdk/src/arbOne/JsonRpcError.ts b/packages/passport/sdk/src/arbOne/JsonRpcError.ts deleted file mode 100644 index a67e99a4ce..0000000000 --- a/packages/passport/sdk/src/arbOne/JsonRpcError.ts +++ /dev/null @@ -1,38 +0,0 @@ -export enum ProviderErrorCode { - UNSUPPORTED_METHOD = 4200, - UNAUTHORIZED = 4100, - USER_REJECTED_REQUEST = 4001, -} - -export enum RpcErrorCode { - INTERNAL_ERROR = -32603, - INVALID_PARAMS = -32602, - INVALID_REQUEST = -32600, -} - -export class JsonRpcError extends Error { - public code: number; - - public data?: any; - - constructor(code: number, message: string, data?: any) { - super(message); - this.code = code; - this.data = data; - this.name = 'JsonRpcError'; - - // Maintains proper stack trace for where our error was thrown (only available on V8) - if (Error.captureStackTrace) { - Error.captureStackTrace(this, JsonRpcError); - } - } - - public toJSON() { - return { - code: this.code, - message: this.message, - data: this.data, - }; - } -} - diff --git a/packages/passport/sdk/src/arbOne/arbOneProvider.ts b/packages/passport/sdk/src/arbOne/arbOneProvider.ts deleted file mode 100644 index c844644fac..0000000000 --- a/packages/passport/sdk/src/arbOne/arbOneProvider.ts +++ /dev/null @@ -1,402 +0,0 @@ -import { JsonRpcProvider, toBeHex, Signer } from 'ethers'; -import { - Provider, - ProviderEvent, - ProviderEventMap, - RequestArguments, -} from './types'; -import AuthManager from '../authManager'; -import TypedEventEmitter from '../utils/typedEventEmitter'; -import { PassportConfiguration } from '../config'; -import { - PassportEventMap, PassportEvents, User, UserArbOne, -} from '../types'; -import { ArbOneRelayerClient } from './relayerClient'; -import { JsonRpcError, ProviderErrorCode, RpcErrorCode } from './JsonRpcError'; -import { Flow, identify, trackError, trackFlow } from '@imtbl/metrics'; -import { sendTransaction } from './sendTransaction'; -import { getNonce } from './walletHelpers'; -import { registerArbOneUser } from './user'; -import { MultiRollupApiClients } from '@imtbl/generated-clients'; - -export type ArbOneProviderInput = { - authManager: AuthManager; - config: PassportConfiguration; - multiRollupApiClients: MultiRollupApiClients; - passportEventEmitter: TypedEventEmitter; - ethSigner: Signer; - user: User | null; -}; - -const isArbOneUser = (user: User): user is UserArbOne => 'arbOne' in user; - -export class ArbOneProvider implements Provider { - readonly #authManager: AuthManager; - - readonly #config: PassportConfiguration; - - /** - * EIP-1193 provider event emitter - * Emits standard provider events (accountsChanged, chainChanged, etc) - */ - readonly #providerEventEmitter: TypedEventEmitter; - - /** - * Internal Passport event emitter - * Listens to Passport events (login, logout) and updates provider state - */ - readonly #passportEventEmitter: TypedEventEmitter; - - // JSON-RPC provider for direct Arbitrum One RPC calls - readonly #rpcProvider: JsonRpcProvider; - - readonly #multiRollupApiClients: MultiRollupApiClients; - - // Relayer client for submitting transactions via backend relayer - readonly #relayerClient: ArbOneRelayerClient; - - // Sequence signer for signing transactions and messages (analogous to ethSigner in zkEVM) - readonly #ethSigner: Signer; - - // Identifies this as a Passport provider (for wallet detection) - public readonly isPassport: boolean = true; - - constructor({ - authManager, - config, - multiRollupApiClients, - passportEventEmitter, - ethSigner, - user, - }: ArbOneProviderInput) { - this.#authManager = authManager; - this.#config = config; - this.#passportEventEmitter = passportEventEmitter; - this.#ethSigner = ethSigner; - - this.#rpcProvider = new JsonRpcProvider(this.#config.arbOneRpcUrl, undefined, { - staticNetwork: true, - }); - - this.#relayerClient = new ArbOneRelayerClient({ - config: this.#config, - rpcProvider: this.#rpcProvider, - authManager: this.#authManager, - }); - - this.#multiRollupApiClients = multiRollupApiClients; - this.#providerEventEmitter = new TypedEventEmitter(); - - passportEventEmitter.on(PassportEvents.LOGGED_IN, (loggedInUser: User) => { - if (isArbOneUser(loggedInUser)) { - this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, [ - loggedInUser.arbOne.ethAddress, - ]); - } - }); - - passportEventEmitter.on(PassportEvents.LOGGED_OUT, this.#handleLogout); - } - - #handleLogout = () => { - this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, []); - }; - - // Get the current ArbOne address from the User session - async #getArbOneAddress() { - // return "0x83e14c79776f468a23d99ef112d9de7fbec24b00"; - // TODO remove - try { - const user = await this.#authManager.getUser(); - if (user && isArbOneUser(user)) { - return user.arbOne.ethAddress; - } - return undefined; - } catch { - return undefined; - } - } - - async #performRequest(request: RequestArguments): Promise { - switch (request.method) { - case 'eth_requestAccounts': { - const arbOneAddress = await this.#getArbOneAddress(); - if (arbOneAddress) return [arbOneAddress]; - - const flow = trackFlow('passport', 'ethRequestAccounts_arbOne'); - - try { - const user = await this.#authManager.getUserOrLogin(); - flow.addEvent('endGetUserOrLogin'); - - let userArbOneEthAddress: string | undefined; - - if (!isArbOneUser(user)) { - console.log('startUserRegistration'); - flow.addEvent('startUserRegistration'); - - // Get address from Sequence signer - const address = await this.#ethSigner.getAddress(); - userArbOneEthAddress = address; - - // This should register the Sequence wallet address with the user's Passport account - // await registerArbOneUser({...}) - userArbOneEthAddress = await registerArbOneUser({ - ethSigner: this.#ethSigner, - authManager: this.#authManager, - multiRollupApiClients: this.#multiRollupApiClients, - accessToken: user.accessToken, - rpcProvider: this.#rpcProvider, - flow, - }); - - flow.addEvent('endUserRegistration'); - } else { - userArbOneEthAddress = user.arbOne.ethAddress; - } - - if (userArbOneEthAddress) { - this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, [ - userArbOneEthAddress, - ]); - } - - identify({ - passportId: user.profile.sub, - }); - - return [userArbOneEthAddress]; - } catch (error) { - if (error instanceof Error) { - trackError('passport', 'ethRequestAccounts_arbOne', error, { flowId: flow.details.flowId }); - } else { - flow.addEvent('errored'); - } - throw error; - } finally { - flow.addEvent('End'); - } - } - - case 'eth_sendTransaction': { - // Get user's Arbitrum One wallet address - // eoa: 0x94C87AAB8F415D7eCb28503C6A79B35a49b88f86 - const arbOneAddress = '0x93b034db58f16d9c22df136cac0d133af6cce1c6';//'0x9b77b115890ac0c9e2ea5d456bc84b333c7533e1';//await this.#getArbOneAddress(); - if (!arbOneAddress) { - throw new JsonRpcError( - ProviderErrorCode.UNAUTHORIZED, - `Unauthorised - call eth_requestAccounts first`, - ); - } - - - const flow = trackFlow('passport', 'ethSendTransaction_arbOne'); - - try { - const signerAddress = await this.#ethSigner.getAddress(); - const tx = { - to: '0x896ad3cff6c29f0d43b1930267c1abed6a88a034',//'0x94C87AAB8F415D7eCb28503C6A79B35a49b88f86', // Your EOA - value: 0n, - data: "0x" - } - - return await sendTransaction({ - params: [tx], // request.params || [] - sequenceSigner: this.#ethSigner, - rpcProvider: this.#rpcProvider, - relayerClient: this.#relayerClient, - arbOneAddress, - flow, - }); - } catch (error) { - if (error instanceof Error) { - trackError('passport', 'ethSendTransaction_arbOne', error, { flowId: flow.details.flowId }); - } else { - flow.addEvent('errored'); - } - throw error; - } finally { - flow.addEvent('End'); - } - } - - case 'eth_accounts': { - const arbOneAddress = await this.#getArbOneAddress(); - return arbOneAddress ? [arbOneAddress] : []; - } - - case 'personal_sign': { - // Get user's Arbitrum One wallet address - const arbOneAddress = await this.#getArbOneAddress(); - if (!arbOneAddress) { - throw new JsonRpcError( - ProviderErrorCode.UNAUTHORIZED, - 'Unauthorised - call eth_requestAccounts first', - ); - } - - const flow = trackFlow('passport', 'personalSign_arbOne'); - - try { - const [message] = request.params || []; - - if (!message) { - throw new JsonRpcError( - RpcErrorCode.INVALID_PARAMS, - 'Message is required for personal_sign', - ); - } - - // Sign message with Sequence wallet - // - // Flow: - // 1. User signs message with Sequence wallet - // 2. Signature is returned directly (no relayer needed for simple signatures) - // - // Note: For EIP-1271 smart contract signatures (used in transactions), - // the relayer handles the 2x2 multisig. But for personal_sign, - // the relayer's imSign endpoint manages the signature creation. - const signature = await this.#relayerClient.imSign(arbOneAddress, message); - return signature; - } catch (error) { - if (error instanceof Error) { - trackError('passport', 'personalSign_arbOne', error, { flowId: flow.details.flowId }); - } else { - flow.addEvent('errored'); - } - throw error; - } finally { - flow.addEvent('End'); - } - } - - case 'eth_signTypedData': - case 'eth_signTypedData_v4': { - // Get user's Arbitrum One wallet address - const arbOneAddress = await this.#getArbOneAddress(); - if (!arbOneAddress) { - throw new JsonRpcError( - ProviderErrorCode.UNAUTHORIZED, - 'Unauthorised - call eth_requestAccounts first', - ); - } - - const flow = trackFlow('passport', 'ethSignTypedDataV4_arbOne'); - - try { - const [address, typedDataString] = request.params || []; - - if (!typedDataString) { - throw new JsonRpcError( - RpcErrorCode.INVALID_PARAMS, - 'Typed data is required', - ); - } - - // Sign EIP-712 typed data with Sequence wallet - // - // Flow: - // 1. Parse typed data (EIP-712 format) - // 2. User signs with Sequence wallet - // 3. Signature is returned via relayer endpoint - // - // Used for structured data signing (e.g., permit, meta-transactions) - // The relayer handles the signature creation for the smart contract wallet. - - const typedData = typeof typedDataString === 'string' - ? JSON.parse(typedDataString) - : typedDataString; - - // Use relayer's typed data signing endpoint - const signature = await this.#relayerClient.imSignTypedData(arbOneAddress, typedData); - return signature; - } catch (error) { - if (error instanceof Error) { - trackError('passport', 'ethSignTypedDataV4_arbOne', error, { flowId: flow.details.flowId }); - } else { - flow.addEvent('errored'); - } - throw error; - } finally { - flow.addEvent('End'); - } - } - - case 'eth_chainId': { - const { chainId } = await this.#rpcProvider.getNetwork(); - return toBeHex(chainId); - } - - // Pass through methods to RPC provider - 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); - } -} diff --git a/packages/passport/sdk/src/arbOne/examples.ts b/packages/passport/sdk/src/arbOne/examples.ts deleted file mode 100644 index 1de637da92..0000000000 --- a/packages/passport/sdk/src/arbOne/examples.ts +++ /dev/null @@ -1,365 +0,0 @@ -/** - * Example usage of Arbitrum One provider with Sequence wallet integration - * - * This file contains examples of how to use the ArbOneProvider to interact - * with Arbitrum One using Passport authentication and Sequence wallet infrastructure. - */ - -import { Environment } from '@imtbl/config'; -import { Passport, EvmChain } from '../index'; - -// ============================================================================ -// Example 1: Basic Connection to Arbitrum One -// ============================================================================ - -export async function connectToArbOne() { - const passport = new Passport({ - baseConfig: { environment: Environment.SANDBOX }, - clientId: 'YOUR_CLIENT_ID', - redirectUri: 'http://localhost:3000/callback', - }); - - // Connect to Arbitrum One - const provider = await passport.connectEvm({ - announceProvider: true, - chain: EvmChain.ARBONE, - }); - - // Request accounts (triggers login if not already logged in) - const accounts = await provider.request({ - method: 'eth_requestAccounts', - }); - - console.log('Connected to Arbitrum One with account:', accounts[0]); - return { passport, provider, accounts }; -} - -// ============================================================================ -// Example 2: Sending a Transaction -// ============================================================================ - -export async function sendTransaction() { - const { provider, accounts } = await connectToArbOne(); - - const txHash = await provider.request({ - method: 'eth_sendTransaction', - params: [{ - from: accounts[0], - to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb', - value: '0x29a2241af62c0000', // 0.005 ETH in hex - data: '0x', - }], - }); - - console.log('Transaction sent:', txHash); - return txHash; -} - -// ============================================================================ -// Example 3: Getting Account Balance -// ============================================================================ - -export async function getBalance() { - const { provider, accounts } = await connectToArbOne(); - - const balance = await provider.request({ - method: 'eth_getBalance', - params: [accounts[0], 'latest'], - }); - - console.log('Balance:', balance); - return balance; -} - -// ============================================================================ -// Example 4: Personal Sign -// ============================================================================ - -export async function signMessage() { - const { provider, accounts } = await connectToArbOne(); - - const message = 'Hello from Arbitrum One!'; - - const signature = await provider.request({ - method: 'personal_sign', - params: [message, accounts[0]], - }); - - console.log('Message signed:', signature); - return signature; -} - -// ============================================================================ -// Example 5: Sign Typed Data (EIP-712) -// ============================================================================ - -export async function signTypedData() { - const { provider, accounts } = await connectToArbOne(); - - const typedData = { - domain: { - name: 'My DApp', - version: '1', - chainId: 42161, // Arbitrum One mainnet - verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', - }, - types: { - Person: [ - { name: 'name', type: 'string' }, - { name: 'wallet', type: 'address' }, - ], - Mail: [ - { name: 'from', type: 'Person' }, - { name: 'to', type: 'Person' }, - { name: 'contents', type: 'string' }, - ], - }, - primaryType: 'Mail', - message: { - from: { - name: 'Alice', - wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', - }, - to: { - name: 'Bob', - wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', - }, - contents: 'Hello, Bob!', - }, - }; - - const signature = await provider.request({ - method: 'eth_signTypedData_v4', - params: [accounts[0], JSON.stringify(typedData)], - }); - - console.log('Typed data signed:', signature); - return signature; -} - -// ============================================================================ -// Example 6: Estimating Gas -// ============================================================================ - -export async function estimateGas() { - const { provider, accounts } = await connectToArbOne(); - - const gasEstimate = await provider.request({ - method: 'eth_estimateGas', - params: [{ - from: accounts[0], - to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb', - value: '0x29a2241af62c0000', - data: '0x', - }], - }); - - console.log('Estimated gas:', gasEstimate); - return gasEstimate; -} - -// ============================================================================ -// Example 7: Calling a Contract (Read Operation) -// ============================================================================ - -export async function callContract() { - const { provider } = await connectToArbOne(); - - // Example: Reading totalSupply from an ERC20 contract - const contractAddress = '0x...' // Your contract address - const totalSupplySelector = '0x18160ddd'; // totalSupply() function selector - - const result = await provider.request({ - method: 'eth_call', - params: [{ - to: contractAddress, - data: totalSupplySelector, - }, 'latest'], - }); - - console.log('Contract call result:', result); - return result; -} - -// ============================================================================ -// Example 8: Getting Chain ID -// ============================================================================ - -export async function getChainId() { - const { provider } = await connectToArbOne(); - - const chainId = await provider.request({ - method: 'eth_chainId', - }); - - console.log('Chain ID:', chainId); - return chainId; -} - -// ============================================================================ -// Example 9: Multi-Chain Application (zkEVM + Arbitrum One) -// ============================================================================ - -export async function multiChainExample() { - const passport = new Passport({ - baseConfig: { environment: Environment.SANDBOX }, - clientId: 'YOUR_CLIENT_ID', - redirectUri: 'http://localhost:3000/callback', - }); - - // Connect to zkEVM - const zkEvmProvider = await passport.connectEvm({ - announceProvider: false, - chain: EvmChain.ZKEVM, - }); - - const zkEvmAccounts = await zkEvmProvider.request({ - method: 'eth_requestAccounts', - }); - - console.log('zkEVM account:', zkEvmAccounts[0]); - - // Connect to Arbitrum One - const arbOneProvider = await passport.connectEvm({ - announceProvider: false, - chain: EvmChain.ARBONE, - }); - - const arbOneAccounts = await arbOneProvider.request({ - method: 'eth_requestAccounts', - }); - - console.log('Arbitrum One account:', arbOneAccounts[0]); - - return { - zkEvm: { provider: zkEvmProvider, accounts: zkEvmAccounts }, - arbOne: { provider: arbOneProvider, accounts: arbOneAccounts }, - }; -} - -// ============================================================================ -// Example 10: Listening to Events -// ============================================================================ - -export async function listenToEvents() { - const { provider } = await connectToArbOne(); - - // Listen for account changes - provider.on('accountsChanged', (accounts: string[]) => { - console.log('Accounts changed:', accounts); - }); - - // Listen for chain changes - provider.on('chainChanged', (chainId: string) => { - console.log('Chain changed:', chainId); - }); - - console.log('Event listeners registered'); -} - -// ============================================================================ -// Example 11: Error Handling -// ============================================================================ - -export async function errorHandlingExample() { - try { - const { provider } = await connectToArbOne(); - - // Try to send a transaction without proper parameters - await provider.request({ - method: 'eth_sendTransaction', - params: [{}], // Invalid parameters - }); - } catch (error: any) { - console.error('Error occurred:'); - console.error('- Code:', error.code); - console.error('- Message:', error.message); - - // Handle specific error codes - if (error.code === 4001) { - console.log('User rejected the request'); - } else if (error.code === 4100) { - console.log('Unauthorized - need to call eth_requestAccounts'); - } else if (error.code === 4200) { - console.log('Method not supported'); - } - } -} - -// ============================================================================ -// Example 12: Using with React -// ============================================================================ - -export function ReactExample() { - // This is a conceptual example for React usage - /* - import { useState, useEffect } from 'react'; - import { Passport, EvmChain } from '@imtbl/passport'; - - function ArbOneWallet() { - const [provider, setProvider] = useState(null); - const [account, setAccount] = useState(''); - - useEffect(() => { - const initPassport = async () => { - const passport = new Passport({ - baseConfig: { environment: 'sandbox' }, - clientId: 'YOUR_CLIENT_ID', - redirectUri: 'http://localhost:3000/callback', - }); - - const arbProvider = await passport.connectEvm({ - chain: EvmChain.ARBONE, - }); - - setProvider(arbProvider); - - // Listen to account changes - arbProvider.on('accountsChanged', (accounts) => { - setAccount(accounts[0] || ''); - }); - }; - - initPassport(); - }, []); - - const connect = async () => { - if (!provider) return; - - const accounts = await provider.request({ - method: 'eth_requestAccounts', - }); - - setAccount(accounts[0]); - }; - - const sendTx = async () => { - if (!provider || !account) return; - - const txHash = await provider.request({ - method: 'eth_sendTransaction', - params: [{ - from: account, - to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb', - value: '0x29a2241af62c0000', - }], - }); - - console.log('Transaction:', txHash); - }; - - return ( -
- - {account && ( - <> -

Connected: {account}

- - - )} -
- ); - } - */ -} - diff --git a/packages/passport/sdk/src/arbOne/index.ts b/packages/passport/sdk/src/arbOne/index.ts deleted file mode 100644 index b69d22aa78..0000000000 --- a/packages/passport/sdk/src/arbOne/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { ArbOneProvider, type ArbOneProviderInput } from './arbOneProvider'; -export { ArbOneRelayerClient } from './relayerClient'; -export { sendTransaction } from './sendTransaction'; -export { JsonRpcError, ProviderErrorCode, RpcErrorCode } from './JsonRpcError'; -export type { Provider, RequestArguments, RelayerTransaction } from './types'; - diff --git a/packages/passport/sdk/src/arbOne/relayerClient.ts b/packages/passport/sdk/src/arbOne/relayerClient.ts deleted file mode 100644 index b31ad22902..0000000000 --- a/packages/passport/sdk/src/arbOne/relayerClient.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { BytesLike, JsonRpcProvider } from 'ethers'; -import AuthManager from '../authManager'; -import { PassportConfiguration } from '../config'; -import { FeeOption, RelayerTransaction, TypedDataPayload } from './types'; - -export type RelayerClientInput = { - config: PassportConfiguration, - rpcProvider: JsonRpcProvider, - authManager: AuthManager -}; - -// JsonRpc base Types -type JsonRpc = { - id: number; - jsonrpc: '2.0'; -}; - -// EthSendTransaction types -type EthSendTransactionRequest = { - method: 'eth_sendTransaction'; - params: { - to: string; - data: BytesLike; - chainId: string; - }[]; -}; - -type EthSendTransactionResponse = JsonRpc & { - result: string; -}; - -// ImGetTransactionByHash types -type ImGetTransactionByHashRequest = { - method: 'im_getTransactionByHash'; - params: string[]; -}; - -type ImGetTransactionByHashResponse = JsonRpc & { - result: RelayerTransaction; -}; - -// ImGetFeeOptions types -type ImGetFeeOptionsRequest = { - method: 'im_getFeeOptions'; - params: { - userAddress: string; - data: BytesLike; - chainId: string; - }[]; -}; - -type ImGetFeeOptionsResponse = JsonRpc & { - result: FeeOption[] | undefined -}; - -// ImSign types -type ImSignRequest = { - method: 'im_sign'; - params: { - chainId: string; - address: string; - message: string; - }[]; -}; - -type ImSignResponse = JsonRpc & { - result: string; -}; - -// ImSignTypedData types -type ImSignTypedDataRequest = { - method: 'im_signTypedData'; - params: { - chainId: string; - address: string; - eip712Payload: TypedDataPayload; - }[]; -}; - -type ImSignTypedDataResponse = JsonRpc & { - result: string; -}; - -export type RelayerTransactionRequest = - | EthSendTransactionRequest - | ImGetTransactionByHashRequest - | ImGetFeeOptionsRequest - | ImSignTypedDataRequest - | ImSignRequest; - -/** - * RelayerClient for Arbitrum One - * Similar to zkEVM RelayerClient but works with Arbitrum One chain - */ -export class ArbOneRelayerClient { - private readonly config: PassportConfiguration; - - private readonly rpcProvider: JsonRpcProvider; - - private readonly authManager: AuthManager; - - constructor({ config, rpcProvider, authManager }: RelayerClientInput) { - this.config = config; - this.rpcProvider = rpcProvider; - this.authManager = authManager; - } - - private static getResponsePreview(text: string): string { - return text.length > 100 - ? `${text.substring(0, 50)}...${text.substring(text.length - 50)}` - : text; - } - - private getEip155ChainId(chainId: number): string { - return `eip155:${chainId}`; - } - - private async postToRelayer(request: RelayerTransactionRequest): Promise { - const body: RelayerTransactionRequest & JsonRpc = { - id: 1, - jsonrpc: '2.0', - ...request, - }; - - const user = await this.authManager.getUser(); - if (!user) { - throw new Error('User not authenticated'); - } - - // TODO: Update this URL when backend adds ArbOne support - // For now, using the same relayer URL but backend will need to support ArbOne chain - const response = await fetch(`${this.config.relayerUrl}/v1/transactions`, { - method: 'POST', - headers: { - Authorization: `Bearer ${user.accessToken}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify(body), - }); - - const responseText = await response.text(); - - if (!response.ok) { - const preview = ArbOneRelayerClient.getResponsePreview(responseText); - throw new Error(`Relayer HTTP error: ${response.status}. Content: "${preview}"`); - } - - let jsonResponse; - try { - jsonResponse = JSON.parse(responseText); - } catch (parseError) { - const preview = ArbOneRelayerClient.getResponsePreview(responseText); - throw new Error(`Relayer JSON parse error: ${parseError instanceof Error ? parseError.message : 'Unknown error'}. Content: "${preview}"`); - } - - if (jsonResponse.error) { - throw new Error(jsonResponse.error); - } - - return jsonResponse; - } - - public async ethSendTransaction(to: string, data: BytesLike): Promise { - const { chainId } = await this.rpcProvider.getNetwork(); - const payload: EthSendTransactionRequest = { - method: 'eth_sendTransaction', - params: [{ - to, - data, - chainId: this.getEip155ChainId(Number(chainId)), - }], - }; - const { result } = await this.postToRelayer(payload); - return result; - } - - public async imGetTransactionByHash(hash: string): Promise { - const payload: ImGetTransactionByHashRequest = { - method: 'im_getTransactionByHash', - params: [hash], - }; - const { result } = await this.postToRelayer(payload); - return result; - } - - public async imGetFeeOptions(userAddress: string, data: BytesLike): Promise { - const { chainId } = await this.rpcProvider.getNetwork(); - const payload: ImGetFeeOptionsRequest = { - method: 'im_getFeeOptions', - params: [{ - userAddress, - data, - chainId: this.getEip155ChainId(Number(chainId)), - }], - }; - const { result } = await this.postToRelayer(payload); - return result; - } - - public async imSignTypedData(address: string, eip712Payload: TypedDataPayload): Promise { - const { chainId } = await this.rpcProvider.getNetwork(); - const payload: ImSignTypedDataRequest = { - method: 'im_signTypedData', - params: [{ - address, - eip712Payload, - chainId: this.getEip155ChainId(Number(chainId)), - }], - }; - const { result } = await this.postToRelayer(payload); - return result; - } - - public async imSign(address: string, message: string): Promise { - const { chainId } = await this.rpcProvider.getNetwork(); - const payload: ImSignRequest = { - method: 'im_sign', - params: [{ - address, - message, - chainId: this.getEip155ChainId(Number(chainId)), - }], - }; - const { result } = await this.postToRelayer(payload); - return result; - } -} - diff --git a/packages/passport/sdk/src/arbOne/sendTransaction.ts b/packages/passport/sdk/src/arbOne/sendTransaction.ts deleted file mode 100644 index 7bb067f6cd..0000000000 --- a/packages/passport/sdk/src/arbOne/sendTransaction.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { prepareAndSignTransaction, pollRelayerTransaction, TransactionParams } from './transactionHelpers'; - -type EthSendTransactionParams = TransactionParams & { - params: Array; -}; - -/** - * Send transaction on Arbitrum One using Sequence wallet and relayer - * Similar flow to zkEVM: - * 1. User signs with Sequence wallet (EOA signature) - * 2. Relayer adds its signature (2x2 multisig) - * 3. Relayer submits on-chain - * 4. First transaction auto-deploys the smart contract wallet - */ -export const sendTransaction = async ({ - params, - sequenceSigner, - rpcProvider, - relayerClient, - arbOneAddress, - flow, - nonceSpace, - isBackgroundTransaction = false, -}: EthSendTransactionParams): Promise => { - const transactionRequest = params[0]; - - const { relayerId } = await prepareAndSignTransaction({ - transactionRequest, - sequenceSigner, - rpcProvider, - relayerClient, - arbOneAddress, - flow, - nonceSpace, - isBackgroundTransaction, - }); - - const { hash } = await pollRelayerTransaction(relayerClient, relayerId, flow); - return hash; -}; - diff --git a/packages/passport/sdk/src/arbOne/transactionHelpers.ts b/packages/passport/sdk/src/arbOne/transactionHelpers.ts deleted file mode 100644 index 5b9d41c89a..0000000000 --- a/packages/passport/sdk/src/arbOne/transactionHelpers.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { Flow } from '@imtbl/metrics'; -import { - Signer, TransactionRequest, JsonRpcProvider, -} from 'ethers'; -import { - getNonce, - getNormalisedTransactions, - signMetaTransactions, -} from './walletHelpers'; -import { ArbOneRelayerClient } from './relayerClient'; -import { - FeeOption, - MetaTransaction, - RelayerTransactionStatus, -} from './types'; -import { JsonRpcError, RpcErrorCode } from './JsonRpcError'; -import { retryWithDelay } from '../network/retry'; - -const MAX_TRANSACTION_HASH_RETRIEVAL_RETRIES = 30; -const TRANSACTION_HASH_RETRIEVAL_WAIT = 1000; - -export type TransactionParams = { - sequenceSigner: Signer; - rpcProvider: JsonRpcProvider; - relayerClient: ArbOneRelayerClient; - arbOneAddress: string; - flow: Flow; - nonceSpace?: bigint; - isBackgroundTransaction?: boolean; -}; - -// Fee payment no longer needed - relayer sponsors gas -// const getFeeOption = async ( -// metaTransaction: MetaTransaction, -// walletAddress: string, -// relayerClient: ArbOneRelayerClient, -// ): Promise => { -// const normalisedMetaTransaction = getNormalisedTransactions([ -// metaTransaction, -// ]); -// const transactions = encodedTransactions(normalisedMetaTransaction); -// const feeOptions = await relayerClient.imGetFeeOptions( -// walletAddress, -// transactions, -// ); -// -// if (!feeOptions || !Array.isArray(feeOptions)) { -// throw new Error('Invalid fee options received from relayer'); -// } -// -// console.log('feeOptions', JSON.stringify(feeOptions)); -// -// // For Arbitrum One, look for ETH fee option (instead of IMX) -// const ethFeeOption = feeOptions.find( -// (feeOption) => feeOption.tokenSymbol === 'ETH', -// ); -// if (!ethFeeOption) { -// throw new Error('Failed to retrieve fees for ETH token'); -// } -// -// return ethFeeOption; -// }; - -/** - * Build meta transactions for Arbitrum One - * No fee transaction needed - relayer sponsors gas - */ -const buildMetaTransactions = async ( - transactionRequest: TransactionRequest, - rpcProvider: JsonRpcProvider, - relayerClient: ArbOneRelayerClient, - arbOneAddress: string, - nonceSpace?: bigint, -): Promise<[MetaTransaction, ...MetaTransaction[]]> => { - if (!transactionRequest.to) { - throw new JsonRpcError( - RpcErrorCode.INVALID_PARAMS, - 'eth_sendTransaction requires a "to" field', - ); - } - - // Get the nonce from the smart wallet - const nonce = await getNonce(rpcProvider, arbOneAddress, nonceSpace); - console.log('buildMetaTransactions nonce', nonce); - - const metaTransaction: MetaTransaction = { - to: transactionRequest.to.toString(), - data: transactionRequest.data, - nonce, - value: transactionRequest.value, - revertOnError: true, - }; - - // Return just the user's transaction - no fee transaction needed - return [metaTransaction]; -}; - -/** - * Prepare and sign transaction using Sequence wallet - * This generates the user's signature which relayer will combine with its own (2x2 multisig) - * Supports both V1 and V3 contract formats - */ -export const prepareAndSignTransaction = async ({ - transactionRequest, - sequenceSigner, - rpcProvider, - relayerClient, - arbOneAddress, - flow, - nonceSpace, -}: TransactionParams & { transactionRequest: TransactionRequest }): Promise<{ relayerId: string }> => { - flow.addEvent('startBuildMetaTransactions'); - - const metaTransactions = await buildMetaTransactions( - transactionRequest, - rpcProvider, - relayerClient, - arbOneAddress, - nonceSpace, - ); - - flow.addEvent('endBuildMetaTransactions'); - - const nonce = metaTransactions[0].nonce!; - - flow.addEvent('startSignMetaTransactions'); - - const { chainId } = await rpcProvider.getNetwork(); - - const signedTransaction = await signMetaTransactions( - metaTransactions, - nonce, - BigInt(chainId.toString()), - arbOneAddress, - sequenceSigner, - ); - - flow.addEvent('endSignMetaTransactions'); - - flow.addEvent('startSubmitToRelayer'); - - // Send to relayer - relayer will add its own signature and submit on-chain - // On first transaction, this will deploy the smart contract wallet - const relayerId = await relayerClient.ethSendTransaction( - arbOneAddress, - signedTransaction, - ); - - flow.addEvent('endSubmitToRelayer'); - - return { relayerId }; -}; - -/** - * Poll relayer for transaction status - * Same as zkEVM - waits for relayer to process and submit transaction - */ -export const pollRelayerTransaction = async ( - relayerClient: ArbOneRelayerClient, - relayerId: string, - flow: Flow, -): Promise<{ hash: string }> => { - flow.addEvent('startPollRelayerTransaction'); - - const result = await retryWithDelay( - async () => { - const transaction = await relayerClient.imGetTransactionByHash(relayerId); - - if (transaction.status === RelayerTransactionStatus.SUCCESSFUL) { - return { hash: transaction.hash }; - } - - if ( - transaction.status === RelayerTransactionStatus.FAILED - || transaction.status === RelayerTransactionStatus.REVERTED - || transaction.status === RelayerTransactionStatus.CANCELLED - ) { - throw new JsonRpcError( - RpcErrorCode.INTERNAL_ERROR, - transaction.statusMessage || 'Transaction failed', - ); - } - - // Transaction still pending, retry - throw new Error('Transaction pending'); - }, - { - retries: MAX_TRANSACTION_HASH_RETRIEVAL_RETRIES, - interval: TRANSACTION_HASH_RETRIEVAL_WAIT, - finalErr: new JsonRpcError( - RpcErrorCode.INTERNAL_ERROR, - 'Transaction polling timeout', - ), - }, - ); - - flow.addEvent('endPollRelayerTransaction'); - - return result; -}; - diff --git a/packages/passport/sdk/src/arbOne/types.ts b/packages/passport/sdk/src/arbOne/types.ts deleted file mode 100644 index 89e20bcb54..0000000000 --- a/packages/passport/sdk/src/arbOne/types.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { BigNumberish } from 'ethers'; - -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]; -} - -// Relayer types (matching zkEVM) -export enum RelayerTransactionStatus { - PENDING = 'PENDING', - SUBMITTED = 'SUBMITTED', - SUCCESSFUL = 'SUCCESSFUL', - REVERTED = 'REVERTED', - FAILED = 'FAILED', - CANCELLED = 'CANCELLED', -} - -export interface RelayerTransaction { - status: RelayerTransactionStatus; - chainId: string; - relayerId: string; - hash: string; - statusMessage?: string; -} - -export interface FeeOption { - tokenPrice: string; - tokenSymbol: string; - tokenDecimals: number; - tokenAddress: string; - recipientAddress: string; -} - -export interface MetaTransaction { - to: string; - value?: BigNumberish | null; - data?: string | null; - nonce?: BigNumberish; - gasLimit?: BigNumberish; - delegateCall?: boolean; - revertOnError?: boolean; -} - -export interface MetaTransactionNormalised { - delegateCall: boolean; - revertOnError: boolean; - gasLimit: BigNumberish; - target: string; - value: BigNumberish; - data: string; -} - -// https://eips.ethereum.org/EIPS/eip-712 -export interface TypedDataPayload { - types: { - EIP712Domain: Array<{ name: string; type: string }>; - [key: string]: Array<{ name: string; type: string }>; - }; - domain: { - name?: string; - version?: string; - chainId?: number | string; - verifyingContract?: string; - salt?: string; - }; - primaryType: string; - message: Record; -} diff --git a/packages/passport/sdk/src/arbOne/user/index.ts b/packages/passport/sdk/src/arbOne/user/index.ts deleted file mode 100644 index d7b177cdd2..0000000000 --- a/packages/passport/sdk/src/arbOne/user/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { registerArbOneUser, type RegisterArbOneUserInput } from './registerArbOneUser'; - diff --git a/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts b/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts deleted file mode 100644 index 0d974fcca2..0000000000 --- a/packages/passport/sdk/src/arbOne/user/registerArbOneUser.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { JsonRpcProvider, Signer } from 'ethers'; -import { Flow } from '@imtbl/metrics'; -import AuthManager from '../../authManager'; -import { MultiRollupApiClients } from '@imtbl/generated-clients'; -import { signRaw } from '@imtbl/toolkit'; -import { getEip155ChainId } from '../walletHelpers'; -import { JsonRpcError, RpcErrorCode } from '../JsonRpcError'; - -export type RegisterArbOneUserInput = { - authManager: AuthManager; - multiRollupApiClients: MultiRollupApiClients; - accessToken: string; - rpcProvider: JsonRpcProvider; - ethSigner: Signer; - flow: Flow; -}; - -const MESSAGE_TO_SIGN = 'Only sign this message from Immutable Passport'; - -export async function registerArbOneUser({ - authManager, - multiRollupApiClients, - accessToken, - rpcProvider, - ethSigner, - flow, -}: RegisterArbOneUserInput): Promise { - const getAddressPromise = ethSigner.getAddress(); - getAddressPromise.then(() => flow.addEvent('endGetAddress')); - - const signRawPromise = signRaw(MESSAGE_TO_SIGN, ethSigner); - signRawPromise.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] = await Promise.all([ - getAddressPromise, - signRawPromise, - 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 { - const registrationResponse = await multiRollupApiClients.passportApi.createCounterfactualAddressV2({ - chainName: 'arbitrum-sepolia', //chainName, - createCounterfactualAddressRequest: { - ethereum_address: ethereumAddress, - ethereum_signature: ethereumSignature, - }, - }, { - headers: { Authorization: `Bearer ${accessToken}` }, - }); - flow.addEvent('endCreateCounterfactualAddress'); - - authManager.forceUserRefreshInBackground(); - - return registrationResponse.data.counterfactual_address; - } catch (error) { - flow.addEvent('errorRegisteringArbOneUser'); - throw error; - } -} - diff --git a/packages/passport/sdk/src/arbOne/walletHelpers.ts b/packages/passport/sdk/src/arbOne/walletHelpers.ts deleted file mode 100644 index 0091805657..0000000000 --- a/packages/passport/sdk/src/arbOne/walletHelpers.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { walletContracts } from '@0xsequence/abi'; -import { v1 as sequenceCoreV1 } from '@0xsequence/core'; -import { Payload, Signature } from '@0xsequence/wallet-primitives'; -import { Bytes, Hex, Address } from 'ox'; -import { - BigNumberish, Contract, getBytes, - Interface, Signer, ZeroAddress, - JsonRpcProvider, AbiCoder, concat, - SigningKey, -} from 'ethers'; -import { MetaTransaction, MetaTransactionNormalised, TypedDataPayload } from './types'; -import { hashMessage } from 'ethers'; -import SequenceSigner from '../sequence/sequenceSigner'; - -const SIGNATURE_WEIGHT = 1; // Weight of a single signature in the multi-sig - -// Legacy V1/V2 functions - kept for potential backwards compatibility -export const getNormalisedTransactions = (txs: MetaTransaction[]): MetaTransactionNormalised[] => txs.map((t) => ({ - delegateCall: t.delegateCall === true, - revertOnError: t.revertOnError === true, - gasLimit: t.gasLimit ?? BigInt(0), - target: t.to ?? ZeroAddress, - value: t.value ?? BigInt(0), - data: t.data ?? '0x', -})); - -export const coerceNonceSpace = (nonceSpace?: bigint): bigint => nonceSpace || 0n; - -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; -}; - -/** - * Get nonce from Sequence smart contract wallet on Arbitrum One - * Similar to zkEVM but works with Arbitrum One chain - */ -export const getNonce = async ( - rpcProvider: JsonRpcProvider, - arbOneAddress: string, - nonceSpace?: bigint, -): Promise => { - const rawSpace = nonceSpace ? (nonceSpace >> 96n) : 0n; - - // Check if smart contract wallet is deployed - const code = await rpcProvider.getCode(arbOneAddress); - if (code === '0x') { - // Wallet not deployed yet, nonce is 0 - // on sequence first transaction is to update image hash which nonce is 0 - // so this needs to be 1 - return encodeNonce(rawSpace, 1n); - } - - // Wallet is deployed, get nonce from contract - const walletInterface = new Interface(walletContracts.mainModule.abi); - const walletContract = new Contract(arbOneAddress, walletInterface, rpcProvider); - - const nonce = await walletContract.readNonce(rawSpace); - return encodeNonce(rawSpace, BigInt(nonce.toString())); -}; - -export const getEip155ChainId = (chainId: number): string => `eip155:${chainId}`; - -/** - * Convert MetaTransaction to Sequence Payload.Call format - */ -const toSequenceCall = (tx: MetaTransaction): Payload.Call => ({ - to: Address.from(tx.to || ZeroAddress), - value: tx.value ? BigInt(tx.value.toString()) : 0n, - data: (tx.data || '0x') as Hex.Hex, - gasLimit: tx.gasLimit ? BigInt(tx.gasLimit.toString()) : 0n, - delegateCall: tx.delegateCall ?? false, - onlyFallback: false, - behaviorOnError: tx.revertOnError ? 'revert' : 'ignore', -}); - -/** - * Sign meta-transactions using Sequence V3 SDK primitives - * Uses EIP-712 typed data for signing and compact binary encoding for payload - * Returns fully encoded transaction data ready for relayer submission - */ -export const signMetaTransactions = async ( - metaTransactions: MetaTransaction[], - encodedNonce: BigNumberish, - chainId: bigint, - walletAddress: string, - sequenceSigner: Signer, -): Promise => { - const encodedNonceBigInt = BigInt(encodedNonce.toString()); - const space = encodedNonceBigInt >> 96n; - const nonce = encodedNonceBigInt & ((1n << 96n) - 1n); - - // Convert to Sequence call format - const calls = metaTransactions.map(toSequenceCall); - - // Create Sequence payload using SDK - const payload = Payload.fromCall(nonce, space, calls); - - // Encode payload using SDK (compact binary format) - // Pass wallet address for self-call optimization - const encodedPayload = Payload.encode(payload, Address.from(walletAddress)) - // Hash payload using SDK (EIP-712 typed data hash) - const payloadHash = Payload.hash( - Address.from(walletAddress), - Number(chainId), - payload - ); - console.log('[signMetaTransactions] payloadHash', payloadHash); - // Sign with ETH_SIGN (adds Ethereum message prefix) - // const signature = await sequenceSigner.signMessage(payloadHash); - let signature; - if ((sequenceSigner as SequenceSigner).useIdentityInstrument) { - signature = await (sequenceSigner as SequenceSigner).signMessage(payloadHash); - console.log('[signMetaTransactions] signature', signature); - } else { - const privateKey = await (sequenceSigner as SequenceSigner).getPrivateKey(); - console.log('[signMetaTransactions] privateKey', privateKey); - const signingKey = new SigningKey(privateKey); - const ethSignDigest = hashMessage(payloadHash); - signature = signingKey.sign(ethSignDigest); // This returns a Signature object - } - - console.log('[signMetaTransactions] signature', signature); - // Parse signature to extract r, s, yParity - // Safely convert signature to hex string before parsing bytes - const sigHex = - typeof signature === 'string' - ? signature - : (signature as any)?.serialized || (signature as any)?.compact || ''; - const sigBytes = Bytes.fromHex(sigHex); - const r = Bytes.toBigInt(sigBytes.slice(0, 32)); - const s = Bytes.toBigInt(sigBytes.slice(32, 64)); - const v = sigBytes[64]!; - const yParity = v >= 27 ? v - 27 : v; - - // Create signed signer leaf for topology - const signedLeaf: Signature.SignedSignerLeaf = { - type: 'signer', - address: Address.from(await sequenceSigner.getAddress()), - weight: BigInt(SIGNATURE_WEIGHT), - signed: true, - signature: { - type: 'eth_sign', - r, - s, - yParity, - }, - }; - - // Create raw signature configuration - const rawSignature: Signature.RawSignature = { - noChainId: false, - configuration: { - threshold: BigInt(SIGNATURE_WEIGHT), - checkpoint: 0n, - topology: signedLeaf, - }, - }; - - // Encode signature using SDK - const encodedSignature = Signature.encodeSignature(rawSignature); - - // Encode the execute call: execute(bytes payload, bytes signature) - const executeSelector = '0x61c2926c'; // keccak256("execute(bytes,bytes)")[:4] - const encodedParams = AbiCoder.defaultAbiCoder().encode( - ['bytes', 'bytes'], - [Bytes.toHex(encodedPayload), Bytes.toHex(encodedSignature)] - ); - - return concat([executeSelector, encodedParams]); -}; diff --git a/packages/passport/sdk/src/authManager.ts b/packages/passport/sdk/src/authManager.ts index bdda25901b..6379666b7f 100644 --- a/packages/passport/sdk/src/authManager.ts +++ b/packages/passport/sdk/src/authManager.ts @@ -26,7 +26,7 @@ import { isUserZkEvm, UserImx, isUserImx, - RollupType, + EvmChain, } from './types'; import { PassportConfiguration } from './config'; import ConfirmationOverlay from './overlay/confirmationOverlay'; @@ -160,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; }; @@ -639,31 +651,11 @@ export default class AuthManager { } public async getUserZkEvm(): Promise { - // TODO: Uncomment when ZkEvm attributes are populated - // const user = await this.getUser(isUserZkEvm); - // if (!user) { - // throw new Error('Failed to obtain a User with the required ZkEvm attributes'); - // } - // return user; - - const oidcUser = await this.userManager.getUser(); - if (!oidcUser) { - throw new Error('User not authenticated'); + const user = await this.getUser(isUserZkEvm); + if (!user) { + throw new Error('Failed to obtain a User with the required ZkEvm attributes'); } - - const ethAddress = '0xa6df9053c888404ada7d05409cbe6f4440e9750e'; - const userAdminAddress = '0x5055cd32253f6fd0702ca3983425f520e23bf473'; - - // Add ZkEvm attributes to the OIDC user - const userWithZkEvm = { - ...oidcUser, - [RollupType.ZKEVM]: { - ethAddress, - userAdminAddress, - } - } as unknown as UserZkEvm; - - return userWithZkEvm; + return user; } public async getUserImx(): Promise { diff --git a/packages/passport/sdk/src/config/config.test.ts b/packages/passport/sdk/src/config/config.test.ts index 4a9b048b49..3704f1466c 100644 --- a/packages/passport/sdk/src/config/config.test.ts +++ b/packages/passport/sdk/src/config/config.test.ts @@ -31,6 +31,8 @@ describe('Config', () => { indexerMrBasePath: 'indexerMrBasePath123', orderBookMrBasePath: 'orderBookMrBasePath123', passportMrBasePath: 'passportMrBasePath123', + sequenceIdentityInstrumentEndpoint: 'sequenceIdentityInstrumentEndpoint123', + sequenceProjectAccessKey: 'sequenceProjectAccessKey123' }; 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 72d17c27f6..9354895979 100644 --- a/packages/passport/sdk/src/config/config.ts +++ b/packages/passport/sdk/src/config/config.ts @@ -50,9 +50,9 @@ export class PassportConfiguration { readonly relayerUrl: string; - readonly arbOneRpcUrl: string; + readonly sequenceProjectAccessKey: string; - readonly sequenceIdentityInstrumentEndpoint?: string; + readonly sequenceIdentityInstrumentEndpoint: string; readonly multiRollupConfig: MultiRollupAPIConfiguration; @@ -107,9 +107,9 @@ export class PassportConfiguration { this.magicPublishableApiKey = overrides.magicPublishableApiKey; this.magicProviderId = overrides.magicProviderId; this.zkEvmRpcUrl = overrides.zkEvmRpcUrl; - this.relayerUrl = 'http://localhost:8070/relayer-mr';//overrides.relayerUrl; - this.arbOneRpcUrl = 'https://sepolia-rollup.arbitrum.io/rpc';//overrides.arbOneRpcUrl || 'https://arb1.arbitrum.io/rpc'; + this.relayerUrl = overrides.relayerUrl; this.sequenceIdentityInstrumentEndpoint = overrides.sequenceIdentityInstrumentEndpoint; + this.sequenceProjectAccessKey = overrides.sequenceProjectAccessKey; this.multiRollupConfig = { indexer: createConfig({ basePath: overrides.indexerMrBasePath, @@ -118,7 +118,7 @@ export class PassportConfiguration { basePath: overrides.orderBookMrBasePath, }), passport: createConfig({ - basePath: 'http://localhost:8071',//overrides.passportMrBasePath, + basePath: overrides.passportMrBasePath, }), }; } else { @@ -131,7 +131,8 @@ export class PassportConfiguration { this.imxPublicApiDomain = 'https://api.immutable.com'; this.zkEvmRpcUrl = 'https://rpc.immutable.com'; this.relayerUrl = 'https://api.immutable.com/relayer-mr'; - this.arbOneRpcUrl = 'https://arb1.arbitrum.io/rpc'; + this.sequenceIdentityInstrumentEndpoint = 'https://next-identity.sequence.app/'; + this.sequenceProjectAccessKey = 'AQAAAAAAAAB5QznGqk9paa4EQjom09ERpJs'; this.multiRollupConfig = multiRollupConfig.getProduction(); break; } @@ -144,7 +145,8 @@ export class PassportConfiguration { this.imxPublicApiDomain = 'https://api.sandbox.immutable.com'; this.zkEvmRpcUrl = 'https://rpc.testnet.immutable.com'; this.relayerUrl = 'http://localhost:8070/relayer-mr'; - this.arbOneRpcUrl = 'https://sepolia-rollup.arbitrum.io/rpc'; + this.sequenceIdentityInstrumentEndpoint = 'https://next-identity.sequence-dev.app/'; + this.sequenceProjectAccessKey = 'AQAAAAAAAAB5QznGqk9paa4EQjom09ERpJs'; this.multiRollupConfig = multiRollupConfig.getSandbox(); break; } diff --git a/packages/passport/sdk/src/index.ts b/packages/passport/sdk/src/index.ts index c33c4861b0..55a40402ee 100644 --- a/packages/passport/sdk/src/index.ts +++ b/packages/passport/sdk/src/index.ts @@ -30,7 +30,6 @@ export type { User, UserImx, UserZkEvm, - UserArbOne, } from './types'; export { MarketingConsentStatus, @@ -39,5 +38,4 @@ export { EvmChain, isUserImx, isUserZkEvm, - isUserArbOne, } 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..0202d22668 --- /dev/null +++ b/packages/passport/sdk/src/sequence/chainConfig.ts @@ -0,0 +1,36 @@ +import { EvmChain } from "../types"; + +export type ChainConfig = { + chainId: number; + relayerUrl: string; + nodeUrl: string; + rpcUrl: string; +}; + +const CHAIN_CONFIGS: Record, ChainConfig> = { + [EvmChain.ARBITRUM_ONE]: { + chainId: 421614, + relayerUrl: 'https://next-arbitrum-one-relayer.sequence.app', + nodeUrl: 'https://next-nodes.sequence.app/arbitrum-one', + rpcUrl: 'https://arb1.arbitrum.io/rpc', + }, + [EvmChain.ARBITRUM_SEPOLIA]: { + 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): 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; +} \ No newline at end of file diff --git a/packages/passport/sdk/src/sequence/index.ts b/packages/passport/sdk/src/sequence/index.ts index 47158796e1..9155772d09 100644 --- a/packages/passport/sdk/src/sequence/index.ts +++ b/packages/passport/sdk/src/sequence/index.ts @@ -1,2 +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..43b350d991 --- /dev/null +++ b/packages/passport/sdk/src/sequence/sendTransaction.ts @@ -0,0 +1,36 @@ +import { prepareAndSignTransaction, TransactionParams } from './transactionHelpers'; +import { EvmChain } from '../types'; + +type EthSendTransactionParams = TransactionParams & { + params: Array; + chain: EvmChain; +}; + +export const sendTransaction = async ({ + params, + sequenceSigner, + rpcProvider, + relayerClient, + walletAddress, + flow, + authManager, + chain, + multiRollupApiClients, +}: EthSendTransactionParams): Promise => { + const transactionRequest = params[0]; + + const { to, data } = await prepareAndSignTransaction({ + transactionRequest, + sequenceSigner, + rpcProvider, + relayerClient, + walletAddress, + flow, + authManager, + multiRollupApiClients, + }); + + const txHash = await relayerClient.postToRelayer(chain, 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..0e2e5872fe --- /dev/null +++ b/packages/passport/sdk/src/sequence/sequenceProvider.ts @@ -0,0 +1,254 @@ +import { JsonRpcProvider } from 'ethers'; +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, +} 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 { Provider as OxProvider, RpcTransport } from 'ox'; + +export type SequenceProviderInput = { + authManager: AuthManager; + config: PassportConfiguration; + multiRollupApiClients: MultiRollupApiClients; + passportEventEmitter: TypedEventEmitter; + 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 #rpcProvider: 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; + + constructor({ + authManager, + config, + multiRollupApiClients, + passportEventEmitter, + ethSigner, + user, + chain, + }: SequenceProviderInput) { + this.#authManager = authManager; + this.#config = config; + this.#passportEventEmitter = passportEventEmitter; + this.#ethSigner = ethSigner; + this.#chain = chain; + + const chainConfig = getChainConfig(chain); + // this.#rpcProvider = new JsonRpcProvider(chainConfig.rpcUrl, undefined, { + // staticNetwork: true, + // }); + this.#rpcProvider = 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': { + const walletAddress = await this.#getWalletAddress(); + 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; + } + + if (userEthAddress) { + this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, [ + userEthAddress, + ]); + } + + identify({ + passportId: user.profile.sub, + }); + + return [userEthAddress]; + } catch (error) { + 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': { + 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, + rpcProvider: this.#rpcProvider, + relayerClient: this.#relayerClient, + walletAddress, + flow, + authManager: this.#authManager, + chain: this.#chain, + multiRollupApiClients: this.#multiRollupApiClients, + }); + } 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'); + } + } + + case 'eth_getBalance': + const [address, blockNumber] = request.params || []; + return this.#rpcProvider.request({ + method: request.method, + params: [address, blockNumber || 'latest'], + }); + + 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); + } +} + diff --git a/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts b/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts new file mode 100644 index 0000000000..81f4cbcc88 --- /dev/null +++ b/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts @@ -0,0 +1,72 @@ +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'; + +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, + to: Address.Address, + data: Hex.Hex, + flow: Flow, + ): Promise { + flow.addEvent('startSubmitToRelayer'); + + const chainConfig = getChainConfig(chain); + + const relayer = this.getRelayer(chain, chainConfig); + const { opHash } = await relayer.relay(to, data, chainConfig.chainId); + + const wait = (ms: number) => new Promise((res) => setTimeout(res, ms)); + + let transactionHash: string; + while (true) { + const status = await relayer.status(opHash, chainConfig.chainId); + 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 index 90bb31a873..4f9b88c12f 100644 --- a/packages/passport/sdk/src/sequence/sequenceSigner.ts +++ b/packages/passport/sdk/src/sequence/sequenceSigner.ts @@ -1,305 +1,48 @@ -import { AbstractSigner, Signer, TypedDataDomain, TypedDataField, hexlify, toUtf8Bytes, getBytes, Wallet, keccak256, hashMessage, toBeHex, concat } 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, Bytes } from 'ox' -import jwtDecode from 'jwt-decode'; -import { IdTokenPayload } from '../types'; -import { SigningKey } from 'ethers'; -interface AuthKey { - address: string; - privateKey: CryptoKey; - identitySigner: string; - expiresAt: Date; -} - -interface UserWallet { - userIdentifier: string; - walletAddress: string; - authKey: AuthKey; - identityInstrument: IdentityInstrument; -} - -// Private key wallet for non-Identity Instrument mode -interface PrivateKeyWallet { - userIdentifier: string; - walletAddress: string; - wallet: Wallet; -} - -export default class SequenceSigner extends AbstractSigner { - private readonly authManager: AuthManager; - private readonly config: PassportConfiguration; - - // Identity Instrument mode - private userWallet: UserWallet | null = null; - private createWalletPromise: Promise | null = null; - - // Private key mode - private privateKeyWallet: PrivateKeyWallet | null = null; - private createPrivateKeyWalletPromise: Promise | null = null; - - useIdentityInstrument: boolean = true; +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: ISigner; + private readonly privateKeySigner: ISigner; + private readonly useIdentityInstrument: boolean; constructor(authManager: AuthManager, config: PassportConfiguration) { - super(); - this.authManager = authManager; - this.config = config; - } - - 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; - // Need a new ID token to call identity instrument - // TODO: improve this - await this.authManager.forceUserRefresh(); - - const authenticatedUser = user || await this.getUserOrThrow(); - - if (!authenticatedUser.idToken) { - throw new PassportError( - 'User idToken not available', - PassportErrorType.NOT_LOGGED_IN_ERROR, - ); - } - - const identityInstrumentEndpoint = 'https://next-identity.sequence-dev.app/';//this.config.sequenceIdentityInstrumentEndpoint - //|| 'https://identity.sequence.app/'; - - // OIDC credentials from Passport config - const idToken = authenticatedUser.idToken; - const decoded = jwtDecode(idToken) - const issuer = decoded.iss; - const audience = decoded.aud; - - // Generate NEW ephemeral authKey for this session - // Note: authKey is ephemeral and not reused. The identity signer address is deterministic. - 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), // 1 hour - }; - - const identityInstrument = new IdentityInstrument(identityInstrumentEndpoint, "@14:test"); - const challenge = new IdTokenChallenge(issuer, audience, idToken); - - console.log('[SequenceSigner] Registering authKey with Identity Instrument...'); - - // Register this ephemeral authKey with the user's identity - await identityInstrument.commitVerifier( - Identity.toIdentityAuthKey(authKey), - challenge - ); - - console.log('[SequenceSigner] Completing auth to get identity signer...'); - - // Get the deterministic identity signer address for this user - const result = await identityInstrument.completeAuth( - Identity.toIdentityAuthKey(authKey), - challenge - ); - - const signerAddress = result.signer.address; - authKey.identitySigner = signerAddress; - - console.log('[SequenceSigner] Identity signer established:', signerAddress); - - this.userWallet = { - userIdentifier: authenticatedUser.profile.sub, - walletAddress: signerAddress, - authKey, - identityInstrument, - }; - - return resolve(this.userWallet!); - } catch (error) { - const errorMessage = `Identity Instrument: Failed to create signer: ${(error as Error).message}`; - console.error('[SequenceSigner] Error:', errorMessage, error); - return reject(new PassportError(errorMessage, PassportErrorType.WALLET_CONNECTION_ERROR)); - } finally { - this.createWalletPromise = null; - } - }); - - return this.createWalletPromise; - } - - private async getPrivateKeyWallet(): Promise { - let { privateKeyWallet } = this; - if (!privateKeyWallet) { - privateKeyWallet = await this.createPrivateKeyWallet(); - } - - const user = await this.getUserOrThrow(); - if (user.profile.sub !== privateKeyWallet.userIdentifier) { - privateKeyWallet = await this.createPrivateKeyWallet(user); - } - - return privateKeyWallet; - } - - private async createPrivateKeyWallet(user?: User): Promise { - if (this.createPrivateKeyWalletPromise) return this.createPrivateKeyWalletPromise; - - this.createPrivateKeyWalletPromise = new Promise(async (resolve, reject) => { - try { - this.privateKeyWallet = null; - const authenticatedUser = user || await this.getUserOrThrow(); - - // Derive deterministic private key from user identity - const seed = `${authenticatedUser.profile.sub}-sequence-arb-one`; - const privateKeyHash = keccak256(toUtf8Bytes(seed)); - - const wallet = new Wallet(privateKeyHash); - const walletAddress = await wallet.getAddress(); - - this.privateKeyWallet = { - userIdentifier: authenticatedUser.profile.sub, - walletAddress, - wallet, - }; - - 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.createPrivateKeyWalletPromise = null; - } - }); - - return this.createPrivateKeyWalletPromise; - } - - 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; + this.identityInstrumentSigner = new IdentityInstrumentSigner(authManager, config); + this.privateKeySigner = new PrivateKeySigner(authManager); + this.useIdentityInstrument = config.authenticationDomain !== 'https://auth.dev.immutable.com'; } async getAddress(): Promise { - if (this.useIdentityInstrument) { - const wallet = await this.getUserWallet(); - return wallet.walletAddress; - } else { - const wallet = await this.getPrivateKeyWallet(); - console.log('[SequenceSigner] wallet.walletAddress', wallet.walletAddress); - return wallet.walletAddress; - } - } - - async getPrivateKey(): Promise { - if (this.useIdentityInstrument) { - return Promise.resolve(''); - } else { - const wallet = await this.getPrivateKeyWallet(); - return wallet.wallet.privateKey; - } - } - - async signMessage(message: string | Uint8Array): Promise { - if (this.useIdentityInstrument) { - console.log('[SequenceSigner] signMessage - Identity Instrument mode'); - // Identity Instrument mode - const wallet = await this.getUserWallet(); - - const signer = new Identity.IdentitySigner( - wallet.identityInstrument, - wallet.authKey - ); - - console.log('[SequenceSigner] getting message bytes...'); - - // Convert message to 32-byte hash digest - // signMessage expects the message to be hashed with Ethereum prefix - let messageBytes: Uint8Array; - if (typeof message === 'string') { - messageBytes = toUtf8Bytes(message); - } else { - messageBytes = message; - } - - // Hash with Ethereum message prefix: keccak256("\x19Ethereum Signed Message:\n" + len(message) + message) - const digest = hashMessage(messageBytes); - - // Sign using Identity Instrument (expects 32-byte hash) - const signature = await signer.signDigest(getBytes(digest)); - - // Convert signature object to hex string in standard ECDSA format - // Identity Instrument returns: { r: bigint, s: bigint, yParity: number, type: "hash" } - // We need: 0x + r (32 bytes) + s (32 bytes) + v (1 byte) - const r = toBeHex(signature.r, 32); - const s = toBeHex(signature.s, 32); - const v = toBeHex(signature.yParity + 27, 1); // Standard Ethereum: v = 27 or 28 - - return concat([r, s, v]); - } else { - // Private key mode - const pkWallet = await this.getPrivateKeyWallet(); - return pkWallet.wallet.signMessage(message); - } + return this.useIdentityInstrument + ? this.identityInstrumentSigner.getAddress() + : this.privateKeySigner.getAddress(); } - async signTransaction(): Promise { - throw new PassportError( - 'signTransaction not supported - use signMessage for EIP-712 signing', - PassportErrorType.WALLET_CONNECTION_ERROR, - ); + async getWalletConfig(): Promise { + return this.useIdentityInstrument + ? this.identityInstrumentSigner.getWalletConfig() + : this.privateKeySigner.getWalletConfig(); } - async signTypedData( - domain: TypedDataDomain, - types: Record, - value: Record, - ): Promise { - if (this.useIdentityInstrument) { - throw new PassportError( - 'signTypedData not yet implemented for Identity Instrument', - PassportErrorType.WALLET_CONNECTION_ERROR, - ); - } else { - // Private key mode - const pkWallet = await this.getPrivateKeyWallet(); - return pkWallet.wallet.signTypedData(domain, types, value); - } + 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); } - connect(): Signer { - throw new PassportError( - 'connect() not supported', - PassportErrorType.WALLET_CONNECTION_ERROR, - ); + async signMessage(message: string): 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..98636acf0a --- /dev/null +++ b/packages/passport/sdk/src/sequence/signer/ISigner.ts @@ -0,0 +1,10 @@ +import { Config, Payload, Signature as SequenceSignature } from '@0xsequence/wallet-primitives'; +import { Address } from 'ox'; + +export interface ISigner { + getAddress(): Promise; + getWalletConfig(): Promise; + signPayload(walletAddress: Address.Address, chainId: number, payload: Payload.Parented): Promise; + signMessage(message: string): 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..ac715fee03 --- /dev/null +++ b/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts @@ -0,0 +1,186 @@ +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 jwtDecode from 'jwt-decode'; +import { IdTokenPayload } from '../../types'; +import { + Config, + Payload, + Signature as SequenceSignature, +} from '@0xsequence/wallet-primitives'; +import { createWalletConfig } from './signerHelpers'; +import { ISigner } from './ISigner'; + +interface AuthKey { + address: string; + privateKey: CryptoKey; + identitySigner: string; + expiresAt: Date; +} + +interface UserWallet { + userIdentifier: string; + walletAddress: string; + authKey: AuthKey; + identityInstrument: IdentityInstrument; + walletConfig: Config.Config +} + +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(); + + 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 = jwtDecode(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; + + const walletConfig = createWalletConfig(Address.from(signerAddress)); + + this.userWallet = { + userIdentifier: authenticatedUser.profile.sub, + walletAddress: signerAddress, + authKey, + identityInstrument, + walletConfig, + }; + + 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.walletAddress; + } + + async getWalletConfig(): Promise { + const wallet = await this.getUserWallet(); + return wallet.walletConfig; + } + + 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): Promise { + const wallet = await this.getUserWallet(); + + const signer = new Identity.IdentitySigner( + wallet.identityInstrument, + wallet.authKey + ); + + const messageBytes = toUtf8Bytes(message); + const digest = hashMessage(messageBytes); + + 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..dda85cafdb --- /dev/null +++ b/packages/passport/sdk/src/sequence/signer/privateKeySigner.ts @@ -0,0 +1,113 @@ +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 { createWalletConfig } from './signerHelpers'; +import { ISigner } from './ISigner'; +import { Address } from 'ox'; + +interface PrivateKeyWallet { + userIdentifier: string; + signerAddress: string; + walletConfig: Config.Config; + 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}`; + let signer = new Signers.Pk.Pk(privateKeyHash); + + const signerAddress = signer.address; + const walletConfig = createWalletConfig(signerAddress); + + this.privateKeyWallet = { + userIdentifier: authenticatedUser.profile.sub, + signerAddress, + walletConfig, + 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 { + const wallet = await this.getWalletInstance(); + return wallet.signerAddress; + } + + async getWalletConfig(): Promise { + const wallet = await this.getWalletInstance(); + return wallet.walletConfig; + } + + 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): 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..5c736c1ab0 --- /dev/null +++ b/packages/passport/sdk/src/sequence/signer/signerHelpers.ts @@ -0,0 +1,79 @@ +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 stateProviderUrl = "https://keymachine.sequence.app"; + +export const createWalletConfig = (signerAddress: Address.Address): Config.Config => ({ + threshold: 1n, + checkpoint: 0n, + topology: { + type: "signer", + address: signerAddress, + 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..1dfca4fc15 --- /dev/null +++ b/packages/passport/sdk/src/sequence/transactionHelpers.ts @@ -0,0 +1,372 @@ +import { Flow } from '@imtbl/metrics'; +import { TransactionRequest } from 'ethers'; +import { isWalletDeployed } from './walletHelpers'; +import { JsonRpcError, ProviderErrorCode, RpcErrorCode } from '../zkEvm/JsonRpcError'; +import SequenceSigner from './sequenceSigner'; +import { Address, Bytes, Hex, Abi, AbiFunction, Provider, Hash, RpcTransport } from 'ox'; +import { Payload, Config, Signature, Erc6492, Constants, Context } from '@0xsequence/wallet-primitives'; +import { Envelope, Signers, State, Wallet } from '@0xsequence/wallet-core'; +import { SequenceRelayerClient } from './sequenceRelayerClient'; +import AuthManager from '../authManager'; +import { MultiRollupApiClients } from '@imtbl/generated-clients'; +import { createStateProvider, saveWalletConfig, SEQUENCE_CONTEXT } from './signer/signerHelpers'; + +const UPDATE_IMAGE_HASH = Abi.from(['function updateImageHash(bytes32 _imageHash) external'])[0]; + +export type TransactionParams = { + sequenceSigner: SequenceSigner; + rpcProvider: Provider.Provider; + relayerClient: SequenceRelayerClient; + walletAddress: string; + flow: Flow; + authManager: AuthManager; + nonceSpace?: bigint; + multiRollupApiClients: MultiRollupApiClients; +}; + +/** + * Deploy wallet and execute first transaction + * Combines: deploy + updateImageHash (nonce 0) + user transaction (nonce 1) + */ +const deployBootstrapAndExecute = async ( + transactionRequest: TransactionRequest, + sequenceSigner: SequenceSigner, + rpcProvider: Provider.Provider, + walletAddress: Address.Address, + wallet: Wallet, + stateProvider: State.Provider, + chainId: string, + flow: Flow, + multiRollupApiClients: MultiRollupApiClients, +): Promise<{ to: Address.Address; signedTransaction: Hex.Hex; }> => { + flow.addEvent('startDeployBootstrapAndExecute'); + + // Get deployment info + const deployInfo = await stateProvider.getDeploy(Address.from(walletAddress)); + if (!deployInfo) { + throw new Error(`Cannot find deploy information for wallet ${walletAddress}`); + } + + // Build deploy call + const deployTx = Erc6492.deploy(deployInfo.imageHash, deployInfo.context); + const deployCall: Payload.Call = { + to: deployTx.to, + value: 0n, + data: deployTx.data, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }; + + flow.addEvent('endDeployBootstrapAndExecute'); + + // Build updateImageHash and user transaction calls in parallel + const [updateImageHashCall, userTransactionCall] = await Promise.all([ + buildUpdateImageHashCall(walletAddress, sequenceSigner, Number(chainId), flow), + buildUserTransactionCall(walletAddress, transactionRequest, wallet, rpcProvider, sequenceSigner, chainId, flow), + ]); + + // Build Guest Module multicall: deploy + updateImageHash + user tx + const signedTransaction = Bytes.toHex( + Payload.encode({ + type: 'call', + space: 0n, + nonce: 0n, + calls: [deployCall, updateImageHashCall, userTransactionCall], + }) + ); + + flow.addEvent('endBuildGuestModuleMulticall'); + + return { to: wallet.guest, signedTransaction }; +}; + +const createWalletAndStateProvider = async ( + authManager: AuthManager, + walletAddress: Address.Address, + sequenceSigner: SequenceSigner, + multiRollupApiClients: MultiRollupApiClients +): Promise<{ wallet: Wallet; stateProvider: State.Provider; }> => { + const user = await authManager.getUser(); + if (!user?.accessToken) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + 'No access token found', + ); + } + const deploymentSalt = await fetchDeploymentSalt(user.accessToken, multiRollupApiClients); + + const walletConfig = await sequenceSigner.getWalletConfig(); + const realImageHash = Bytes.toHex(Config.hashConfiguration(walletConfig)); + 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: wallet, stateProvider: stateProvider }; +}; + +export const prepareAndSignTransaction = async ({ + transactionRequest, + sequenceSigner, + rpcProvider, + relayerClient, + walletAddress, + flow, + authManager, + multiRollupApiClients, +}: TransactionParams & { transactionRequest: TransactionRequest }): Promise<{ to: Address.Address; data: Hex.Hex; }> => { + if (!transactionRequest.to) { + throw new JsonRpcError( + RpcErrorCode.INVALID_PARAMS, + 'eth_sendTransaction requires a "to" field', + ); + } + + const chainId = await rpcProvider.request({ method: 'eth_chainId' }); + + const { wallet, stateProvider } = await createWalletAndStateProvider(authManager, Address.from(walletAddress), sequenceSigner, multiRollupApiClients); + + const deployed = await isWalletDeployed(rpcProvider, walletAddress); + if (!deployed) { + const result = await deployBootstrapAndExecute( + transactionRequest, + sequenceSigner, + rpcProvider, + Address.from(walletAddress), + wallet, + stateProvider, + Number(chainId).toString(), + flow, + multiRollupApiClients + ); + flow.addEvent('endPrepareDeployBootstrapExecuteTransaction'); + return { to: result.to, data: result.signedTransaction }; + } + + flow.addEvent('startBuildMetaTransactions'); + + const tx: Payload.Call = { + to: transactionRequest.to as `0x${string}`, + data: (transactionRequest.data || '0x') as `0x${string}`, + value: BigInt(transactionRequest.value || 0), + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: "revert", + }; + + const envelope = await wallet.prepareTransaction(rpcProvider as any, [tx]); + + const signature = await sequenceSigner.signPayload(Address.from(walletAddress), Number(chainId), envelope.payload); + console.log(`sig = ${signature}`); + const signedEnvelope = Envelope.toSigned(envelope, [ + { + address: Address.from(await sequenceSigner.getAddress()), + signature: signature, + }, + ]); + + const { to, data } = await wallet.buildTransaction(rpcProvider as any, signedEnvelope); + + return { to: to, data: data }; +}; + +/** + * Build and sign updateImageHash call (nonce 0) + */ +const buildUpdateImageHashCall = async ( + walletAddress: string, + sequenceSigner: SequenceSigner, + chainId: number, + flow: Flow, +): Promise => { + flow.addEvent('startBuildUpdateImageHashCall'); + + const signerAddress = await sequenceSigner.getAddress(); + const topology: Config.Topology = { + type: "signer", + address: Address.from(signerAddress), + weight: 1n, + }; + + const walletConfig: Config.Config = { + threshold: 1n, + checkpoint: 0n, + topology: topology, + }; + + const imageHash = Bytes.toHex(Config.hashConfiguration(walletConfig)); + + const updateImageHashTx: Payload.Call = { + to: Address.from(walletAddress), + value: 0n, + data: AbiFunction.encodeData(UPDATE_IMAGE_HASH, [imageHash]), + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }; + + const payload: Payload.Calls = { + type: 'call', + space: 0n, + nonce: 0n, + calls: [updateImageHashTx], + }; + + const bootstrapConfig: Config.Config = { + threshold: 1n, + checkpoint: 0n, + topology: { + type: 'signer', + address: Address.from("IMMUTABLE_SIGNER_ADDRESS"), + weight: 1n, + }, + }; + + const bootstrapEnvelope: Envelope.Envelope = { + wallet: Address.from(walletAddress), + payload: payload, + chainId: chainId, + configuration: bootstrapConfig, + }; + + const immutableSigner = new Signers.Pk.Pk('IMMUTABLE_SIGNER_ADDRESS_PK' as `0x${string}`); + const bootstrapSignature = await immutableSigner.sign(Address.from(walletAddress), chainId, payload); + + const signedBootstrapEnvelope = Envelope.toSigned(bootstrapEnvelope, [ + { + address: Address.from(immutableSigner.address), + signature: bootstrapSignature, + }, + ]); + + const bootstrapRawSig = Envelope.encodeSignature(signedBootstrapEnvelope); + const bootstrapEncodedSig = Bytes.toHex( + Signature.encodeSignature({ + ...bootstrapRawSig, + suffix: [], + }) + ); + + const updateImageHashCall: Payload.Call = { + to: Address.from(walletAddress), + value: 0n, + data: AbiFunction.encodeData(Constants.EXECUTE, [ + Bytes.toHex(Payload.encode(payload)), + bootstrapEncodedSig, + ]), + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }; + + flow.addEvent('endBuildUpdateImageHashCall'); + + return updateImageHashCall; +} + +/** + * Build and sign user transaction call (nonce 1) + */ +const buildUserTransactionCall = async ( + walletAddress: string, + transactionRequest: TransactionRequest, + wallet: Wallet, + rpcProvider: Provider.Provider, + sequenceSigner: SequenceSigner, + chainId: string, + flow: Flow, +): Promise => { + flow.addEvent('startBuildUserTransactionCall'); + + const userTx: Payload.Call = { + to: transactionRequest.to as `0x${string}`, + value: BigInt(transactionRequest.value || 0), + data: (transactionRequest.data || '0x') as `0x${string}`, + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: "revert", + }; + + const envelope = await wallet.prepareTransaction(rpcProvider as any, [userTx], { noConfigUpdate: true }); + + // Adjust nonce to 1 for user transaction (bootstrap transaction uses nonce 0) + const userEnvelope = { + ...envelope, + payload: { + ...envelope.payload, + nonce: 1n, + }, + }; + + // Sign user transaction + const userSignature = await sequenceSigner.signPayload(Address.from(walletAddress), Number(chainId), userEnvelope.payload); + + const signerAddress = await sequenceSigner.getAddress(); + const signedUserEnvelope = Envelope.toSigned(userEnvelope, [ + { + address: Address.from(signerAddress), + signature: userSignature, + }, + ]); + + // Encode signature + const status = await wallet.getStatus(rpcProvider as any); + const userRawSig = Envelope.encodeSignature(signedUserEnvelope); + const userEncodedSig = Bytes.toHex( + Signature.encodeSignature({ + ...userRawSig, + suffix: status.pendingUpdates.map(({ signature }: any) => signature), + }) + ); + + flow.addEvent('endBuildUserTransactionCall'); + + const userTransactionCall: Payload.Call = { + to: Address.from(walletAddress), + value: 0n, + data: AbiFunction.encodeData(Constants.EXECUTE, [ + Bytes.toHex(Payload.encode(signedUserEnvelope.payload)), + userEncodedSig, + ]), + gasLimit: 0n, + delegateCall: false, + onlyFallback: false, + behaviorOnError: 'revert', + }; + + flow.addEvent('endBuildUserTransactionCall'); + + return userTransactionCall; +} + +// TODO replace this with multi-rollup api client +async function fetchDeploymentSalt( + accessToken: string, + multiRollupApiClients: MultiRollupApiClients, +): Promise { + const apiUrl = `http://localhost:8071/v2/passport/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; +} + 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..237a005182 --- /dev/null +++ b/packages/passport/sdk/src/sequence/user/registerUser.ts @@ -0,0 +1,86 @@ +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 { Provider } from 'ox'; + +export type RegisterUserInput = { + authManager: AuthManager; + multiRollupApiClients: MultiRollupApiClients; + accessToken: string; + rpcProvider: Provider.Provider; + 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.request({ method: 'eth_chainId' }); + detectNetworkPromise.then(() => flow.addEvent('endDetectNetwork')); + + const listChainsPromise = multiRollupApiClients.chainsApi.listChains(); + listChainsPromise.then(() => flow.addEvent('endListChains')); + + const [ethereumAddress, ethereumSignature, chainId, chainListResponse] = await Promise.all([ + getAddressPromise, + signMessagePromise, + detectNetworkPromise, + listChainsPromise, + ]); + + const eipChainId = getEip155ChainId(Number(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 ${chainId}`, + ); + } + + try { + const registrationResponse = await multiRollupApiClients.passportApi.createCounterfactualAddressV2({ + chainName: chainName, + createCounterfactualAddressRequest: { + ethereum_address: ethereumAddress, + ethereum_signature: ethereumSignature, + }, + }, { + headers: { Authorization: `Bearer ${accessToken}` }, + }); + flow.addEvent('endCreateCounterfactualAddress'); + + authManager.forceUserRefreshInBackground(); + + return registrationResponse.data.counterfactual_address; + } catch (error) { + 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..bf1135911a --- /dev/null +++ b/packages/passport/sdk/src/sequence/walletHelpers.ts @@ -0,0 +1,48 @@ +import { walletContracts } from '@0xsequence/abi'; +import { Payload, Signature } from '@0xsequence/wallet-primitives'; +import { Bytes, Address, Abi, AbiFunction, Hex, Provider } from 'ox'; +import { BigNumberish } from 'ethers'; +import SequenceSigner from './sequenceSigner'; + +const READ_NONCE = Abi.from(['function readNonce(uint256 _space) external view returns (uint256)'])[0] +const SIGNATURE_WEIGHT = 1; + +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 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 dd02037f13..ed308f16b5 100644 --- a/packages/passport/sdk/src/types.ts +++ b/packages/passport/sdk/src/types.ts @@ -39,7 +39,6 @@ export type UserProfile = { export enum RollupType { IMX = 'imx', ZKEVM = 'zkEvm', - ARBONE = 'arbOne', } export type User = { @@ -57,20 +56,27 @@ export type User = { ethAddress: string; userAdminAddress: string; }; - [RollupType.ARBONE]?: { +} & { + [K in Exclude]?: { ethAddress: string; + userAdminAddress: string; }; }; +export type PassportChainMetadata = { + eth_address: string; + user_admin_address: string; +}; + export type PassportMetadata = { imx_eth_address: string; imx_stark_address: string; imx_user_admin_address: string; zkevm_eth_address: string; zkevm_user_admin_address: string; - arbone_eth_address?: string; +} & { + [K in Exclude]: PassportChainMetadata; }; - export interface OidcConfiguration { clientId: string; logoutRedirectUri?: string; @@ -90,8 +96,8 @@ export interface PassportOverrides { immutableXClient: IMXClient; zkEvmRpcUrl: string; relayerUrl: string; - arbOneRpcUrl?: string; - sequenceIdentityInstrumentEndpoint?: string; + sequenceIdentityInstrumentEndpoint: string; + sequenceProjectAccessKey: string; indexerMrBasePath: string; orderBookMrBasePath: string; passportMrBasePath: string; @@ -137,11 +143,9 @@ type WithRequired = T & { [P in K]-?: T[P] }; export type UserImx = WithRequired; export type UserZkEvm = WithRequired; -export type UserArbOne = WithRequired; export const isUserZkEvm = (user: User): user is UserZkEvm => !!user[RollupType.ZKEVM]; export const isUserImx = (user: User): user is UserImx => !!user[RollupType.IMX]; -export const isUserArbOne = (user: User): user is UserArbOne => !!user[RollupType.ARBONE]; export type DeviceTokenResponse = { access_token: string; @@ -189,7 +193,8 @@ export type LinkedWallet = { export enum EvmChain { ZKEVM = 'zkevm', - ARBONE = 'arbone', + ARBITRUM_ONE = 'arbitrum_one', + ARBITRUM_SEPOLIA = 'arbitrum_sepolia', } export type ConnectEvmArguments = { 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/sendTransaction.ts b/packages/passport/sdk/src/zkEvm/sendTransaction.ts index 60068346bc..2146f35795 100644 --- a/packages/passport/sdk/src/zkEvm/sendTransaction.ts +++ b/packages/passport/sdk/src/zkEvm/sendTransaction.ts @@ -13,7 +13,6 @@ export const sendTransaction = async ({ zkEvmAddress, flow, nonceSpace, - isBackgroundTransaction = false, }: EthSendTransactionParams): Promise => { const transactionRequest = params[0]; @@ -26,7 +25,6 @@ export const sendTransaction = async ({ zkEvmAddress, flow, nonceSpace, - isBackgroundTransaction, }); const { hash } = await pollRelayerTransaction(relayerClient, relayerId, flow); diff --git a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts index ecf8245d34..d889641e92 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 = () => { @@ -181,6 +184,9 @@ export class ZkEvmProvider implements Provider { rpcProvider: this.#rpcProvider, flow, }); + + this.userWalletAddress = userZkEvmEthAddress; + flow.addEvent('endUserRegistration'); } else { userZkEvmEthAddress = user.zkEvm.ethAddress; @@ -206,7 +212,7 @@ export class ZkEvmProvider implements Provider { } } case 'eth_sendTransaction': { - const zkEvmAddress = '0x775396532ac01f6013c0118a5a9d4568aaa92cfe';//await this.#getZkEvmAddress(); + const zkEvmAddress = this.userWalletAddress;//await this.#getZkEvmAddress(); if (!zkEvmAddress) { throw new JsonRpcError( ProviderErrorCode.UNAUTHORIZED, @@ -218,10 +224,7 @@ export class ZkEvmProvider implements Provider { console.log(`request.params ${JSON.stringify(request.params)}`); try { - return await this.#guardianClient.withConfirmationScreen({ - width: 480, - height: 720, - })(async () => await sendTransaction({ + return await sendTransaction({ params: request.params || [], ethSigner: this.#ethSigner, guardianClient: this.#guardianClient, @@ -229,7 +232,19 @@ export class ZkEvmProvider implements Provider { relayerClient: this.#relayerClient, zkEvmAddress, flow, - })); + }); + // return await this.#guardianClient.withConfirmationScreen({ + // width: 480, + // height: 720, + // })(async () => await sendTransaction({ + // params: request.params || [], + // ethSigner: this.#ethSigner, + // guardianClient: this.#guardianClient, + // rpcProvider: this.#rpcProvider, + // relayerClient: this.#relayerClient, + // zkEvmAddress, + // flow, + // })); } catch (error) { if (error instanceof Error) { trackError('passport', 'eth_sendTransaction', error, { flowId: flow.details.flowId }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 102291df07..e0a320593d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,13 +114,13 @@ importers: version: 29.7.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) typescript: specifier: ^5 version: 5.6.2 @@ -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.10.6(bufferutil@4.0.8)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 2.10.6 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) @@ -1196,7 +1196,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1362,7 +1362,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1374,7 +1374,7 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2076,20 +2076,23 @@ importers: specifier: 2.3.34 version: 2.3.34(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@0xsequence/identity-instrument': - specifier: 0.0.0-20251120164619 - version: 0.0.0-20251120164619(typescript@5.6.2) + specifier: 3.0.0-beta.1 + version: 3.0.0-beta.1(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.1 + version: 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) '@0xsequence/wallet-core': - specifier: 0.0.0-20251120164619 - version: 0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10) + specifier: 3.0.0-beta.1 + version: 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) '@0xsequence/wallet-primitives': - specifier: 0.0.0-20251120164619 - version: 0.0.0-20251120164619(typescript@5.6.2) + specifier: 3.0.0-beta.1 + version: 3.0.0-beta.1(typescript@5.6.2) '@0xsequence/wallet-wdk': - specifier: 0.0.0-20251120164619 - version: 0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10) + specifier: 3.0.0-beta.1 + version: 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) '@imtbl/config': specifier: workspace:* version: link:../../config @@ -2183,7 +2186,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2198,7 +2201,7 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) tsup: specifier: 8.3.0 version: 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) @@ -2714,18 +2717,12 @@ importers: packages: - '@0xsequence/abi@0.0.0-coolcats-0.36.12-20220711222640': - resolution: {integrity: sha512-4SU6ttoNSA4sXtCU6H9EbQlqr2oyeOMrh0bay9G+XncwLhikaXL9DUQCXHMzIWAM5v7I+glfakkRZytnUdieiw==} - '@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/config@0.0.0-coolcats-0.36.12-20220711222640': - resolution: {integrity: sha512-X0zrcxyx9EWZ8Q761m5obNxuMeTEl5QgN2/dD/fRfDx4nFeRYUQwDOnVwhfVBvsg4RSudwGXcbr7i8in63aFVg==} - '@0xsequence/core@2.3.34': resolution: {integrity: sha512-VpXO4bQsMwP+y64Ba6C/wNKYUFGksmCYUZQMS1s/ncXAPTmZLLk3pZfmY4Djc8aDqZYYy6Yo0Mq90VPaqYI7Hg==} peerDependencies: @@ -2736,43 +2733,31 @@ packages: peerDependencies: ethers: '>=6' - '@0xsequence/guard@0.0.0-coolcats-0.36.12-20220711222640': - resolution: {integrity: sha512-Rv1+PhIHT/CTTA/ICK1el1BOmLO3sfE7eSUs5nXWvJceCqq0suRreylsBxs2K8niwNS2XrOqxbH8I3Iu5O0spw==} + '@0xsequence/guard@3.0.0-beta.2': + resolution: {integrity: sha512-Uj5I8rBPyOzyCKxqg9jdEWr8Jcuwxg+dCOmU3ZXEWtXqqtq8f9gxKqdfjXkMPvDZRPZ+ReDYXyUzpFJRUX5otw==} - '@0xsequence/identity-instrument@0.0.0-20251120164619': - resolution: {integrity: sha512-FCcfiKf3zSC9RzF2xkJQ+pdMaTRGDDOrE/GywsljvfjX5twUtKIyWCqiyLlPZ3img68XH/NXIS6RXQqg+/g6/A==} + '@0xsequence/identity-instrument@3.0.0-beta.1': + resolution: {integrity: sha512-nr2IeIXmaM4jOLB7umHxIDLyKOVlrX8o6y1v1FLW5rxCb3Ex218XhSNzC/fHxaZf2NzxvZ8FihIvHAyBDwLdbw==} '@0xsequence/indexer@2.3.35': resolution: {integrity: sha512-zqjGRzRzFWC8jf26WsagHz0zPP6V8ieAUBDrEKItPb0rgzNX+KiMl6wMZXW/zQp+DGuCfvFfeL0NSALmFxmjRg==} - '@0xsequence/multicall@0.0.0-coolcats-0.36.12-20220711222640': - resolution: {integrity: sha512-jo2oWa7ChPyCvunqLO6n2467j0kZa+Qu2Xvypk5X+0fYzY8K8daaugTPVwnADl3bhYmJtmIZHcMNoBEVYqmZJA==} - - '@0xsequence/network@0.0.0-coolcats-0.36.12-20220711222640': - resolution: {integrity: sha512-VlQvPBVtk04iW0avieEEPHK4ijx84KC+WTOqfRsb+5o5fpvx6mmqpOoI6baUnLxNuOqB04yTmd4vqLuXtn4vFw==} - '@0xsequence/network@2.3.35': resolution: {integrity: sha512-xn3pLk778EPiM+xHkYQWdY00xDlgWZxz1U8RxEqRi8IjMcC8N6rqNWTupIXWUVOxNCMtlF+Qtme95+slhHAQUQ==} peerDependencies: ethers: '>=6' - '@0xsequence/relayer@0.0.0-coolcats-0.36.12-20220711222640': - resolution: {integrity: sha512-kQQDQ6ofT2eoLxieAUhO9HllueSymTCdyt5kbISprjbJJjQco5ekPD50Wt8x2bazgulaAR5VlIvzqme67kbR3g==} - '@0xsequence/relayer@2.3.35': resolution: {integrity: sha512-9kld9zQ2kxh2QqKDaaTmCzdzLGx8fykgID/YlxqDV62J9G5/5g8xTpO0LsGamheQ75l1Orhw2lRNkuyiAib9jg==} peerDependencies: ethers: '>=6' + '@0xsequence/relayer@3.0.0-beta.1': + resolution: {integrity: sha512-xgzRjGTqusmv2dVjYnpXdsT1pmbap1770PGSgpdXX/Lo+PEMVhHGbm+mP6STIDhOJhKHGMCYxrELClnavwpJIA==} + '@0xsequence/tee-verifier@0.1.2': resolution: {integrity: sha512-7sKr8/T4newknx6LAukjlRI3siGiGhBnZohz2Z3jX0zb0EBQdKUq0L//A7CPSckHFPxTg/QvQU2v8e9x9GfkDw==} - '@0xsequence/transactions@0.0.0-coolcats-0.36.12-20220711222640': - resolution: {integrity: sha512-RMSNQmr2rmZhpgViqs42Q6ABc8yKDheEVi2j1lPrXVnTCnQ3tF492eUDkaAJGRQ2Pjt57u60LhejNIz8B3YrkA==} - - '@0xsequence/utils@0.0.0-coolcats-0.36.12-20220711222640': - resolution: {integrity: sha512-8MaLwpFnKQAP6aOKxt4fWKFxhduTjvYxgV664iHRL7dMpzH5XuTJbuQhMuGbtJKZSB7bWQE9sYUhXxjMkQ0jlw==} - '@0xsequence/utils@2.3.34': resolution: {integrity: sha512-4vJUNbQ1UNgr0XcipSOsMB4EglJyj3XlndNfuqRxMuXZAAyEmMVESyC6XjtDIdN26OclUJLj7EYOSlsRkS12Hw==} peerDependencies: @@ -2783,14 +2768,14 @@ packages: peerDependencies: ethers: '>=6' - '@0xsequence/wallet-core@0.0.0-20251120164619': - resolution: {integrity: sha512-aRpDSB47kjcXhgn88srUMz6YpQhi1AuQLWTjScuue7iBZ/6ELiYDErevn9wY8kq5B6VMpUJbsaQri6aQjox0ug==} + '@0xsequence/wallet-core@3.0.0-beta.1': + resolution: {integrity: sha512-XNIXy+OeLaV7wMBYL9ihMMuwbAeGjbqfct2gd878vUOkPXsXYmKakN8Km62va+sLgzL7PJZF/JPqy+fjiy4YFQ==} - '@0xsequence/wallet-primitives@0.0.0-20251120164619': - resolution: {integrity: sha512-VW+XnCNe0O8oasqHsnWnx1Bl4M87KyZX3cytijaiqngTF1OYlhGfqVBQVYoLp6qy5zOFksT8vbO8jojOkaD/MA==} + '@0xsequence/wallet-primitives@3.0.0-beta.1': + resolution: {integrity: sha512-9zjToPzOwX470usNirrCc6JNL4wjIGV2JjbjFaqHMxbdqapihsAYKAgcI0OBVM2YoNSMn2Wx70eqCY0VS/KeOw==} - '@0xsequence/wallet-wdk@0.0.0-20251120164619': - resolution: {integrity: sha512-uUAbSTjlzEaPF+tnEUkFb4Asj9+AutubeMHXKiP+AVhlpQllAEygmimIo4w/y14y0qa9FcY5+RPacysjCDQkew==} + '@0xsequence/wallet-wdk@3.0.0-beta.1': + resolution: {integrity: sha512-+pgtOpJwAerXImouZFwEbSus4s0ZwKrT+uwtuGIrNlNNiqbikaag0QniCgOPbE0r0ePxE9Vd0jAoaZGrzRfesA==} '@0xsquid/sdk@2.8.25': resolution: {integrity: sha512-fSMKVdKIX8G3qFpoTf3WfcyjhGdc9hE0uSu1bs1gsh4+iG19ILguDdrY8g87dUknt9PCKBb6TIt1QeYEgbXjdA==} @@ -10674,9 +10659,6 @@ packages: picomatch: optional: true - fetch-ponyfill@7.1.0: - resolution: {integrity: sha512-FhbbL55dj/qdVO3YNK7ZEkshvj3eQ7EuIGV2I6ic/2YiocvyWv+7jg2s4AyS0wdRU75s3tA8ZxI/xPigb0v5Aw==} - figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -13386,15 +13368,6 @@ packages: node-fetch-native@1.6.2: resolution: {integrity: sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==} - node-fetch@2.6.13: - resolution: {integrity: sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -17488,23 +17461,10 @@ packages: snapshots: - '@0xsequence/abi@0.0.0-coolcats-0.36.12-20220711222640': {} - '@0xsequence/abi@2.3.34': {} '@0xsequence/abi@2.3.35': {} - '@0xsequence/config@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10)': - dependencies: - '@0xsequence/abi': 0.0.0-coolcats-0.36.12-20220711222640 - '@0xsequence/multicall': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@0xsequence/network': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@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 @@ -17517,9 +17477,14 @@ snapshots: '@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@0.0.0-coolcats-0.36.12-20220711222640': {} + '@0xsequence/guard@3.0.0-beta.2(typescript@5.6.2)': + dependencies: + ox: 0.7.2(typescript@5.6.2) + transitivePeerDependencies: + - typescript + - zod - '@0xsequence/identity-instrument@0.0.0-20251120164619(typescript@5.6.2)': + '@0xsequence/identity-instrument@3.0.0-beta.1(typescript@5.6.2)': dependencies: json-canonicalize: 2.0.0 jwt-decode: 4.0.0 @@ -17530,26 +17495,6 @@ snapshots: '@0xsequence/indexer@2.3.35': {} - '@0xsequence/multicall@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10)': - dependencies: - '@0xsequence/abi': 0.0.0-coolcats-0.36.12-20220711222640 - '@0xsequence/network': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@0xsequence/network@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10)': - dependencies: - '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@0xsequence/network@2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: '@0xsequence/core': 2.3.35(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) @@ -17558,20 +17503,6 @@ snapshots: '@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@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': - dependencies: - '@0xsequence/abi': 0.0.0-coolcats-0.36.12-20220711222640 - '@0xsequence/config': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@0xsequence/transactions': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - fetch-ponyfill: 7.1.0(encoding@0.1.13) - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - '@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 @@ -17579,31 +17510,22 @@ snapshots: '@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/tee-verifier@0.1.2': + '@0xsequence/relayer@3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: - cbor2: 1.12.0 - pkijs: 3.3.3 - - '@0xsequence/transactions@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10)': - dependencies: - '@0xsequence/abi': 0.0.0-coolcats-0.36.12-20220711222640 - '@0xsequence/network': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@0xsequence/utils': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@ethersproject/abi': 5.7.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': 3.0.0-beta.1(typescript@5.6.2) + mipd: 0.0.7(typescript@5.6.2) + ox: 0.7.2(typescript@5.6.2) + viem: 2.39.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil + - typescript - utf-8-validate + - zod - '@0xsequence/utils@0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@0xsequence/tee-verifier@0.1.2': dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/properties': 5.7.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - js-base64: 3.7.7 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + 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: @@ -17615,43 +17537,41 @@ snapshots: ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) js-base64: 3.7.7 - '@0xsequence/wallet-core@0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10)': + '@0xsequence/wallet-core@3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: - '@0xsequence/guard': 0.0.0-coolcats-0.36.12-20220711222640 - '@0xsequence/relayer': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@0xsequence/wallet-primitives': 0.0.0-20251120164619(typescript@5.6.2) + '@0xsequence/guard': 3.0.0-beta.2(typescript@5.6.2) + '@0xsequence/relayer': 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': 3.0.0-beta.1(typescript@5.6.2) mipd: 0.0.7(typescript@5.6.2) ox: 0.7.2(typescript@5.6.2) viem: 2.39.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - - encoding - typescript - utf-8-validate - zod - '@0xsequence/wallet-primitives@0.0.0-20251120164619(typescript@5.6.2)': + '@0xsequence/wallet-primitives@3.0.0-beta.1(typescript@5.6.2)': dependencies: ox: 0.7.2(typescript@5.6.2) transitivePeerDependencies: - typescript - zod - '@0xsequence/wallet-wdk@0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10)': + '@0xsequence/wallet-wdk@3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: - '@0xsequence/guard': 0.0.0-coolcats-0.36.12-20220711222640 - '@0xsequence/identity-instrument': 0.0.0-20251120164619(typescript@5.6.2) - '@0xsequence/relayer': 0.0.0-coolcats-0.36.12-20220711222640(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@0xsequence/guard': 3.0.0-beta.2(typescript@5.6.2) + '@0xsequence/identity-instrument': 3.0.0-beta.1(typescript@5.6.2) + '@0xsequence/relayer': 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) '@0xsequence/tee-verifier': 0.1.2 - '@0xsequence/wallet-core': 0.0.0-20251120164619(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.6.2)(utf-8-validate@5.0.10) - '@0xsequence/wallet-primitives': 0.0.0-20251120164619(typescript@5.6.2) + '@0xsequence/wallet-core': 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': 3.0.0-beta.1(typescript@5.6.2) idb: 7.1.1 jwt-decode: 4.0.0 ox: 0.7.2(typescript@5.6.2) uuid: 11.1.0 transitivePeerDependencies: - bufferutil - - encoding - typescript - utf-8-validate - zod @@ -20556,7 +20476,7 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/bridge-sdk@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/bridge-sdk@2.10.6': dependencies: '@imtbl/config': 2.10.6 '@jest/globals': 29.7.0 @@ -20568,16 +20488,16 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/checkout-sdk@2.10.6(bufferutil@4.0.8)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@imtbl/checkout-sdk@2.10.6': dependencies: '@imtbl/blockchain-data': 2.10.6 - '@imtbl/bridge-sdk': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/bridge-sdk': 2.10.6 '@imtbl/config': 2.10.6 - '@imtbl/dex-sdk': 2.10.6(bufferutil@4.0.8)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@imtbl/dex-sdk': 2.10.6 '@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) + '@imtbl/orderbook': 2.10.6 + '@imtbl/passport': 2.10.6 '@metamask/detect-provider': 2.0.0 axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20643,12 +20563,12 @@ snapshots: - typescript - utf-8-validate - '@imtbl/dex-sdk@2.10.6(bufferutil@4.0.8)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@imtbl/dex-sdk@2.10.6': dependencies: '@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@20.14.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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@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)) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -20689,7 +20609,7 @@ snapshots: - debug - pg-native - '@imtbl/orderbook@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/orderbook@2.10.6': dependencies: '@imtbl/config': 2.10.6 '@imtbl/metrics': 2.10.6 @@ -20703,16 +20623,16 @@ snapshots: - debug - utf-8-validate - '@imtbl/passport@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/passport@2.10.6': 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) + '@imtbl/toolkit': 2.10.6 + '@imtbl/x-client': 2.10.6 + '@imtbl/x-provider': 2.10.6 '@magic-ext/oidc': 12.0.5 '@magic-sdk/provider': 29.0.5(localforage@1.10.0) '@metamask/detect-provider': 2.0.0 @@ -20737,17 +20657,17 @@ snapshots: - encoding - supports-color - '@imtbl/sdk@2.10.6(bufferutil@4.0.8)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@imtbl/sdk@2.10.6': dependencies: '@imtbl/blockchain-data': 2.10.6 - '@imtbl/checkout-sdk': 2.10.6(bufferutil@4.0.8)(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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@imtbl/checkout-sdk': 2.10.6 '@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/orderbook': 2.10.6 + '@imtbl/passport': 2.10.6 '@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) + '@imtbl/x-client': 2.10.6 + '@imtbl/x-provider': 2.10.6 transitivePeerDependencies: - bufferutil - debug @@ -20756,9 +20676,9 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/toolkit@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/toolkit@2.10.6': dependencies: - '@imtbl/x-client': 2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.10.6 '@magic-ext/oidc': 12.0.5 '@metamask/detect-provider': 2.0.0 axios: 1.7.7 @@ -20780,7 +20700,7 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/x-client@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/x-client@2.10.6': dependencies: '@ethereumjs/wallet': 2.0.4 '@imtbl/config': 2.10.6 @@ -20796,12 +20716,12 @@ snapshots: - debug - utf-8-validate - '@imtbl/x-provider@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/x-provider@2.10.6': dependencies: '@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) + '@imtbl/toolkit': 2.10.6 + '@imtbl/x-client': 2.10.6 '@magic-ext/oidc': 12.0.5 '@metamask/detect-provider': 2.0.0 axios: 1.7.7 @@ -21292,7 +21212,7 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@26.6.3': + '@jest/test-sequencer@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': dependencies: '@jest/test-result': 26.6.2 graceful-fs: 4.2.11 @@ -21300,7 +21220,11 @@ snapshots: jest-runner: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: + - bufferutil + - canvas - supports-color + - ts-node + - utf-8-validate '@jest/test-sequencer@27.5.1': dependencies: @@ -25088,6 +25012,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + debug: 4.3.7(supports-color@8.1.1) + eslint: 9.16.0(jiti@1.21.0) + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -25260,17 +25203,6 @@ snapshots: transitivePeerDependencies: - hardhat - '@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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': - dependencies: - '@openzeppelin/contracts': 3.4.2 - '@uniswap/v2-core': 1.0.1 - '@uniswap/v3-core': 1.0.0 - '@uniswap/v3-periphery': 1.4.4 - dotenv: 14.3.2 - hardhat-watcher: 2.5.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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - transitivePeerDependencies: - - hardhat - '@uniswap/v2-core@1.0.1': {} '@uniswap/v3-core@1.0.0': {} @@ -25304,19 +25236,6 @@ snapshots: transitivePeerDependencies: - hardhat - '@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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/solidity': 5.7.0 - '@uniswap/sdk-core': 4.0.6 - '@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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@uniswap/v3-periphery': 1.4.3 - '@uniswap/v3-staker': 1.0.0 - tiny-invariant: 1.3.1 - tiny-warning: 1.0.3 - transitivePeerDependencies: - - hardhat - '@uniswap/v3-staker@1.0.0': dependencies: '@openzeppelin/contracts': 3.4.2 @@ -26337,20 +26256,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@29.7.0(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.9) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - optional: true - babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 @@ -26551,13 +26456,6 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.10) - babel-preset-jest@29.6.3(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) - optional: true - babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.26.9 @@ -28538,7 +28436,7 @@ snapshots: dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 @@ -28549,13 +28447,13 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) eslint-config-airbnb@19.0.4(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-plugin-jsx-a11y@6.9.0(eslint@8.57.0))(eslint-plugin-react-hooks@5.0.0(eslint@8.57.0))(eslint-plugin-react@7.35.0(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0(eslint@8.57.0) @@ -28569,8 +28467,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -28589,7 +28487,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28608,7 +28506,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28625,8 +28523,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28643,8 +28541,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28654,18 +28552,45 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + dependencies: + '@babel/core': 7.26.9 + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.10.4 + '@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) + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-jest: 25.7.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))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) @@ -28681,23 +28606,23 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@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) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) - eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.35.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-testing-library: 5.11.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -28722,7 +28647,25 @@ snapshots: enhanced-resolve: 5.15.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + get-tsconfig: 4.6.2 + globby: 13.2.2 + is-core-module: 2.15.0 + is-glob: 4.0.3 + synckit: 0.8.5 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + dependencies: + debug: 4.3.7(supports-color@8.1.1) + enhanced-resolve: 5.15.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) get-tsconfig: 4.6.2 globby: 13.2.2 is-core-module: 2.15.0 @@ -28745,6 +28688,27 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): dependencies: debug: 3.2.7 @@ -28755,6 +28719,14 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0): + dependencies: + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + eslint: 8.57.0 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) @@ -28763,15 +28735,15 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) - eslint: 8.57.0 + eslint: 9.16.0(jiti@1.21.0) lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -28798,6 +28770,33 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.16.0(jiti@1.21.0) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)) + hasown: 2.0.2 + is-core-module: 2.15.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): dependencies: array-includes: 3.1.8 @@ -28847,6 +28846,17 @@ snapshots: - supports-color - typescript + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -29655,12 +29665,6 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fetch-ponyfill@7.1.0(encoding@0.1.13): - dependencies: - node-fetch: 2.6.13(encoding@0.1.13) - transitivePeerDependencies: - - encoding - figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -30290,11 +30294,6 @@ snapshots: chokidar: 3.6.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) - hardhat-watcher@2.5.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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): - dependencies: - chokidar: 3.6.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@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) - 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): dependencies: '@ethersproject/abi': 5.7.0 @@ -31479,7 +31478,7 @@ snapshots: jest-config@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 - '@jest/test-sequencer': 26.6.3 + '@jest/test-sequencer': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) '@jest/types': 26.6.2 babel-jest: 26.6.3(@babel/core@7.26.10) chalk: 4.1.2 @@ -33854,12 +33853,6 @@ snapshots: node-fetch-native@1.6.2: {} - node-fetch@2.6.13(encoding@0.1.13): - dependencies: - whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -35677,6 +35670,92 @@ snapshots: '@remix-run/router': 1.7.2 react: 18.3.1 + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.26.9 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + '@svgr/webpack': 5.5.0 + babel-jest: 27.5.1(@babel/core@7.26.9) + babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) + babel-preset-react-app: 10.0.1 + bfj: 7.0.2 + browserslist: 4.23.3 + camelcase: 6.3.0 + case-sensitive-paths-webpack-plugin: 2.4.0 + css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + eslint: 8.57.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + fs-extra: 10.1.0 + html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + identity-obj-proxy: 3.0.0 + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-resolve: 27.5.1 + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss: 8.4.49 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) + postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) + postcss-preset-env: 7.8.3(postcss@8.4.49) + prompts: 2.4.2 + react: 18.3.1 + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-refresh: 0.11.0 + resolve: 1.22.8 + resolve-url-loader: 4.0.0 + sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + semver: 7.6.3 + source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + optionalDependencies: + fsevents: 2.3.3 + typescript: 5.6.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - '@parcel/css' + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - bufferutil + - canvas + - clean-css + - csso + - debug + - esbuild + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - fibers + - node-notifier + - node-sass + - rework + - rework-visit + - sass + - sass-embedded + - sockjs-client + - supports-color + - ts-node + - type-fest + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 @@ -35763,7 +35842,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35780,9 +35859,9 @@ snapshots: css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + eslint: 9.16.0(jiti@1.21.0) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35799,7 +35878,7 @@ snapshots: prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 @@ -37604,12 +37683,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37624,12 +37703,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37644,12 +37723,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37664,12 +37743,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37678,10 +37757,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.26.10 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.9) + babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 ts-mockito@2.6.1: From d7f58e5a087eb10d1b4d70dfff74020a4deb8739 Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Tue, 2 Dec 2025 19:15:01 +1300 Subject: [PATCH 05/10] chore: remove sequence sdk workarounds --- .../passport/sdk-sample-app/next.config.js | 65 ------ packages/passport/sdk-sample-app/package.json | 6 +- .../src/components/arbone/ArbOneRequest.tsx | 1 - .../src/components/arbone/ArbOneWorkflow.tsx | 1 - .../src/context/ImmutableProvider.tsx | 29 ++- .../src/context/PassportProvider.tsx | 17 -- .../passport/sdk/src/zkEvm/sendTransaction.ts | 2 + pnpm-lock.yaml | 186 +++--------------- sdk/src/index.browser.ts | 4 +- 9 files changed, 46 insertions(+), 265 deletions(-) diff --git a/packages/passport/sdk-sample-app/next.config.js b/packages/passport/sdk-sample-app/next.config.js index d8b6ecd479..6f4b2c2c11 100644 --- a/packages/passport/sdk-sample-app/next.config.js +++ b/packages/passport/sdk-sample-app/next.config.js @@ -17,71 +17,6 @@ const nextConfig = { }, output: 'export', reactStrictMode: true, - // Transpile workspace packages and Sequence packages to handle SSR properly - transpilePackages: [ - '@imtbl/passport', - '@imtbl/config', - '@imtbl/toolkit', - '@imtbl/x-client', - '@imtbl/orderbook', - '@imtbl/blockchain-data', - '@imtbl/generated-clients', - '@imtbl/x-provider', - '@0xsequence/wallet-wdk', - '@0xsequence/identity-instrument', - '@0xsequence/wallet-core', - '@0xsequence/abi', - '@0xsequence/core', - '@0xsequence/auth', - '@0xsequence/network', - ], - // Configure webpack to handle these packages - webpack: (config, { isServer, webpack }) => { - // Prefer source files over built files for workspace packages in development - config.resolve.alias = { - ...config.resolve.alias, - '@imtbl/passport': require('path').resolve(__dirname, '../sdk/src'), - '@imtbl/config': require('path').resolve(__dirname, '../../config/src'), - '@imtbl/toolkit': require('path').resolve(__dirname, '../../internal/toolkit/src'), - '@imtbl/x-client': require('path').resolve(__dirname, '../../x-client/src'), - '@imtbl/orderbook': require('path').resolve(__dirname, '../../orderbook/src'), - '@imtbl/blockchain-data': require('path').resolve(__dirname, '../../blockchain-data/sdk/src'), - '@imtbl/generated-clients': require('path').resolve(__dirname, '../../internal/generated-clients/src'), - '@imtbl/x-provider': require('path').resolve(__dirname, '../../x-provider/src'), - }; - - // Add workspace root node_modules to resolution paths so @0xsequence packages can be found - // (pnpm hoists packages to workspace root) - config.resolve.modules = [ - ...(config.resolve.modules || []), - require('path').resolve(__dirname, '../../../node_modules'), - require('path').resolve(__dirname, '../sdk/node_modules'), - require('path').resolve(__dirname, 'node_modules'), - ]; - - // Ensure crypto is properly polyfilled for @0xsequence packages - config.plugins.push( - new webpack.ProvidePlugin({ - Buffer: ['buffer', 'Buffer'], - process: 'process/browser', - }) - ); - - if (!isServer) { - // Ensure these packages are bundled for the client - config.resolve.fallback = { - ...config.resolve.fallback, - fs: false, - net: false, - tls: false, - crypto: require.resolve('crypto-browserify'), - stream: require.resolve('stream-browserify'), - buffer: require.resolve('buffer'), - process: require.resolve('process/browser'), - }; - } - return config; - }, }; module.exports = nextConfig diff --git a/packages/passport/sdk-sample-app/package.json b/packages/passport/sdk-sample-app/package.json index 197391de17..84bde0dbed 100644 --- a/packages/passport/sdk-sample-app/package.json +++ b/packages/passport/sdk-sample-app/package.json @@ -5,7 +5,7 @@ "@biom3/design-tokens": "^0.4.5", "@biom3/react": "^0.29.4", "@imtbl/blockchain-data": "workspace:*", - "@imtbl/config": "file:/Users/natalie/Development/ts-immutable-sdk/packages/config", + "@imtbl/config": "workspace:*", "@imtbl/generated-clients": "workspace:*", "@imtbl/orderbook": "workspace:*", "@imtbl/passport": "workspace:*", @@ -31,13 +31,9 @@ "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", - "buffer": "^5.5.0||^6.0.0", "concurrently": "^8.2.2", - "crypto-browserify": "^3.12.1", "eslint": "^8.40.0", "eslint-config-next": "13.3.1", - "process": "^0.11.10", - "stream-browserify": "^3.0.0", "typescript": "^5.6.2" }, "private": true, diff --git a/packages/passport/sdk-sample-app/src/components/arbone/ArbOneRequest.tsx b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneRequest.tsx index 1c53ebbc89..411d98f8cd 100644 --- a/packages/passport/sdk-sample-app/src/components/arbone/ArbOneRequest.tsx +++ b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneRequest.tsx @@ -179,4 +179,3 @@ function ArbOneRequest({ showModal, setShowModal }: ModalProps) { } 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 index eb109b9fc4..4f0b5d1eaf 100644 --- a/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx +++ b/packages/passport/sdk-sample-app/src/components/arbone/ArbOneWorkflow.tsx @@ -76,4 +76,3 @@ function ArbOneWorkflow() { } 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 0d1b6f7044..9886e540f4 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -186,7 +186,7 @@ const getOrderbookConfig = (environment: EnvironmentNames): ModuleConfiguration< }; const ImmutableContext = createContext<{ - passportClient: Passport | null, + passportClient: Passport, sdkClient: ImmutableX, orderbookClient: Orderbook, blockchainData: BlockchainData, @@ -195,7 +195,7 @@ const ImmutableContext = createContext<{ }>({ sdkClient: new ImmutableX(getSdkConfig(EnvironmentNames.DEV)), orderbookClient: new Orderbook(getOrderbookConfig(EnvironmentNames.DEV)), - passportClient: null, // Initialize as null during SSR + passportClient: new Passport(getPassportConfig(EnvironmentNames.DEV)), environment: EnvironmentNames.DEV, blockchainData: new BlockchainData(getBlockchainDataConfig(EnvironmentNames.DEV)), }); @@ -213,8 +213,8 @@ export function ImmutableProvider({ const [orderbookClient, setOrderbookClient] = useState( useContext(ImmutableContext).orderbookClient, ); - const [passportClient, setPassportClient] = useState( - null, // Start as null for SSR + const [passportClient, setPassportClient] = useState( + useContext(ImmutableContext).passportClient, ); const [blockchainData, setBlockchainData] = useState( @@ -222,18 +222,15 @@ export function ImmutableProvider({ ); useEffect(() => { - // Only initialize Passport on the client side - if (typeof window !== 'undefined') { - const passportInstance = new Passport(getPassportConfig(environment)); - Object.defineProperty(window, 'passport', { - configurable: true, - value: passportInstance, - }); - setSdkClient(new ImmutableX(getSdkConfig(environment))); - setOrderbookClient(new Orderbook(getOrderbookConfig(environment))); - setPassportClient(passportInstance); - setBlockchainData(new BlockchainData(getBlockchainDataConfig(environment))); - } + const passportInstance = new Passport(getPassportConfig(environment)); + Object.defineProperty(window, 'passport', { + configurable: true, + value: passportInstance, + }); + setSdkClient(new ImmutableX(getSdkConfig(environment))); + setOrderbookClient(new Orderbook(getOrderbookConfig(environment))); + setPassportClient(passportInstance); + setBlockchainData(new BlockchainData(getBlockchainDataConfig(environment))); }, [environment]); const providerValues = useMemo(() => ({ diff --git a/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx b/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx index cd960cda2f..01f2670670 100644 --- a/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/PassportProvider.tsx @@ -63,7 +63,6 @@ export function PassportProvider({ const { passportClient } = useImmutableProvider(); const connectImx = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); const provider = await passportClient.connectImx(); @@ -81,7 +80,6 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const connectZkEvm = useCallback(async () => { - if (!passportClient) return; setIsLoading(true); const provider = await passportClient.connectEvm(); if (provider) { @@ -94,7 +92,6 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const connectArbOne = useCallback(async () => { - if (!passportClient) return; setIsLoading(true); const provider = await passportClient.connectEvm({ chain: EvmChain.ARBITRUM_SEPOLIA }); if (provider) { @@ -107,7 +104,6 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const getIdToken = useCallback(async () => { - if (!passportClient) return; setIsLoading(true); const idToken = await passportClient.getIdToken(); addMessage('Get ID token', idToken); @@ -117,7 +113,6 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const getAccessToken = useCallback(async () => { - if (!passportClient) return; setIsLoading(true); const accessToken = await passportClient.getAccessToken(); addMessage('Get Access token', accessToken); @@ -127,7 +122,6 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const getUserInfo = useCallback(async () => { - if (!passportClient) return; setIsLoading(true); const userInfo = await passportClient.getUserInfo(); addMessage('Get User Info', userInfo); @@ -137,7 +131,6 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const getLinkedAddresses = useCallback(async () => { - if (!passportClient) return; setIsLoading(true); const linkedAddresses = await passportClient.getLinkedAddresses(); addMessage('Get Linked Addresses', linkedAddresses); @@ -147,7 +140,6 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const linkWallet = useCallback(async (params: LinkWalletParams) => { - if (!passportClient) return; setIsLoading(true); let linkedWallet; try { @@ -161,7 +153,6 @@ export function PassportProvider({ }, [passportClient, setIsLoading, addMessage]); const logout = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); await passportClient.logout(); @@ -177,7 +168,6 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const popupRedirect = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login(); @@ -191,7 +181,6 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const login = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ useRedirectFlow: true }); @@ -206,7 +195,6 @@ export function PassportProvider({ // Popup redirect methods (provider-specific) const popupRedirectGoogle = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -225,7 +213,6 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const popupRedirectApple = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -244,7 +231,6 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const popupRedirectFacebook = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -264,7 +250,6 @@ export function PassportProvider({ // Login (redirect) methods const loginGoogle = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -284,7 +269,6 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const loginApple = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ @@ -304,7 +288,6 @@ export function PassportProvider({ }, [addMessage, passportClient, setIsLoading]); const loginFacebook = useCallback(async () => { - if (!passportClient) return; try { setIsLoading(true); const userProfile = await passportClient.login({ diff --git a/packages/passport/sdk/src/zkEvm/sendTransaction.ts b/packages/passport/sdk/src/zkEvm/sendTransaction.ts index 2146f35795..60068346bc 100644 --- a/packages/passport/sdk/src/zkEvm/sendTransaction.ts +++ b/packages/passport/sdk/src/zkEvm/sendTransaction.ts @@ -13,6 +13,7 @@ export const sendTransaction = async ({ zkEvmAddress, flow, nonceSpace, + isBackgroundTransaction = false, }: EthSendTransactionParams): Promise => { const transactionRequest = params[0]; @@ -25,6 +26,7 @@ export const sendTransaction = async ({ zkEvmAddress, flow, nonceSpace, + isBackgroundTransaction, }); const { hash } = await pollRelayerTransaction(relayerClient, relayerId, flow); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0a320593d..17b71e2b1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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.10.6 + 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) @@ -2221,8 +2221,8 @@ importers: specifier: workspace:* version: link:../../blockchain-data/sdk '@imtbl/config': - specifier: file:/Users/natalie/Development/ts-immutable-sdk/packages/config - version: file:packages/config + specifier: workspace:* + version: link:../../config '@imtbl/generated-clients': specifier: workspace:* version: link:../../internal/generated-clients @@ -2293,27 +2293,15 @@ importers: '@typescript-eslint/parser': specifier: ^5.57.1 version: 5.62.0(eslint@8.57.0)(typescript@5.6.2) - buffer: - specifier: ^5.5.0||^6.0.0 - version: 6.0.3 concurrently: specifier: ^8.2.2 version: 8.2.2 - crypto-browserify: - specifier: ^3.12.1 - version: 3.12.1 eslint: specifier: ^8.40.0 version: 8.57.0 eslint-config-next: specifier: 13.3.1 version: 13.3.1(eslint@8.57.0)(typescript@5.6.2) - process: - specifier: ^0.11.10 - version: 0.11.10 - stream-browserify: - specifier: ^3.0.0 - version: 3.0.0 typescript: specifier: ^5.6.2 version: 5.6.2 @@ -4463,10 +4451,6 @@ packages: resolution: {integrity: sha512-ctRqrnT4r+5S62IZWqsMAXs1wCf/Ir48k+DrEf6B/VDF5+VZSEVtROrXT4urLuzR9B2VXE4EnnZtNLFpzu3k6w==} engines: {node: '>=20.11.0'} - '@imtbl/config@file:packages/config': - resolution: {directory: packages/config, type: directory} - engines: {node: '>=20.11.0'} - '@imtbl/contracts@2.2.17': resolution: {integrity: sha512-JakmzqU019vo4T52nPQIgXmGM5tlzPO5QRiMKU9xJQVMKPaICTc3UPIFEBfHr/Jq4cj720Dj8YaJ3SgowwO+bg==} @@ -8197,9 +8181,6 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - asn1.js@4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} - asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} @@ -8598,17 +8579,9 @@ packages: browserify-rsa@4.1.0: resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} - browserify-rsa@4.1.1: - resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} - engines: {node: '>= 0.10'} - browserify-sign@4.2.1: resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} - browserify-sign@4.2.5: - resolution: {integrity: sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==} - engines: {node: '>= 0.10'} - browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} @@ -9303,10 +9276,6 @@ packages: crypto-browserify@3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} - crypto-browserify@3.12.1: - resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} - engines: {node: '>= 0.10'} - crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} @@ -11242,18 +11211,10 @@ packages: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} - hash-base@3.0.5: - resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} - engines: {node: '>= 0.10'} - hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} - hash-base@3.1.2: - resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} - engines: {node: '>= 0.8'} - hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} @@ -13784,10 +13745,6 @@ packages: parse-asn1@5.1.6: resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} - parse-asn1@5.1.9: - resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} - engines: {node: '>= 0.10'} - parse-cache-control@1.0.1: resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} @@ -13881,10 +13838,6 @@ packages: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} - pbkdf2@3.1.5: - resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} - engines: {node: '>= 0.10'} - peek-readable@5.1.0: resolution: {integrity: sha512-Tq2I+yoz6Xq3S09E2PyjzOy/oYuNg5v7wyjmrw7OQYSKc7QnDs63q4RXFXraMoI6LZyiEOJ/wDEYzGDPhWwNPA==} engines: {node: '>=14.16'} @@ -15203,10 +15156,6 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - ripemd160@2.0.3: - resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} - engines: {node: '>= 0.8'} - rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true @@ -20476,7 +20425,7 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/bridge-sdk@2.10.6': + '@imtbl/bridge-sdk@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.10.6 '@jest/globals': 29.7.0 @@ -20488,16 +20437,16 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/checkout-sdk@2.10.6': + '@imtbl/checkout-sdk@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/blockchain-data': 2.10.6 - '@imtbl/bridge-sdk': 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 + '@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 - '@imtbl/passport': 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) @@ -20516,10 +20465,6 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/config@file:packages/config': - dependencies: - '@imtbl/metrics': link:packages/internal/metrics - '@imtbl/contracts@2.2.17(bufferutil@4.0.8)(eslint@9.16.0(jiti@1.21.0))(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 @@ -20563,7 +20508,7 @@ snapshots: - typescript - utf-8-validate - '@imtbl/dex-sdk@2.10.6': + '@imtbl/dex-sdk@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.10.6 '@uniswap/sdk-core': 3.2.3 @@ -20609,7 +20554,7 @@ snapshots: - debug - pg-native - '@imtbl/orderbook@2.10.6': + '@imtbl/orderbook@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.10.6 '@imtbl/metrics': 2.10.6 @@ -20623,16 +20568,16 @@ snapshots: - debug - utf-8-validate - '@imtbl/passport@2.10.6': + '@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 - '@imtbl/x-client': 2.10.6 - '@imtbl/x-provider': 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 @@ -20657,17 +20602,17 @@ snapshots: - encoding - supports-color - '@imtbl/sdk@2.10.6': + '@imtbl/sdk@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/blockchain-data': 2.10.6 - '@imtbl/checkout-sdk': 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 - '@imtbl/passport': 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 - '@imtbl/x-provider': 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 @@ -20676,9 +20621,9 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/toolkit@2.10.6': + '@imtbl/toolkit@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/x-client': 2.10.6 + '@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 @@ -20700,7 +20645,7 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/x-client@2.10.6': + '@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.10.6 @@ -20716,12 +20661,12 @@ snapshots: - debug - utf-8-validate - '@imtbl/x-provider@2.10.6': + '@imtbl/x-provider@2.10.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.10.6 '@imtbl/generated-clients': 2.10.6 - '@imtbl/toolkit': 2.10.6 - '@imtbl/x-client': 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 @@ -26060,12 +26005,6 @@ snapshots: asap@2.0.6: {} - asn1.js@4.10.1: - dependencies: - bn.js: 4.12.0 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - asn1.js@5.4.1: dependencies: bn.js: 4.12.0 @@ -26698,12 +26637,6 @@ snapshots: bn.js: 5.2.1 randombytes: 2.1.0 - browserify-rsa@4.1.1: - dependencies: - bn.js: 5.2.2 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - browserify-sign@4.2.1: dependencies: bn.js: 5.2.2 @@ -26716,18 +26649,6 @@ snapshots: readable-stream: 3.6.2 safe-buffer: 5.2.1 - browserify-sign@4.2.5: - dependencies: - bn.js: 5.2.2 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.6.1 - inherits: 2.0.4 - parse-asn1: 5.1.9 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - browserify-zlib@0.2.0: dependencies: pako: 1.0.11 @@ -26871,8 +26792,8 @@ snapshots: call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.0 - get-intrinsic: 1.2.4 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.4: @@ -27525,21 +27446,6 @@ snapshots: randombytes: 2.1.0 randomfill: 1.0.4 - crypto-browserify@3.12.1: - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.5 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - hash-base: 3.0.5 - inherits: 2.0.4 - pbkdf2: 3.1.2 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - crypto-js@4.2.0: {} crypto-random-string@2.0.0: {} @@ -30501,24 +30407,12 @@ snapshots: is-number: 3.0.0 kind-of: 4.0.0 - hash-base@3.0.5: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - hash-base@3.1.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 safe-buffer: 5.2.1 - hash-base@3.1.2: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - to-buffer: 1.2.2 - hash.js@1.1.7: dependencies: inherits: 2.0.4 @@ -34432,14 +34326,6 @@ snapshots: pbkdf2: 3.1.2 safe-buffer: 5.2.1 - parse-asn1@5.1.9: - dependencies: - asn1.js: 4.10.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - pbkdf2: 3.1.5 - safe-buffer: 5.2.1 - parse-cache-control@1.0.1: {} parse-json@4.0.0: @@ -34517,15 +34403,6 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - pbkdf2@3.1.5: - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.3 - safe-buffer: 5.2.1 - sha.js: 2.4.12 - to-buffer: 1.2.2 - peek-readable@5.1.0: {} performance-now@2.1.0: {} @@ -36214,11 +36091,6 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 - ripemd160@2.0.3: - dependencies: - hash-base: 3.1.2 - inherits: 2.0.4 - rlp@2.2.7: dependencies: bn.js: 5.2.2 diff --git a/sdk/src/index.browser.ts b/sdk/src/index.browser.ts index 5955b6651c..9b0f285d2a 100644 --- a/sdk/src/index.browser.ts +++ b/sdk/src/index.browser.ts @@ -1,8 +1,6 @@ export * as config from './config'; export * as blockchainData from './blockchain_data'; -// Passport excluded from IIFE browser bundle due to experimental @0xsequence dependencies -// Use ESM/CJS builds for Passport support -// export * as passport from './passport'; +export * as passport from './passport'; export * as orderbook from './orderbook'; export * as checkout from './checkout'; export * as x from './x'; From 73b23373e3c5826318cebaf1544b9c975159092c Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Fri, 5 Dec 2025 17:34:35 +1300 Subject: [PATCH 06/10] feat: move guest module payload construction to backend --- packages/passport/sdk/package.json | 10 +- .../sdk/src/sequence/sendTransaction.ts | 3 - .../sdk/src/sequence/sequenceProvider.ts | 4 +- .../sdk/src/sequence/transactionHelpers.ts | 206 ++------ pnpm-lock.yaml | 443 ++++++------------ 5 files changed, 205 insertions(+), 461 deletions(-) diff --git a/packages/passport/sdk/package.json b/packages/passport/sdk/package.json index 241630dc33..e19c44d8b0 100644 --- a/packages/passport/sdk/package.json +++ b/packages/passport/sdk/package.json @@ -7,12 +7,12 @@ "dependencies": { "@0xsequence/abi": "2.3.34", "@0xsequence/core": "2.3.34", - "@0xsequence/identity-instrument": "3.0.0-beta.1", + "@0xsequence/identity-instrument": "3.0.0-beta.4", "@0xsequence/network": "^2.3.35", - "@0xsequence/wallet-wdk": "3.0.0-beta.1", - "@0xsequence/relayer": "3.0.0-beta.1", - "@0xsequence/wallet-core": "3.0.0-beta.1", - "@0xsequence/wallet-primitives": "3.0.0-beta.1", + "@0xsequence/wallet-wdk": "3.0.0-beta.4", + "@0xsequence/relayer": "3.0.0-beta.4", + "@0xsequence/wallet-core": "3.0.0-beta.4", + "@0xsequence/wallet-primitives": "3.0.0-beta.4", "@imtbl/config": "workspace:*", "@imtbl/generated-clients": "workspace:*", "@imtbl/metrics": "workspace:*", diff --git a/packages/passport/sdk/src/sequence/sendTransaction.ts b/packages/passport/sdk/src/sequence/sendTransaction.ts index 43b350d991..4db308fc2b 100644 --- a/packages/passport/sdk/src/sequence/sendTransaction.ts +++ b/packages/passport/sdk/src/sequence/sendTransaction.ts @@ -15,7 +15,6 @@ export const sendTransaction = async ({ flow, authManager, chain, - multiRollupApiClients, }: EthSendTransactionParams): Promise => { const transactionRequest = params[0]; @@ -27,10 +26,8 @@ export const sendTransaction = async ({ walletAddress, flow, authManager, - multiRollupApiClients, }); const txHash = await relayerClient.postToRelayer(chain, to, data, flow); return txHash; }; - diff --git a/packages/passport/sdk/src/sequence/sequenceProvider.ts b/packages/passport/sdk/src/sequence/sequenceProvider.ts index 0e2e5872fe..e5b35ad0af 100644 --- a/packages/passport/sdk/src/sequence/sequenceProvider.ts +++ b/packages/passport/sdk/src/sequence/sequenceProvider.ts @@ -1,4 +1,4 @@ -import { JsonRpcProvider } from 'ethers'; +import { Provider as OxProvider, RpcTransport } from 'ox'; import { Provider, ProviderEvent, @@ -22,7 +22,6 @@ import { registerUser } from './user'; import { MultiRollupApiClients } from '@imtbl/generated-clients'; import { SequenceSigner } from './index'; import { getChainConfig } from './chainConfig'; -import { Provider as OxProvider, RpcTransport } from 'ox'; export type SequenceProviderInput = { authManager: AuthManager; @@ -195,7 +194,6 @@ export class SequenceProvider implements Provider { flow, authManager: this.#authManager, chain: this.#chain, - multiRollupApiClients: this.#multiRollupApiClients, }); } catch (error) { if (error instanceof Error) { diff --git a/packages/passport/sdk/src/sequence/transactionHelpers.ts b/packages/passport/sdk/src/sequence/transactionHelpers.ts index 1dfca4fc15..bfbd3e189a 100644 --- a/packages/passport/sdk/src/sequence/transactionHelpers.ts +++ b/packages/passport/sdk/src/sequence/transactionHelpers.ts @@ -1,18 +1,15 @@ import { Flow } from '@imtbl/metrics'; import { TransactionRequest } from 'ethers'; -import { isWalletDeployed } from './walletHelpers'; +import { Address, Bytes, Hex, AbiFunction, Provider } from 'ox'; +import { getEip155ChainId, isWalletDeployed } from './walletHelpers'; import { JsonRpcError, ProviderErrorCode, RpcErrorCode } from '../zkEvm/JsonRpcError'; import SequenceSigner from './sequenceSigner'; -import { Address, Bytes, Hex, Abi, AbiFunction, Provider, Hash, RpcTransport } from 'ox'; -import { Payload, Config, Signature, Erc6492, Constants, Context } from '@0xsequence/wallet-primitives'; -import { Envelope, Signers, State, Wallet } from '@0xsequence/wallet-core'; +import { Payload, Config, Signature, Constants, Context } from '@0xsequence/wallet-primitives'; +import { Envelope, Wallet } from '@0xsequence/wallet-core'; import { SequenceRelayerClient } from './sequenceRelayerClient'; import AuthManager from '../authManager'; -import { MultiRollupApiClients } from '@imtbl/generated-clients'; import { createStateProvider, saveWalletConfig, SEQUENCE_CONTEXT } from './signer/signerHelpers'; -const UPDATE_IMAGE_HASH = Abi.from(['function updateImageHash(bytes32 _imageHash) external'])[0]; - export type TransactionParams = { sequenceSigner: SequenceSigner; rpcProvider: Provider.Provider; @@ -21,7 +18,6 @@ export type TransactionParams = { flow: Flow; authManager: AuthManager; nonceSpace?: bigint; - multiRollupApiClients: MultiRollupApiClients; }; /** @@ -34,60 +30,52 @@ const deployBootstrapAndExecute = async ( rpcProvider: Provider.Provider, walletAddress: Address.Address, wallet: Wallet, - stateProvider: State.Provider, chainId: string, flow: Flow, - multiRollupApiClients: MultiRollupApiClients, + authManager: AuthManager, ): Promise<{ to: Address.Address; signedTransaction: Hex.Hex; }> => { flow.addEvent('startDeployBootstrapAndExecute'); - - // Get deployment info - const deployInfo = await stateProvider.getDeploy(Address.from(walletAddress)); - if (!deployInfo) { - throw new Error(`Cannot find deploy information for wallet ${walletAddress}`); + + const user = await authManager.getUser(); + if (!user?.accessToken) { + throw new JsonRpcError( + ProviderErrorCode.UNAUTHORIZED, + 'No access token found', + ); } - - // Build deploy call - const deployTx = Erc6492.deploy(deployInfo.imageHash, deployInfo.context); - const deployCall: Payload.Call = { - to: deployTx.to, - value: 0n, - data: deployTx.data, - gasLimit: 0n, - delegateCall: false, - onlyFallback: false, - behaviorOnError: 'revert', - }; - flow.addEvent('endDeployBootstrapAndExecute'); + const userTransction = await buildUserTransactionCall(walletAddress, transactionRequest, wallet, rpcProvider, sequenceSigner, chainId, flow); - // Build updateImageHash and user transaction calls in parallel - const [updateImageHashCall, userTransactionCall] = await Promise.all([ - buildUpdateImageHashCall(walletAddress, sequenceSigner, Number(chainId), flow), - buildUserTransactionCall(walletAddress, transactionRequest, wallet, rpcProvider, sequenceSigner, chainId, flow), - ]); - - // Build Guest Module multicall: deploy + updateImageHash + user tx - const signedTransaction = Bytes.toHex( - Payload.encode({ - type: 'call', - space: 0n, - nonce: 0n, - calls: [deployCall, updateImageHashCall, userTransactionCall], - }) - ); + 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({ + wallet_address: walletAddress, + user_eoa: await sequenceSigner.getAddress(), + chain_id: getEip155ChainId(Number(chainId)), + user_execute_data: userTransction.data, + }), + }); + + if (!response.ok) { + throw new Error(`Failed to build guest module calldata: ${response.statusText}`); + } + + const result = await response.json(); flow.addEvent('endBuildGuestModuleMulticall'); - - return { to: wallet.guest, signedTransaction }; + + return { to: result.to, signedTransaction: result.data }; }; -const createWalletAndStateProvider = async ( +const createWallet = async ( authManager: AuthManager, walletAddress: Address.Address, sequenceSigner: SequenceSigner, - multiRollupApiClients: MultiRollupApiClients -): Promise<{ wallet: Wallet; stateProvider: State.Provider; }> => { +): Promise => { const user = await authManager.getUser(); if (!user?.accessToken) { throw new JsonRpcError( @@ -95,7 +83,7 @@ const createWalletAndStateProvider = async ( 'No access token found', ); } - const deploymentSalt = await fetchDeploymentSalt(user.accessToken, multiRollupApiClients); + const deploymentSalt = await fetchDeploymentSalt(user.accessToken); const walletConfig = await sequenceSigner.getWalletConfig(); const realImageHash = Bytes.toHex(Config.hashConfiguration(walletConfig)); @@ -106,7 +94,7 @@ const createWalletAndStateProvider = async ( }); await saveWalletConfig(walletConfig, stateProvider); - return { wallet: wallet, stateProvider: stateProvider }; + return wallet; }; export const prepareAndSignTransaction = async ({ @@ -117,7 +105,6 @@ export const prepareAndSignTransaction = async ({ walletAddress, flow, authManager, - multiRollupApiClients, }: TransactionParams & { transactionRequest: TransactionRequest }): Promise<{ to: Address.Address; data: Hex.Hex; }> => { if (!transactionRequest.to) { throw new JsonRpcError( @@ -128,7 +115,7 @@ export const prepareAndSignTransaction = async ({ const chainId = await rpcProvider.request({ method: 'eth_chainId' }); - const { wallet, stateProvider } = await createWalletAndStateProvider(authManager, Address.from(walletAddress), sequenceSigner, multiRollupApiClients); + const wallet = await createWallet(authManager, Address.from(walletAddress), sequenceSigner); const deployed = await isWalletDeployed(rpcProvider, walletAddress); if (!deployed) { @@ -138,10 +125,9 @@ export const prepareAndSignTransaction = async ({ rpcProvider, Address.from(walletAddress), wallet, - stateProvider, Number(chainId).toString(), flow, - multiRollupApiClients + authManager, ); flow.addEvent('endPrepareDeployBootstrapExecuteTransaction'); return { to: result.to, data: result.signedTransaction }; @@ -162,7 +148,6 @@ export const prepareAndSignTransaction = async ({ const envelope = await wallet.prepareTransaction(rpcProvider as any, [tx]); const signature = await sequenceSigner.signPayload(Address.from(walletAddress), Number(chainId), envelope.payload); - console.log(`sig = ${signature}`); const signedEnvelope = Envelope.toSigned(envelope, [ { address: Address.from(await sequenceSigner.getAddress()), @@ -175,102 +160,6 @@ export const prepareAndSignTransaction = async ({ return { to: to, data: data }; }; -/** - * Build and sign updateImageHash call (nonce 0) - */ -const buildUpdateImageHashCall = async ( - walletAddress: string, - sequenceSigner: SequenceSigner, - chainId: number, - flow: Flow, -): Promise => { - flow.addEvent('startBuildUpdateImageHashCall'); - - const signerAddress = await sequenceSigner.getAddress(); - const topology: Config.Topology = { - type: "signer", - address: Address.from(signerAddress), - weight: 1n, - }; - - const walletConfig: Config.Config = { - threshold: 1n, - checkpoint: 0n, - topology: topology, - }; - - const imageHash = Bytes.toHex(Config.hashConfiguration(walletConfig)); - - const updateImageHashTx: Payload.Call = { - to: Address.from(walletAddress), - value: 0n, - data: AbiFunction.encodeData(UPDATE_IMAGE_HASH, [imageHash]), - gasLimit: 0n, - delegateCall: false, - onlyFallback: false, - behaviorOnError: 'revert', - }; - - const payload: Payload.Calls = { - type: 'call', - space: 0n, - nonce: 0n, - calls: [updateImageHashTx], - }; - - const bootstrapConfig: Config.Config = { - threshold: 1n, - checkpoint: 0n, - topology: { - type: 'signer', - address: Address.from("IMMUTABLE_SIGNER_ADDRESS"), - weight: 1n, - }, - }; - - const bootstrapEnvelope: Envelope.Envelope = { - wallet: Address.from(walletAddress), - payload: payload, - chainId: chainId, - configuration: bootstrapConfig, - }; - - const immutableSigner = new Signers.Pk.Pk('IMMUTABLE_SIGNER_ADDRESS_PK' as `0x${string}`); - const bootstrapSignature = await immutableSigner.sign(Address.from(walletAddress), chainId, payload); - - const signedBootstrapEnvelope = Envelope.toSigned(bootstrapEnvelope, [ - { - address: Address.from(immutableSigner.address), - signature: bootstrapSignature, - }, - ]); - - const bootstrapRawSig = Envelope.encodeSignature(signedBootstrapEnvelope); - const bootstrapEncodedSig = Bytes.toHex( - Signature.encodeSignature({ - ...bootstrapRawSig, - suffix: [], - }) - ); - - const updateImageHashCall: Payload.Call = { - to: Address.from(walletAddress), - value: 0n, - data: AbiFunction.encodeData(Constants.EXECUTE, [ - Bytes.toHex(Payload.encode(payload)), - bootstrapEncodedSig, - ]), - gasLimit: 0n, - delegateCall: false, - onlyFallback: false, - behaviorOnError: 'revert', - }; - - flow.addEvent('endBuildUpdateImageHashCall'); - - return updateImageHashCall; -} - /** * Build and sign user transaction call (nonce 1) */ @@ -282,7 +171,7 @@ const buildUserTransactionCall = async ( sequenceSigner: SequenceSigner, chainId: string, flow: Flow, -): Promise => { +): Promise => { flow.addEvent('startBuildUserTransactionCall'); const userTx: Payload.Call = { @@ -296,7 +185,7 @@ const buildUserTransactionCall = async ( }; const envelope = await wallet.prepareTransaction(rpcProvider as any, [userTx], { noConfigUpdate: true }); - + // Adjust nonce to 1 for user transaction (bootstrap transaction uses nonce 0) const userEnvelope = { ...envelope, @@ -305,7 +194,7 @@ const buildUserTransactionCall = async ( nonce: 1n, }, }; - + // Sign user transaction const userSignature = await sequenceSigner.signPayload(Address.from(walletAddress), Number(chainId), userEnvelope.payload); @@ -345,14 +234,12 @@ const buildUserTransactionCall = async ( flow.addEvent('endBuildUserTransactionCall'); return userTransactionCall; -} +}; -// TODO replace this with multi-rollup api client async function fetchDeploymentSalt( - accessToken: string, - multiRollupApiClients: MultiRollupApiClients, + accessToken: string ): Promise { - const apiUrl = `http://localhost:8071/v2/passport/counterfactual-salt`; + const apiUrl = 'http://localhost:8071/v2/passport/counterfactual-salt'; const response = await fetch(apiUrl, { method: 'GET', @@ -369,4 +256,3 @@ async function fetchDeploymentSalt( const data = await response.json(); return data.salt; } - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17b71e2b1c..4e7c7aa5c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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.39.3(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.39.3(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 @@ -1196,7 +1196,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1362,7 +1362,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1374,7 +1374,7 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2076,23 +2076,23 @@ importers: specifier: 2.3.34 version: 2.3.34(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) '@0xsequence/identity-instrument': - specifier: 3.0.0-beta.1 - version: 3.0.0-beta.1(typescript@5.6.2) + specifier: 3.0.0-beta.4 + version: 3.0.0-beta.4(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.1 - version: 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + specifier: 3.0.0-beta.4 + version: 3.0.0-beta.4(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) '@0xsequence/wallet-core': - specifier: 3.0.0-beta.1 - version: 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + specifier: 3.0.0-beta.4 + version: 3.0.0-beta.4(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) '@0xsequence/wallet-primitives': - specifier: 3.0.0-beta.1 - version: 3.0.0-beta.1(typescript@5.6.2) + specifier: 3.0.0-beta.4 + version: 3.0.0-beta.4(typescript@5.6.2) '@0xsequence/wallet-wdk': - specifier: 3.0.0-beta.1 - version: 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + specifier: 3.0.0-beta.4 + version: 3.0.0-beta.4(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) '@imtbl/config': specifier: workspace:* version: link:../../config @@ -2721,11 +2721,11 @@ packages: peerDependencies: ethers: '>=6' - '@0xsequence/guard@3.0.0-beta.2': - resolution: {integrity: sha512-Uj5I8rBPyOzyCKxqg9jdEWr8Jcuwxg+dCOmU3ZXEWtXqqtq8f9gxKqdfjXkMPvDZRPZ+ReDYXyUzpFJRUX5otw==} + '@0xsequence/guard@3.0.0-beta.4': + resolution: {integrity: sha512-iCwnVVP8dALFEqz+3vuf/Bi1Z1oq3UcPZraMiqE+pGTDwruhpOfwmrY0NTk30VSg7oJK1yVWvTIx+YYPD+r6lA==} - '@0xsequence/identity-instrument@3.0.0-beta.1': - resolution: {integrity: sha512-nr2IeIXmaM4jOLB7umHxIDLyKOVlrX8o6y1v1FLW5rxCb3Ex218XhSNzC/fHxaZf2NzxvZ8FihIvHAyBDwLdbw==} + '@0xsequence/identity-instrument@3.0.0-beta.4': + resolution: {integrity: sha512-BXaUgm3C+lxMYBuacYQISKmYQ1s9lUWQHOEWMvX6WwekZTy84902TPgNTDuJFqw0FdNNmPGyALEbDNcM3wu+BQ==} '@0xsequence/indexer@2.3.35': resolution: {integrity: sha512-zqjGRzRzFWC8jf26WsagHz0zPP6V8ieAUBDrEKItPb0rgzNX+KiMl6wMZXW/zQp+DGuCfvFfeL0NSALmFxmjRg==} @@ -2740,8 +2740,8 @@ packages: peerDependencies: ethers: '>=6' - '@0xsequence/relayer@3.0.0-beta.1': - resolution: {integrity: sha512-xgzRjGTqusmv2dVjYnpXdsT1pmbap1770PGSgpdXX/Lo+PEMVhHGbm+mP6STIDhOJhKHGMCYxrELClnavwpJIA==} + '@0xsequence/relayer@3.0.0-beta.4': + resolution: {integrity: sha512-xNyesEGZ+Hfj9nzP1VyM3f1qVRo/44NM+/r/b1sgWw6SgSmU8gXAY80fo6oyVt25m8SIq4zmjyQhmBHQOj5TVA==} '@0xsequence/tee-verifier@0.1.2': resolution: {integrity: sha512-7sKr8/T4newknx6LAukjlRI3siGiGhBnZohz2Z3jX0zb0EBQdKUq0L//A7CPSckHFPxTg/QvQU2v8e9x9GfkDw==} @@ -2756,14 +2756,14 @@ packages: peerDependencies: ethers: '>=6' - '@0xsequence/wallet-core@3.0.0-beta.1': - resolution: {integrity: sha512-XNIXy+OeLaV7wMBYL9ihMMuwbAeGjbqfct2gd878vUOkPXsXYmKakN8Km62va+sLgzL7PJZF/JPqy+fjiy4YFQ==} + '@0xsequence/wallet-core@3.0.0-beta.4': + resolution: {integrity: sha512-7jH3KcfuaEwDD1lcTnczmkuqZa48q2rKsrYSYtJsH+6RwQNXlGRTRIaafwd3A3HEcrUTSL1xDTRBhscTVeOIaQ==} - '@0xsequence/wallet-primitives@3.0.0-beta.1': - resolution: {integrity: sha512-9zjToPzOwX470usNirrCc6JNL4wjIGV2JjbjFaqHMxbdqapihsAYKAgcI0OBVM2YoNSMn2Wx70eqCY0VS/KeOw==} + '@0xsequence/wallet-primitives@3.0.0-beta.4': + resolution: {integrity: sha512-RfRf6GlxU+QvHeAPEHq+Z961ayEm0TmAdaI9R9pmrj5YsR/ZPqb+XsARC3OlB5dnwiOCwjZQpVyA3wqgI8XCRQ==} - '@0xsequence/wallet-wdk@3.0.0-beta.1': - resolution: {integrity: sha512-+pgtOpJwAerXImouZFwEbSus4s0ZwKrT+uwtuGIrNlNNiqbikaag0QniCgOPbE0r0ePxE9Vd0jAoaZGrzRfesA==} + '@0xsequence/wallet-wdk@3.0.0-beta.4': + resolution: {integrity: sha512-JIZj2GO3eOZRfodfLbYLA3rb+qCRkIOVEvjx0H/y1Yfr3+vkYSyIZmYLH4+FBwfgLNnD4DLFu7goAjYhOsoW4A==} '@0xsquid/sdk@2.8.25': resolution: {integrity: sha512-fSMKVdKIX8G3qFpoTf3WfcyjhGdc9hE0uSu1bs1gsh4+iG19ILguDdrY8g87dUknt9PCKBb6TIt1QeYEgbXjdA==} @@ -11461,6 +11461,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'} @@ -13638,16 +13641,16 @@ packages: outvariant@1.4.0: resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} - ox@0.7.2: - resolution: {integrity: sha512-JJHxdef3KqwQ8xW9H+UVLWaQiCUh/DeFN/Ii65XwbHTvSuXZveihTV2gs9hhLw5XEWPBrcH7sQBM0rqG7/QurQ==} + ox@0.9.14: + resolution: {integrity: sha512-lxZYCzGH00WtIPPrqXCrbSW/ZiKjigfII6R0Vu1eH2GpobmcwVheiivbCvsBZzmVZcNpwkabSamPP+ZNtdnKIQ==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - ox@0.9.14: - resolution: {integrity: sha512-lxZYCzGH00WtIPPrqXCrbSW/ZiKjigfII6R0Vu1eH2GpobmcwVheiivbCvsBZzmVZcNpwkabSamPP+ZNtdnKIQ==} + ox@0.9.17: + resolution: {integrity: sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -16807,8 +16810,8 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true uuid@8.3.2: @@ -16873,6 +16876,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: @@ -17426,18 +17437,18 @@ snapshots: '@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.2(typescript@5.6.2)': + '@0xsequence/guard@3.0.0-beta.4(typescript@5.6.2)': dependencies: - ox: 0.7.2(typescript@5.6.2) + ox: 0.9.17(typescript@5.6.2) transitivePeerDependencies: - typescript - zod - '@0xsequence/identity-instrument@3.0.0-beta.1(typescript@5.6.2)': + '@0xsequence/identity-instrument@3.0.0-beta.4(typescript@5.6.2)': dependencies: json-canonicalize: 2.0.0 jwt-decode: 4.0.0 - ox: 0.7.2(typescript@5.6.2) + ox: 0.9.17(typescript@5.6.2) transitivePeerDependencies: - typescript - zod @@ -17459,12 +17470,12 @@ snapshots: '@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.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': + '@0xsequence/relayer@3.0.0-beta.4(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: - '@0xsequence/wallet-primitives': 3.0.0-beta.1(typescript@5.6.2) + '@0xsequence/wallet-primitives': 3.0.0-beta.4(typescript@5.6.2) mipd: 0.0.7(typescript@5.6.2) - ox: 0.7.2(typescript@5.6.2) - viem: 2.39.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + 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 @@ -17486,39 +17497,39 @@ snapshots: 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.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': + '@0xsequence/wallet-core@3.0.0-beta.4(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: - '@0xsequence/guard': 3.0.0-beta.2(typescript@5.6.2) - '@0xsequence/relayer': 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) - '@0xsequence/wallet-primitives': 3.0.0-beta.1(typescript@5.6.2) + '@0xsequence/guard': 3.0.0-beta.4(typescript@5.6.2) + '@0xsequence/relayer': 3.0.0-beta.4(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': 3.0.0-beta.4(typescript@5.6.2) mipd: 0.0.7(typescript@5.6.2) - ox: 0.7.2(typescript@5.6.2) - viem: 2.39.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + 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.1(typescript@5.6.2)': + '@0xsequence/wallet-primitives@3.0.0-beta.4(typescript@5.6.2)': dependencies: - ox: 0.7.2(typescript@5.6.2) + ox: 0.9.17(typescript@5.6.2) transitivePeerDependencies: - typescript - zod - '@0xsequence/wallet-wdk@3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': + '@0xsequence/wallet-wdk@3.0.0-beta.4(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: - '@0xsequence/guard': 3.0.0-beta.2(typescript@5.6.2) - '@0xsequence/identity-instrument': 3.0.0-beta.1(typescript@5.6.2) - '@0xsequence/relayer': 3.0.0-beta.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/guard': 3.0.0-beta.4(typescript@5.6.2) + '@0xsequence/identity-instrument': 3.0.0-beta.4(typescript@5.6.2) + '@0xsequence/relayer': 3.0.0-beta.4(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.1(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) - '@0xsequence/wallet-primitives': 3.0.0-beta.1(typescript@5.6.2) - idb: 7.1.1 + '@0xsequence/wallet-core': 3.0.0-beta.4(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': 3.0.0-beta.4(typescript@5.6.2) + idb: 8.0.3 jwt-decode: 4.0.0 - ox: 0.7.2(typescript@5.6.2) - uuid: 11.1.0 + ox: 0.9.17(typescript@5.6.2) + uuid: 13.0.0 transitivePeerDependencies: - bufferutil - typescript @@ -24957,25 +24968,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - debug: 4.3.7(supports-color@8.1.1) - eslint: 9.16.0(jiti@1.21.0) - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -25198,17 +25190,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.39.3(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.39.3(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.39.3(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.39.3(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: @@ -25235,11 +25227,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.39.3(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.39.3(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 @@ -26195,6 +26187,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.26.9) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 @@ -26395,6 +26401,13 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.10) + babel-preset-jest@29.6.3(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) + optional: true + babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.26.9 @@ -28458,45 +28471,18 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) - '@rushstack/eslint-patch': 1.10.4 - '@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) - babel-preset-react-app: 10.0.1 - confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) - eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.35.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-jest: 25.7.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))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) @@ -28512,23 +28498,23 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@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) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 9.16.0(jiti@1.21.0) - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-testing-library: 5.11.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -28605,16 +28591,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): dependencies: debug: 3.2.7 @@ -28625,14 +28601,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0): - dependencies: - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - eslint: 8.57.0 - lodash: 4.17.21 - string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) @@ -28641,11 +28609,11 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) - eslint: 9.16.0(jiti@1.21.0) + eslint: 8.57.0 lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -28676,33 +28644,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)) - hasown: 2.0.2 - is-core-module: 2.15.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): dependencies: array-includes: 3.1.8 @@ -28752,17 +28693,6 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - transitivePeerDependencies: - - supports-color - - typescript - eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -30691,6 +30621,8 @@ snapshots: idb@7.1.1: {} + idb@8.0.3: {} + identity-obj-proxy@3.0.0: dependencies: harmony-reflect: 1.6.2 @@ -34170,11 +34102,11 @@ snapshots: outvariant@1.4.0: {} - ox@0.7.2(typescript@5.6.2): + ox@0.9.14(typescript@5.6.2): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.7 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 @@ -34185,7 +34117,7 @@ snapshots: transitivePeerDependencies: - zod - ox@0.9.14(typescript@5.6.2): + ox@0.9.17(typescript@5.6.2): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -35547,92 +35479,6 @@ snapshots: '@remix-run/router': 1.7.2 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): - dependencies: - '@babel/core': 7.26.9 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.26.9) - babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) - babel-preset-react-app: 10.0.1 - bfj: 7.0.2 - browserslist: 4.23.3 - camelcase: 6.3.0 - case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss: 8.4.49 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) - postcss-preset-env: 7.8.3(postcss@8.4.49) - prompts: 2.4.2 - react: 18.3.1 - react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - react-refresh: 0.11.0 - resolve: 1.22.8 - resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - optionalDependencies: - fsevents: 2.3.3 - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - '@parcel/css' - - '@swc/core' - - '@types/babel__core' - - '@types/webpack' - - bufferutil - - canvas - - clean-css - - csso - - debug - - esbuild - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - fibers - - node-notifier - - node-sass - - rework - - rework-visit - - sass - - sass-embedded - - sockjs-client - - supports-color - - ts-node - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-hot-middleware - - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 @@ -35719,7 +35565,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35736,9 +35582,9 @@ snapshots: css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + eslint: 8.57.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35755,7 +35601,7 @@ snapshots: prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 @@ -37555,12 +37401,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37575,12 +37421,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37595,12 +37441,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37615,12 +37461,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37629,10 +37475,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.9 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) + babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.23.1 ts-mockito@2.6.1: @@ -38172,7 +38018,7 @@ snapshots: utils-merge@1.0.1: {} - uuid@11.1.0: {} + uuid@13.0.0: {} uuid@8.3.2: {} @@ -38250,6 +38096,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) @@ -38289,14 +38152,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.39.3(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.39.3(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.39.3(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.39.3(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.39.3(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: From c9e8d65de2ee3ebb938d8492ff2cc25fedbc9e1a Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Tue, 9 Dec 2025 13:40:48 +1300 Subject: [PATCH 07/10] feat: 2x2 wallet config --- .../generated-clients/src/config/config.ts | 2 +- .../src/context/ImmutableProvider.tsx | 4 +- packages/passport/sdk/src/Passport.ts | 1 + packages/passport/sdk/src/config/config.ts | 2 +- .../sdk/src/sequence/sendTransaction.ts | 2 + .../sdk/src/sequence/sequenceProvider.ts | 24 ++++ .../sdk/src/sequence/sequenceSigner.ts | 12 +- .../sdk/src/sequence/signer/ISigner.ts | 3 +- .../signer/identityInstrumentSigner.ts | 22 +--- .../src/sequence/signer/privateKeySigner.ts | 16 +-- .../sdk/src/sequence/signer/signerHelpers.ts | 35 +++-- .../sdk/src/sequence/transactionHelpers.ts | 122 ++++++++++-------- .../sdk/src/zkEvm/transactionHelpers.ts | 18 +-- .../passport/sdk/src/zkEvm/zkEvmProvider.ts | 31 +++-- 14 files changed, 168 insertions(+), 126 deletions(-) diff --git a/packages/internal/generated-clients/src/config/config.ts b/packages/internal/generated-clients/src/config/config.ts index 5bd9e362a4..20bab0cf07 100644 --- a/packages/internal/generated-clients/src/config/config.ts +++ b/packages/internal/generated-clients/src/config/config.ts @@ -78,7 +78,7 @@ export const multiRollupConfig = { basePath: 'https://api.sandbox.immutable.com', }), passport: createConfig({ - basePath: 'http://localhost:8071', + basePath: 'http://localhost:8072', }), }), }; diff --git a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx index 9886e540f4..38c8ae30c9 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -136,10 +136,10 @@ const getPassportConfig = (environment: EnvironmentNames): PassportModuleConfigu })), immutableXClient: new IMXClient(getSdkConfig(EnvironmentNames.DEV)), zkEvmRpcUrl: 'https://rpc.dev.immutable.com', - relayerUrl: 'http://localhost:8070/relayer-mr', + relayerUrl: 'http://localhost:8073/relayer-mr', indexerMrBasePath: 'https://api.dev.immutable.com', orderBookMrBasePath: 'https://api.dev.immutable.com', - passportMrBasePath: 'http://localhost:8071', + passportMrBasePath: 'http://localhost:8072', sequenceIdentityInstrumentEndpoint: 'https://next-identity.sequence-dev.app/', sequenceProjectAccessKey: 'AQAAAAAAAAB5QznGqk9paa4EQjom09ERpJs', }, diff --git a/packages/passport/sdk/src/Passport.ts b/packages/passport/sdk/src/Passport.ts index 4a8479ae87..831fdccedd 100644 --- a/packages/passport/sdk/src/Passport.ts +++ b/packages/passport/sdk/src/Passport.ts @@ -198,6 +198,7 @@ export class Passport { authManager: this.authManager, config: this.config, multiRollupApiClients: this.multiRollupApiClients, + guardianClient: this.guardianClient, ethSigner: this.sequenceSigner, user, chain, diff --git a/packages/passport/sdk/src/config/config.ts b/packages/passport/sdk/src/config/config.ts index 9354895979..add39a5019 100644 --- a/packages/passport/sdk/src/config/config.ts +++ b/packages/passport/sdk/src/config/config.ts @@ -144,7 +144,7 @@ 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 = 'http://localhost:8070/relayer-mr'; + this.relayerUrl = 'http://localhost:8073/relayer-mr'; this.sequenceIdentityInstrumentEndpoint = 'https://next-identity.sequence-dev.app/'; this.sequenceProjectAccessKey = 'AQAAAAAAAAB5QznGqk9paa4EQjom09ERpJs'; this.multiRollupConfig = multiRollupConfig.getSandbox(); diff --git a/packages/passport/sdk/src/sequence/sendTransaction.ts b/packages/passport/sdk/src/sequence/sendTransaction.ts index 4db308fc2b..3aa9cf8c61 100644 --- a/packages/passport/sdk/src/sequence/sendTransaction.ts +++ b/packages/passport/sdk/src/sequence/sendTransaction.ts @@ -11,6 +11,7 @@ export const sendTransaction = async ({ sequenceSigner, rpcProvider, relayerClient, + guardianClient, walletAddress, flow, authManager, @@ -23,6 +24,7 @@ export const sendTransaction = async ({ sequenceSigner, rpcProvider, relayerClient, + guardianClient, walletAddress, flow, authManager, diff --git a/packages/passport/sdk/src/sequence/sequenceProvider.ts b/packages/passport/sdk/src/sequence/sequenceProvider.ts index e5b35ad0af..30275b830f 100644 --- a/packages/passport/sdk/src/sequence/sequenceProvider.ts +++ b/packages/passport/sdk/src/sequence/sequenceProvider.ts @@ -22,12 +22,14 @@ import { registerUser } from './user'; import { MultiRollupApiClients } from '@imtbl/generated-clients'; import { SequenceSigner } from './index'; import { getChainConfig } from './chainConfig'; +import GuardianClient from '../guardian'; export type SequenceProviderInput = { authManager: AuthManager; config: PassportConfiguration; multiRollupApiClients: MultiRollupApiClients; passportEventEmitter: TypedEventEmitter; + guardianClient: GuardianClient; ethSigner: SequenceSigner; user: User | null; chain: Exclude; @@ -52,6 +54,8 @@ export class SequenceProvider implements Provider { readonly #passportEventEmitter: TypedEventEmitter; + readonly #guardianClient: GuardianClient; + readonly #rpcProvider: OxProvider.Provider; readonly #multiRollupApiClients: MultiRollupApiClients; @@ -72,12 +76,14 @@ export class SequenceProvider implements Provider { 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; @@ -115,6 +121,9 @@ export class SequenceProvider implements Provider { async #performRequest(request: RequestArguments): Promise { switch (request.method) { case 'eth_requestAccounts': { + const signerAddress = await this.#ethSigner.getAddress(); + console.log(`sequence signerAddress = ${signerAddress}`); + const walletAddress = await this.#getWalletAddress(); if (walletAddress) return [walletAddress]; @@ -190,11 +199,26 @@ export class SequenceProvider implements Provider { sequenceSigner: this.#ethSigner, rpcProvider: this.#rpcProvider, relayerClient: this.#relayerClient, + guardianClient: this.#guardianClient, walletAddress, flow, authManager: this.#authManager, chain: this.#chain, }); + // return await this.#guardianClient.withConfirmationScreen({ + // width: 480, + // height: 720, + // })(async () => await sendTransaction({ + // params: request.params || [], + // sequenceSigner: this.#ethSigner, + // rpcProvider: this.#rpcProvider, + // relayerClient: this.#relayerClient, + // guardianClient: this.#guardianClient, + // walletAddress, + // flow, + // authManager: this.#authManager, + // chain: this.#chain, + // })); } catch (error) { if (error instanceof Error) { trackError('passport', `ethSendTransaction_${this.#chain}`, error, { flowId: flow.details.flowId }); diff --git a/packages/passport/sdk/src/sequence/sequenceSigner.ts b/packages/passport/sdk/src/sequence/sequenceSigner.ts index 4f9b88c12f..3885fd78d7 100644 --- a/packages/passport/sdk/src/sequence/sequenceSigner.ts +++ b/packages/passport/sdk/src/sequence/sequenceSigner.ts @@ -12,8 +12,8 @@ import { PrivateKeySigner } from './signer/privateKeySigner'; import { Address } from 'ox'; export default class SequenceSigner implements ISigner { - private readonly identityInstrumentSigner: ISigner; - private readonly privateKeySigner: ISigner; + private readonly identityInstrumentSigner: IdentityInstrumentSigner; + private readonly privateKeySigner: PrivateKeySigner; private readonly useIdentityInstrument: boolean; constructor(authManager: AuthManager, config: PassportConfiguration) { @@ -28,19 +28,13 @@ export default class SequenceSigner implements ISigner { : this.privateKeySigner.getAddress(); } - async getWalletConfig(): Promise { - return this.useIdentityInstrument - ? this.identityInstrumentSigner.getWalletConfig() - : this.privateKeySigner.getWalletConfig(); - } - 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): Promise { + 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 index 98636acf0a..ddcd4bb9f6 100644 --- a/packages/passport/sdk/src/sequence/signer/ISigner.ts +++ b/packages/passport/sdk/src/sequence/signer/ISigner.ts @@ -3,8 +3,7 @@ import { Address } from 'ox'; export interface ISigner { getAddress(): Promise; - getWalletConfig(): Promise; signPayload(walletAddress: Address.Address, chainId: number, payload: Payload.Parented): Promise; - signMessage(message: string): 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 index ac715fee03..45c7a27f23 100644 --- a/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts +++ b/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts @@ -9,11 +9,9 @@ import { Hex, Address } from 'ox'; import jwtDecode from 'jwt-decode'; import { IdTokenPayload } from '../../types'; import { - Config, Payload, Signature as SequenceSignature, } from '@0xsequence/wallet-primitives'; -import { createWalletConfig } from './signerHelpers'; import { ISigner } from './ISigner'; interface AuthKey { @@ -25,10 +23,9 @@ interface AuthKey { interface UserWallet { userIdentifier: string; - walletAddress: string; + signerAddress: string; authKey: AuthKey; identityInstrument: IdentityInstrument; - walletConfig: Config.Config } export class IdentityInstrumentSigner implements ISigner { @@ -119,14 +116,11 @@ export class IdentityInstrumentSigner implements ISigner { const signerAddress = result.signer.address; authKey.identitySigner = signerAddress; - const walletConfig = createWalletConfig(Address.from(signerAddress)); - this.userWallet = { userIdentifier: authenticatedUser.profile.sub, - walletAddress: signerAddress, + signerAddress: signerAddress, authKey, identityInstrument, - walletConfig, }; return resolve(this.userWallet!); @@ -144,12 +138,7 @@ export class IdentityInstrumentSigner implements ISigner { async getAddress(): Promise { const wallet = await this.getUserWallet(); - return wallet.walletAddress; - } - - async getWalletConfig(): Promise { - const wallet = await this.getUserWallet(); - return wallet.walletConfig; + return wallet.signerAddress; } async signPayload(walletAddress: Address.Address, chainId: number, payload: Payload.Parented): Promise { @@ -163,7 +152,7 @@ export class IdentityInstrumentSigner implements ISigner { return signer.sign(walletAddress, chainId, payload); } - async signMessage(message: string): Promise { + async signMessage(message: string | Uint8Array): Promise { const wallet = await this.getUserWallet(); const signer = new Identity.IdentitySigner( @@ -171,8 +160,7 @@ export class IdentityInstrumentSigner implements ISigner { wallet.authKey ); - const messageBytes = toUtf8Bytes(message); - const digest = hashMessage(messageBytes); + const digest = hashMessage(message); const signature = await signer.signDigest(getBytes(digest)); diff --git a/packages/passport/sdk/src/sequence/signer/privateKeySigner.ts b/packages/passport/sdk/src/sequence/signer/privateKeySigner.ts index dda85cafdb..522fc8bb64 100644 --- a/packages/passport/sdk/src/sequence/signer/privateKeySigner.ts +++ b/packages/passport/sdk/src/sequence/signer/privateKeySigner.ts @@ -8,14 +8,12 @@ import { Payload, Signature as SequenceSignature, } from '@0xsequence/wallet-primitives'; -import { createWalletConfig } from './signerHelpers'; import { ISigner } from './ISigner'; import { Address } from 'ox'; interface PrivateKeyWallet { userIdentifier: string; signerAddress: string; - walletConfig: Config.Config; signer: Signers.Pk.Pk; } @@ -62,15 +60,14 @@ export class PrivateKeySigner implements ISigner { 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; - const walletConfig = createWalletConfig(signerAddress); this.privateKeyWallet = { userIdentifier: authenticatedUser.profile.sub, signerAddress, - walletConfig, signer, }; @@ -87,21 +84,20 @@ export class PrivateKeySigner implements ISigner { } 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 getWalletConfig(): Promise { - const wallet = await this.getWalletInstance(); - return wallet.walletConfig; - } - 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): Promise { + async signMessage(message: string | Uint8Array): Promise { const pkWallet = await this.getWalletInstance(); const privateKeyHash = keccak256(toUtf8Bytes(`${pkWallet.userIdentifier}-sequence-arb-one`)) as `0x${string}`; diff --git a/packages/passport/sdk/src/sequence/signer/signerHelpers.ts b/packages/passport/sdk/src/sequence/signer/signerHelpers.ts index 5c736c1ab0..f6c42ef6c4 100644 --- a/packages/passport/sdk/src/sequence/signer/signerHelpers.ts +++ b/packages/passport/sdk/src/sequence/signer/signerHelpers.ts @@ -9,17 +9,34 @@ export const SEQUENCE_CONTEXT: Context.Context = { creationCode: "0x6054600f3d396034805130553df3fe63906111273d3560e01c14602b57363d3d373d3d3d3d369030545af43d82803e156027573d90f35b3d90fd5b30543d5260203df3", }; +const immutableSignerContractAddress = '0x8bea3E180bEab544c9295a0C0b8eC1628614A2b3'; + const stateProviderUrl = "https://keymachine.sequence.app"; -export const createWalletConfig = (signerAddress: Address.Address): Config.Config => ({ - threshold: 1n, - checkpoint: 0n, - topology: { - type: "signer", - address: signerAddress, - weight: 1n, - }, -}); +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); diff --git a/packages/passport/sdk/src/sequence/transactionHelpers.ts b/packages/passport/sdk/src/sequence/transactionHelpers.ts index bfbd3e189a..c676a42f06 100644 --- a/packages/passport/sdk/src/sequence/transactionHelpers.ts +++ b/packages/passport/sdk/src/sequence/transactionHelpers.ts @@ -1,23 +1,63 @@ import { Flow } from '@imtbl/metrics'; import { TransactionRequest } from 'ethers'; import { Address, Bytes, Hex, AbiFunction, Provider } from 'ox'; -import { getEip155ChainId, isWalletDeployed } from './walletHelpers'; +import { getEip155ChainId, getNonce, isWalletDeployed } from './walletHelpers'; import { JsonRpcError, ProviderErrorCode, RpcErrorCode } from '../zkEvm/JsonRpcError'; import SequenceSigner from './sequenceSigner'; import { Payload, Config, Signature, Constants, Context } from '@0xsequence/wallet-primitives'; -import { Envelope, Wallet } from '@0xsequence/wallet-core'; +import { Envelope, State, Wallet } from '@0xsequence/wallet-core'; import { SequenceRelayerClient } from './sequenceRelayerClient'; import AuthManager from '../authManager'; -import { createStateProvider, saveWalletConfig, SEQUENCE_CONTEXT } from './signer/signerHelpers'; +import { createStateProvider, createWalletConfig, saveWalletConfig, SEQUENCE_CONTEXT } from './signer/signerHelpers'; +import GuardianClient from '../guardian'; +import { MetaTransaction } from '../zkEvm/types'; export type TransactionParams = { sequenceSigner: SequenceSigner; rpcProvider: Provider.Provider; + guardianClient: GuardianClient; relayerClient: SequenceRelayerClient; walletAddress: string; flow: Flow; authManager: AuthManager; nonceSpace?: bigint; + isBackgroundTransaction?: boolean; +}; + +const buildMetaTransactions = async ( + transactionRequest: TransactionRequest, + rpcProvider: Provider.Provider, + relayerClient: SequenceRelayerClient, + zkevmAddress: string, + nonceSpace?: bigint, +): Promise<[MetaTransaction, ...MetaTransaction[]]> => { + 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, + }; + + // Estimate the fee and get the nonce from the smart wallet + const nonce = await getNonce(rpcProvider, zkevmAddress, nonceSpace); + + // Build the meta transactions array with a valid nonce and fee transaction + const metaTransactions: [MetaTransaction, ...MetaTransaction[]] = [ + { + ...metaTransaction, + nonce, + }, + ]; + + return metaTransactions; }; /** @@ -32,6 +72,7 @@ const deployBootstrapAndExecute = async ( wallet: Wallet, chainId: string, flow: Flow, + stateProvider: State.Provider, authManager: AuthManager, ): Promise<{ to: Address.Address; signedTransaction: Hex.Hex; }> => { flow.addEvent('startDeployBootstrapAndExecute'); @@ -44,7 +85,7 @@ const deployBootstrapAndExecute = async ( ); } - const userTransction = await buildUserTransactionCall(walletAddress, transactionRequest, wallet, rpcProvider, sequenceSigner, chainId, flow); + const userSignature = await signUserTransaction(walletAddress, transactionRequest, wallet, rpcProvider, sequenceSigner, chainId, flow); const response = await fetch('http://localhost:8073/relayer-mr/v1/build-guest-module-calldata', { method: 'POST', @@ -53,10 +94,11 @@ const deployBootstrapAndExecute = async ( 'Content-Type': 'application/json' }, body: JSON.stringify({ - wallet_address: walletAddress, - user_eoa: await sequenceSigner.getAddress(), chain_id: getEip155ChainId(Number(chainId)), - user_execute_data: userTransction.data, + to: transactionRequest.to, + value: Hex.fromNumber(BigInt(transactionRequest.value ?? 0)), + data: transactionRequest.data ?? '0x', + user_ecdsa_signature: userSignature, }), }); @@ -75,7 +117,7 @@ const createWallet = async ( authManager: AuthManager, walletAddress: Address.Address, sequenceSigner: SequenceSigner, -): Promise => { +): Promise<{ wallet: Wallet; stateProvider: State.Provider; }> => { const user = await authManager.getUser(); if (!user?.accessToken) { throw new JsonRpcError( @@ -85,8 +127,11 @@ const createWallet = async ( } const deploymentSalt = await fetchDeploymentSalt(user.accessToken); - const walletConfig = await sequenceSigner.getWalletConfig(); + 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, @@ -94,17 +139,19 @@ const createWallet = async ( }); await saveWalletConfig(walletConfig, stateProvider); - return wallet; + return { wallet: wallet, stateProvider: stateProvider }; }; export const prepareAndSignTransaction = async ({ transactionRequest, sequenceSigner, rpcProvider, + guardianClient, relayerClient, walletAddress, flow, authManager, + isBackgroundTransaction, }: TransactionParams & { transactionRequest: TransactionRequest }): Promise<{ to: Address.Address; data: Hex.Hex; }> => { if (!transactionRequest.to) { throw new JsonRpcError( @@ -115,7 +162,7 @@ export const prepareAndSignTransaction = async ({ const chainId = await rpcProvider.request({ method: 'eth_chainId' }); - const wallet = await createWallet(authManager, Address.from(walletAddress), sequenceSigner); + const {wallet, stateProvider} = await createWallet(authManager, Address.from(walletAddress), sequenceSigner); const deployed = await isWalletDeployed(rpcProvider, walletAddress); if (!deployed) { @@ -127,6 +174,7 @@ export const prepareAndSignTransaction = async ({ wallet, Number(chainId).toString(), flow, + stateProvider, authManager, ); flow.addEvent('endPrepareDeployBootstrapExecuteTransaction'); @@ -145,9 +193,11 @@ export const prepareAndSignTransaction = async ({ behaviorOnError: "revert", }; + const envelope = await wallet.prepareTransaction(rpcProvider as any, [tx]); const signature = await sequenceSigner.signPayload(Address.from(walletAddress), Number(chainId), envelope.payload); + const signedEnvelope = Envelope.toSigned(envelope, [ { address: Address.from(await sequenceSigner.getAddress()), @@ -163,7 +213,7 @@ export const prepareAndSignTransaction = async ({ /** * Build and sign user transaction call (nonce 1) */ -const buildUserTransactionCall = async ( +const signUserTransaction = async ( walletAddress: string, transactionRequest: TransactionRequest, wallet: Wallet, @@ -171,8 +221,8 @@ const buildUserTransactionCall = async ( sequenceSigner: SequenceSigner, chainId: string, flow: Flow, -): Promise => { - flow.addEvent('startBuildUserTransactionCall'); +): Promise => { + flow.addEvent('startSignUserTransaction'); const userTx: Payload.Call = { to: transactionRequest.to as `0x${string}`, @@ -195,51 +245,19 @@ const buildUserTransactionCall = async ( }, }; - // Sign user transaction - const userSignature = await sequenceSigner.signPayload(Address.from(walletAddress), Number(chainId), userEnvelope.payload); - - const signerAddress = await sequenceSigner.getAddress(); - const signedUserEnvelope = Envelope.toSigned(userEnvelope, [ - { - address: Address.from(signerAddress), - signature: userSignature, - }, - ]); - - // Encode signature - const status = await wallet.getStatus(rpcProvider as any); - const userRawSig = Envelope.encodeSignature(signedUserEnvelope); - const userEncodedSig = Bytes.toHex( - Signature.encodeSignature({ - ...userRawSig, - suffix: status.pendingUpdates.map(({ signature }: any) => signature), - }) - ); - - flow.addEvent('endBuildUserTransactionCall'); - - const userTransactionCall: Payload.Call = { - to: Address.from(walletAddress), - value: 0n, - data: AbiFunction.encodeData(Constants.EXECUTE, [ - Bytes.toHex(Payload.encode(signedUserEnvelope.payload)), - userEncodedSig, - ]), - gasLimit: 0n, - delegateCall: false, - onlyFallback: false, - behaviorOnError: 'revert', - }; + // Encode payload to bytes and sign with EIP-191 prefix + const payloadDigest = Payload.hash(Address.from(walletAddress), Number(chainId), userEnvelope.payload); + const userSignatureHex = await sequenceSigner.signMessage(payloadDigest) as `0x${string}`; - flow.addEvent('endBuildUserTransactionCall'); + flow.addEvent('endSignUserTransaction'); - return userTransactionCall; + return userSignatureHex; }; async function fetchDeploymentSalt( accessToken: string ): Promise { - const apiUrl = 'http://localhost:8071/v2/passport/counterfactual-salt'; + const apiUrl = 'http://localhost:8072/v2/passport/counterfactual-salt'; const response = await fetch(apiUrl, { method: 'GET', diff --git a/packages/passport/sdk/src/zkEvm/transactionHelpers.ts b/packages/passport/sdk/src/zkEvm/transactionHelpers.ts index 633db6a80d..37270b5569 100644 --- a/packages/passport/sdk/src/zkEvm/transactionHelpers.ts +++ b/packages/passport/sdk/src/zkEvm/transactionHelpers.ts @@ -197,15 +197,15 @@ export const prepareAndSignTransaction = async ({ // Parallelize the validation and signing of the transaction // without waiting for the validation to complete - // const validateTransaction = async () => { - // await guardianClient.validateEVMTransaction({ - // chainId: getEip155ChainId(Number(chainId)), - // nonce: convertBigNumberishToString(nonce), - // metaTransactions, - // isBackgroundTransaction, - // }); - // flow.addEvent('endValidateEVMTransaction'); - // }; + const validateTransaction = async () => { + await guardianClient.validateEVMTransaction({ + chainId: getEip155ChainId(Number(chainId)), + nonce: convertBigNumberishToString(nonce), + metaTransactions, + isBackgroundTransaction, + }); + flow.addEvent('endValidateEVMTransaction'); + }; // NOTE: We sign again because we now are adding the fee transaction, so the // whole payload is different and needs a new signature. diff --git a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts index d889641e92..996c20366d 100644 --- a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts +++ b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts @@ -162,6 +162,9 @@ export class ZkEvmProvider implements Provider { switch (request.method) { case 'eth_requestAccounts': { + const signerAddress = await this.#ethSigner.getAddress(); + console.log(`zkevm signerAddress = ${signerAddress}`); + const zkEvmAddress = await this.#getZkEvmAddress(); if (zkEvmAddress) return [zkEvmAddress]; @@ -224,19 +227,7 @@ export class ZkEvmProvider implements Provider { 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, - // })(async () => await sendTransaction({ + // return await sendTransaction({ // params: request.params || [], // ethSigner: this.#ethSigner, // guardianClient: this.#guardianClient, @@ -244,7 +235,19 @@ export class ZkEvmProvider implements Provider { // relayerClient: this.#relayerClient, // zkEvmAddress, // flow, - // })); + // }); + return await this.#guardianClient.withConfirmationScreen({ + width: 480, + height: 720, + })(async () => await sendTransaction({ + params: request.params || [], + ethSigner: this.#ethSigner, + guardianClient: this.#guardianClient, + rpcProvider: this.#rpcProvider, + relayerClient: this.#relayerClient, + zkEvmAddress, + flow, + })); } catch (error) { if (error instanceof Error) { trackError('passport', 'eth_sendTransaction', error, { flowId: flow.details.flowId }); From dfbc7d653167c46a3f03c83c493af39fd02bddac Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Wed, 10 Dec 2025 14:23:07 +1300 Subject: [PATCH 08/10] refactor: sequence send transaction --- packages/passport/sdk/package.json | 1 + .../passport/sdk/src/Passport.int.test.ts | 1 + packages/passport/sdk/src/Passport.test.ts | 1 + .../passport/sdk/src/config/config.test.ts | 3 +- packages/passport/sdk/src/config/config.ts | 5 + .../sdk/src/sequence/transactionHelpers.ts | 220 ++++++-------- .../sdk/src/sequence/walletHelpers.ts | 12 +- packages/passport/sdk/src/types.ts | 1 + .../sdk/src/zkEvm/transactionHelpers.ts | 4 +- pnpm-lock.yaml | 280 ++++++++++++++---- 10 files changed, 332 insertions(+), 196 deletions(-) diff --git a/packages/passport/sdk/package.json b/packages/passport/sdk/package.json index e19c44d8b0..fa2e841042 100644 --- a/packages/passport/sdk/package.json +++ b/packages/passport/sdk/package.json @@ -13,6 +13,7 @@ "@0xsequence/relayer": "3.0.0-beta.4", "@0xsequence/wallet-core": "3.0.0-beta.4", "@0xsequence/wallet-primitives": "3.0.0-beta.4", + "@0xsequence/guard": "3.0.0-beta.4", "@imtbl/config": "workspace:*", "@imtbl/generated-clients": "workspace:*", "@imtbl/metrics": "workspace:*", diff --git a/packages/passport/sdk/src/Passport.int.test.ts b/packages/passport/sdk/src/Passport.int.test.ts index 0534596268..c4e6d7b137 100644 --- a/packages/passport/sdk/src/Passport.int.test.ts +++ b/packages/passport/sdk/src/Passport.int.test.ts @@ -197,6 +197,7 @@ describe('Passport', () => { 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 6f966f8768..0cc70b2721 100644 --- a/packages/passport/sdk/src/Passport.test.ts +++ b/packages/passport/sdk/src/Passport.test.ts @@ -129,6 +129,7 @@ describe('Passport', () => { immutableXClient, sequenceIdentityInstrumentEndpoint: 'sequenceIdentityInstrumentEndpoint123', sequenceProjectAccessKey: 'sequenceProjectAccessKey123', + sequenceGuardEndpoint: 'sequenceGuardEndpoint123', }, ...oidcConfiguration, }); diff --git a/packages/passport/sdk/src/config/config.test.ts b/packages/passport/sdk/src/config/config.test.ts index 3704f1466c..d15c4951e5 100644 --- a/packages/passport/sdk/src/config/config.test.ts +++ b/packages/passport/sdk/src/config/config.test.ts @@ -32,7 +32,8 @@ describe('Config', () => { orderBookMrBasePath: 'orderBookMrBasePath123', passportMrBasePath: 'passportMrBasePath123', sequenceIdentityInstrumentEndpoint: 'sequenceIdentityInstrumentEndpoint123', - sequenceProjectAccessKey: 'sequenceProjectAccessKey123' + 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 add39a5019..e379a81a96 100644 --- a/packages/passport/sdk/src/config/config.ts +++ b/packages/passport/sdk/src/config/config.ts @@ -54,6 +54,8 @@ export class PassportConfiguration { readonly sequenceIdentityInstrumentEndpoint: string; + readonly sequenceGuardEndpoint: string; + readonly multiRollupConfig: MultiRollupAPIConfiguration; readonly crossSdkBridgeEnabled: boolean; @@ -110,6 +112,7 @@ export class PassportConfiguration { this.relayerUrl = overrides.relayerUrl; this.sequenceIdentityInstrumentEndpoint = overrides.sequenceIdentityInstrumentEndpoint; this.sequenceProjectAccessKey = overrides.sequenceProjectAccessKey; + this.sequenceGuardEndpoint = overrides.sequenceGuardEndpoint; this.multiRollupConfig = { indexer: createConfig({ basePath: overrides.indexerMrBasePath, @@ -133,6 +136,7 @@ export class PassportConfiguration { 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; } @@ -147,6 +151,7 @@ export class PassportConfiguration { 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/sequence/transactionHelpers.ts b/packages/passport/sdk/src/sequence/transactionHelpers.ts index c676a42f06..e2266562fb 100644 --- a/packages/passport/sdk/src/sequence/transactionHelpers.ts +++ b/packages/passport/sdk/src/sequence/transactionHelpers.ts @@ -1,11 +1,11 @@ import { Flow } from '@imtbl/metrics'; -import { TransactionRequest } from 'ethers'; -import { Address, Bytes, Hex, AbiFunction, Provider } from 'ox'; +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, Signature, Constants, Context } from '@0xsequence/wallet-primitives'; -import { Envelope, State, Wallet } from '@0xsequence/wallet-core'; +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'; @@ -24,13 +24,12 @@ export type TransactionParams = { isBackgroundTransaction?: boolean; }; -const buildMetaTransactions = async ( +const buildMetaTransaction = async ( transactionRequest: TransactionRequest, rpcProvider: Provider.Provider, - relayerClient: SequenceRelayerClient, - zkevmAddress: string, + walletAddress: string, nonceSpace?: bigint, -): Promise<[MetaTransaction, ...MetaTransaction[]]> => { +): Promise => { if (!transactionRequest.to) { throw new JsonRpcError( RpcErrorCode.INVALID_PARAMS, @@ -46,78 +45,21 @@ const buildMetaTransactions = async ( revertOnError: true, }; - // Estimate the fee and get the nonce from the smart wallet - const nonce = await getNonce(rpcProvider, zkevmAddress, nonceSpace); - - // Build the meta transactions array with a valid nonce and fee transaction - const metaTransactions: [MetaTransaction, ...MetaTransaction[]] = [ - { - ...metaTransaction, - nonce, - }, - ]; - - return metaTransactions; -}; - -/** - * Deploy wallet and execute first transaction - * Combines: deploy + updateImageHash (nonce 0) + user transaction (nonce 1) - */ -const deployBootstrapAndExecute = async ( - transactionRequest: TransactionRequest, - sequenceSigner: SequenceSigner, - rpcProvider: Provider.Provider, - walletAddress: Address.Address, - wallet: Wallet, - chainId: string, - flow: Flow, - stateProvider: State.Provider, - authManager: AuthManager, -): Promise<{ to: Address.Address; signedTransaction: Hex.Hex; }> => { - flow.addEvent('startDeployBootstrapAndExecute'); - - const user = await authManager.getUser(); - if (!user?.accessToken) { - throw new JsonRpcError( - ProviderErrorCode.UNAUTHORIZED, - 'No access token found', - ); - } - - const userSignature = await signUserTransaction(walletAddress, transactionRequest, wallet, rpcProvider, sequenceSigner, chainId, flow); - - 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: userSignature, - }), - }); - - if (!response.ok) { - throw new Error(`Failed to build guest module calldata: ${response.statusText}`); - } - - const result = await response.json(); - - flow.addEvent('endBuildGuestModuleMulticall'); + // Get the nonce from the smart wallet + const nonce = await getNonce(rpcProvider, walletAddress, nonceSpace); - return { to: result.to, signedTransaction: result.data }; + // Build the meta transactions array with a valid nonce + return { + ...metaTransaction, + nonce, + }; }; const createWallet = async ( authManager: AuthManager, walletAddress: Address.Address, sequenceSigner: SequenceSigner, -): Promise<{ wallet: Wallet; stateProvider: State.Provider; }> => { +): Promise => { const user = await authManager.getUser(); if (!user?.accessToken) { throw new JsonRpcError( @@ -139,7 +81,7 @@ const createWallet = async ( }); await saveWalletConfig(walletConfig, stateProvider); - return { wallet: wallet, stateProvider: stateProvider }; + return wallet; }; export const prepareAndSignTransaction = async ({ @@ -151,107 +93,119 @@ export const prepareAndSignTransaction = async ({ walletAddress, flow, authManager, + nonceSpace, isBackgroundTransaction, }: TransactionParams & { transactionRequest: TransactionRequest }): Promise<{ to: Address.Address; data: Hex.Hex; }> => { - if (!transactionRequest.to) { + const user = await authManager.getUser(); + if (!user?.accessToken) { throw new JsonRpcError( - RpcErrorCode.INVALID_PARAMS, - 'eth_sendTransaction requires a "to" field', + ProviderErrorCode.UNAUTHORIZED, + 'No access token found', ); } const chainId = await rpcProvider.request({ method: 'eth_chainId' }); - const {wallet, stateProvider} = await createWallet(authManager, Address.from(walletAddress), sequenceSigner); - - const deployed = await isWalletDeployed(rpcProvider, walletAddress); - if (!deployed) { - const result = await deployBootstrapAndExecute( - transactionRequest, - sequenceSigner, - rpcProvider, - Address.from(walletAddress), - wallet, - Number(chainId).toString(), - flow, - stateProvider, - authManager, - ); - flow.addEvent('endPrepareDeployBootstrapExecuteTransaction'); - return { to: result.to, data: result.signedTransaction }; - } + const metaTransaction = await buildMetaTransaction( + transactionRequest, + rpcProvider, + walletAddress, + nonceSpace, + ); + flow.addEvent('endBuildMetaTransactions'); - flow.addEvent('startBuildMetaTransactions'); + console.log(`end build meta transaction`); - const tx: Payload.Call = { - to: transactionRequest.to as `0x${string}`, - data: (transactionRequest.data || '0x') as `0x${string}`, - value: BigInt(transactionRequest.value || 0), - gasLimit: 0n, - delegateCall: false, - onlyFallback: false, - behaviorOnError: "revert", - }; + const { nonce } = metaTransaction; + if (typeof nonce === 'undefined') { + throw new Error('Failed to retrieve nonce from the smart wallet'); + } + console.log(`nonce = ${nonce}`); - const envelope = await wallet.prepareTransaction(rpcProvider as any, [tx]); + const signature = await signMetaTransaction( + walletAddress, + metaTransaction, + authManager, + rpcProvider, + sequenceSigner, + chainId, + flow, + nonce, + ); - const signature = await sequenceSigner.signPayload(Address.from(walletAddress), Number(chainId), envelope.payload); + console.log(`end sign meta transaction`); - const signedEnvelope = Envelope.toSigned(envelope, [ - { - address: Address.from(await sequenceSigner.getAddress()), - signature: signature, + 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, + }), + }); - const { to, data } = await wallet.buildTransaction(rpcProvider as any, signedEnvelope); + if (!response.ok) { + throw new Error(`Failed to build guest module calldata: ${response.statusText}`); + } + + const result = await response.json(); + + flow.addEvent('endBuildGuestModuleMulticall'); - return { to: to, data: data }; + return { to: result.to, data: result.data }; }; -/** - * Build and sign user transaction call (nonce 1) - */ -const signUserTransaction = async ( +const signMetaTransaction = async ( walletAddress: string, - transactionRequest: TransactionRequest, - wallet: Wallet, + metaTransaction: MetaTransaction, + authManager: AuthManager, rpcProvider: Provider.Provider, sequenceSigner: SequenceSigner, chainId: string, flow: Flow, + nonce: BigNumberish, ): Promise => { - flow.addEvent('startSignUserTransaction'); + flow.addEvent('startSignMetaTransaction'); - const userTx: Payload.Call = { - to: transactionRequest.to as `0x${string}`, - value: BigInt(transactionRequest.value || 0), - data: (transactionRequest.data || '0x') as `0x${string}`, + 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, [userTx], { noConfigUpdate: true }); + 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 userEnvelope = { + const adjustedEnvelope = { ...envelope, payload: { ...envelope.payload, - nonce: 1n, + nonce: isDeployed ? BigInt(nonce) : 1n, }, }; // Encode payload to bytes and sign with EIP-191 prefix - const payloadDigest = Payload.hash(Address.from(walletAddress), Number(chainId), userEnvelope.payload); - const userSignatureHex = await sequenceSigner.signMessage(payloadDigest) as `0x${string}`; + const payloadDigest = Payload.hash(Address.from(walletAddress), Number(chainId), adjustedEnvelope.payload); + const signature = await sequenceSigner.signMessage(payloadDigest) as `0x${string}`; - flow.addEvent('endSignUserTransaction'); + flow.addEvent('endSignMetaTransaction'); - return userSignatureHex; + return signature; }; async function fetchDeploymentSalt( @@ -273,4 +227,4 @@ async function fetchDeploymentSalt( const data = await response.json(); return data.salt; -} +} \ No newline at end of file diff --git a/packages/passport/sdk/src/sequence/walletHelpers.ts b/packages/passport/sdk/src/sequence/walletHelpers.ts index bf1135911a..7d9d88ae2d 100644 --- a/packages/passport/sdk/src/sequence/walletHelpers.ts +++ b/packages/passport/sdk/src/sequence/walletHelpers.ts @@ -1,11 +1,7 @@ -import { walletContracts } from '@0xsequence/abi'; -import { Payload, Signature } from '@0xsequence/wallet-primitives'; -import { Bytes, Address, Abi, AbiFunction, Hex, Provider } from 'ox'; +import { Address, Abi, AbiFunction, Provider } from 'ox'; import { BigNumberish } from 'ethers'; -import SequenceSigner from './sequenceSigner'; const READ_NONCE = Abi.from(['function readNonce(uint256 _space) external view returns (uint256)'])[0] -const SIGNATURE_WEIGHT = 1; export const isWalletDeployed = async ( rpcProvider: Provider.Provider, @@ -27,6 +23,11 @@ export const getNonce = async ( 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]); @@ -42,6 +43,7 @@ export const getNonce = async ( }); const nonce = AbiFunction.decodeResult(READ_NONCE, result); + return encodeNonce(rawSpace, nonce); }; diff --git a/packages/passport/sdk/src/types.ts b/packages/passport/sdk/src/types.ts index ed308f16b5..bbc35a465a 100644 --- a/packages/passport/sdk/src/types.ts +++ b/packages/passport/sdk/src/types.ts @@ -98,6 +98,7 @@ export interface PassportOverrides { relayerUrl: string; sequenceIdentityInstrumentEndpoint: string; sequenceProjectAccessKey: string; + sequenceGuardEndpoint: string; indexerMrBasePath: string; orderBookMrBasePath: string; passportMrBasePath: string; diff --git a/packages/passport/sdk/src/zkEvm/transactionHelpers.ts b/packages/passport/sdk/src/zkEvm/transactionHelpers.ts index 37270b5569..8ddaec4055 100644 --- a/packages/passport/sdk/src/zkEvm/transactionHelpers.ts +++ b/packages/passport/sdk/src/zkEvm/transactionHelpers.ts @@ -221,8 +221,8 @@ export const prepareAndSignTransaction = async ({ return signed; }; - const [signedTransactions] = await Promise.all([ - // validateTransaction(), + const [, signedTransactions] = await Promise.all([ + validateTransaction(), signTransaction(), ]); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e7c7aa5c4..c11061b0d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1196,7 +1196,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1362,7 +1362,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1374,7 +1374,7 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2075,6 +2075,9 @@ importers: '@0xsequence/core': 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.4 + version: 3.0.0-beta.4(typescript@5.6.2) '@0xsequence/identity-instrument': specifier: 3.0.0-beta.4 version: 3.0.0-beta.4(typescript@5.6.2) @@ -24968,6 +24971,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + debug: 4.3.7(supports-color@8.1.1) + eslint: 9.16.0(jiti@1.21.0) + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -26187,20 +26209,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@29.7.0(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.9) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - optional: true - babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 @@ -26401,13 +26409,6 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.10) - babel-preset-jest@29.6.3(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) - optional: true - babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.26.9 @@ -28471,18 +28472,45 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + dependencies: + '@babel/core': 7.26.9 + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.10.4 + '@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) + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-jest: 25.7.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))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) @@ -28498,23 +28526,23 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@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) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) - eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.35.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-testing-library: 5.11.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -28591,6 +28619,16 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): dependencies: debug: 3.2.7 @@ -28601,6 +28639,14 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0): + dependencies: + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + eslint: 8.57.0 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) @@ -28609,11 +28655,11 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) - eslint: 8.57.0 + eslint: 9.16.0(jiti@1.21.0) lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -28644,6 +28690,33 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.16.0(jiti@1.21.0) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)) + hasown: 2.0.2 + is-core-module: 2.15.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): dependencies: array-includes: 3.1.8 @@ -28693,6 +28766,17 @@ snapshots: - supports-color - typescript + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -35479,6 +35563,92 @@ snapshots: '@remix-run/router': 1.7.2 react: 18.3.1 + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.26.9 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + '@svgr/webpack': 5.5.0 + babel-jest: 27.5.1(@babel/core@7.26.9) + babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) + babel-preset-react-app: 10.0.1 + bfj: 7.0.2 + browserslist: 4.23.3 + camelcase: 6.3.0 + case-sensitive-paths-webpack-plugin: 2.4.0 + css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + eslint: 8.57.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + fs-extra: 10.1.0 + html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + identity-obj-proxy: 3.0.0 + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-resolve: 27.5.1 + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss: 8.4.49 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) + postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) + postcss-preset-env: 7.8.3(postcss@8.4.49) + prompts: 2.4.2 + react: 18.3.1 + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-refresh: 0.11.0 + resolve: 1.22.8 + resolve-url-loader: 4.0.0 + sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + semver: 7.6.3 + source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + optionalDependencies: + fsevents: 2.3.3 + typescript: 5.6.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - '@parcel/css' + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - bufferutil + - canvas + - clean-css + - csso + - debug + - esbuild + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - fibers + - node-notifier + - node-sass + - rework + - rework-visit + - sass + - sass-embedded + - sockjs-client + - supports-color + - ts-node + - type-fest + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 @@ -35565,7 +35735,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35582,9 +35752,9 @@ snapshots: css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + eslint: 9.16.0(jiti@1.21.0) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35601,7 +35771,7 @@ snapshots: prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 @@ -37401,12 +37571,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37421,12 +37591,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37441,12 +37611,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37461,12 +37631,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37475,10 +37645,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.26.10 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.9) + babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 ts-mockito@2.6.1: From b178738c158f3be5c6cff91d6640cf93a0764c6f Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Mon, 15 Dec 2025 11:50:26 +1300 Subject: [PATCH 09/10] feat: game bridge sequence, guardian support for sequence --- packages/game-bridge/build.js | 77 +++ packages/game-bridge/package.json | 7 +- packages/game-bridge/src/index.ts | 69 ++- .../generated-clients/src/mr-api-clients.ts | 6 +- .../src/context/ImmutableProvider.tsx | 1 + packages/passport/sdk/src/Passport.ts | 1 + .../sdk/src/confirmation/confirmation.ts | 4 + .../passport/sdk/src/guardian/index.test.ts | 13 + packages/passport/sdk/src/guardian/index.ts | 117 ++++- .../sdk/src/sequence/sequenceProvider.ts | 43 +- .../sdk/src/sequence/sequenceRelayerClient.ts | 3 + .../signer/identityInstrumentSigner.ts | 4 +- .../sdk/src/sequence/transactionHelpers.ts | 46 +- .../passport/sdk/src/zkEvm/zkEvmProvider.ts | 5 + pnpm-lock.yaml | 488 +++++++++--------- tsup.config.js | 14 +- 16 files changed, 566 insertions(+), 332 deletions(-) create mode 100644 packages/game-bridge/build.js 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/mr-api-clients.ts b/packages/internal/generated-clients/src/mr-api-clients.ts index 36c8f2b181..452c8579ca 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,8 @@ 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(createConfig({ + basePath: 'http://localhost:8074', + })); } } diff --git a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx index 38c8ae30c9..92d661855f 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -142,6 +142,7 @@ const getPassportConfig = (environment: EnvironmentNames): PassportModuleConfigu 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/src/Passport.ts b/packages/passport/sdk/src/Passport.ts index 831fdccedd..072196f105 100644 --- a/packages/passport/sdk/src/Passport.ts +++ b/packages/passport/sdk/src/Passport.ts @@ -85,6 +85,7 @@ export const buildPrivateVars = (passportModuleConfiguration: PassportModuleConf config, authManager, guardianApi: multiRollupApiClients.guardianApi, + multiRollupApiClients, }); const imxApiClients = buildImxApiClients(passportModuleConfiguration); diff --git a/packages/passport/sdk/src/confirmation/confirmation.ts b/packages/passport/sdk/src/confirmation/confirmation.ts index f8069ca7cb..8e092b7a51 100644 --- a/packages/passport/sdk/src/confirmation/confirmation.ts +++ b/packages/passport/sdk/src/confirmation/confirmation.ts @@ -63,6 +63,7 @@ export default class ConfirmationScreen { chainType: GeneratedClients.mr.TransactionApprovalRequestChainTypeEnum, chainId?: string, ): Promise { + console.log(`request confirmation for transactionId: ${transactionId}, etherAddress: ${etherAddress}, chainType: ${chainType}, chainId: ${chainId}`); return new Promise((resolve, reject) => { const messageHandler = ({ data, origin }: MessageEvent) => { if ( @@ -228,6 +229,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 +237,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 +246,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..bf02ff1759 100644 --- a/packages/passport/sdk/src/guardian/index.ts +++ b/packages/passport/sdk/src/guardian/index.ts @@ -9,12 +9,14 @@ 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'; export type GuardianClientParams = { confirmationScreen: ConfirmationScreen; config: PassportConfiguration; authManager: AuthManager; guardianApi: GeneratedClients.mr.GuardianApi; + multiRollupApiClients: GeneratedClients.MultiRollupApiClients; }; export type GuardianEvaluateImxTransactionParams = { @@ -41,6 +43,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 +79,81 @@ 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 { + // Replace dashes with underscores for other chains + chainKey = chain.name.replace(/-/g, '_'); + } + + 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,16 @@ export default class GuardianClient { } if (confirmationRequired && !!transactionId) { - const user = await this.authManager.getUserZkEvm(); + const { ethAddress } = await this.getUserForChain(chainId); const confirmationResult = await this.confirmationScreen.requestConfirmation( transactionId, - user.zkEvm.ethAddress, + ethAddress, GeneratedClients.mr.TransactionApprovalRequestChainTypeEnum.Evm, chainId, ); + console.log(`confirmationResult: ${JSON.stringify(confirmationResult)}`); + if (!confirmationResult.confirmed) { throw new JsonRpcError( RpcErrorCode.TRANSACTION_REJECTED, @@ -258,13 +337,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 +358,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 +380,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 +407,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/sequence/sequenceProvider.ts b/packages/passport/sdk/src/sequence/sequenceProvider.ts index 30275b830f..204938b54d 100644 --- a/packages/passport/sdk/src/sequence/sequenceProvider.ts +++ b/packages/passport/sdk/src/sequence/sequenceProvider.ts @@ -121,10 +121,13 @@ export class SequenceProvider implements Provider { 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}`); @@ -151,10 +154,14 @@ export class SequenceProvider implements Provider { }); this.userWalletAddress = userEthAddress; + console.log(`eth_requestAccounts 2 walletAddress = ${this.userWalletAddress}`); flow.addEvent('endUserRegistration'); } else { userEthAddress = user[this.#chain].ethAddress; + + this.userWalletAddress = userEthAddress; + console.log(`eth_requestAccounts 3 walletAddress = ${this.userWalletAddress}`); } if (userEthAddress) { @@ -181,7 +188,8 @@ export class SequenceProvider implements Provider { } case 'eth_sendTransaction': { - const walletAddress = this.userWalletAddress; + console.log(`sequence eth_sendTransaction ${this.userWalletAddress}`); + const walletAddress = '0x3fadd1f6f02408c0fad35e362e3d5c65e722b67a';//this.userWalletAddress; // const walletAddress = await this.#getWalletAddress(); if (!walletAddress) { @@ -194,21 +202,8 @@ export class SequenceProvider implements Provider { const flow = trackFlow('passport', `ethSendTransaction_${this.#chain}`); try { - return await sendTransaction({ - params: request.params || [], - sequenceSigner: this.#ethSigner, - rpcProvider: this.#rpcProvider, - relayerClient: this.#relayerClient, - guardianClient: this.#guardianClient, - walletAddress, - flow, - authManager: this.#authManager, - chain: this.#chain, - }); - // return await this.#guardianClient.withConfirmationScreen({ - // width: 480, - // height: 720, - // })(async () => await sendTransaction({ + // console.log(`sequence NO GUARDIAN`) + // return await sendTransaction({ // params: request.params || [], // sequenceSigner: this.#ethSigner, // rpcProvider: this.#rpcProvider, @@ -218,7 +213,21 @@ export class SequenceProvider implements Provider { // flow, // authManager: this.#authManager, // chain: this.#chain, - // })); + // }); + return await this.#guardianClient.withConfirmationScreen({ + width: 480, + height: 720, + })(async () => await sendTransaction({ + params: request.params || [], + sequenceSigner: this.#ethSigner, + rpcProvider: this.#rpcProvider, + relayerClient: this.#relayerClient, + guardianClient: this.#guardianClient, + walletAddress, + flow, + authManager: this.#authManager, + chain: this.#chain, + })); } catch (error) { if (error instanceof Error) { trackError('passport', `ethSendTransaction_${this.#chain}`, error, { flowId: flow.details.flowId }); diff --git a/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts b/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts index 81f4cbcc88..f493490485 100644 --- a/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts +++ b/packages/passport/sdk/src/sequence/sequenceRelayerClient.ts @@ -47,13 +47,16 @@ export class SequenceRelayerClient { const chainConfig = getChainConfig(chain); 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'); diff --git a/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts b/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts index 45c7a27f23..fcd99ce83d 100644 --- a/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts +++ b/packages/passport/sdk/src/sequence/signer/identityInstrumentSigner.ts @@ -6,7 +6,7 @@ import AuthManager from '../../authManager'; import { PassportConfiguration } from '../../config'; import { User } from '../../types'; import { Hex, Address } from 'ox'; -import jwtDecode from 'jwt-decode'; +import jwt_decode from 'jwt-decode'; import { IdTokenPayload } from '../../types'; import { Payload, @@ -82,7 +82,7 @@ export class IdentityInstrumentSigner implements ISigner { } const idToken = authenticatedUser.idToken; - const decoded = jwtDecode(idToken); + const decoded = jwt_decode(idToken); const issuer = decoded.iss; const audience = decoded.aud; diff --git a/packages/passport/sdk/src/sequence/transactionHelpers.ts b/packages/passport/sdk/src/sequence/transactionHelpers.ts index e2266562fb..0324101c74 100644 --- a/packages/passport/sdk/src/sequence/transactionHelpers.ts +++ b/packages/passport/sdk/src/sequence/transactionHelpers.ts @@ -9,8 +9,9 @@ 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 from '../guardian'; +import GuardianClient, { convertBigNumberishToString } from '../guardian'; import { MetaTransaction } from '../zkEvm/types'; +import { signTypedDataV4 } from '../zkEvm/signTypedDataV4'; export type TransactionParams = { sequenceSigner: SequenceSigner; @@ -114,27 +115,40 @@ export const prepareAndSignTransaction = async ({ ); flow.addEvent('endBuildMetaTransactions'); - console.log(`end build meta transaction`); - const { nonce } = metaTransaction; if (typeof nonce === 'undefined') { throw new Error('Failed to retrieve nonce from the smart wallet'); } - console.log(`nonce = ${nonce}`); + const validateTransaction = async () => { + await guardianClient.validateEVMTransaction({ + chainId: getEip155ChainId(Number(chainId)), + nonce: convertBigNumberishToString(nonce), + metaTransactions: [metaTransaction], + isBackgroundTransaction, + }); + flow.addEvent('endValidateEVMTransaction'); + }; - const signature = await signMetaTransaction( - walletAddress, - metaTransaction, - authManager, - rpcProvider, - sequenceSigner, - chainId, - flow, - nonce, - ); + const signTransaction = async () => { + const signed = await signMetaTransaction( + walletAddress, + metaTransaction, + authManager, + rpcProvider, + sequenceSigner, + chainId, + flow, + nonce, + ); + flow.addEvent('endSignMetaTransaction'); + return signed; + } - console.log(`end sign meta transaction`); + const [_, signature] = await Promise.all([ + validateTransaction(), + signTransaction(), + ]); const response = await fetch('http://localhost:8073/relayer-mr/v1/build-guest-module-calldata', { method: 'POST', @@ -159,6 +173,8 @@ export const prepareAndSignTransaction = async ({ flow.addEvent('endBuildGuestModuleMulticall'); + console.log(`response ${JSON.stringify(result)}`); + return { to: result.to, data: result.data }; }; diff --git a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts index 996c20366d..4af2d14fec 100644 --- a/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts +++ b/packages/passport/sdk/src/zkEvm/zkEvmProvider.ts @@ -162,10 +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'); @@ -193,6 +195,8 @@ export class ZkEvmProvider implements Provider { flow.addEvent('endUserRegistration'); } else { userZkEvmEthAddress = user.zkEvm.ethAddress; + + this.userWalletAddress = userZkEvmEthAddress; } this.#providerEventEmitter.emit(ProviderEvent.ACCOUNTS_CHANGED, [ @@ -215,6 +219,7 @@ export class ZkEvmProvider implements Provider { } } case 'eth_sendTransaction': { + console.log(`zkevm eth_sendTransaction`); const zkEvmAddress = this.userWalletAddress;//await this.#getZkEvmAddress(); if (!zkEvmAddress) { throw new JsonRpcError( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c11061b0d0..6d55a79e6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1196,7 +1196,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1362,7 +1362,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1374,7 +1374,7 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -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) @@ -9381,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==} @@ -9813,6 +9822,9 @@ packages: 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==} @@ -11293,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'} @@ -11301,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'} @@ -11513,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. @@ -11853,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==} @@ -13101,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==} @@ -13502,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'} @@ -14901,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==} @@ -14916,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==} @@ -15694,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==} @@ -15771,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'} @@ -15850,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==} @@ -16170,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==} @@ -16287,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==} @@ -16871,14 +16940,6 @@ packages: typescript: optional: true - viem@2.39.3: - resolution: {integrity: sha512-s11rPQRvUEdc5qHK3xT4fIk4qvgPAaLwaTFq+EbFlcJJD+Xn3R4mc9H6B6fquEiHl/mdsdbG/uKCnYpoNtHNHw==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - viem@2.41.2: resolution: {integrity: sha512-LYliajglBe1FU6+EH9mSWozp+gRA/QcHfxeD9Odf83AdH5fwUS7DroH4gHvlv6Sshqi1uXrYFA2B/EOczxd15g==} peerDependencies: @@ -17329,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'} @@ -23302,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.39.3(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 @@ -24971,25 +25036,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - debug: 4.3.7(supports-color@8.1.1) - eslint: 9.16.0(jiti@1.21.0) - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -26209,6 +26255,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.26.9) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 @@ -26409,6 +26469,13 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.10) + babel-preset-jest@29.6.3(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) + optional: true + babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.26.9 @@ -26648,7 +26715,7 @@ 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: @@ -27352,7 +27419,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: @@ -27361,7 +27428,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: @@ -27559,6 +27626,10 @@ snapshots: css.escape@1.5.1: {} + cssauron@1.4.0: + dependencies: + through: 2.3.8 + cssdb@7.6.0: {} cssesc@3.0.0: {} @@ -27993,6 +28064,10 @@ snapshots: 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: @@ -28472,45 +28547,18 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) - '@rushstack/eslint-patch': 1.10.4 - '@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) - babel-preset-react-app: 10.0.1 - confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) - eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.35.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-jest: 25.7.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))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) @@ -28526,23 +28574,23 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@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) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 9.16.0(jiti@1.21.0) - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-testing-library: 5.11.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(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@8.57.0) + eslint-plugin-jest: 25.7.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))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -28619,16 +28667,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): dependencies: debug: 3.2.7 @@ -28639,14 +28677,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0): - dependencies: - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - eslint: 8.57.0 - lodash: 4.17.21 - string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) @@ -28655,11 +28685,11 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) - eslint: 9.16.0(jiti@1.21.0) + eslint: 8.57.0 lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -28690,33 +28720,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)) - hasown: 2.0.2 - is-core-module: 2.15.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): dependencies: array-includes: 3.1.8 @@ -28766,17 +28769,6 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - transitivePeerDependencies: - - supports-color - - typescript - eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -30502,6 +30494,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 @@ -30516,6 +30514,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 @@ -30744,6 +30760,8 @@ snapshots: indent-string@4.0.0: {} + indexof@0.0.1: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -31041,6 +31059,8 @@ snapshots: dependencies: system-architecture: 0.1.0 + isarray@0.0.1: {} + isarray@1.0.0: {} isarray@2.0.5: {} @@ -33452,6 +33472,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: @@ -34003,6 +34027,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: @@ -34417,7 +34443,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: {} @@ -35563,92 +35589,6 @@ snapshots: '@remix-run/router': 1.7.2 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): - dependencies: - '@babel/core': 7.26.9 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.26.9) - babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) - babel-preset-react-app: 10.0.1 - bfj: 7.0.2 - browserslist: 4.23.3 - camelcase: 6.3.0 - case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss: 8.4.49 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) - postcss-preset-env: 7.8.3(postcss@8.4.49) - prompts: 2.4.2 - react: 18.3.1 - react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - react-refresh: 0.11.0 - resolve: 1.22.8 - resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - optionalDependencies: - fsevents: 2.3.3 - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - '@parcel/css' - - '@swc/core' - - '@types/babel__core' - - '@types/webpack' - - bufferutil - - canvas - - clean-css - - csso - - debug - - esbuild - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - fibers - - node-notifier - - node-sass - - rework - - rework-visit - - sass - - sass-embedded - - sockjs-client - - supports-color - - ts-node - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-hot-middleware - - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 @@ -35735,7 +35675,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35752,9 +35692,9 @@ snapshots: css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + eslint: 8.57.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -35771,7 +35711,7 @@ snapshots: prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 @@ -35858,6 +35798,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 @@ -35886,6 +35840,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 @@ -36799,6 +36757,10 @@ snapshots: split2@4.2.0: {} + split@0.3.3: + dependencies: + through: 2.3.8 + split@1.0.1: dependencies: through: 2.3.8 @@ -36875,6 +36837,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: @@ -36984,6 +36955,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 @@ -37446,6 +37419,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 @@ -37552,6 +37540,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: @@ -37571,12 +37568,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37591,12 +37588,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37611,12 +37608,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37631,12 +37628,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(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): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37645,10 +37642,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.9 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) + babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.23.1 ts-mockito@2.6.1: @@ -38249,23 +38246,6 @@ snapshots: - utf-8-validate - zod - viem@2.39.3(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 - viem@2.41.2(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@noble/curves': 1.9.1 @@ -38865,6 +38845,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({ From e4325820e7505887070229678d2f051a66050363 Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Mon, 15 Dec 2025 15:15:05 +1300 Subject: [PATCH 10/10] feat: sequence provider --- .../sdk/src/sequence/sendTransaction.ts | 4 +- .../sdk/src/sequence/sequenceProvider.ts | 54 +++++++++++++++---- .../sdk/src/sequence/transactionHelpers.ts | 11 ++-- .../sdk/src/sequence/user/registerUser.ts | 12 ++--- 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/packages/passport/sdk/src/sequence/sendTransaction.ts b/packages/passport/sdk/src/sequence/sendTransaction.ts index 3aa9cf8c61..2727c65317 100644 --- a/packages/passport/sdk/src/sequence/sendTransaction.ts +++ b/packages/passport/sdk/src/sequence/sendTransaction.ts @@ -9,7 +9,7 @@ type EthSendTransactionParams = TransactionParams & { export const sendTransaction = async ({ params, sequenceSigner, - rpcProvider, + oxRpcProvider, relayerClient, guardianClient, walletAddress, @@ -22,7 +22,7 @@ export const sendTransaction = async ({ const { to, data } = await prepareAndSignTransaction({ transactionRequest, sequenceSigner, - rpcProvider, + oxRpcProvider, relayerClient, guardianClient, walletAddress, diff --git a/packages/passport/sdk/src/sequence/sequenceProvider.ts b/packages/passport/sdk/src/sequence/sequenceProvider.ts index 204938b54d..ed856692e9 100644 --- a/packages/passport/sdk/src/sequence/sequenceProvider.ts +++ b/packages/passport/sdk/src/sequence/sequenceProvider.ts @@ -23,6 +23,7 @@ import { MultiRollupApiClients } from '@imtbl/generated-clients'; import { SequenceSigner } from './index'; import { getChainConfig } from './chainConfig'; import GuardianClient from '../guardian'; +import { JsonRpcProvider } from 'ethers'; export type SequenceProviderInput = { authManager: AuthManager; @@ -56,7 +57,9 @@ export class SequenceProvider implements Provider { readonly #guardianClient: GuardianClient; - readonly #rpcProvider: OxProvider.Provider; + readonly #rpcProvider: JsonRpcProvider; + + readonly #oxRpcProvider: OxProvider.Provider; readonly #multiRollupApiClients: MultiRollupApiClients; @@ -89,10 +92,10 @@ export class SequenceProvider implements Provider { this.#chain = chain; const chainConfig = getChainConfig(chain); - // this.#rpcProvider = new JsonRpcProvider(chainConfig.rpcUrl, undefined, { - // staticNetwork: true, - // }); - this.#rpcProvider = OxProvider.from(RpcTransport.fromHttp(chainConfig.nodeUrl)); + this.#rpcProvider = new JsonRpcProvider(chainConfig.rpcUrl, undefined, { + staticNetwork: true, + }); + this.#oxRpcProvider = OxProvider.from(RpcTransport.fromHttp(chainConfig.nodeUrl)); this.#relayerClient = new SequenceRelayerClient({ config: this.#config }); @@ -190,6 +193,7 @@ export class SequenceProvider implements Provider { case 'eth_sendTransaction': { console.log(`sequence eth_sendTransaction ${this.userWalletAddress}`); const walletAddress = '0x3fadd1f6f02408c0fad35e362e3d5c65e722b67a';//this.userWalletAddress; + // const walletAddress = this.userWalletAddress; // const walletAddress = await this.#getWalletAddress(); if (!walletAddress) { @@ -206,7 +210,7 @@ export class SequenceProvider implements Provider { // return await sendTransaction({ // params: request.params || [], // sequenceSigner: this.#ethSigner, - // rpcProvider: this.#rpcProvider, + // oxRpcProvider: this.#oxRpcProvider, // relayerClient: this.#relayerClient, // guardianClient: this.#guardianClient, // walletAddress, @@ -220,7 +224,7 @@ export class SequenceProvider implements Provider { })(async () => await sendTransaction({ params: request.params || [], sequenceSigner: this.#ethSigner, - rpcProvider: this.#rpcProvider, + oxRpcProvider: this.#oxRpcProvider, relayerClient: this.#relayerClient, guardianClient: this.#guardianClient, walletAddress, @@ -240,12 +244,40 @@ export class SequenceProvider implements Provider { } } + // Pass through methods case 'eth_getBalance': + case 'eth_getCode': + case 'eth_getTransactionCount': { const [address, blockNumber] = request.params || []; - return this.#rpcProvider.request({ - method: request.method, - params: [address, blockNumber || 'latest'], - }); + 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( diff --git a/packages/passport/sdk/src/sequence/transactionHelpers.ts b/packages/passport/sdk/src/sequence/transactionHelpers.ts index 0324101c74..11167c5483 100644 --- a/packages/passport/sdk/src/sequence/transactionHelpers.ts +++ b/packages/passport/sdk/src/sequence/transactionHelpers.ts @@ -11,11 +11,10 @@ import AuthManager from '../authManager'; import { createStateProvider, createWalletConfig, saveWalletConfig, SEQUENCE_CONTEXT } from './signer/signerHelpers'; import GuardianClient, { convertBigNumberishToString } from '../guardian'; import { MetaTransaction } from '../zkEvm/types'; -import { signTypedDataV4 } from '../zkEvm/signTypedDataV4'; export type TransactionParams = { sequenceSigner: SequenceSigner; - rpcProvider: Provider.Provider; + oxRpcProvider: Provider.Provider; guardianClient: GuardianClient; relayerClient: SequenceRelayerClient; walletAddress: string; @@ -88,7 +87,7 @@ const createWallet = async ( export const prepareAndSignTransaction = async ({ transactionRequest, sequenceSigner, - rpcProvider, + oxRpcProvider, guardianClient, relayerClient, walletAddress, @@ -105,11 +104,11 @@ export const prepareAndSignTransaction = async ({ ); } - const chainId = await rpcProvider.request({ method: 'eth_chainId' }); + const chainId = await oxRpcProvider.request({ method: 'eth_chainId' }); const metaTransaction = await buildMetaTransaction( transactionRequest, - rpcProvider, + oxRpcProvider, walletAddress, nonceSpace, ); @@ -135,7 +134,7 @@ export const prepareAndSignTransaction = async ({ walletAddress, metaTransaction, authManager, - rpcProvider, + oxRpcProvider, sequenceSigner, chainId, flow, diff --git a/packages/passport/sdk/src/sequence/user/registerUser.ts b/packages/passport/sdk/src/sequence/user/registerUser.ts index 237a005182..9fa86d738a 100644 --- a/packages/passport/sdk/src/sequence/user/registerUser.ts +++ b/packages/passport/sdk/src/sequence/user/registerUser.ts @@ -4,13 +4,13 @@ import { MultiRollupApiClients } from '@imtbl/generated-clients'; import { getEip155ChainId } from '../walletHelpers'; import { JsonRpcError, RpcErrorCode } from '../../zkEvm/JsonRpcError'; import SequenceSigner from '../sequenceSigner'; -import { Provider } from 'ox'; +import { JsonRpcProvider } from 'ethers'; export type RegisterUserInput = { authManager: AuthManager; multiRollupApiClients: MultiRollupApiClients; accessToken: string; - rpcProvider: Provider.Provider; + rpcProvider: JsonRpcProvider; ethSigner: SequenceSigner; flow: Flow; }; @@ -42,25 +42,25 @@ export async function registerUser({ }); signMessagePromise.then(() => flow.addEvent('endSignRaw')); - const detectNetworkPromise = rpcProvider.request({ method: 'eth_chainId' }); + const detectNetworkPromise = rpcProvider.getNetwork(); detectNetworkPromise.then(() => flow.addEvent('endDetectNetwork')); const listChainsPromise = multiRollupApiClients.chainsApi.listChains(); listChainsPromise.then(() => flow.addEvent('endListChains')); - const [ethereumAddress, ethereumSignature, chainId, chainListResponse] = await Promise.all([ + const [ethereumAddress, ethereumSignature, network, chainListResponse] = await Promise.all([ getAddressPromise, signMessagePromise, detectNetworkPromise, listChainsPromise, ]); - const eipChainId = getEip155ChainId(Number(chainId)); + 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 ${chainId}`, + `Chain name does not exist on for chain id ${network.chainId}`, ); }