diff --git a/packages/checkout/sdk/package.json b/packages/checkout/sdk/package.json index 86f1365117..6b5dc5b101 100644 --- a/packages/checkout/sdk/package.json +++ b/packages/checkout/sdk/package.json @@ -17,7 +17,8 @@ "axios": "^1.6.5", "ethers": "^6.13.4", "semver": "^7.4.0", - "uuid": "^8.3.2" + "uuid": "^8.3.2", + "zod": "^4.0.17" }, "devDependencies": { "@swc/core": "^1.3.36", diff --git a/packages/checkout/sdk/src/api/blockscout/blockscout.test.ts b/packages/checkout/sdk/src/api/blockscout/blockscout.test.ts index b234f48a0f..c59d3ea576 100644 --- a/packages/checkout/sdk/src/api/blockscout/blockscout.test.ts +++ b/packages/checkout/sdk/src/api/blockscout/blockscout.test.ts @@ -1,5 +1,6 @@ /* eslint @typescript-eslint/naming-convention: off */ import { AxiosResponse, HttpStatusCode } from 'axios'; +import * as metrics from '@imtbl/metrics'; import { Blockscout } from './blockscout'; import { BlockscoutError, @@ -16,6 +17,57 @@ jest.mock('../http', () => ({ })), })); +jest.mock('@imtbl/metrics', () => ({ + trackError: jest.fn(), +})); + +const mockERC20Response = { + status: 200, + statusText: 'OK', + headers: {}, + config: {} as any, + data: + { + items: [ + { + token: { + address_hash: '0xF57e7e7C23978C3cAEC3C3548E3D615c346e79fF', + circulating_market_cap: '639486814.4877648', + decimals: '18', + exchange_rate: '0.568914', + holders_count: '71451', + icon_url: 'https://assets.coingecko.com', + name: 'Immutable X', + symbol: 'IMX', + total_supply: '2000000000000000000000000000', + type: 'ERC-20', + }, + token_id: null, + token_instance: null, + value: '3000000000000000000', + }, + { + token: { + address_hash: '0xF57e7e7C23978C3cAEC3C3548E3D615c346e77aB', + circulating_market_cap: '639486814.4877648', + decimals: '18', + exchange_rate: '0.568914', + holders_count: '71451', + icon_url: 'https://assets.coingecko.com', + name: 'Immutable X', + symbol: 'IMX', + total_supply: '8000000000000000000000000000', + type: 'ERC-20', + }, + token_id: null, + token_instance: null, + value: '6000000000000000000', + }, + ], + next_page_params: null, + }, +} as AxiosResponse; + describe('Blockscout', () => { let mockedHttpClient: jest.Mocked; afterEach(() => { @@ -39,53 +91,7 @@ describe('Blockscout', () => { describe('getTokensByWalletAddress', () => { it('success', async () => { - const mockResponse = { - status: 200, - statusText: 'OK', - headers: {}, - config: {} as any, - data: - { - items: [ - { - token: { - address_hash: '0xF57e7e7C23978C3cAEC3C3548E3D615c346e79fF', - circulating_market_cap: '639486814.4877648', - decimals: '18', - exchange_rate: '0.568914', - holders_count: '71451', - icon_url: 'https://assets.coingecko.com', - name: 'Immutable X', - symbol: 'IMX', - total_supply: '2000000000000000000000000000', - type: 'ERC-20', - }, - token_id: null, - token_instance: null, - value: '3000000000000000000', - }, - { - token: { - address_hash: '', - circulating_market_cap: '639486814.4877648', - decimals: '18', - exchange_rate: '0.568914', - holders_count: '71451', - icon_url: 'https://assets.coingecko.com', - name: 'Immutable X', - symbol: 'IMX', - total_supply: '8000000000000000000000000000', - type: 'ERC-20', - }, - token_id: null, - token_instance: null, - value: '6000000000000000000', - }, - ], - next_page_params: null, - }, - } as AxiosResponse; - mockedHttpClient.get.mockResolvedValueOnce(mockResponse); + mockedHttpClient.get.mockResolvedValueOnce(mockERC20Response); const token = BlockscoutTokenType.ERC20; const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET); @@ -96,11 +102,13 @@ describe('Blockscout', () => { }, ); - // should not contain native token data - expect(resp.items.length).toEqual(1); + expect(resp.items.length).toEqual(2); expect(resp.items[0].value).toEqual('3000000000000000000'); expect(resp.items[0].token.address).toEqual('0xF57e7e7C23978C3cAEC3C3548E3D615c346e79fF'); + expect(resp.items[1].value).toEqual('6000000000000000000'); + expect(resp.items[1].token.address).toEqual('0xF57e7e7C23978C3cAEC3C3548E3D615c346e77aB'); + expect(mockedHttpClient.get).toHaveBeenNthCalledWith( 1, `${client.url}/api/v2/addresses/0x1234567890/tokens?type=${token}`, @@ -108,15 +116,7 @@ describe('Blockscout', () => { }); it('success cached', async () => { - const mockResponse = { - status: 200, - data: - { - items: [], - next_page_params: null, - }, - } as AxiosResponse; - mockedHttpClient.get.mockResolvedValue(mockResponse); + mockedHttpClient.get.mockResolvedValue(mockERC20Response); const token = BlockscoutTokenType.ERC20; const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET); @@ -133,15 +133,7 @@ describe('Blockscout', () => { }); it('success zero TTL', async () => { - const mockResponse = { - status: 200, - data: - { - items: [], - next_page_params: null, - }, - } as AxiosResponse; - mockedHttpClient.get.mockResolvedValue(mockResponse); + mockedHttpClient.get.mockResolvedValue(mockERC20Response); const token = BlockscoutTokenType.ERC20; const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET, 0); @@ -156,11 +148,7 @@ describe('Blockscout', () => { }); it('success with pagination', async () => { - const mockResponse = { - status: 200, - data: {}, - } as AxiosResponse; - mockedHttpClient.get.mockResolvedValueOnce(mockResponse); + mockedHttpClient.get.mockResolvedValueOnce(mockERC20Response); const token = BlockscoutTokenType.ERC20; const nextPage = { @@ -180,11 +168,7 @@ describe('Blockscout', () => { }); it('success with no pagination', async () => { - const mockResponse = { - status: 200, - data: {}, - } as AxiosResponse; - mockedHttpClient.get.mockResolvedValueOnce(mockResponse); + mockedHttpClient.get.mockResolvedValueOnce(mockERC20Response); const token = BlockscoutTokenType.ERC20; const nextPage = null; @@ -198,12 +182,12 @@ describe('Blockscout', () => { }); it('fails 400', async () => { - const mockResponse = { + const mock400Response = { status: HttpStatusCode.BadRequest, statusText: 'error', data: {}, } as AxiosResponse; - mockedHttpClient.get.mockResolvedValueOnce(mockResponse); + mockedHttpClient.get.mockResolvedValueOnce(mock400Response); const token = BlockscoutTokenType.ERC20; const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET); @@ -217,12 +201,12 @@ describe('Blockscout', () => { }); it('fails 500', async () => { - const mockResponse = { + const mock500Response = { status: HttpStatusCode.InternalServerError, statusText: 'error', data: {}, } as AxiosResponse; - mockedHttpClient.get.mockResolvedValueOnce(mockResponse); + mockedHttpClient.get.mockResolvedValueOnce(mock500Response); const token = BlockscoutTokenType.ERC20; const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET); @@ -248,6 +232,131 @@ describe('Blockscout', () => { expect((error as BlockscoutError).message).toEqual('InternalServerError'); } }); + + it('skips validation for non-2xx responses', async () => { + // Mock a 400 response with invalid data structure that would fail validation + const mock400Response = { + status: HttpStatusCode.BadRequest, + statusText: 'Bad Request', + data: { error: 'Invalid request' }, // This doesn't match BlockscoutERC20Response schema + } as AxiosResponse; + mockedHttpClient.get.mockRejectedValueOnce(mock400Response); + + const token = BlockscoutTokenType.ERC20; + const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET); + + await expect( + client.getTokensByWalletAddress({ + walletAddress: '0x1234567890', + tokenType: token, + }), + ).rejects.toMatchObject({ + code: HttpStatusCode.InternalServerError, + }); + }); + + it('calls trackError and returns data when 2xx response fails validation', async () => { + // Mock a 200 response with invalid data structure that will fail validation + const mockInvalidResponse = { + status: 200, + statusText: 'OK', + data: { + items: [ + { + token: { + address: '0xF57e7e7C23978C3cAEC3C3548E3D615c346e79fF', // incorrect field name + circulating_market_cap: '639486814.4877648', + decimals: '18', + exchange_rate: '0.569', + holders: '123456', // incorrect field name + icon_url: 'https://example.com/icon.png', + name: 'Test Token', + symbol: 'TEST', + total_supply: '1000000000000000000000000', + type: 'ERC-20', + extra_field: 'this is not in the schema', + another_unexpected_field: { nested: 'object' }, + }, + token_id: null, + token_instance: null, + value: '1000000000000000000', + }, + ], + next_page_params: null, + }, + } as AxiosResponse; + mockedHttpClient.get.mockResolvedValueOnce(mockInvalidResponse); + + const token = BlockscoutTokenType.ERC20; + const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET); + + const result = await client.getTokensByWalletAddress({ + walletAddress: '0x1234567890', + tokenType: token, + }); + + // Should call trackError for validation failure + expect(metrics.trackError).toHaveBeenCalledWith( + 'checkout', + 'blockscout_response_validation_failed', + expect.any(Error), + ); + + // Should still return the raw response data without throwing + expect(result).toEqual({ items: [], next_page_params: null }); + }); + + it('handles valid response with extra properties', async () => { + // Mock a 200 response with valid structure but extra unexpected property + const mockResponseWithExtraProperty = { + status: 200, + statusText: 'OK', + data: { + items: [ + { + token: { + address_hash: '0xF57e7e7C23978C3cAEC3C3548E3D615c346e79fF', + circulating_market_cap: '639486814.4877648', + decimals: '18', + exchange_rate: '0.569', + holders_count: '123456', + icon_url: 'https://example.com/icon.png', + name: 'Test Token', + symbol: 'TEST', + total_supply: '1000000000000000000000000', + type: 'ERC-20', + extra_field: 'this is not in the schema', + another_unexpected_field: { nested: 'object' }, + }, + token_id: null, + token_instance: null, + value: '1000000000000000000', + }, + ], + next_page_params: null, + }, + } as AxiosResponse; + mockedHttpClient.get.mockResolvedValueOnce(mockResponseWithExtraProperty); + + const token = BlockscoutTokenType.ERC20; + const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET); + + const result = await client.getTokensByWalletAddress({ + walletAddress: '0x1234567890', + tokenType: token, + }); + + // trackError should NOT be called - validation should pass with extra properties stripped + expect(metrics.trackError).not.toHaveBeenCalled(); + + // Should return processed data with extra properties removed + expect(result).toHaveProperty('items'); + expect(result).toHaveProperty('next_page_params'); + expect(result.items).toHaveLength(1); + + // Should contain normalized token data (address_hash -> address) + expect(result.items[0].token).toHaveProperty('address', '0xF57e7e7C23978C3cAEC3C3548E3D615c346e79fF'); + }); }); describe('getNativeTokenByWalletAddress', () => { @@ -371,5 +480,56 @@ describe('Blockscout', () => { expect((error as BlockscoutError).message).toEqual('InternalServerError'); } }); + + it('calls trackError and returns data when 2xx response fails validation', async () => { + // Mock a 200 response with invalid data structure that will fail validation + const mockInvalidResponse = { + status: 200, + statusText: 'OK', + data: { balance: '55290000000000000000' }, // Wrong field name - should be 'coin_balance' + } as AxiosResponse; + mockedHttpClient.get.mockResolvedValueOnce(mockInvalidResponse); + + const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET); + + const result = await client.getNativeTokenByWalletAddress({ + walletAddress: '0x1234567890', + }); + + // Should call trackError for validation failure + expect(metrics.trackError).toHaveBeenCalledWith( + 'checkout', + 'blockscout_response_validation_failed', + expect.any(Error), + ); + + expect(result.value).toEqual(undefined); + }); + + it('handles valid response with extra properties', async () => { + // Mock a 200 response with valid structure but extra unexpected properties + const mockResponseWithExtraProperty = { + status: 200, + statusText: 'OK', + data: { + coin_balance: '55290000000000000000', + hash: '0x933d4CE1B6334d2Ede312765Dc31e3105CA28e31', // Extra property + extra_field: 'this should be ignored', // Extra property + }, + } as AxiosResponse; + mockedHttpClient.get.mockResolvedValueOnce(mockResponseWithExtraProperty); + + const client = new Blockscout(mockedHttpClient, ChainId.IMTBL_ZKEVM_TESTNET); + + const result = await client.getNativeTokenByWalletAddress({ + walletAddress: '0x1234567890', + }); + + // trackError should NOT be called - validation should pass with extra properties stripped + expect(metrics.trackError).not.toHaveBeenCalled(); + + // Verify the coin_balance was used correctly + expect(result.value).toBe('55290000000000000000'); + }); }); }); diff --git a/packages/checkout/sdk/src/api/blockscout/blockscout.ts b/packages/checkout/sdk/src/api/blockscout/blockscout.ts index 362a000faf..57f93cd834 100644 --- a/packages/checkout/sdk/src/api/blockscout/blockscout.ts +++ b/packages/checkout/sdk/src/api/blockscout/blockscout.ts @@ -3,10 +3,15 @@ import axios, { AxiosResponse, HttpStatusCode, } from 'axios'; +import { z } from 'zod'; +import { trackError } from '@imtbl/metrics'; import { ChainId } from '../../types'; import { + BlockscoutNativeResponse, + BlockscoutNativeResponseSchema, BlockscoutERC20Response, BlockscoutERC20ResponseItem, + BlockscoutERC20ResponseSchema, BlockscoutNativeTokenData, BlockscoutToken, BlockscoutTokenData, @@ -77,6 +82,46 @@ export class Blockscout { this.ttl = ttl !== undefined ? ttl : CACHE_DATA_TTL; } + /** + * Generic HTTP GET method with schema validation and caching + * @param url The URL to fetch from + * @param schema Zod schema to validate the response + * @returns Promise with validated and typed response data + */ + private async httpGet(url: string, schema: z.ZodSchema): Promise { + try { + // Cache response data to prevent unnecessary requests + const cached = this.getCache(url); + if (cached) return Promise.resolve(cached); + + // success if 2XX response otherwise throw error + const response: AxiosResponse = await this.httpClient.get(url); + + // Only validate response structure for successful responses (2xx) + if (response.status >= 200 && response.status < 300) { + try { + const validatedData = schema.parse(response.data); + this.setCache(url, validatedData); + return Promise.resolve(validatedData); + } catch (validationError: any) { + trackError('checkout', 'blockscout_response_validation_failed', validationError); + return Promise.resolve(response.data); + } + } + + // For non-2xx responses, return data without validation + return Promise.resolve(response.data); + } catch (err: any) { + let code: number = HttpStatusCode.InternalServerError; + let message = 'InternalServerError'; + if (axios.isAxiosError(err)) { + code = (err as AxiosError).response?.status || code; + message = (err as AxiosError).message; + } + return Promise.reject({ code, message }); + } + } + /** * isChainSupported verifies if the chain is supported by Blockscout * @param chainId @@ -101,57 +146,43 @@ export class Blockscout { tokenType: BlockscoutTokenType, nextPage?: BlockscoutTokenPagination | null }): Promise { - try { - let url = `${this.url}/api/v2/addresses/${params.walletAddress}/tokens?type=${params.tokenType}`; - if (params.nextPage) url += `&${new URLSearchParams(params.nextPage as Record)}`; - - // Cache response data to prevent unnecessary requests - const cached = this.getCache(url); - if (cached) return Promise.resolve(cached); + let url = `${this.url}/api/v2/addresses/${params.walletAddress}/tokens?type=${params.tokenType}`; + if (params.nextPage) url += `&${new URLSearchParams(params.nextPage as Record)}`; + + // Use the generic httpGet method with schema validation + const response = await this.httpGet(url, BlockscoutERC20ResponseSchema); + + // blockscout changed their API to return address_hash instead of address + // map the address_hash to address field so that any further consumer is not affected by the change + const normalizedItems: BlockscoutToken[] = response.items?.map( + (item: BlockscoutERC20ResponseItem) => { + const token: BlockscoutTokenData = { + ...item.token, + icon_url: item.token.icon_url ?? '', + address: item.token.address_hash, + holders: item.token.holders_count, + }; + + return { + ...item, + token, + }; + }, + ) || []; + + // To get around an issue with native tokens being an ERC-20, there is the need + // to remove IMX from `resp` and add it back in using getNativeTokenByWalletAddress. + // This has affected some of the early wallets, and it might not be an issue in mainnet + // however, let's enforce it. + const data = { + items: normalizedItems.filter( + (token: BlockscoutToken) => token.token.address && token.token.address !== this.nativeToken.address, + ), + // eslint-disable-next-line @typescript-eslint/naming-convention + next_page_params: response.next_page_params, + }; - // success if 2XX response otherwise throw error - const response: AxiosResponse = await this.httpClient.get(url); - - // blockscout changed their API to return address_hash instead of address - // map the address_hash to address field so that any further consumer is not affected by the change - const normalizedItems: BlockscoutToken[] = response.data?.items?.map( - (item: BlockscoutERC20ResponseItem) => { - const token: BlockscoutTokenData = { - ...item.token, - address: item.token.address_hash, - holders: item.token.holders_count, - }; - - return { - ...item, - token, - }; - }, - ) || []; - - // To get around an issue with native tokens being an ERC-20, there is the need - // to remove IMX from `resp` and add it back in using getNativeTokenByWalletAddress. - // This has affected some of the early wallets, and it might not be an issue in mainnet - // however, let's enforce it. - const data = { - items: normalizedItems.filter( - (token: BlockscoutToken) => token.token.address && token.token.address !== this.nativeToken.address, - ), - // eslint-disable-next-line @typescript-eslint/naming-convention - next_page_params: response.data?.next_page_params, - }; - - this.setCache(url, data); - return Promise.resolve(data); - } catch (err: any) { - let code: number = HttpStatusCode.InternalServerError; - let message = 'InternalServerError'; - if (axios.isAxiosError(err)) { - code = (err as AxiosError).response?.status || code; - message = (err as AxiosError).message; - } - return Promise.reject({ code, message }); - } + return Promise.resolve(data); } /** @@ -160,30 +191,16 @@ export class Blockscout { * @returns list of tokens given the wallet address and the token types */ public async getNativeTokenByWalletAddress(params: { walletAddress: string, }): Promise { - try { - const url = `${this.url}/api/v2/addresses/${params.walletAddress}`; - - // Cache response data to prevent unnecessary requests - const cached = this.getCache(url); - if (cached) return Promise.resolve(cached); + const url = `${this.url}/api/v2/addresses/${params.walletAddress}`; - const response = await this.httpClient.get(url); // success if 2XX response otherwise throw error + // Use the generic httpGet method with schema validation + const response = await this.httpGet(url, BlockscoutNativeResponseSchema); - const data = { - token: this.nativeToken, - value: response.data.coin_balance, - }; + const data = { + token: this.nativeToken, + value: response.coin_balance, + }; - this.setCache(url, data); - return Promise.resolve(data); - } catch (err: any) { - let code: number = HttpStatusCode.InternalServerError; - let message = 'InternalServerError'; - if (axios.isAxiosError(err)) { - code = (err as AxiosError).response?.status || code; - message = (err as AxiosError).message; - } - return Promise.reject({ code, message }); - } + return Promise.resolve(data); } } diff --git a/packages/checkout/sdk/src/api/blockscout/blockscoutType.ts b/packages/checkout/sdk/src/api/blockscout/blockscoutType.ts index 7a778ef368..c35da74f3d 100644 --- a/packages/checkout/sdk/src/api/blockscout/blockscoutType.ts +++ b/packages/checkout/sdk/src/api/blockscout/blockscoutType.ts @@ -1,6 +1,7 @@ /* eslint @typescript-eslint/naming-convention: off */ import { HttpStatusCode } from 'axios'; +import { z } from 'zod'; export enum BlockscoutTokenType { ERC20 = 'ERC-20', @@ -18,10 +19,10 @@ export interface BlockscoutERC20ResponseItem { name: string symbol: string holders_count: string - circulating_market_cap: string - exchange_rate: string + circulating_market_cap: string | null + exchange_rate: string | null total_supply: string - icon_url: string; + icon_url: string | null type: BlockscoutTokenType } value: string @@ -62,3 +63,48 @@ export interface BlockscoutNativeTokenData { name: string symbol: string } + +// Zod schemas for runtime validation +export const BlockscoutTokenTypeSchema = z.enum(BlockscoutTokenType); + +export const BlockscoutTokenPaginationSchema = z.record( + z.string(), + z.union([z.string(), z.number(), z.null()]), +).nullable(); + +export const BlockscoutERC20ResponseItemTokenSchema = z.object({ + address_hash: z.string().refine( + (val) => val.startsWith('0x'), + { message: 'address_hash must start with \'0x\'' }, + ), + decimals: z.string(), + name: z.string(), + symbol: z.string(), + holders_count: z.string(), + circulating_market_cap: z.string().nullable(), + exchange_rate: z.string().nullable(), + total_supply: z.string(), + icon_url: z.string().nullable(), + type: BlockscoutTokenTypeSchema, +}); + +export const BlockscoutERC20ResponseItemSchema = z.object({ + token: BlockscoutERC20ResponseItemTokenSchema, + value: z.string(), + token_id: z.string().nullable(), + token_instance: z.string().nullable(), +}); + +export const BlockscoutERC20ResponseSchema = z.object({ + items: z.array(BlockscoutERC20ResponseItemSchema), + next_page_params: BlockscoutTokenPaginationSchema, +}); + +export interface BlockscoutNativeResponse { + coin_balance: string; +} + +export const BlockscoutNativeResponseSchema = z.object({ + // eslint-disable-next-line @typescript-eslint/naming-convention + coin_balance: z.string(), +}); diff --git a/packages/passport/sdk-sample-app/.eslintrc.json b/packages/passport/sdk-sample-app/.eslintrc.json index 7bb36de407..c808cc5003 100644 --- a/packages/passport/sdk-sample-app/.eslintrc.json +++ b/packages/passport/sdk-sample-app/.eslintrc.json @@ -1,6 +1,6 @@ { + "root": true, "extends": [ - "../../../.eslintrc", "next/core-web-vitals" ], "parser": "@typescript-eslint/parser", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a489876bd4..b7ff785555 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.20(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.4.9(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) @@ -1020,7 +1020,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) + 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) @@ -1072,6 +1072,9 @@ importers: uuid: specifier: ^8.3.2 version: 8.3.2 + zod: + specifier: ^4.0.17 + version: 4.0.17 devDependencies: '@swc/core': specifier: ^1.3.36 @@ -1099,7 +1102,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 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-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -1805,7 +1808,7 @@ importers: version: 18.15.13 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 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)) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1845,13 +1848,13 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 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-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) 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))(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) 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) @@ -1992,7 +1995,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) + 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) @@ -2050,7 +2053,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) + 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) @@ -2314,7 +2317,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) + 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) @@ -2375,7 +2378,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) + 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) @@ -4364,18 +4367,18 @@ packages: resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} - '@imtbl/blockchain-data@2.1.11': - resolution: {integrity: sha512-FZtCxgBoDwNONdbLT61MiOzTG1+rMHC/Zt3ed0K79elISf73/v65SzhyHgumngOWkcUs25TiHw+jm2uU52JyBw==} + '@imtbl/blockchain-data@2.4.9': + resolution: {integrity: sha512-sC5JxmzkL5bH6BfIlZv1H2GxqqwH0Lk7rI3AiMhMvJazLFCbv9ESnziUc7RYyWCJM6wTjZCO05rUjmIZOBfu9w==} - '@imtbl/bridge-sdk@2.1.11': - resolution: {integrity: sha512-EaXeMG+Ge17CT089wHipwYoJsGz/EeCLcEztTgIYpijA6R+4wb/jOtwnoCnOAWLHJE4Ep7wi366Xf7be5jTJWQ==} + '@imtbl/bridge-sdk@2.4.9': + resolution: {integrity: sha512-qvw9VdJFbI6fFd5/r2MY6eLPy3TvZ4d1z5Xf4m0itI2NmkGbmPjxbGRU3zOEU9q7sgNSyxTeu9yulLSyskmVUg==} engines: {node: '>=20.11.0'} - '@imtbl/checkout-sdk@2.1.11': - resolution: {integrity: sha512-8PvuLX7T/3fGygug6fGGnAWRXFHpXkzV3wHgBcBekOe4K16Dl1wobgzyHoal6K90N/LId/ox38Hu3gPwe/yR6Q==} + '@imtbl/checkout-sdk@2.4.9': + resolution: {integrity: sha512-d4NYLm9n8wQDdOyjiLnvV7E3EZbD9LQfgHqCRzjWUUlbU8lMwvqbymb0UJvQOgCNzA/TJXwr/hKtoT2CzhIlHA==} - '@imtbl/config@2.1.11': - resolution: {integrity: sha512-6qJ579F6teAGn8Rsdi+lIHejh4KoyYoG5QPiykMwFV+vbX7rok4pT6cNkNDLHFu/ZGcNMP+w5+W3vzaOnG0pcQ==} + '@imtbl/config@2.4.9': + resolution: {integrity: sha512-qEtolbKaWKzZFWyLFt9FrP04jvy3OQRZzjpWDFe/dSNL9oYBng1ths+k1KRRLLdEobZ6iDm1zLiFDO05Slv1Mg==} engines: {node: '>=20.11.0'} '@imtbl/contracts@2.2.17': @@ -4384,51 +4387,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.4.9': + resolution: {integrity: sha512-Zg4MpBX+g/da1DZoZhzMcD3XwQZYmCVpqBDlbYQP8zd5mcaPtsWtOeI9IlyRAivdC6R8KpUHcXEWQTDEKtVcIQ==} engines: {node: '>=20.11.0'} - '@imtbl/generated-clients@2.1.11': - resolution: {integrity: sha512-r0xEwQiLYE9hOYCB/q37yPIkREpvRF+JeqQ3tXELQcqMwgH7Rb30ISAN2dMuxXMgvLa9pG2P9rSEisQXLemjJQ==} + '@imtbl/generated-clients@2.4.9': + resolution: {integrity: sha512-FNDuUBXbhJCkqirfl6Kzr4FmHwsKT37d9yz6jmqs83Dak/85Vth6qXh01BIdWZmRRc3+XAD5mUEUjxRRhCVeCA==} 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.4.9': + resolution: {integrity: sha512-ozR9fJxjOUAM+ojf+D5Gph8WJVUo8yn2qI/Amezd0GIIuOmMsuLavaLgGluF30xsDp4xYpV0/9yyYul1zJ1qwg==} engines: {node: '>=20.11.0'} - '@imtbl/minting-backend@2.1.11': - resolution: {integrity: sha512-SgfOT+4nDMAxj5dq0pIrPyaXZ5fhUVgbfOGDoYGJd6x8jJ7utADFemLWWxZHII1/gTe5hg3xSkYR7uluzxvv+Q==} + '@imtbl/minting-backend@2.4.9': + resolution: {integrity: sha512-jI5A8Fin7cmTmkODXqGVaPRJ4tEXG/tCNzzco7Omue9qiQvIx+2U02jhDJAbIVtK5kY27B9T4ioBp5YqgcbitQ==} - '@imtbl/orderbook@2.1.11': - resolution: {integrity: sha512-QKt+oc0AU4kQYCzRSBc0BRwkioZ30cfsmqzthtKU4OLg8H2ngjtt7qN9f6fylflJfHCI3T8spMJPvurH9qsK+w==} + '@imtbl/orderbook@2.4.9': + resolution: {integrity: sha512-NVqyrmVm9Jf6M4M1Jm8dQ48MriUZuHbrDdy3/y6EPPrjxyzj7H2CTrwDnF87q0UuVk158T8bwiJMTyW2xBbsIw==} - '@imtbl/passport@2.1.11': - resolution: {integrity: sha512-62bc8Dn/RwLJBQtGC8rR+UJ9wEPNUr1z9OlOK/YOezHR2RR9EAVyXaDkhquCN4LkZuw+iqYbu2OWWJ0ST3K8Eg==} + '@imtbl/passport@2.4.9': + resolution: {integrity: sha512-UL2EKW5l5Sq+TLAFs8l0TexbRq6fVPae62bq42Pwr4ETuifoVHsbIfD4wP5hXm5ufKn/R9Vjl7Snrfh2KtWctA==} engines: {node: '>=20.11.0'} '@imtbl/react-analytics@0.3.2-alpha': resolution: {integrity: sha512-HQuVby8XK3koyphtKmBVtezN86xhkshaP+VJgKxDgGhYzVkNbKOffLrtSapCqWB/0v5THmsahLVq0xIWQM67RA==} - '@imtbl/sdk@2.1.11': - resolution: {integrity: sha512-w3oYF+THX6kL3kV/gRsAa9ca18QXb66jlGUPt//rEwOqu6M2mcpWb5V4R+SzR/gKp79OuSCzkPFKYF7kNqQOJw==} + '@imtbl/sdk@2.4.9': + resolution: {integrity: sha512-206tVePFcYP+ZEQCj9mmJcAZyBWeAAUCFJpMxq5W2O56uPWzfZ1B45n7eHH07eFNIfH2fqRhXilHZZKHOcG2Qg==} engines: {node: '>=20.0.0'} - '@imtbl/toolkit@2.1.11': - resolution: {integrity: sha512-krQRFKF+UL7qDca2eWBwRwDLWv0p+JlNs/bCO8q9xvv5gOkUvTplbm0hA+SfTsacboDJ13MekN96n83TRvvCPg==} + '@imtbl/toolkit@2.4.9': + resolution: {integrity: sha512-ZD7S97MA/QJhHrW0HEyfHq3NKDxq1+6rFTwPHh/dXE3wKOdUecaMeikeOlvb7Plq/Ghl3SZRt5jfvF8AtpxCKg==} engines: {node: '>=20.11.0'} - '@imtbl/webhook@2.1.11': - resolution: {integrity: sha512-0uoXONxwroH1VYuNwKbqxxyLE83EZRZSUz1Gvya7uZk4RG8vAmSFqsPnEfqca64B4SYePoa0qeu0Bq8+P24AJg==} + '@imtbl/webhook@2.4.9': + resolution: {integrity: sha512-XBYN/Z8orhQVAMn4nGV4YjvidJUfGUnESHLTa3Ii7Y4UT7KMHEN9+uDV5E/LvCo8Tdf5ZVvd7thxtzDbI6BiGw==} - '@imtbl/x-client@2.1.11': - resolution: {integrity: sha512-HLYbj6dqfFvry5xfI1d+Q2GF+w5w9UTmAD4G29vTW6rsQQGXeBtJE5R8foY+c1OIz4+kDuTZrrfXxiGnkQ4DRQ==} + '@imtbl/x-client@2.4.9': + resolution: {integrity: sha512-l8DevYDIpouR9RI6ljdlp6V9S8ik/aB1Q+bAhfe2c4vZkSpSJITDPXE1j2SpF8c0d4CUaQnR4ASt4lOYN+5GPA==} engines: {node: '>=20.11.0'} - '@imtbl/x-provider@2.1.11': - resolution: {integrity: sha512-MdAv353DLWJf2S4JeBJpbLsfDbBjRcEc7baLTLxZUesfVTO6Mh0KLvuZ2U0vPtyOv37rG0oeXzcmWaq8a3CGgQ==} + '@imtbl/x-provider@2.4.9': + resolution: {integrity: sha512-vtEOZ0s7+ZreDtXwQIJxRCc0sj7Ikw0/S6BKIW1gOF2qnwR4mBH/hRIDnnZ/NyHkBkfr5H8/kAjLCRN0sJzGpQ==} engines: {node: '>=20.11.0'} '@ioredis/commands@1.2.0': @@ -4718,9 +4721,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==} @@ -7588,6 +7588,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 +7630,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 +7643,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==} @@ -10081,8 +10084,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.20: + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} peerDependencies: eslint: '>=8.40' @@ -13348,10 +13351,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'} @@ -17121,6 +17120,9 @@ packages: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} + zod@4.0.17: + resolution: {integrity: sha512-1PHjlYRevNxxdy2JZ8JcNAw7rX8V9P1AKkP+x/xZfxB0K5FYfuV+Ug6P/6NVSR2jHQ+FzDDoDHS04nYUsOIyLQ==} + zustand@4.4.1: resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} @@ -20041,17 +20043,17 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} - '@imtbl/blockchain-data@2.1.11': + '@imtbl/blockchain-data@2.4.9': dependencies: - '@imtbl/config': 2.1.11 - '@imtbl/generated-clients': 2.1.11 + '@imtbl/config': 2.4.9 + '@imtbl/generated-clients': 2.4.9 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.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.1.11 + '@imtbl/config': 2.4.9 '@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 +20063,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.4.9(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.4.9 + '@imtbl/bridge-sdk': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/config': 2.4.9 + '@imtbl/dex-sdk': 2.4.9(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.4.9 + '@imtbl/metrics': 2.4.9 + '@imtbl/orderbook': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/passport': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metamask/detect-provider': 2.0.0 axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20083,9 +20085,9 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/config@2.1.11': + '@imtbl/config@2.4.9': dependencies: - '@imtbl/metrics': 2.1.11 + '@imtbl/metrics': 2.4.9 transitivePeerDependencies: - debug @@ -20132,12 +20134,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.4.9(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.4.9 '@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 +20147,7 @@ snapshots: - hardhat - utf-8-validate - '@imtbl/generated-clients@2.1.11': + '@imtbl/generated-clients@2.4.9': dependencies: axios: 1.7.7 transitivePeerDependencies: @@ -20155,7 +20157,7 @@ snapshots: dependencies: buffer: 6.0.3 - '@imtbl/metrics@2.1.11': + '@imtbl/metrics@2.4.9': dependencies: axios: 1.7.7 global-const: 0.1.2 @@ -20163,13 +20165,13 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/minting-backend@2.1.11': + '@imtbl/minting-backend@2.4.9': 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.4.9 + '@imtbl/config': 2.4.9 + '@imtbl/generated-clients': 2.4.9 + '@imtbl/metrics': 2.4.9 + '@imtbl/webhook': 2.4.9 uuid: 8.3.2 optionalDependencies: pg: 8.11.5 @@ -20178,10 +20180,10 @@ snapshots: - debug - pg-native - '@imtbl/orderbook@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/orderbook@2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.1.11 - '@imtbl/metrics': 2.1.11 + '@imtbl/config': 2.4.9 + '@imtbl/metrics': 2.4.9 '@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 +20194,17 @@ snapshots: - debug - utf-8-validate - '@imtbl/passport@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/passport@2.4.9(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/config': 2.4.9 + '@imtbl/generated-clients': 2.4.9 + '@imtbl/metrics': 2.4.9 + '@imtbl/toolkit': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-provider': 2.4.9(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 +20213,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 +20228,17 @@ snapshots: - encoding - supports-color - '@imtbl/sdk@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/sdk@2.4.9(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.4.9 + '@imtbl/checkout-sdk': 2.4.9(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.4.9 + '@imtbl/minting-backend': 2.4.9 + '@imtbl/orderbook': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/passport': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/webhook': 2.4.9 + '@imtbl/x-client': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-provider': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -20245,35 +20247,35 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/toolkit@2.1.11(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/toolkit@2.4.9(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.4.9(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 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.4.9': dependencies: - '@imtbl/config': 2.1.11 - '@imtbl/generated-clients': 2.1.11 + '@imtbl/config': 2.4.9 + '@imtbl/generated-clients': 2.4.9 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.4.9(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.4.9 + '@imtbl/generated-clients': 2.4.9 axios: 1.7.7 bn.js: 5.2.1 elliptic: 6.6.1 @@ -20285,19 +20287,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.4.9(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.4.9 + '@imtbl/generated-clients': 2.4.9 + '@imtbl/toolkit': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.4.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@magic-ext/oidc': 12.0.5 '@metamask/detect-provider': 2.0.0 axios: 1.7.7 enc-utils: 3.0.0 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) magic-sdk: 29.0.5 - oidc-client-ts: 2.4.0 + oidc-client-ts: 3.3.0 transitivePeerDependencies: - bufferutil - debug @@ -20978,8 +20980,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)': @@ -24730,6 +24730,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': {} @@ -24763,6 +24774,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 @@ -27896,7 +27920,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@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 @@ -27907,13 +27931,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@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@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) @@ -27927,8 +27951,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) @@ -27947,7 +27971,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) @@ -27966,7 +27990,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) @@ -27983,8 +28007,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) @@ -28001,8 +28025,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) @@ -28050,7 +28074,7 @@ snapshots: 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-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(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) @@ -28080,25 +28104,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 @@ -28121,17 +28127,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@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 @@ -28158,7 +28153,34 @@ snapshots: 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 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.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-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) + 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@8.57.0)(typescript@5.6.2))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -28297,7 +28319,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react-refresh@0.4.19(eslint@8.57.0): + eslint-plugin-react-refresh@0.4.20(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -29647,6 +29669,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 @@ -30701,27 +30728,6 @@ snapshots: - ts-node - utf-8-validate - jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): - dependencies: - '@jest/core': 29.7.0(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/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - 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)) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 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)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest-cli@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)): dependencies: '@jest/core': 29.7.0(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)) @@ -30764,27 +30770,6 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): - dependencies: - '@jest/core': 29.7.0(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/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.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)) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.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)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest-cli@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)): dependencies: '@jest/core': 29.7.0(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)) @@ -31880,20 +31865,6 @@ snapshots: - ts-node - utf-8-validate - jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): - dependencies: - '@jest/core': 29.7.0(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/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - 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)): dependencies: '@jest/core': 29.7.0(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)) @@ -31922,20 +31893,6 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): - dependencies: - '@jest/core': 29.7.0(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/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - 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)): dependencies: '@jest/core': 29.7.0(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)) @@ -33482,11 +33439,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 @@ -36835,12 +36787,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 @@ -38166,6 +38118,8 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 + zod@4.0.17: {} + zustand@4.4.1(@types/react@18.3.12)(immer@9.0.21)(react@18.3.1): dependencies: use-sync-external-store: 1.2.0(react@18.3.1)