From 00794cf670fac5a7f5365e03d1911ff46b16b98d Mon Sep 17 00:00:00 2001 From: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Date: Sun, 13 Apr 2025 12:37:27 +0700 Subject: [PATCH 01/55] Add .circleci/config.yml --- .circleci/config.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000..62291703e2 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,31 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/configuration-reference +version: 2.1 + +# Define a job to be invoked later in a workflow. +# See: https://circleci.com/docs/jobs-steps/#jobs-overview & https://circleci.com/docs/configuration-reference/#jobs +jobs: + say-hello: + # Specify the execution environment. You can specify an image from Docker Hub or use one of our convenience images from CircleCI's Developer Hub. + # See: https://circleci.com/docs/executor-intro/ & https://circleci.com/docs/configuration-reference/#executor-job + docker: + # Specify the version you desire here + # See: https://circleci.com/developer/images/image/cimg/base + - image: cimg/base:current + + # Add steps to the job + # See: https://circleci.com/docs/jobs-steps/#steps-overview & https://circleci.com/docs/configuration-reference/#steps + steps: + # Checkout the code as the first step. + - checkout + - run: + name: "Say hello" + command: "echo Hello, World!" + +# Orchestrate jobs using workflows +# See: https://circleci.com/docs/workflows/ & https://circleci.com/docs/configuration-reference/#workflows +workflows: + say-hello-workflow: # This is the name of the workflow, feel free to change it to better match your workflow. + # Inside the workflow, you define the jobs you want to run. + jobs: + - say-hello \ No newline at end of file From 513a7328f0c088b9aec89681e7e0b0810dfa7f99 Mon Sep 17 00:00:00 2001 From: Alissa Crane Date: Mon, 14 Apr 2025 09:20:53 -0700 Subject: [PATCH 02/55] chore: add context exports (#2261) --- packages/onchainkit/src/buy/index.ts | 1 + packages/onchainkit/src/checkout/index.ts | 1 + packages/onchainkit/src/earn/index.ts | 1 - packages/onchainkit/src/swap/index.ts | 1 + packages/onchainkit/src/transaction/index.ts | 1 + packages/onchainkit/src/wallet/index.ts | 5 ++++- 6 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/onchainkit/src/buy/index.ts b/packages/onchainkit/src/buy/index.ts index bed8f927a9..25fda14a14 100644 --- a/packages/onchainkit/src/buy/index.ts +++ b/packages/onchainkit/src/buy/index.ts @@ -1,2 +1,3 @@ // 🌲☀🌲 export { Buy } from './components/Buy'; +export { useBuyContext } from './components/BuyProvider'; diff --git a/packages/onchainkit/src/checkout/index.ts b/packages/onchainkit/src/checkout/index.ts index 70f8df5f6b..de051a286b 100644 --- a/packages/onchainkit/src/checkout/index.ts +++ b/packages/onchainkit/src/checkout/index.ts @@ -7,3 +7,4 @@ export type { CheckoutReact, CheckoutStatusReact, } from './types'; +export { useCheckoutContext } from './components/CheckoutProvider'; diff --git a/packages/onchainkit/src/earn/index.ts b/packages/onchainkit/src/earn/index.ts index fdcf42f956..09945ca182 100644 --- a/packages/onchainkit/src/earn/index.ts +++ b/packages/onchainkit/src/earn/index.ts @@ -2,7 +2,6 @@ // Components export { Earn } from './components/Earn'; -export { EarnProvider } from './components/EarnProvider'; export { EarnDeposit } from './components/EarnDeposit'; export { EarnWithdraw } from './components/EarnWithdraw'; export { EarnDetails } from './components/EarnDetails'; diff --git a/packages/onchainkit/src/swap/index.ts b/packages/onchainkit/src/swap/index.ts index 5941473986..c18d5c0b82 100644 --- a/packages/onchainkit/src/swap/index.ts +++ b/packages/onchainkit/src/swap/index.ts @@ -11,6 +11,7 @@ export { SwapSettingsSlippageInput } from './components/SwapSettingsSlippageInpu export { SwapSettingsSlippageTitle } from './components/SwapSettingsSlippageTitle'; export { SwapToast } from './components/SwapToast'; export { SwapToggleButton } from './components/SwapToggleButton'; +export { useSwapContext } from './components/SwapProvider'; // Types export type { diff --git a/packages/onchainkit/src/transaction/index.ts b/packages/onchainkit/src/transaction/index.ts index 13496b8ef0..89817d522e 100644 --- a/packages/onchainkit/src/transaction/index.ts +++ b/packages/onchainkit/src/transaction/index.ts @@ -10,6 +10,7 @@ export { TransactionToast } from './components/TransactionToast'; export { TransactionToastIcon } from './components/TransactionToastIcon'; export { TransactionToastAction } from './components/TransactionToastAction'; export { TransactionToastLabel } from './components/TransactionToastLabel'; +export { useTransactionContext } from './components/TransactionProvider'; export type { LifecycleStatus, TransactionButtonReact, diff --git a/packages/onchainkit/src/wallet/index.ts b/packages/onchainkit/src/wallet/index.ts index 1ee6c28df4..272b661eae 100644 --- a/packages/onchainkit/src/wallet/index.ts +++ b/packages/onchainkit/src/wallet/index.ts @@ -19,12 +19,15 @@ export { WalletAdvancedQrReceive } from './components/WalletAdvancedQrReceive'; export { WalletAdvancedSwap } from './components/WalletAdvancedSwap'; export { WalletAdvancedWalletActions } from './components/WalletAdvancedWalletActions'; export { WalletModal } from './components/WalletModal'; -export { WalletProvider } from './components/WalletProvider'; +export { useWalletContext } from './components/WalletProvider'; // Utils export { isValidAAEntrypoint } from './utils/isValidAAEntrypoint'; export { isWalletACoinbaseSmartWallet } from './utils/isWalletACoinbaseSmartWallet'; +// Hooks +export { usePortfolio } from './hooks/usePortfolio'; + // Types export type { ConnectWalletReact, From a3907e50b494f7d1b7cc2bf294dab7538828d83e Mon Sep 17 00:00:00 2001 From: Paul Cramer Date: Mon, 14 Apr 2025 09:21:18 -0700 Subject: [PATCH 03/55] feat: Add batch ENS / Basename resolution with useAddresses hook and getAddresses utility (#2277) --- .changeset/early-schools-lie.md | 5 + .../src/identity/hooks/useAddresses.test.tsx | 358 ++++++++++++++++++ .../src/identity/hooks/useAddresses.ts | 31 ++ packages/onchainkit/src/identity/index.ts | 4 + packages/onchainkit/src/identity/types.ts | 20 + .../src/identity/utils/getAddresses.test.ts | 184 +++++++++ .../src/identity/utils/getAddresses.ts | 74 ++++ 7 files changed, 676 insertions(+) create mode 100644 .changeset/early-schools-lie.md create mode 100644 packages/onchainkit/src/identity/hooks/useAddresses.test.tsx create mode 100644 packages/onchainkit/src/identity/hooks/useAddresses.ts create mode 100644 packages/onchainkit/src/identity/utils/getAddresses.test.ts create mode 100644 packages/onchainkit/src/identity/utils/getAddresses.ts diff --git a/.changeset/early-schools-lie.md b/.changeset/early-schools-lie.md new file mode 100644 index 0000000000..953d9b84bc --- /dev/null +++ b/.changeset/early-schools-lie.md @@ -0,0 +1,5 @@ +--- +"@coinbase/onchainkit": patch +--- + +- **feat**: Add batch ENS / Basename resolution with useAddresses hook and getAddresses utility. By @cpcramer #2277 diff --git a/packages/onchainkit/src/identity/hooks/useAddresses.test.tsx b/packages/onchainkit/src/identity/hooks/useAddresses.test.tsx new file mode 100644 index 0000000000..1a710dabd1 --- /dev/null +++ b/packages/onchainkit/src/identity/hooks/useAddresses.test.tsx @@ -0,0 +1,358 @@ +import { publicClient } from '@/core/network/client'; +import { renderHook, waitFor } from '@testing-library/react'; +import type { Address } from 'viem'; +import { base, baseSepolia, mainnet, optimism } from 'viem/chains'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { getAddresses } from '../utils/getAddresses'; +import { getNewReactQueryTestProvider } from './getNewReactQueryTestProvider'; +import { useAddresses } from './useAddresses'; + +vi.mock('@/core/network/client'); + +vi.mock('@/core/network/getChainPublicClient', () => ({ + ...vi.importActual('@/core/network/getChainPublicClient'), + getChainPublicClient: vi.fn(() => publicClient), +})); + +vi.mock('../utils/getAddresses'); + +const mockUseQuery = vi.fn(); +vi.mock('@tanstack/react-query', async () => { + const actual = await vi.importActual('@tanstack/react-query'); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + type UseQueryType = (options: { + queryKey: unknown[]; + queryFn: () => Promise; + [key: string]: unknown; + }) => unknown; + + return { + ...actual, + useQuery: (options: { + queryKey: unknown[]; + queryFn: () => Promise; + [key: string]: unknown; + }) => { + mockUseQuery(options); + return (actual.useQuery as UseQueryType)(options); + }, + }; +}); + +describe('useAddresses', () => { + const testNames = ['test.eth', 'test2.eth', 'shrek.base.eth']; + const testAddresses = [ + '0x1234567890123456789012345678901234567890', + '0x2345678901234567890123456789012345678901', + '0x3456789012345678901234567890123456789012', + ] as Address[]; + + beforeEach(() => { + vi.clearAllMocks(); + vi.resetAllMocks(); + mockUseQuery.mockClear(); + }); + + it('returns the correct addresses and loading state', async () => { + vi.mocked(getAddresses).mockResolvedValue(testAddresses); + + const { result } = renderHook(() => useAddresses({ names: testNames }), { + wrapper: getNewReactQueryTestProvider(), + }); + + expect(result.current.isPending).toBe(true); + expect(result.current.data).toBe(undefined); + + await waitFor(() => { + expect(result.current.data).toEqual(testAddresses); + expect(result.current.isPending).toBe(false); + }); + + expect(getAddresses).toHaveBeenCalledWith({ + names: testNames, + chain: mainnet, + }); + }); + + it('returns the correct addresses for custom chain', async () => { + vi.mocked(getAddresses).mockResolvedValue(testAddresses); + + const { result } = renderHook( + () => + useAddresses({ + names: testNames, + chain: base, + }), + { + wrapper: getNewReactQueryTestProvider(), + }, + ); + + await waitFor(() => { + expect(result.current.data).toEqual(testAddresses); + expect(result.current.isPending).toBe(false); + }); + + expect(getAddresses).toHaveBeenCalledWith({ + names: testNames, + chain: base, + }); + }); + + it('returns error for unsupported chain', async () => { + const errorMessage = + 'ChainId not supported, name resolution is only supported on Ethereum and Base.'; + vi.mocked(getAddresses).mockRejectedValue(errorMessage); + + const { result } = renderHook( + () => + useAddresses({ + names: testNames, + chain: optimism, + }), + { + wrapper: getNewReactQueryTestProvider(), + }, + ); + + await waitFor(() => { + expect(result.current.data).toBe(undefined); + expect(result.current.isPending).toBe(false); + expect(result.current.isError).toBe(true); + expect(result.current.error).toBe(errorMessage); + }); + }); + + it('is disabled when names array is empty', async () => { + vi.mocked(getAddresses).mockImplementation(() => { + throw new Error('This should not be called'); + }); + + const { result } = renderHook(() => useAddresses({ names: [] }), { + wrapper: getNewReactQueryTestProvider(), + }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + expect(getAddresses).not.toHaveBeenCalled(); + expect(result.current.isError).toBe(false); + }); + + it('uses the default query options when no queryOptions are provided', async () => { + vi.mocked(getAddresses).mockResolvedValue(testAddresses); + + renderHook(() => useAddresses({ names: testNames }), { + wrapper: getNewReactQueryTestProvider(), + }); + + await waitFor(() => { + expect(getAddresses).toHaveBeenCalled(); + }); + + const options = mockUseQuery.mock.calls[0][0]; + expect(options).toHaveProperty('queryKey'); + expect(options.queryKey).toEqual([ + 'useAddresses', + testNames.join(','), + mainnet.id, + ]); + }); + + it('merges custom queryOptions with default options', async () => { + const customCacheTime = 120000; + + vi.mocked(getAddresses).mockResolvedValue(testAddresses); + + renderHook( + () => useAddresses({ names: testNames }, { cacheTime: customCacheTime }), + { + wrapper: getNewReactQueryTestProvider(), + }, + ); + + expect(mockUseQuery).toHaveBeenCalled(); + const options = mockUseQuery.mock.calls[0][0]; + expect(options).toHaveProperty('gcTime', customCacheTime); + }); + + it('correctly maps cacheTime to gcTime for backwards compatibility', async () => { + const mockCacheTime = 60000; + const mockGcTime = 120000; + + vi.mocked(getAddresses).mockResolvedValue(testAddresses); + + renderHook( + () => useAddresses({ names: testNames }, { cacheTime: mockCacheTime }), + { + wrapper: getNewReactQueryTestProvider(), + }, + ); + + expect(mockUseQuery).toHaveBeenCalled(); + const optionsWithCacheTime = mockUseQuery.mock.calls[0][0]; + expect(optionsWithCacheTime).toHaveProperty('gcTime', mockCacheTime); + + mockUseQuery.mockClear(); + + renderHook( + () => + useAddresses( + { names: testNames }, + { + cacheTime: mockCacheTime, + gcTime: mockGcTime, + }, + ), + { + wrapper: getNewReactQueryTestProvider(), + }, + ); + + expect(mockUseQuery).toHaveBeenCalled(); + const optionsWithBoth = mockUseQuery.mock.calls[0][0]; + expect(optionsWithBoth).toHaveProperty('gcTime', mockGcTime); + }); + + it('creates a stable query key based on names and chain', async () => { + vi.mocked(getAddresses).mockResolvedValue(testAddresses); + + const { result, rerender } = renderHook( + (props: { names: string[] }) => useAddresses({ names: props.names }), + { + wrapper: getNewReactQueryTestProvider(), + initialProps: { names: testNames }, + }, + ); + + await waitFor(() => { + expect(result.current.data).toEqual(testAddresses); + }); + + vi.clearAllMocks(); + + rerender({ names: [...testNames] }); + + expect(getAddresses).not.toHaveBeenCalled(); + }); + + it('handles partial failures in address resolution', async () => { + const partialResults = [testAddresses[0], null, testAddresses[2]]; + vi.mocked(getAddresses).mockResolvedValue(partialResults); + + const { result } = renderHook(() => useAddresses({ names: testNames }), { + wrapper: getNewReactQueryTestProvider(), + }); + + await waitFor(() => { + expect(result.current.data).toEqual(partialResults); + expect(result.current.isPending).toBe(false); + expect(result.current.isError).toBe(false); + }); + + expect(getAddresses).toHaveBeenCalledWith({ + names: testNames, + chain: mainnet, + }); + }); + + it('respects enabled=false in queryOptions even with valid names', async () => { + vi.mocked(getAddresses).mockImplementation(() => { + throw new Error('This should not be called'); + }); + + const { result } = renderHook( + () => useAddresses({ names: testNames }, { enabled: false }), + { + wrapper: getNewReactQueryTestProvider(), + }, + ); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + expect(getAddresses).not.toHaveBeenCalled(); + expect(result.current.isLoading).toBe(false); + expect(result.current.fetchStatus).toBe('idle'); + }); + + it('enables the query when enabled=true and names are valid', async () => { + vi.mocked(getAddresses).mockResolvedValue(testAddresses); + + const { result } = renderHook( + () => useAddresses({ names: testNames }, { enabled: true }), + { + wrapper: getNewReactQueryTestProvider(), + }, + ); + + await waitFor(() => { + expect(result.current.data).toEqual(testAddresses); + expect(result.current.isLoading).toBe(false); + }); + + expect(getAddresses).toHaveBeenCalledWith({ + names: testNames, + chain: mainnet, + }); + }); + + it('supports Base Sepolia chain', async () => { + vi.mocked(getAddresses).mockResolvedValue(testAddresses); + + const { result } = renderHook( + () => + useAddresses({ + names: testNames, + chain: baseSepolia, + }), + { + wrapper: getNewReactQueryTestProvider(), + }, + ); + + await waitFor(() => { + expect(result.current.data).toEqual(testAddresses); + expect(result.current.isPending).toBe(false); + }); + + expect(getAddresses).toHaveBeenCalledWith({ + names: testNames, + chain: baseSepolia, + }); + }); + + it('handles empty results from getAddresses', async () => { + vi.mocked(getAddresses).mockResolvedValue([]); + + const { result } = renderHook(() => useAddresses({ names: testNames }), { + wrapper: getNewReactQueryTestProvider(), + }); + + await waitFor(() => { + expect(result.current.data).toEqual([]); + expect(result.current.isPending).toBe(false); + expect(result.current.isError).toBe(false); + }); + }); + + it('does not run query when names prop changes to empty array', async () => { + vi.mocked(getAddresses).mockResolvedValue(testAddresses); + + const { result, rerender } = renderHook( + (props: { names: string[] }) => useAddresses({ names: props.names }), + { + wrapper: getNewReactQueryTestProvider(), + initialProps: { names: testNames }, + }, + ); + + await waitFor(() => { + expect(result.current.data).toEqual(testAddresses); + }); + + vi.clearAllMocks(); + rerender({ names: [] }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + expect(getAddresses).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/onchainkit/src/identity/hooks/useAddresses.ts b/packages/onchainkit/src/identity/hooks/useAddresses.ts new file mode 100644 index 0000000000..378fd8ef4b --- /dev/null +++ b/packages/onchainkit/src/identity/hooks/useAddresses.ts @@ -0,0 +1,31 @@ +import { getAddresses } from '@/identity/utils/getAddresses'; +import { DEFAULT_QUERY_OPTIONS } from '@/internal/constants'; +import { useQuery } from '@tanstack/react-query'; +import { mainnet } from 'viem/chains'; +import type { + GetAddressReturnType, + UseAddressesOptions, + UseQueryOptions, +} from '../types'; + +/** + * A React hook that leverages the `@tanstack/react-query` for fetching and optionally caching + * multiple Ethereum addresses from ENS names or Basenames in a single batch request. + */ +export const useAddresses = ( + { names, chain = mainnet }: UseAddressesOptions, + queryOptions?: UseQueryOptions, +) => { + const namesKey = names.join(','); + const queryKey = ['useAddresses', namesKey, chain.id]; + + return useQuery({ + queryKey, + queryFn: () => getAddresses({ names, chain }), + enabled: !!names.length, + ...DEFAULT_QUERY_OPTIONS, + // Use cacheTime as gcTime for backward compatibility + gcTime: queryOptions?.cacheTime, + ...queryOptions, + }); +}; diff --git a/packages/onchainkit/src/identity/index.ts b/packages/onchainkit/src/identity/index.ts index 1cb3855549..c96a371744 100644 --- a/packages/onchainkit/src/identity/index.ts +++ b/packages/onchainkit/src/identity/index.ts @@ -9,12 +9,14 @@ export { Socials } from './components/Socials'; export { isBasename } from './utils/isBasename'; export { IdentityCard } from './components/IdentityCard'; export { getAddress } from './utils/getAddress'; +export { getAddresses } from './utils/getAddresses'; export { getAttestations } from './utils/getAttestations'; export { getAvatar } from './utils/getAvatar'; export { getAvatars } from './utils/getAvatars'; export { getName } from './utils/getName'; export { getNames } from './utils/getNames'; export { useAddress } from './hooks/useAddress'; +export { useAddresses } from './hooks/useAddresses'; export { useAttestations } from './hooks/useAttestations'; export { useAvatar } from './hooks/useAvatar'; export { useAvatars } from './hooks/useAvatars'; @@ -32,6 +34,7 @@ export type { EASSchemaUid, EthBalanceReact, GetAddress, + GetAddresses, GetAddressReturnType, GetAttestationsOptions, GetAvatar, @@ -44,6 +47,7 @@ export type { IdentityReact, NameReact, UseAddressOptions, + UseAddressesOptions, UseAvatarOptions, UseNamesOptions, UseQueryOptions, diff --git a/packages/onchainkit/src/identity/types.ts b/packages/onchainkit/src/identity/types.ts index babd7b9301..89d55f99fb 100644 --- a/packages/onchainkit/src/identity/types.ts +++ b/packages/onchainkit/src/identity/types.ts @@ -140,6 +140,16 @@ export type GetAddress = { chain?: Chain; }; +/** + * Note: exported as public Type + */ +export type GetAddresses = { + /** Array of names to resolve addresses for */ + names: Array; + /** Optional chain for domain resolution */ + chain?: Chain; +}; + /** * Note: exported as public Type */ @@ -285,6 +295,16 @@ export type UseAddressOptions = { chain?: Chain; }; +/** + * Note: exported as public Type + */ +export type UseAddressesOptions = { + /** Array of ENS or Basenames to resolve addresses for */ + names: Array; + /** Optional chain for domain resolution */ + chain?: Chain; +}; + /** * Note: exported as public Type */ diff --git a/packages/onchainkit/src/identity/utils/getAddresses.test.ts b/packages/onchainkit/src/identity/utils/getAddresses.test.ts new file mode 100644 index 0000000000..8eb2bf6390 --- /dev/null +++ b/packages/onchainkit/src/identity/utils/getAddresses.test.ts @@ -0,0 +1,184 @@ +import { publicClient } from '@/core/network/client'; +import { isBase } from '@/core/utils/isBase'; +import { isEthereum } from '@/core/utils/isEthereum'; +import { isBasename } from '@/identity/utils/isBasename'; +import type { Address } from 'viem'; +import { base, mainnet, optimism } from 'viem/chains'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import type { Mock } from 'vitest'; +import { RESOLVER_ADDRESSES_BY_CHAIN_ID } from '../constants'; +import { getAddresses } from './getAddresses'; + +vi.mock('@/core/network/client'); + +vi.mock('@/core/utils/isBase', () => ({ + isBase: vi.fn(), +})); + +vi.mock('@/core/utils/isEthereum', () => ({ + isEthereum: vi.fn(), +})); + +vi.mock('@/identity/utils/isBasename', () => ({ + isBasename: vi.fn(), +})); + +vi.mock('@/core/network/getChainPublicClient', () => ({ + ...vi.importActual('@/core/network/getChainPublicClient'), + getChainPublicClient: vi.fn(() => publicClient), +})); + +describe('getAddresses', () => { + const mockGetEnsAddress = publicClient.getEnsAddress as Mock; + const testNames = ['user1.eth', 'user2.eth', 'user3.base.eth']; + const testAddresses = [ + '0x1234567890123456789012345678901234567890', + '0x2345678901234567890123456789012345678901', + '0x3456789012345678901234567890123456789012', + ] as Address[]; + + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(isBase).mockImplementation(({ chainId }) => chainId === base.id); + vi.mocked(isEthereum).mockImplementation( + ({ chainId }) => chainId === mainnet.id, + ); + vi.mocked(isBasename).mockImplementation( + (name) => name.includes('.base.eth') || name.includes('.basetest.eth'), + ); + }); + + it('returns empty array when no names are provided', async () => { + const addresses = await getAddresses({ names: [] }); + expect(addresses).toEqual([]); + }); + + it('fetches addresses for multiple ENS names on mainnet', async () => { + mockGetEnsAddress.mockImplementation((params) => { + if (params.name === testNames[0]) + return Promise.resolve(testAddresses[0]); + if (params.name === testNames[1]) + return Promise.resolve(testAddresses[1]); + if (params.name === testNames[2]) + return Promise.resolve(testAddresses[2]); + return Promise.resolve(null); + }); + + const addresses = await getAddresses({ names: testNames }); + + expect(addresses).toEqual(testAddresses); + expect(mockGetEnsAddress).toHaveBeenCalledTimes(3); + testNames.forEach((name, index) => { + const isBasenameName = isBasename(name); + expect(mockGetEnsAddress).toHaveBeenNthCalledWith(index + 1, { + name, + universalResolverAddress: isBasenameName + ? RESOLVER_ADDRESSES_BY_CHAIN_ID[mainnet.id] + : undefined, + }); + }); + }); + + it('fetches addresses for multiple names on Base chain', async () => { + mockGetEnsAddress.mockImplementation((params) => { + if (params.name === testNames[0]) + return Promise.resolve(testAddresses[0]); + if (params.name === testNames[1]) + return Promise.resolve(testAddresses[1]); + if (params.name === testNames[2]) + return Promise.resolve(testAddresses[2]); + return Promise.resolve(null); + }); + + const addresses = await getAddresses({ names: testNames, chain: base }); + + expect(addresses).toEqual(testAddresses); + expect(mockGetEnsAddress).toHaveBeenCalledTimes(3); + testNames.forEach((name, index) => { + const isBasenameName = isBasename(name); + expect(mockGetEnsAddress).toHaveBeenNthCalledWith(index + 1, { + name, + universalResolverAddress: isBasenameName + ? RESOLVER_ADDRESSES_BY_CHAIN_ID[base.id] + : undefined, + }); + }); + }); + + it('rejects for unsupported chains', async () => { + await expect( + getAddresses({ + names: testNames, + chain: optimism, + }), + ).rejects.toBe( + 'ChainId not supported, name resolution is only supported on Ethereum and Base.', + ); + + expect(mockGetEnsAddress).not.toHaveBeenCalled(); + }); + + it('handles partial failures in address resolution', async () => { + mockGetEnsAddress.mockImplementation((params) => { + if (params.name === testNames[0]) + return Promise.resolve(testAddresses[0]); + if (params.name === testNames[1]) + return Promise.reject(new Error('Resolution failed')); + if (params.name === testNames[2]) + return Promise.resolve(testAddresses[2]); + return Promise.resolve(null); + }); + + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + + const addresses = await getAddresses({ names: testNames }); + + expect(addresses).toEqual([testAddresses[0], null, testAddresses[2]]); + expect(consoleSpy).toHaveBeenCalled(); + expect(mockGetEnsAddress).toHaveBeenCalledTimes(3); + + consoleSpy.mockRestore(); + }); + + it('handles errors in batch resolution process', async () => { + mockGetEnsAddress.mockImplementation(() => { + throw new Error('Batch resolution failed'); + }); + + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + + const addresses = await getAddresses({ names: testNames }); + + expect(addresses).toEqual([null, null, null]); + expect(consoleSpy).toHaveBeenCalledWith( + 'Error resolving addresses in batch:', + expect.any(Error), + ); + + consoleSpy.mockRestore(); + }); + + it('handles null result in names array', async () => { + const namesWithNull = ['user1.eth', null, 'user3.eth']; + + mockGetEnsAddress.mockImplementation((params) => { + if (params.name === 'user1.eth') return Promise.resolve(testAddresses[0]); + if (params.name === 'user3.eth') return Promise.resolve(testAddresses[2]); + return Promise.resolve(null); + }); + + const addresses = await getAddresses({ names: namesWithNull as string[] }); + + expect(addresses).toEqual([testAddresses[0], null, testAddresses[2]]); + expect(mockGetEnsAddress).toHaveBeenCalledTimes(2); + }); + + it('returns array of nulls when all names are null or undefined', async () => { + const allNullNames = [null, undefined, null] as unknown as string[]; + + const addresses = await getAddresses({ names: allNullNames }); + + expect(addresses).toEqual([null, null, null]); + expect(mockGetEnsAddress).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/onchainkit/src/identity/utils/getAddresses.ts b/packages/onchainkit/src/identity/utils/getAddresses.ts new file mode 100644 index 0000000000..2375d6770d --- /dev/null +++ b/packages/onchainkit/src/identity/utils/getAddresses.ts @@ -0,0 +1,74 @@ +import { getChainPublicClient } from '@/core/network/getChainPublicClient'; +import { isBase } from '@/core/utils/isBase'; +import { isEthereum } from '@/core/utils/isEthereum'; +import { RESOLVER_ADDRESSES_BY_CHAIN_ID } from '@/identity/constants'; +import type { GetAddressReturnType, GetAddresses } from '@/identity/types'; +import { isBasename } from '@/identity/utils/isBasename'; +import { mainnet } from 'viem/chains'; + +/** + * An asynchronous function to fetch multiple Ethereum addresses from ENS names or Basenames + * in a single batch request. + */ +export const getAddresses = async ({ + names, + chain = mainnet, +}: GetAddresses): Promise => { + if (!names || names.length === 0) { + return []; + } + + const chainIsBase = isBase({ chainId: chain.id }); + const chainIsEthereum = isEthereum({ chainId: chain.id }); + const chainSupportsUniversalResolver = chainIsEthereum || chainIsBase; + + if (!chainSupportsUniversalResolver) { + return Promise.reject( + 'ChainId not supported, name resolution is only supported on Ethereum and Base.', + ); + } + + const client = getChainPublicClient(chain); + const results: GetAddressReturnType[] = Array(names.length).fill(null); + + try { + // Filter out null or undefined names + const validItems = names + .map((name, index) => (name ? { name, index } : null)) + .filter((item): item is { name: string; index: number } => item !== null); + + if (validItems.length === 0) { + return results; + } + + const addressPromises = validItems.map(({ name, index }) => + client + .getEnsAddress({ + name, + universalResolverAddress: isBasename(name) + ? RESOLVER_ADDRESSES_BY_CHAIN_ID[chain.id] + : undefined, + }) + .then((address) => { + return { index, address }; + }) + .catch((error) => { + console.error(`Error resolving address for ${name}:`, error); + // Return null for the address if resolution fails + return { index, address: null }; + }), + ); + + const resolvedAddresses = await Promise.all(addressPromises); + + // Update results array with resolved addresses + resolvedAddresses.forEach(({ index, address }) => { + results[index] = address; + }); + } catch (error) { + console.error('Error resolving addresses in batch:', error); + return Array(names.length).fill(null); + } + + return results; +}; From 3e7c8f2d015ae04fddec8bce78668adecab3d1a9 Mon Sep 17 00:00:00 2001 From: Alissa Crane Date: Mon, 14 Apr 2025 10:01:26 -0700 Subject: [PATCH 04/55] chore: add provider exports back (#2278) --- packages/onchainkit/src/earn/index.ts | 1 + packages/onchainkit/src/wallet/index.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/onchainkit/src/earn/index.ts b/packages/onchainkit/src/earn/index.ts index 09945ca182..15d9388dd0 100644 --- a/packages/onchainkit/src/earn/index.ts +++ b/packages/onchainkit/src/earn/index.ts @@ -13,6 +13,7 @@ export { WithdrawBalance } from './components/WithdrawBalance'; export { WithdrawButton } from './components/WithdrawButton'; export { YieldDetails } from './components/YieldDetails'; export { VaultDetails } from './components/VaultDetails'; +export { EarnProvider } from './components/EarnProvider'; // Hooks export { useEarnContext } from './components/EarnProvider'; diff --git a/packages/onchainkit/src/wallet/index.ts b/packages/onchainkit/src/wallet/index.ts index 272b661eae..c902de05ec 100644 --- a/packages/onchainkit/src/wallet/index.ts +++ b/packages/onchainkit/src/wallet/index.ts @@ -19,13 +19,14 @@ export { WalletAdvancedQrReceive } from './components/WalletAdvancedQrReceive'; export { WalletAdvancedSwap } from './components/WalletAdvancedSwap'; export { WalletAdvancedWalletActions } from './components/WalletAdvancedWalletActions'; export { WalletModal } from './components/WalletModal'; -export { useWalletContext } from './components/WalletProvider'; +export { WalletProvider } from './components/WalletProvider'; // Utils export { isValidAAEntrypoint } from './utils/isValidAAEntrypoint'; export { isWalletACoinbaseSmartWallet } from './utils/isWalletACoinbaseSmartWallet'; // Hooks +export { useWalletContext } from './components/WalletProvider'; export { usePortfolio } from './hooks/usePortfolio'; // Types From b369057c006a315a8ea04a837f02895800acf2d5 Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Mon, 14 Apr 2025 12:22:51 -0600 Subject: [PATCH 05/55] refactor: Replace Packemon with Vite (#2227) --- .github/workflows/check.yml | 24 - .github/workflows/lint.yml | 2 +- packages/onchainkit/.storybook/main.ts | 29 - packages/onchainkit/.storybook/preview.ts | 16 - packages/onchainkit/package.json | 195 +- packages/onchainkit/packemon.config.ts | 35 - packages/onchainkit/react-shim.js | 3 - .../earn/components/DepositBalance.test.tsx | 2 +- .../earn/components/DepositButton.test.tsx | 2 +- .../src/earn/components/EarnBalance.test.tsx | 2 +- .../src/earn/components/EarnDeposit.test.tsx | 2 +- .../src/earn/components/EarnDetails.test.tsx | 2 +- .../src/earn/components/EarnWithdraw.test.tsx | 2 +- .../src/earn/components/VaultDetails.test.tsx | 2 +- .../earn/components/WithdrawBalance.test.tsx | 2 +- .../earn/components/WithdrawButton.test.tsx | 2 +- .../src/earn/components/YieldDetails.test.tsx | 2 +- .../earn/mocks/{index.ts => mocks.test.ts} | 8 +- .../identity/components/Address.stories.ts | 18 - .../identity/components/Avatar.stories.tsx | 114 - .../src/identity/components/Badge.stories.ts | 14 - .../components/EthBalance.stories.tsx | 38 - .../src/identity/components/Name.stories.tsx | 50 - .../src/internal/svg/disconnectSvg.stories.ts | 23 - .../swap/components/SwapButton.stories.tsx | 47 - .../components/SwapToggleButton.stories.tsx | 39 - .../src/token/components/TokenChip.stories.ts | 28 - .../token/components/TokenImage.stories.ts | 33 - .../src/token/components/TokenRow.stories.ts | 38 - .../token/components/TokenSearch.stories.tsx | 54 - .../components/TokenSelectButton.stories.ts | 29 - .../TokenSelectDropdown.stories.tsx | 58 - .../components/TransactionButton.stories.tsx | 41 - packages/onchainkit/src/vite-env.d.ts | 1 + .../WalletDropdownDisconnect.stories.tsx | 33 - packages/onchainkit/src/wallet/types.ts | 5 +- .../isWalletACoinbaseSmartWallet.test.ts | 17 +- packages/onchainkit/tsconfig.dev.json | 9 - packages/onchainkit/tsconfig.esm.json | 3 - packages/onchainkit/tsconfig.json | 12 +- packages/onchainkit/tsup.config.ts | 69 - packages/onchainkit/vite.config.ts | 58 + pnpm-lock.yaml | 2257 +++++------------ 43 files changed, 876 insertions(+), 2544 deletions(-) delete mode 100644 .github/workflows/check.yml delete mode 100644 packages/onchainkit/.storybook/main.ts delete mode 100644 packages/onchainkit/.storybook/preview.ts delete mode 100644 packages/onchainkit/packemon.config.ts delete mode 100644 packages/onchainkit/react-shim.js rename packages/onchainkit/src/earn/mocks/{index.ts => mocks.test.ts} (83%) delete mode 100644 packages/onchainkit/src/identity/components/Address.stories.ts delete mode 100644 packages/onchainkit/src/identity/components/Avatar.stories.tsx delete mode 100644 packages/onchainkit/src/identity/components/Badge.stories.ts delete mode 100644 packages/onchainkit/src/identity/components/EthBalance.stories.tsx delete mode 100644 packages/onchainkit/src/identity/components/Name.stories.tsx delete mode 100644 packages/onchainkit/src/internal/svg/disconnectSvg.stories.ts delete mode 100644 packages/onchainkit/src/swap/components/SwapButton.stories.tsx delete mode 100644 packages/onchainkit/src/swap/components/SwapToggleButton.stories.tsx delete mode 100644 packages/onchainkit/src/token/components/TokenChip.stories.ts delete mode 100644 packages/onchainkit/src/token/components/TokenImage.stories.ts delete mode 100644 packages/onchainkit/src/token/components/TokenRow.stories.ts delete mode 100644 packages/onchainkit/src/token/components/TokenSearch.stories.tsx delete mode 100644 packages/onchainkit/src/token/components/TokenSelectButton.stories.ts delete mode 100644 packages/onchainkit/src/token/components/TokenSelectDropdown.stories.tsx delete mode 100644 packages/onchainkit/src/transaction/components/TransactionButton.stories.tsx create mode 100644 packages/onchainkit/src/vite-env.d.ts delete mode 100644 packages/onchainkit/src/wallet/components/WalletDropdownDisconnect.stories.tsx delete mode 100644 packages/onchainkit/tsconfig.dev.json delete mode 100644 packages/onchainkit/tsconfig.esm.json delete mode 100644 packages/onchainkit/tsup.config.ts create mode 100644 packages/onchainkit/vite.config.ts diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml deleted file mode 100644 index c0f8f336af..0000000000 --- a/.github/workflows/check.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: onchainkit ci:check -on: - push: - branches: ['main'] - pull_request: - branches: ['main'] -permissions: - contents: read -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [18.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: 'Setup' - uses: ./.github/actions/setup - - - name: Check - run: pnpm f:ock ci:check diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 60b3de4b47..90468eeb0a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -21,4 +21,4 @@ jobs: uses: ./.github/actions/setup - name: Lint - run: pnpm f:ock ci:lint + run: pnpm f:ock lint diff --git a/packages/onchainkit/.storybook/main.ts b/packages/onchainkit/.storybook/main.ts deleted file mode 100644 index 7e5f5afc37..0000000000 --- a/packages/onchainkit/.storybook/main.ts +++ /dev/null @@ -1,29 +0,0 @@ -import path from 'node:path'; -import type { StorybookConfig } from '@storybook/react-vite'; -import { mergeConfig } from 'vite'; - -const config: StorybookConfig = { - stories: ['../src/**/*.mdx', '../src/**/*.stories.@(ts|tsx)'], - addons: [ - '@storybook/addon-links', - '@storybook/addon-essentials', - '@chromatic-com/storybook', - '@storybook/addon-interactions', - '@storybook/addon-a11y', - ], - framework: { - name: '@storybook/react-vite', - options: {}, - }, - viteFinal: async (config) => { - return mergeConfig(config, { - resolve: { - alias: { - '@': path.resolve(__dirname, '../src'), - }, - }, - }); - }, -}; - -export default config; diff --git a/packages/onchainkit/.storybook/preview.ts b/packages/onchainkit/.storybook/preview.ts deleted file mode 100644 index 00c43a9a5c..0000000000 --- a/packages/onchainkit/.storybook/preview.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { Preview } from '@storybook/react'; -import '../src/styles.css'; - -const preview: Preview = { - parameters: { - layout: 'centered', - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/i, - }, - }, - }, -}; - -export default preview; diff --git a/packages/onchainkit/package.json b/packages/onchainkit/package.json index 1d2afa61cd..db5c413211 100644 --- a/packages/onchainkit/package.json +++ b/packages/onchainkit/package.json @@ -4,38 +4,27 @@ "type": "module", "repository": "https://github.com/coinbase/onchainkit.git", "license": "MIT", + "access": "public", "scripts": { "build": "pnpm clean && pnpm bundle:prod && pnpm tailwind:prod", "dev": "concurrently \"pnpm tailwind:dev\" \"pnpm bundle:dev\"", - "bundle:dev": "tsup -- --watch", - "bundle:dev:no-watch": "tsup", - "bundle:prod": "packemon build --addEngines --addFiles --loadConfigs --declaration && tscpaths -p tsconfig.json -s ./src -o ./esm && npx packemon validate --no-license --no-people --no-repo", + "bundle:dev": "vite build --watch", + "bundle:prod": "vite build", "tailwind:dev": "tailwind -i ./src/styles/index-with-tailwind.css -o ./dist/styles.css --watch", "tailwind:prod": "tailwindcss -i ./src/styles/index.css -o ./dist/tailwind.css --minify && tailwindcss -i ./src/styles/index-with-tailwind.css -o ./dist/styles.css --minify", "clean": "rm -rf dist esm", - "check": "eslint . --ext .ts,.tsx && prettier --check .", - "check:unsafe": "eslint . --ext .ts,.tsx --fix && prettier --write .", - "ci:check": "eslint . --ext .ts,.tsx --max-warnings=0", - "ci:format": "prettier --check .", - "ci:lint": "eslint . --ext .ts,.tsx --max-warnings=0", + "lint": "eslint . --ext .ts,.tsx --max-warnings=0", + "lint:fix": "eslint . --ext .ts,.tsx --fix", "format": "prettier --write .", - "lint": "eslint . --ext .ts,.tsx --fix", - "lint:unsafe": "eslint . --ext .ts,.tsx --fix --max-warnings=0", - "storybook:dev": "storybook dev -p 6006", - "storybook:build": "storybook build", - "storybook:test": "test-storybook", "test": "vitest run", "test:coverage": "vitest run --coverage", "test:watch": "vitest", "test:ui": "vitest --ui", - "watch": "tailwind -i ./src/styles/index-with-tailwind.css -o ./src/styles.css --watch", - "watch:tailwind": "tailwind -i ./src/styles/index.css -o ./src/tailwind.css --watch", "get-next-version": "node ./scripts/get-next-version.js", "publish-alpha": "node ./scripts/publish-alpha.js", "validate-build": "node ./scripts/validate-build.js" }, "peerDependencies": { - "@types/react": "^18 || ^19", "react": "^18 || ^19", "react-dom": "^18 || ^19" }, @@ -53,16 +42,6 @@ "wagmi": "^2.14.11" }, "devDependencies": { - "@chromatic-com/storybook": "^1.7.0", - "@storybook/addon-a11y": "^8.2.9", - "@storybook/addon-essentials": "^8.2.9", - "@storybook/addon-interactions": "^8.2.9", - "@storybook/addon-links": "^8.2.9", - "@storybook/blocks": "^8.2.9", - "@storybook/react": "^8.2.9", - "@storybook/react-vite": "^8.2.9", - "@storybook/test": "^8.2.9", - "@storybook/test-runner": "^0.19.1", "@testing-library/jest-dom": "6.4.7", "@testing-library/react": "^14.2.0", "@testing-library/user-event": "^14.6.1", @@ -70,11 +49,15 @@ "@types/qrcode": "^1", "@types/react": "^18", "@types/react-dom": "^18", + "@vitejs/plugin-react": "^4.3.4", "@vitest/coverage-v8": "^3.0.5", "@vitest/ui": "^3.0.5", "autoprefixer": "^10.4.19", "babel-plugin-module-resolver": "^5.0.2", "concurrently": "^8.0.0", + "esbuild-plugin-babel": "^0.2.3", + "glob": "^11.0.1", + "globals": "^15.15.0", "esbuild-fix-imports-plugin": "^1.0.19", "graphql": "^14", "graphql-request": "^6.1.0", @@ -83,140 +66,130 @@ "react": "^18", "react-dom": "^18", "rimraf": "^5.0.5", + "rollup-plugin-preserve-use-client": "^3.0.1", "storybook": "^8.2.9", "tailwindcss": "^3.4.3", "tailwindcss-animate": "^1.0.7", "tscpaths": "^0.0.9", "tsup": "^8.3.5", "vite": "^5.3.3", + "vite-plugin-dts": "^4.5.3", + "vite-plugin-externalize-deps": "^0.9.0", "vitest": "^3.0.5" }, - "packemon": [ - { - "bundle": false, - "platform": [ - "browser" - ] - } - ], - "publishConfig": { - "access": "public" - }, "files": [ "dist/**/*", - "esm/**/*", - "src/", "src/**/*" ], - "main": "./esm/index.js", - "types": "./esm/index.d.ts", - "module": "./esm/index.js", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "module": "./dist/index.js", "exports": { "./package.json": "./package.json", "./styles.css": "./dist/styles.css", "./tailwind.css": "./dist/tailwind.css", - "./theme": "./esm/styles/theme.js", + "./theme": "./dist/styles/theme.js", ".": { - "types": "./esm/index.d.ts", - "module": "./esm/index.js", - "import": "./esm/index.js", - "default": "./esm/index.js" + "types": "./dist/index.d.ts", + "module": "./dist/index.js", + "import": "./dist/index.js", + "default": "./dist/index.js" }, "./api": { - "types": "./esm/api/index.d.ts", - "module": "./esm/api/index.js", - "import": "./esm/api/index.js", - "default": "./esm/api/index.js" + "types": "./dist/api/index.d.ts", + "module": "./dist/api/index.js", + "import": "./dist/api/index.js", + "default": "./dist/api/index.js" }, "./appchain": { - "types": "./esm/appchain/index.d.ts", - "module": "./esm/appchain/index.js", - "import": "./esm/appchain/index.js", - "default": "./esm/appchain/index.js" + "types": "./dist/appchain/index.d.ts", + "module": "./dist/appchain/index.js", + "import": "./dist/appchain/index.js", + "default": "./dist/appchain/index.js" }, "./buy": { - "types": "./esm/buy/index.d.ts", - "module": "./esm/buy/index.js", - "import": "./esm/buy/index.js", - "default": "./esm/buy/index.js" + "types": "./dist/buy/index.d.ts", + "module": "./dist/buy/index.js", + "import": "./dist/buy/index.js", + "default": "./dist/buy/index.js" }, "./checkout": { - "types": "./esm/checkout/index.d.ts", - "module": "./esm/checkout/index.js", - "import": "./esm/checkout/index.js", - "default": "./esm/checkout/index.js" + "types": "./dist/checkout/index.d.ts", + "module": "./dist/checkout/index.js", + "import": "./dist/checkout/index.js", + "default": "./dist/checkout/index.js" }, "./earn": { - "types": "./esm/earn/index.d.ts", - "module": "./esm/earn/index.js", - "import": "./esm/earn/index.js", - "default": "./esm/earn/index.js" + "types": "./dist/earn/index.d.ts", + "module": "./dist/earn/index.js", + "import": "./dist/earn/index.js", + "default": "./dist/earn/index.js" }, "./fund": { - "types": "./esm/fund/index.d.ts", - "module": "./esm/fund/index.js", - "import": "./esm/fund/index.js", - "default": "./esm/fund/index.js" + "types": "./dist/fund/index.d.ts", + "module": "./dist/fund/index.js", + "import": "./dist/fund/index.js", + "default": "./dist/fund/index.js" }, "./identity": { - "types": "./esm/identity/index.d.ts", - "module": "./esm/identity/index.js", - "import": "./esm/identity/index.js", - "default": "./esm/identity/index.js" + "types": "./dist/identity/index.d.ts", + "module": "./dist/identity/index.js", + "import": "./dist/identity/index.js", + "default": "./dist/identity/index.js" }, "./minikit": { - "types": "./esm/minikit/index.d.ts", - "module": "./esm/minikit/index.js", - "import": "./esm/minikit/index.js", - "default": "./esm/minikit/index.js" + "types": "./dist/minikit/index.d.ts", + "module": "./dist/minikit/index.js", + "import": "./dist/minikit/index.js", + "default": "./dist/minikit/index.js" }, "./nft": { - "types": "./esm/nft/index.d.ts", - "module": "./esm/nft/index.js", - "import": "./esm/nft/index.js", - "default": "./esm/nft/index.js" + "types": "./dist/nft/index.d.ts", + "module": "./dist/nft/index.js", + "import": "./dist/nft/index.js", + "default": "./dist/nft/index.js" }, "./nft/view": { - "types": "./esm/nft/components/view/index.d.ts", - "module": "./esm/nft/components/view/index.js", - "import": "./esm/nft/components/view/index.js", - "default": "./esm/nft/components/view/index.js" + "types": "./dist/nft/components/view/index.d.ts", + "module": "./dist/nft/components/view/index.js", + "import": "./dist/nft/components/view/index.js", + "default": "./dist/nft/components/view/index.js" }, "./nft/mint": { - "types": "./esm/nft/components/mint/index.d.ts", - "module": "./esm/nft/components/mint/index.js", - "import": "./esm/nft/components/mint/index.js", - "default": "./esm/nft/components/mint/index.js" + "types": "./dist/nft/components/mint/index.d.ts", + "module": "./dist/nft/components/mint/index.js", + "import": "./dist/nft/components/mint/index.js", + "default": "./dist/nft/components/mint/index.js" }, "./signature": { - "types": "./esm/signature/index.d.ts", - "module": "./esm/signature/index.js", - "import": "./esm/signature/index.js", - "default": "./esm/signature/index.js" + "types": "./dist/signature/index.d.ts", + "module": "./dist/signature/index.js", + "import": "./dist/signature/index.js", + "default": "./dist/signature/index.js" }, "./swap": { - "types": "./esm/swap/index.d.ts", - "module": "./esm/swap/index.js", - "import": "./esm/swap/index.js", - "default": "./esm/swap/index.js" + "types": "./dist/swap/index.d.ts", + "module": "./dist/swap/index.js", + "import": "./dist/swap/index.js", + "default": "./dist/swap/index.js" }, "./token": { - "types": "./esm/token/index.d.ts", - "module": "./esm/token/index.js", - "import": "./esm/token/index.js", - "default": "./esm/token/index.js" + "types": "./dist/token/index.d.ts", + "module": "./dist/token/index.js", + "import": "./dist/token/index.js", + "default": "./dist/token/index.js" }, "./transaction": { - "types": "./esm/transaction/index.d.ts", - "module": "./esm/transaction/index.js", - "import": "./esm/transaction/index.js", - "default": "./esm/transaction/index.js" + "types": "./dist/transaction/index.d.ts", + "module": "./dist/transaction/index.js", + "import": "./dist/transaction/index.js", + "default": "./dist/transaction/index.js" }, "./wallet": { - "types": "./esm/wallet/index.d.ts", - "module": "./esm/wallet/index.js", - "import": "./esm/wallet/index.js", - "default": "./esm/wallet/index.js" + "types": "./dist/wallet/index.d.ts", + "module": "./dist/wallet/index.js", + "import": "./dist/wallet/index.js", + "default": "./dist/wallet/index.js" } }, "packageManager": "pnpm@10.6.3" diff --git a/packages/onchainkit/packemon.config.ts b/packages/onchainkit/packemon.config.ts deleted file mode 100644 index ad68c5482e..0000000000 --- a/packages/onchainkit/packemon.config.ts +++ /dev/null @@ -1,35 +0,0 @@ -const config = { - babelInput(config) { - config.plugins?.push([ - require.resolve('babel-plugin-module-resolver'), - { - root: ['./src'], - alias: { - '@': './src', - }, - }, - ]); - }, - - // Adding support for React 18's "use client" directive - // Mostly used with Next.js apps - rollupOutput(config) { - config.plugins.push({ - name: 'fix-use-client', - renderChunk(code) { - if (code.includes("'use client'")) { - // Remove the original directive and split into lines - const lines = code.replace("'use client';", '').split('\n'); - // Filter out any empty lines and reconstruct - return { - code: `'use client';\n${lines.filter((line) => line.trim()).join('\n')}`, - map: null, - }; - } - return null; // Return null to keep the original code (https://rollupjs.org/plugin-development/#renderchunk) - }, - }); - }, -}; - -export default config; diff --git a/packages/onchainkit/react-shim.js b/packages/onchainkit/react-shim.js deleted file mode 100644 index c8719661bf..0000000000 --- a/packages/onchainkit/react-shim.js +++ /dev/null @@ -1,3 +0,0 @@ -// https://esbuild.github.io/content-types/#auto-import-for-jsx -import * as React from 'react'; -export { React }; diff --git a/packages/onchainkit/src/earn/components/DepositBalance.test.tsx b/packages/onchainkit/src/earn/components/DepositBalance.test.tsx index 3df3693374..66f8cf62e0 100644 --- a/packages/onchainkit/src/earn/components/DepositBalance.test.tsx +++ b/packages/onchainkit/src/earn/components/DepositBalance.test.tsx @@ -1,4 +1,4 @@ -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import type { EarnContextType } from '@/earn/types'; import { usdcToken } from '@/token/constants'; import { fireEvent, render, screen } from '@testing-library/react'; diff --git a/packages/onchainkit/src/earn/components/DepositButton.test.tsx b/packages/onchainkit/src/earn/components/DepositButton.test.tsx index c93fbdaa07..9093293c83 100644 --- a/packages/onchainkit/src/earn/components/DepositButton.test.tsx +++ b/packages/onchainkit/src/earn/components/DepositButton.test.tsx @@ -1,4 +1,4 @@ -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import type { EarnContextType } from '@/earn/types'; import type { MakeRequired } from '@/internal/types'; import type { Call } from '@/transaction/types'; diff --git a/packages/onchainkit/src/earn/components/EarnBalance.test.tsx b/packages/onchainkit/src/earn/components/EarnBalance.test.tsx index 884e3e4050..2bfb2a2c12 100644 --- a/packages/onchainkit/src/earn/components/EarnBalance.test.tsx +++ b/packages/onchainkit/src/earn/components/EarnBalance.test.tsx @@ -1,5 +1,5 @@ import { EarnProvider, useEarnContext } from '@/earn/components/EarnProvider'; -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import type { EarnContextType } from '@/earn/types'; import type { MakeRequired } from '@/internal/types'; import { useGetTokenBalance } from '@/wallet/hooks/useGetTokenBalance'; diff --git a/packages/onchainkit/src/earn/components/EarnDeposit.test.tsx b/packages/onchainkit/src/earn/components/EarnDeposit.test.tsx index d2fffa6ba1..adf2dc2566 100644 --- a/packages/onchainkit/src/earn/components/EarnDeposit.test.tsx +++ b/packages/onchainkit/src/earn/components/EarnDeposit.test.tsx @@ -1,4 +1,4 @@ -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import type { EarnContextType } from '@/earn/types'; import type { MakeRequired } from '@/internal/types'; import type { Call } from '@/transaction/types'; diff --git a/packages/onchainkit/src/earn/components/EarnDetails.test.tsx b/packages/onchainkit/src/earn/components/EarnDetails.test.tsx index 04b6ac3629..32f57c4181 100644 --- a/packages/onchainkit/src/earn/components/EarnDetails.test.tsx +++ b/packages/onchainkit/src/earn/components/EarnDetails.test.tsx @@ -1,5 +1,5 @@ import { EarnDetails } from '@/earn/components/EarnDetails'; -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import { render, screen } from '@testing-library/react'; import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'; import { useEarnContext } from './EarnProvider'; diff --git a/packages/onchainkit/src/earn/components/EarnWithdraw.test.tsx b/packages/onchainkit/src/earn/components/EarnWithdraw.test.tsx index 3318e4d169..4ead36e340 100644 --- a/packages/onchainkit/src/earn/components/EarnWithdraw.test.tsx +++ b/packages/onchainkit/src/earn/components/EarnWithdraw.test.tsx @@ -1,4 +1,4 @@ -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import type { EarnContextType } from '@/earn/types'; import type { MakeRequired } from '@/internal/types'; import type { Call } from '@/transaction/types'; diff --git a/packages/onchainkit/src/earn/components/VaultDetails.test.tsx b/packages/onchainkit/src/earn/components/VaultDetails.test.tsx index 881046f123..e4bf77d53c 100644 --- a/packages/onchainkit/src/earn/components/VaultDetails.test.tsx +++ b/packages/onchainkit/src/earn/components/VaultDetails.test.tsx @@ -1,4 +1,4 @@ -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import { fireEvent, render, screen } from '@testing-library/react'; import { vi } from 'vitest'; import { beforeEach, describe, expect, it } from 'vitest'; diff --git a/packages/onchainkit/src/earn/components/WithdrawBalance.test.tsx b/packages/onchainkit/src/earn/components/WithdrawBalance.test.tsx index 9281869c3b..f670e4186c 100644 --- a/packages/onchainkit/src/earn/components/WithdrawBalance.test.tsx +++ b/packages/onchainkit/src/earn/components/WithdrawBalance.test.tsx @@ -1,4 +1,4 @@ -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import type { EarnContextType } from '@/earn/types'; import { usdcToken } from '@/token/constants'; import { fireEvent, render, screen } from '@testing-library/react'; diff --git a/packages/onchainkit/src/earn/components/WithdrawButton.test.tsx b/packages/onchainkit/src/earn/components/WithdrawButton.test.tsx index 03f7c3b5f6..530f1936db 100644 --- a/packages/onchainkit/src/earn/components/WithdrawButton.test.tsx +++ b/packages/onchainkit/src/earn/components/WithdrawButton.test.tsx @@ -1,4 +1,4 @@ -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import type { EarnContextType } from '@/earn/types'; import type { MakeRequired } from '@/internal/types'; import type { Call } from '@/transaction/types'; diff --git a/packages/onchainkit/src/earn/components/YieldDetails.test.tsx b/packages/onchainkit/src/earn/components/YieldDetails.test.tsx index 93849436b8..60d324e74f 100644 --- a/packages/onchainkit/src/earn/components/YieldDetails.test.tsx +++ b/packages/onchainkit/src/earn/components/YieldDetails.test.tsx @@ -1,4 +1,4 @@ -import { MOCK_EARN_CONTEXT } from '@/earn/mocks'; +import { MOCK_EARN_CONTEXT } from '@/earn/mocks/mocks.test'; import { fireEvent, render, screen } from '@testing-library/react'; import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'; import { useEarnContext } from './EarnProvider'; diff --git a/packages/onchainkit/src/earn/mocks/index.ts b/packages/onchainkit/src/earn/mocks/mocks.test.ts similarity index 83% rename from packages/onchainkit/src/earn/mocks/index.ts rename to packages/onchainkit/src/earn/mocks/mocks.test.ts index f2c1a1c498..b6f5692abe 100644 --- a/packages/onchainkit/src/earn/mocks/index.ts +++ b/packages/onchainkit/src/earn/mocks/mocks.test.ts @@ -1,7 +1,7 @@ import type { EarnContextType } from '@/earn/types'; import { usdcToken } from '@/token/constants'; import type { Address } from 'viem'; -import { vi } from 'vitest'; +import { vi, describe, it, expect } from 'vitest'; export const MOCK_EARN_CONTEXT: EarnContextType = { error: null, @@ -32,3 +32,9 @@ export const MOCK_EARN_CONTEXT: EarnContextType = { updateLifecycleStatus: vi.fn(), isSponsored: false, }; + +describe('MOCK_EARN_CONTEXT', () => { + it('should be defined', () => { + expect(MOCK_EARN_CONTEXT).toBeDefined(); + }); +}); diff --git a/packages/onchainkit/src/identity/components/Address.stories.ts b/packages/onchainkit/src/identity/components/Address.stories.ts deleted file mode 100644 index 2260b0e382..0000000000 --- a/packages/onchainkit/src/identity/components/Address.stories.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { Address } from './Address'; - -const meta = { - title: 'Identity/Address', - component: Address, - tags: ['autodocs'], - argTypes: {}, - args: { - address: '0x02feeb0AdE57b6adEEdE5A4EEea6Cf8c21BeB6B1', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/identity/components/Avatar.stories.tsx b/packages/onchainkit/src/identity/components/Avatar.stories.tsx deleted file mode 100644 index 2b08731f3c..0000000000 --- a/packages/onchainkit/src/identity/components/Avatar.stories.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { base, baseSepolia } from 'viem/chains'; -import { OnchainKitProvider } from '../../OnchainKitProvider'; -import { Avatar } from './Avatar'; -import { Badge } from './Badge'; - -const meta = { - title: 'Identity/Avatar', - component: Avatar, - decorators: [ - (Story) => { - return ( - - - - ); - }, - ], - tags: ['autodocs'], - args: { - address: '0x02feeb0AdE57b6adEEdE5A4EEea6Cf8c21BeB6B1', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; - -export const Loading: Story = { - args: { - loadingComponent:
...
, - }, -}; - -export const Fallback: Story = { - args: { - address: '0x1234567891234567881234567891234567891234', - defaultComponent: ( -
- ), - }, -}; - -export const WithBadge: Story = { - decorators: [ - (Story) => { - return ( - - - - - - ); - }, - ], - args: { - children: , - }, -}; - -export const Base: Story = { - args: { - address: '0x8c8F1a1e1bFdb15E7ed562efc84e5A588E68aD73', - chain: base, - }, -}; - -export const BaseSepolia: Story = { - args: { - address: '0xf75ca27C443768EE1876b027272DC8E3d00B8a23', - chain: baseSepolia, - }, -}; - -export const BaseDefaultToMainnet: Story = { - args: { - address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', - chain: base, - }, -}; - -export const BaseSepoliaDefaultToMainnet: Story = { - args: { - address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', - chain: baseSepolia, - }, -}; - -export const BaseDefaultProfile: Story = { - args: { - address: '0xdb39F11c909bFA976FdC27538152C1a0E4f0fCcA', - chain: base, - }, -}; - -export const BaseSepoliaDefaultProfile: Story = { - args: { - address: '0x8c8F1a1e1bFdb15E7ed562efc84e5A588E68aD73', - chain: baseSepolia, - }, -}; diff --git a/packages/onchainkit/src/identity/components/Badge.stories.ts b/packages/onchainkit/src/identity/components/Badge.stories.ts deleted file mode 100644 index f47ea128e2..0000000000 --- a/packages/onchainkit/src/identity/components/Badge.stories.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { Badge } from './Badge'; - -const meta = { - title: 'Identity/Badge', - component: Badge, - tags: ['autodocs'], -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/identity/components/EthBalance.stories.tsx b/packages/onchainkit/src/identity/components/EthBalance.stories.tsx deleted file mode 100644 index be865dbd4c..0000000000 --- a/packages/onchainkit/src/identity/components/EthBalance.stories.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { baseSepolia } from 'viem/chains'; -import { http, WagmiProvider, createConfig } from 'wagmi'; -import { EthBalance } from './EthBalance'; - -const wagmiConfig = createConfig({ - chains: [baseSepolia], - transports: { - [baseSepolia.id]: http(), - }, -}); - -const meta = { - title: 'Identity/EthBalance', - component: EthBalance, - decorators: [ - (Story) => { - return ( - - - - - - ); - }, - ], - tags: ['autodocs'], - args: { - address: '0x02feeb0AdE57b6adEEdE5A4EEea6Cf8c21BeB6B1', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/identity/components/Name.stories.tsx b/packages/onchainkit/src/identity/components/Name.stories.tsx deleted file mode 100644 index 0156ed04ca..0000000000 --- a/packages/onchainkit/src/identity/components/Name.stories.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { baseSepolia, optimism } from 'viem/chains'; -import { Name } from './Name'; - -const meta = { - title: 'Identity/Name', - component: Name, - decorators: [ - (Story) => { - return ( - - - - ); - }, - ], - tags: ['autodocs'], - args: { - address: '0x02feeb0AdE57b6adEEdE5A4EEea6Cf8c21BeB6B1', - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; - -export const BaseSepolia: Story = { - args: { - address: '0xe5546B2Bd78408DB7908F86251e7f694CF6397b9', - chain: baseSepolia, - }, -}; - -// This should default to ENS domain -export const BaseSepoliaWithoutDomain: Story = { - args: { - address: '0x02feeb0AdE57b6adEEdE5A4EEea6Cf8c21BeB6B1', - chain: baseSepolia, - }, -}; - -export const UnsupportedChain: Story = { - args: { - address: '0x8c8F1a1e1bFdb15E7ed562efc84e5A588E68aD73', - chain: optimism, - }, -}; diff --git a/packages/onchainkit/src/internal/svg/disconnectSvg.stories.ts b/packages/onchainkit/src/internal/svg/disconnectSvg.stories.ts deleted file mode 100644 index 6250cc373a..0000000000 --- a/packages/onchainkit/src/internal/svg/disconnectSvg.stories.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import React from 'react'; -import { disconnectSvg } from './disconnectSvg'; - -const SvgWrapper: React.FC = () => - React.createElement( - 'div', - { - style: { width: '100%', height: '100%', viewBox: '0 0 16 20' }, - }, - disconnectSvg, - ); - -const meta = { - title: 'Wallet/DisconnectSvg', - component: SvgWrapper, - tags: ['autodocs'], -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/swap/components/SwapButton.stories.tsx b/packages/onchainkit/src/swap/components/SwapButton.stories.tsx deleted file mode 100644 index cd8d6ea1b7..0000000000 --- a/packages/onchainkit/src/swap/components/SwapButton.stories.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { baseSepolia } from 'viem/chains'; -import { http, WagmiProvider, createConfig } from 'wagmi'; -import { SwapButton } from './SwapButton'; -import { SwapProvider } from './SwapProvider'; - -const wagmiConfig = createConfig({ - chains: [baseSepolia], - transports: { - [baseSepolia.id]: http(), - }, -}); - -const meta = { - title: 'Swap/Button', - decorators: [ - (Story) => ( - - - - - - - - ), - ], - component: SwapButton, - tags: ['autodocs'], - argTypes: { - className: { - control: 'text', - }, - }, - args: { - disabled: true, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/swap/components/SwapToggleButton.stories.tsx b/packages/onchainkit/src/swap/components/SwapToggleButton.stories.tsx deleted file mode 100644 index f807deb7c2..0000000000 --- a/packages/onchainkit/src/swap/components/SwapToggleButton.stories.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { baseSepolia } from 'viem/chains'; -import { http, WagmiProvider, createConfig } from 'wagmi'; -import { SwapProvider } from './SwapProvider'; -import { SwapToggleButton } from './SwapToggleButton'; - -const wagmiConfig = createConfig({ - chains: [baseSepolia], - transports: { - [baseSepolia.id]: http(), - }, -}); - -const meta = { - title: 'Swap/ToggleButton', - decorators: [ - (Story) => ( - - - - - - - - ), - ], - component: SwapToggleButton, - tags: ['autodocs'], -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/token/components/TokenChip.stories.ts b/packages/onchainkit/src/token/components/TokenChip.stories.ts deleted file mode 100644 index 2eb250b265..0000000000 --- a/packages/onchainkit/src/token/components/TokenChip.stories.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { fn } from '@storybook/test'; -import { TokenChip } from './TokenChip'; - -const meta = { - title: 'Token/TokenChip', - component: TokenChip, - tags: ['autodocs'], - argTypes: {}, - args: { - onClick: fn(), - token: { - address: '', - chainId: 1, - name: 'Ethereum', - symbol: 'ETH', - decimals: 18, - image: - 'https://dynamic-assets.coinbase.com/dbb4b4983bde81309ddab83eb598358eb44375b930b94687ebe38bc22e52c3b2125258ffb8477a5ef22e33d6bd72e32a506c391caa13af64c00e46613c3e5806/asset_icons/4113b082d21cc5fab17fc8f2d19fb996165bcce635e6900f7fc2d57c4ef33ae9.png', - }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/token/components/TokenImage.stories.ts b/packages/onchainkit/src/token/components/TokenImage.stories.ts deleted file mode 100644 index d459f02cd6..0000000000 --- a/packages/onchainkit/src/token/components/TokenImage.stories.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { TokenImage } from './TokenImage'; - -const meta = { - title: 'Token/TokenImage', - component: TokenImage, - tags: ['autodocs'], - argTypes: { - size: { - control: 'number', - }, - }, - args: { - size: 24, - token: { - address: '', - chainId: 1, - name: 'Ethereum', - symbol: 'ETH', - decimals: 18, - image: - 'https://dynamic-assets.coinbase.com/dbb4b4983bde81309ddab83eb598358eb44375b930b94687ebe38bc22e52c3b2125258ffb8477a5ef22e33d6bd72e32a506c391caa13af64c00e46613c3e5806/asset_icons/4113b082d21cc5fab17fc8f2d19fb996165bcce635e6900f7fc2d57c4ef33ae9.png', - }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = { - args: {}, -}; diff --git a/packages/onchainkit/src/token/components/TokenRow.stories.ts b/packages/onchainkit/src/token/components/TokenRow.stories.ts deleted file mode 100644 index 63a683af54..0000000000 --- a/packages/onchainkit/src/token/components/TokenRow.stories.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { fn } from '@storybook/test'; -import { TokenRow } from './TokenRow'; - -const meta = { - title: 'Token/TokenRow', - component: TokenRow, - tags: ['autodocs'], - argTypes: { - hideImage: { - control: 'boolean', - }, - hideSymbol: { - control: 'boolean', - }, - }, - args: { - amount: '100', - hideImage: false, - hideSymbol: false, - token: { - address: '', - chainId: 1, - name: 'Ethereum', - symbol: 'ETH', - decimals: 18, - image: - 'https://dynamic-assets.coinbase.com/dbb4b4983bde81309ddab83eb598358eb44375b930b94687ebe38bc22e52c3b2125258ffb8477a5ef22e33d6bd72e32a506c391caa13af64c00e46613c3e5806/asset_icons/4113b082d21cc5fab17fc8f2d19fb996165bcce635e6900f7fc2d57c4ef33ae9.png', - }, - onClick: fn(), - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/token/components/TokenSearch.stories.tsx b/packages/onchainkit/src/token/components/TokenSearch.stories.tsx deleted file mode 100644 index 5e43df52cc..0000000000 --- a/packages/onchainkit/src/token/components/TokenSearch.stories.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { expect, fn, userEvent, within } from '@storybook/test'; -import React from 'react'; -import { getTokens } from '../../api/getTokens'; -import { TokenSearch } from './TokenSearch'; - -const meta = { - title: 'Token/TokenSearch', - component: () => { - // const [tokens, setTokens] = React.useState([]); - - // TODO: This requires an API key - // eslint-disable-next-line react-hooks/rules-of-hooks - const handleChange = React.useCallback(async () => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const _data = await getTokens(); - // setTokens(data) - }, []); - - return ( -
- - {/**
{JSON.stringify(tokens, null, 2)}
*/} -
- ); - }, - tags: ['autodocs'], - argTypes: {}, - args: { - delayMs: 200, - onChange: fn(), - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = { - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - - const Input = canvas.getByPlaceholderText('Search for a token'); - - await userEvent.type(Input, 'eth', { delay: 300 }); - - const CloseButton = canvas.getByRole('button'); - expect(CloseButton).not.toBeUndefined(); - - await new Promise((resolve) => setTimeout(resolve, 1000)); - - await userEvent.click(CloseButton); - }, -}; diff --git a/packages/onchainkit/src/token/components/TokenSelectButton.stories.ts b/packages/onchainkit/src/token/components/TokenSelectButton.stories.ts deleted file mode 100644 index 3f2fe635a1..0000000000 --- a/packages/onchainkit/src/token/components/TokenSelectButton.stories.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { fn } from '@storybook/test'; -import { TokenSelectButton } from './TokenSelectButton'; - -const meta = { - title: 'Token/TokenSelectButton', - component: TokenSelectButton, - tags: ['autodocs'], - argTypes: {}, - args: { - isOpen: false, - onClick: fn(), - token: { - address: '', - chainId: 1, - name: 'Ethereum', - symbol: 'ETH', - decimals: 18, - image: - 'https://dynamic-assets.coinbase.com/dbb4b4983bde81309ddab83eb598358eb44375b930b94687ebe38bc22e52c3b2125258ffb8477a5ef22e33d6bd72e32a506c391caa13af64c00e46613c3e5806/asset_icons/4113b082d21cc5fab17fc8f2d19fb996165bcce635e6900f7fc2d57c4ef33ae9.png', - }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/token/components/TokenSelectDropdown.stories.tsx b/packages/onchainkit/src/token/components/TokenSelectDropdown.stories.tsx deleted file mode 100644 index 8c2152bfab..0000000000 --- a/packages/onchainkit/src/token/components/TokenSelectDropdown.stories.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { fn } from '@storybook/test'; -import React from 'react'; -import type { Token } from '../types'; -import { TokenSelectDropdown } from './TokenSelectDropdown'; - -const tokens: Token[] = [ - { - address: '', - chainId: 1, - name: 'Ethereum', - symbol: 'ETH', - decimals: 18, - image: - 'https://dynamic-assets.coinbase.com/dbb4b4983bde81309ddab83eb598358eb44375b930b94687ebe38bc22e52c3b2125258ffb8477a5ef22e33d6bd72e32a506c391caa13af64c00e46613c3e5806/asset_icons/4113b082d21cc5fab17fc8f2d19fb996165bcce635e6900f7fc2d57c4ef33ae9.png', - }, - { - name: 'USDC', - address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', - symbol: 'USDC', - decimals: 6, - image: - 'https://d3r81g40ycuhqg.cloudfront.net/wallet/wais/44/2b/442b80bd16af0c0d9b22e03a16753823fe826e5bfd457292b55fa0ba8c1ba213-ZWUzYjJmZGUtMDYxNy00NDcyLTg0NjQtMWI4OGEwYjBiODE2', - chainId: 8453, - }, - { - name: 'Dai', - address: '0x50c5725949a6f0c72e6c4a641f24049a917db0cb', - symbol: 'DAI', - decimals: 18, - image: - 'https://d3r81g40ycuhqg.cloudfront.net/wallet/wais/d0/d7/d0d7784975771dbbac9a22c8c0c12928cc6f658cbcf2bbbf7c909f0fa2426dec-NmU4ZWViMDItOTQyYy00Yjk5LTkzODUtNGJlZmJiMTUxOTgy', - chainId: 8453, - }, -]; - -const meta = { - title: 'Token/TokenSelectDropdown', - component: () => { - // eslint-disable-next-line react-hooks/rules-of-hooks - const [token, setToken] = React.useState(undefined); - return ( - - ); - }, - tags: ['autodocs'], - argTypes: {}, - args: { - setToken: fn(), - options: tokens, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/transaction/components/TransactionButton.stories.tsx b/packages/onchainkit/src/transaction/components/TransactionButton.stories.tsx deleted file mode 100644 index 3325607c26..0000000000 --- a/packages/onchainkit/src/transaction/components/TransactionButton.stories.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { baseSepolia } from 'viem/chains'; -import { http, WagmiProvider, createConfig } from 'wagmi'; -import { TransactionButton } from './TransactionButton'; -import { TransactionProvider } from './TransactionProvider'; - -const wagmiConfig = createConfig({ - chains: [baseSepolia], - transports: { - [baseSepolia.id]: http(), - }, -}); - -const meta = { - title: 'Transaction/Button', - decorators: [ - (Story) => ( - - - - - - - - ), - ], - component: TransactionButton, - tags: ['autodocs'], - argTypes: { - className: { - control: 'text', - }, - }, -} satisfies Meta; - -export default meta; - -type Story = StoryObj; - -export const Basic: Story = {}; diff --git a/packages/onchainkit/src/vite-env.d.ts b/packages/onchainkit/src/vite-env.d.ts new file mode 100644 index 0000000000..11f02fe2a0 --- /dev/null +++ b/packages/onchainkit/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/onchainkit/src/wallet/components/WalletDropdownDisconnect.stories.tsx b/packages/onchainkit/src/wallet/components/WalletDropdownDisconnect.stories.tsx deleted file mode 100644 index f84d172f0c..0000000000 --- a/packages/onchainkit/src/wallet/components/WalletDropdownDisconnect.stories.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { baseSepolia } from 'viem/chains'; -import { http, WagmiProvider, createConfig } from 'wagmi'; -import { WalletDropdownDisconnect } from './WalletDropdownDisconnect'; - -const wagmiConfig = createConfig({ - chains: [baseSepolia], - transports: { - [baseSepolia.id]: http(), - }, -}); - -export default { - title: 'Wallet/WalletDropdownDisconnect', - component: WalletDropdownDisconnect, - decorators: [ - (Story) => ( - - - - - - ), - ], -}; - -export const Default = () => ; - -export const CustomText = () => ; - -export const CustomClass = () => ( - -); diff --git a/packages/onchainkit/src/wallet/types.ts b/packages/onchainkit/src/wallet/types.ts index 035aad4018..5861761c74 100644 --- a/packages/onchainkit/src/wallet/types.ts +++ b/packages/onchainkit/src/wallet/types.ts @@ -4,8 +4,7 @@ import type { SwapDefaultReact } from '@/swap/types'; import type { Token } from '@/token'; import type { QueryObserverResult } from '@tanstack/react-query'; import type { Dispatch, ReactNode, SetStateAction } from 'react'; -import type { Address, Chain, PublicClient } from 'viem'; -import type { UserOperation } from 'viem/_types/account-abstraction'; +import type { RpcUserOperation, Address, Chain, PublicClient } from 'viem'; import type { UseBalanceReturnType, UseReadContractReturnType } from 'wagmi'; export type ConnectButtonReact = { @@ -57,7 +56,7 @@ export type IsValidAAEntrypointOptions = { */ export type IsWalletACoinbaseSmartWalletOptions = { client: PublicClient; - userOp: UserOperation<'0.6'>; + userOp: RpcUserOperation<'0.6'>; }; /** diff --git a/packages/onchainkit/src/wallet/utils/isWalletACoinbaseSmartWallet.test.ts b/packages/onchainkit/src/wallet/utils/isWalletACoinbaseSmartWallet.test.ts index 6856efd438..cb6624b84d 100644 --- a/packages/onchainkit/src/wallet/utils/isWalletACoinbaseSmartWallet.test.ts +++ b/packages/onchainkit/src/wallet/utils/isWalletACoinbaseSmartWallet.test.ts @@ -1,5 +1,4 @@ -import type { PublicClient } from 'viem'; -import type { UserOperation } from 'viem/_types/account-abstraction'; +import type { PublicClient, RpcUserOperation } from 'viem'; import { type Mock, describe, expect, it, vi } from 'vitest'; import { CB_SW_PROXY_BYTECODE, @@ -16,7 +15,7 @@ describe('isWalletACoinbaseSmartWallet', () => { it('should return false for an undeployed account that does not use the Smart Wallet factory', async () => { const userOp = { initCode: 'other-factory', - } as unknown as UserOperation<'0.6'>; + } as unknown as RpcUserOperation<'0.6'>; (client.getBytecode as Mock).mockReturnValue(undefined); @@ -31,7 +30,7 @@ describe('isWalletACoinbaseSmartWallet', () => { it('should return true for an undeployed account that does use the Smart Wallet factory', async () => { const userOp = { initCode: '0x0BA5ED0c6AA8c49038F819E587E2633c4A9F428a1234', - } as unknown as UserOperation<'0.6'>; + } as unknown as RpcUserOperation<'0.6'>; (client.getBytecode as Mock).mockReturnValue(undefined); @@ -44,7 +43,7 @@ describe('isWalletACoinbaseSmartWallet', () => { it('should return false for an invalid sender proxy address', async () => { const userOp = { sender: 'invalid-proxy-address', - } as unknown as UserOperation<'0.6'>; + } as unknown as RpcUserOperation<'0.6'>; (client.getBytecode as Mock).mockReturnValue('invalid bytecode'); (client.request as Mock).mockResolvedValue( @@ -62,7 +61,7 @@ describe('isWalletACoinbaseSmartWallet', () => { it('should return false when the implementation address does not match COINBASE_SMART_WALLET_V1_IMPLEMENTATION', async () => { const userOp = { sender: 'valid-proxy-address', - } as unknown as UserOperation<'0.6'>; + } as unknown as RpcUserOperation<'0.6'>; (client.getBytecode as Mock).mockResolvedValue(CB_SW_PROXY_BYTECODE); const differentImplementationAddress = @@ -86,7 +85,7 @@ describe('isWalletACoinbaseSmartWallet', () => { const userOp = { sender: 'valid-proxy-address', - } as unknown as UserOperation<'0.6'>; + } as unknown as RpcUserOperation<'0.6'>; (client.getBytecode as Mock).mockResolvedValue(CB_SW_PROXY_BYTECODE); (client.request as Mock).mockResolvedValue( @@ -100,7 +99,7 @@ describe('isWalletACoinbaseSmartWallet', () => { it('should return false when there is an error retrieving bytecode', async () => { const userOp = { sender: 'error-address', - } as unknown as UserOperation<'0.6'>; + } as unknown as RpcUserOperation<'0.6'>; (client.getBytecode as Mock).mockRejectedValue( new Error('Failed to fetch bytecode'), @@ -120,7 +119,7 @@ describe('isWalletACoinbaseSmartWallet', () => { it('should return false when there is an error retrieving implementation address', async () => { const userOp = { sender: 'valid-proxy-address', - } as unknown as UserOperation<'0.6'>; + } as unknown as RpcUserOperation<'0.6'>; (client.getBytecode as Mock).mockResolvedValue(CB_SW_PROXY_BYTECODE); (client.request as Mock).mockRejectedValue( diff --git a/packages/onchainkit/tsconfig.dev.json b/packages/onchainkit/tsconfig.dev.json deleted file mode 100644 index 49d39eba1e..0000000000 --- a/packages/onchainkit/tsconfig.dev.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "baseUrl": "./src", - "paths": { - "@/*": ["./*"] - } - }, -} diff --git a/packages/onchainkit/tsconfig.esm.json b/packages/onchainkit/tsconfig.esm.json deleted file mode 100644 index fc8520e737..0000000000 --- a/packages/onchainkit/tsconfig.esm.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.json" -} diff --git a/packages/onchainkit/tsconfig.json b/packages/onchainkit/tsconfig.json index 5193d0867d..0c1ce9436f 100644 --- a/packages/onchainkit/tsconfig.json +++ b/packages/onchainkit/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { - "moduleResolution": "node", + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "moduleResolution": "bundler", "target": "es2020", "module": "es2020", "lib": ["es2020", "dom"], @@ -9,18 +10,17 @@ "strict": true, "sourceMap": true, "declaration": true, + "declarationMap": true, "allowSyntheticDefaultImports": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "declarationDir": "dist/types", - "outDir": "esm", - "typeRoots": ["node_modules/@types", "./types"], - "rootDir": "src", + "typeRoots": ["node_modules/@types", "src/types"], + "outDir": "dist", "baseUrl": ".", "paths": { "@/*": ["src/*"] } }, "include": ["src"], - "exclude": ["node_modules", "**/*.stories.*"] + "exclude": ["node_modules"] } diff --git a/packages/onchainkit/tsup.config.ts b/packages/onchainkit/tsup.config.ts deleted file mode 100644 index 26955811f5..0000000000 --- a/packages/onchainkit/tsup.config.ts +++ /dev/null @@ -1,69 +0,0 @@ -/// - -import { spawnSync } from 'node:child_process'; -import { defineConfig } from 'tsup'; -import { fixAliasPlugin } from 'esbuild-fix-imports-plugin'; - -const isWatchMode = process.argv.includes('--watch'); - -const outDir = 'esm'; - -export default defineConfig({ - tsconfig: 'tsconfig.dev.json', - entry: [ - 'src/**/*.ts', - 'src/**/*.tsx', - '!src/**/*.{test,stories}.{ts,tsx}', - 'src/**/styles.css', - ], - format: ['esm'], - dts: false, - sourcemap: true, - clean: false, - outDir, - treeshake: false, - splitting: false, - bundle: false, - minify: false, - keepNames: true, - silent: false, - watch: isWatchMode ? ['src/**/*.{ts,tsx}'] : false, - ignoreWatch: ['**/*.{test,stories}.{ts,tsx}'], - inject: ['react-shim.js'], - esbuildPlugins: [fixAliasPlugin()], - - esbuildOptions(options) { - options.jsx = 'automatic'; - options.jsxImportSource = 'react'; - }, - - // Generate declaration files separately to improve performance in development - async onSuccess() { - console.log('Generating declaration files...'); - spawnSync( - 'tsc', - [ - '--emitDeclarationOnly', - '--declaration', - '--outDir', - outDir, - '--rootDir', - 'src', - 'src/index.ts', - 'src/*.ts', - 'src/**/index.ts', - 'src/**/theme.ts', - '--incremental', - '--tsBuildInfoFile', - `${outDir}/tsbuildinfo.json`, - '--jsx', - 'react-jsx', - ], - { - shell: true, - }, - ); - - console.log('âš¡ Rebuilt onchainkit.'); - }, -}); diff --git a/packages/onchainkit/vite.config.ts b/packages/onchainkit/vite.config.ts new file mode 100644 index 0000000000..592c869608 --- /dev/null +++ b/packages/onchainkit/vite.config.ts @@ -0,0 +1,58 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import dts from 'vite-plugin-dts'; +import { externalizeDeps } from 'vite-plugin-externalize-deps'; +import preserveUseClientDirective from 'rollup-plugin-preserve-use-client'; +import { extname, relative, resolve } from 'path'; +import { fileURLToPath } from 'node:url'; +import { glob } from 'glob'; +import path from 'node:path'; + +const entryPoints = Object.fromEntries( + glob + .sync('src/**/*.{ts,tsx}', { + ignore: ['src/**/*.d.ts', 'src/**/*.test.ts', 'src/**/*.test.tsx'], + }) + .map((file) => [ + // The name of the entry point + // src/nested/foo.ts becomes nested/foo + relative('src', file.slice(0, file.length - extname(file).length)), + // The absolute path to the entry file + // src/nested/foo.ts becomes /project/src/nested/foo.ts + fileURLToPath(new URL(file, import.meta.url)), + ]), +); + +// https://vite.dev/config/ +export default defineConfig({ + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + plugins: [ + externalizeDeps(), + preserveUseClientDirective(), + react(), + dts({ + tsconfigPath: './tsconfig.json', + include: ['src'], + exclude: ['src/**/*.test.ts', 'src/**/*.test.tsx'], + }), + ], + build: { + minify: false, + sourcemap: true, + lib: { + entry: resolve(__dirname, 'src/index.ts'), + formats: ['es'], + }, + rollupOptions: { + input: entryPoints, + output: { + assetFileNames: 'assets/[name][extname]', + entryFileNames: '[name].js', + }, + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0dadf9faa..cd9e4cec8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,7 +95,7 @@ importers: dependencies: '@coinbase/onchainkit': specifier: latest - version: 0.38.5(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.24.2) + version: 0.38.5(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -209,36 +209,6 @@ importers: specifier: ^2.14.11 version: 2.14.15(@tanstack/query-core@5.69.0)(@tanstack/react-query@5.69.0(react@18.3.1))(@types/react@18.3.19)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2) devDependencies: - '@chromatic-com/storybook': - specifier: ^1.7.0 - version: 1.9.0(react@18.3.1) - '@storybook/addon-a11y': - specifier: ^8.2.9 - version: 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-essentials': - specifier: ^8.2.9 - version: 8.6.7(@types/react@18.3.19)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-interactions': - specifier: ^8.2.9 - version: 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-links': - specifier: ^8.2.9 - version: 8.6.7(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/blocks': - specifier: ^8.2.9 - version: 8.6.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/react': - specifier: ^8.2.9 - version: 8.6.7(@storybook/test@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.2) - '@storybook/react-vite': - specifier: ^8.2.9 - version: 8.6.7(@storybook/test@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.36.0)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) - '@storybook/test': - specifier: ^8.2.9 - version: 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/test-runner': - specifier: ^0.19.1 - version: 0.19.1(@swc/helpers@0.5.15)(@types/node@22.13.10)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) '@testing-library/jest-dom': specifier: 6.4.7 version: 6.4.7(@jest/globals@29.7.0)(jest@29.7.0(@types/node@22.13.10))(vitest@3.0.9) @@ -260,6 +230,9 @@ importers: '@types/react-dom': specifier: ^18 version: 18.3.5(@types/react@18.3.19) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) '@vitest/coverage-v8': specifier: ^3.0.5 version: 3.0.9(vitest@3.0.9) @@ -278,6 +251,15 @@ importers: esbuild-fix-imports-plugin: specifier: ^1.0.19 version: 1.0.19 + esbuild-plugin-babel: + specifier: ^0.2.3 + version: 0.2.3(@babel/core@7.26.10) + glob: + specifier: ^11.0.1 + version: 11.0.1 + globals: + specifier: ^15.15.0 + version: 15.15.0 jsdom: specifier: ^24.1.0 version: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -293,6 +275,9 @@ importers: rimraf: specifier: ^5.0.5 version: 5.0.10 + rollup-plugin-preserve-use-client: + specifier: ^3.0.1 + version: 3.0.1(rollup@4.36.0) storybook: specifier: ^8.2.9 version: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) @@ -307,10 +292,16 @@ importers: version: 0.0.9 tsup: specifier: ^8.3.5 - version: 8.4.0(@swc/core@1.11.11(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.2)(yaml@2.7.0) + version: 8.4.0(@microsoft/api-extractor@7.52.3(@types/node@22.13.10))(@swc/core@1.11.11(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.2)(yaml@2.7.0) vite: specifier: ^5.3.3 version: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) + vite-plugin-dts: + specifier: ^4.5.3 + version: 4.5.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) + vite-plugin-externalize-deps: + specifier: ^0.9.0 + version: 0.9.0(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) vitest: specifier: ^3.0.5 version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) @@ -1228,10 +1219,6 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@chromatic-com/storybook@1.9.0': - resolution: {integrity: sha512-vYQ+TcfktEE3GHnLZXHCzXF/sN9dw+KivH8a5cmPyd9YtQs7fZtHrEgsIjWpYycXiweKMo1Lm1RZsjxk8DH3rA==} - engines: {node: '>=16.0.0', yarn: '>=1.22.18'} - '@coinbase/onchainkit@0.38.5': resolution: {integrity: sha512-i6lW4G6Cto/HCIwv2o4CF1I/5J5mJdUF7KqjALf8qh+LdIdZ1UWl0Zhs8OP93OEEf+GgU18usQSXzLs1uCcogw==} peerDependencies: @@ -1663,12 +1650,6 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - - '@hapi/topo@5.1.0': - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1714,10 +1695,6 @@ packages: node-notifier: optional: true - '@jest/create-cache-key-function@29.7.0': - resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/environment@29.7.0': resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1771,15 +1748,6 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0': - resolution: {integrity: sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ==} - peerDependencies: - typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - peerDependenciesMeta: - typescript: - optional: true - '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -1810,12 +1778,6 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@mdx-js/react@3.1.0': - resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} - peerDependencies: - '@types/react': '>=16' - react: '>=16' - '@metamask/eth-json-rpc-provider@1.0.1': resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} @@ -1885,6 +1847,19 @@ packages: resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} engines: {node: '>=16.0.0'} + '@microsoft/api-extractor-model@7.30.5': + resolution: {integrity: sha512-0ic4rcbcDZHz833RaTZWTGu+NpNgrxVNjVaor0ZDUymfDFzjA/Uuk8hYziIUIOEOSTfmIQqyzVwlzxZxPe7tOA==} + + '@microsoft/api-extractor@7.52.3': + resolution: {integrity: sha512-QEs6l8h7p9eOSHrQ9NBBUZhUuq+j/2QKcRgigbSs2YQepKz8glvsqmsUOp+nvuaY60ps7KkpVVYQCj81WLoMVQ==} + hasBin: true + + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + '@motionone/animation@10.18.0': resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} @@ -2555,6 +2530,28 @@ packages: '@rushstack/eslint-patch@1.11.0': resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} + '@rushstack/node-core-library@5.13.0': + resolution: {integrity: sha512-IGVhy+JgUacAdCGXKUrRhwHMTzqhWwZUI+qEPcdzsb80heOw0QPbhhoVsoiMF7Klp8eYsp7hzpScMXmOa3Uhfg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + + '@rushstack/terminal@0.15.2': + resolution: {integrity: sha512-7Hmc0ysK5077R/IkLS9hYu0QuNafm+TbZbtYVzCMbeOdMjaRboLKrhryjwZSRJGJzu+TV1ON7qZHeqf58XfLpA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@4.23.7': + resolution: {integrity: sha512-Gr9cB7DGe6uz5vq2wdr89WbVDKz0UeuFEn5H2CfWDe7JvjFFaiV15gi6mqDBTbHhHCWS7w8mF1h3BnIfUndqdA==} + '@safe-global/safe-apps-provider@0.18.5': resolution: {integrity: sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g==} @@ -2583,15 +2580,6 @@ packages: '@scure/bip39@1.5.4': resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} - '@sideway/address@4.1.5': - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} - - '@sideway/formula@3.0.1': - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - - '@sideway/pinpoint@2.0.0': - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -2604,103 +2592,6 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@storybook/addon-a11y@8.6.7': - resolution: {integrity: sha512-/pGRa27AVpoFG0J2+PTKSQCk6ytbRkcR+5fi75iLlqgp7YZN9rVJ8SYyEXALf/B8Gw9hSk2uxCyT3dA7ZTy52Q==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-actions@8.6.7': - resolution: {integrity: sha512-XgZCwIcZGThEyD7e2q7rN/jzg7ZHUxn/ln403eex04jWAGBBbtC2IVuowwCWV8HwDihnhpCZEP6HlgjakOYZbQ==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-backgrounds@8.6.7': - resolution: {integrity: sha512-aDFzi83gDhYn0+FGjRYbY5TfBtoG/UgVr9Abi7s5ceabZRhPrYikMyFX0o8V3Z8COl6wUmWmF1luYE4MfXgN2g==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-controls@8.6.7': - resolution: {integrity: sha512-6ReB1Sc1qlqvAM7NUmtw2K1cKCgGBs8zYRgL44Q2ti+r55a2ownhm6WUm/kZs2ixSkV9ehm1osiqbGBfAn0Isw==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-docs@8.6.7': - resolution: {integrity: sha512-kgNPEVuLGNJE8EdVQi5Tg2DYgR66/gut07jvhqnJfNqUkj6UpBHad0JR1uwrd7xS3kJs29Fs7UyU87RJnSlwcg==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-essentials@8.6.7': - resolution: {integrity: sha512-PFT62xuknk4wD1hTZEnYbGP1mJFPlhk7zVVlMjoldMUhmbHsFRhdWCpo93Vu9E3BWVxFxL3Jj+UwSwH4uVmekQ==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-highlight@8.6.7': - resolution: {integrity: sha512-4KE1RF4XfqII7XrJPgf/1W0t0EWRKmik5Rrpb6WofXfgZ2QYzLFnyESjf67/g2TMgDnle2drfa/pt5tGV4+I2Q==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-interactions@8.6.7': - resolution: {integrity: sha512-FbEWWxCl/5DJDyEGTJqtTJ5XbxM2rOUGCPy+3CkPSpI9yvz3zprRTJRHPFrh7hUqQ4Qkqfjm7JCO29+0CmeE0g==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-links@8.6.7': - resolution: {integrity: sha512-fIiXlaOa9Bv2tbBshQbh/BjzGOilXVx+6nrX9VkLOg7UvzAvivtSraRmPWjgdtsChAHC8Xac42KUCNGQ/rkf5w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.7 - peerDependenciesMeta: - react: - optional: true - - '@storybook/addon-measure@8.6.7': - resolution: {integrity: sha512-4dkkCltjKRcJH+ZMv5nbNT0LBQfcXIydVfN9mAvhDsiPFD5eZcHbN4XVfUslECWgrkaa/a6FE1W9PNEUBjCJaA==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-outline@8.6.7': - resolution: {integrity: sha512-atCpCi2CqAWQwL1nu1l5VpIA4fRMnbD4RZMsEiib1suUfNyJv0RdsSgZhp/f+e9sUS0TtMdwhzWT36eEA7VxhQ==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-toolbars@8.6.7': - resolution: {integrity: sha512-gR+mRs+Cc5GINZdKgE7afJLFCSMHkz40+zzdrPu6yY2P4B3UOvuQpt+zC/Er5YQ31EEjIvM6/XMQTM0i2db8AA==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/addon-viewport@8.6.7': - resolution: {integrity: sha512-kTrt6ByCbBIbqoRqQO9watDl5nSIKCC+R0/EmpEl6ZtzBV3l8trZHdvCHhIqOyv7nfaa7pIeTTG1GD6Gdrxk3w==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/blocks@8.6.7': - resolution: {integrity: sha512-IFhIKO7R1UPpnoG/5tZH0FgC79oYgXNf+7aGUwq29M/CQWy6p/Pvp0y4P962btY1UZRol+SsU//33nH8o6yNRw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^8.6.7 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/builder-vite@8.6.7': - resolution: {integrity: sha512-hgYnVu2cy8clrmDwidu4XjvFMTEi9WiblLH5cPI3LWQjVajIQmDpcWVp6kbD063sIOphh9zYP7cVKGO7ktMB/g==} - peerDependencies: - storybook: ^8.6.7 - vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - - '@storybook/components@8.6.7': - resolution: {integrity: sha512-8pnjH1w7PZ/Iiuve1/BJY7EO/kmu0qdE34X1ZM8DyHzuy33EL/PfUuhxNkrL4ayMXrEDp/EJMHx2bqO1RdRV6A==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/core-common@8.6.7': - resolution: {integrity: sha512-k34X1G0HnJnCbCuwoTGmm4LKPY3mPqpTfOL2U8rFBHhwGxT35SIvXcs1mOUyzIQ9riUy8eYJM/FzHGR+478Bog==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/core@8.6.7': resolution: {integrity: sha512-FcvLFA+Qn3+D6LgQkk0MOXA5FBz8DGc0UZmZuVbIwIUV4MV4ywCMwtKdG0cyhtzQg0YNyfiIYWJr7lZ4jLLhYg==} peerDependencies: @@ -2709,89 +2600,6 @@ packages: prettier: optional: true - '@storybook/csf-plugin@8.6.7': - resolution: {integrity: sha512-HK7yQD4kFu04JOKnUwoFeR58r5WY6ucF0D8zfW4Gx+r8hBJ5K4t3z6k2dlIlRQF1X5+2vNkQOwD8liHjckuZ8Q==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/csf-tools@8.6.7': - resolution: {integrity: sha512-3W2QqA96RAknxIav5fNNk10WoN9txpYsHC6elVB6/3MnIfH5QN3qEoLR8qPcVbO8Rsa+uEi5Zj+q0pKXxq+9UA==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/csf@0.1.13': - resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==} - - '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - - '@storybook/icons@1.4.0': - resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - - '@storybook/instrumenter@8.6.7': - resolution: {integrity: sha512-FeQiV0g5crCWs0P1wKY4xZzb4PxAYNcrm2+9LLGVqwnC7qzrSCPf0p10MlveVfwsen1m6Wbqfe+wl21c31Hfmg==} - peerDependencies: - storybook: ^8.6.7 - - '@storybook/manager-api@8.6.7': - resolution: {integrity: sha512-BA8RxaLP07WGF660LWo7qB3Jomr/+MPuCZmuKPqXxPhfIovqYjr0hnugxJBjEah0ic31aNX4NucNfDRuV7F5sA==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/preview-api@8.6.7': - resolution: {integrity: sha512-Rz83Nx43v3Dn9/SjhIsorkcx1gPmlclueuzf6YywJTqE1E/L4dgoe2mOA9MfF0jr0bh3TwEA2J3ii0Jstg1Orw==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/react-dom-shim@8.6.7': - resolution: {integrity: sha512-+JH7gbRI6NRbt9o0l1rY4wFdeVt8wGRddm0b55OBlwBGlFo2nvGVOH73J4AGphXVhfY7z33I3TXIjXQ561UdEQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.7 - - '@storybook/react-vite@8.6.7': - resolution: {integrity: sha512-KiTeYaZ+AUQ1AFHSItP8dhUbd2v7Qy8+BB7w64VxQMw/dw5n0Z38lo4Tzdlkn22q2smW2ce4QwAzh2pfTz3b8g==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@storybook/test': 8.6.7 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.7 - vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - peerDependenciesMeta: - '@storybook/test': - optional: true - - '@storybook/react@8.6.7': - resolution: {integrity: sha512-6R8znSm7kzsoAJyRbEiDWE+5xjeAIzwEcfT60fqx+uMdd0vDFM7f2uT4fYy+CijWas1oFWcNV/LMd3EqSkBGsQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@storybook/test': 8.6.7 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.7 - typescript: '>= 4.2.x' - peerDependenciesMeta: - '@storybook/test': - optional: true - typescript: - optional: true - - '@storybook/test-runner@0.19.1': - resolution: {integrity: sha512-Nc4djXw3Lv3AAXg6TJ7yVTeuMryjMsTDd8GCbE/PStU602rpe8syEqElz78GPoJqB1VYWQ3T9pcu93MKyHT+xQ==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - - '@storybook/test@8.6.7': - resolution: {integrity: sha512-uF1JbBtdT7tuiXfEtHsUShBHIhm2vc0C39nKVJaTWyK9CybajXaj2Ny3IRa3oY9NKnklwGgN+kZ/Z9YiIOc4MQ==} - peerDependencies: - storybook: ^8.6.7 - '@storybook/theming@8.6.7': resolution: {integrity: sha512-F/i4XS5bew9dvtNiHvDJF0mko1IUbPM9PUjTYPaw6cK8ytS0kdec703MsJ/GUA7seeEWBeGdZjV3ua0pys650A==} peerDependencies: @@ -2875,12 +2683,6 @@ packages: '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - '@swc/jest@0.2.37': - resolution: {integrity: sha512-CR2BHhmXKGxTiFr21DYPRHQunLkX3mNIFGFkxBGji6r9uyIR5zftTOVYj1e0sFNMV2H7mf/+vpaglqaryBtqfQ==} - engines: {npm: '>= 7.0.0'} - peerDependencies: - '@swc/core': '*' - '@swc/types@0.1.19': resolution: {integrity: sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==} @@ -2999,10 +2801,6 @@ packages: vitest: optional: true - '@testing-library/jest-dom@6.5.0': - resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@14.3.1': resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} engines: {node: '>=14'} @@ -3010,12 +2808,6 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - '@testing-library/user-event@14.6.1': resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} engines: {node: '>=12', npm: '>=6'} @@ -3025,6 +2817,9 @@ packages: '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -3049,9 +2844,6 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/doctrine@0.0.9': - resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -3085,9 +2877,6 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -3132,9 +2921,6 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/resolve@1.20.6': - resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} - '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -3147,12 +2933,6 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - - '@types/wait-on@5.3.4': - resolution: {integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==} - '@types/ws@8.18.0': resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==} @@ -3313,9 +3093,6 @@ packages: '@vitest/browser': optional: true - '@vitest/expect@2.0.5': - resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - '@vitest/expect@3.0.9': resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} @@ -3330,12 +3107,6 @@ packages: vite: optional: true - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} - - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - '@vitest/pretty-format@3.0.9': resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} @@ -3345,9 +3116,6 @@ packages: '@vitest/snapshot@3.0.9': resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} - '@vitest/spy@2.0.5': - resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - '@vitest/spy@3.0.9': resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} @@ -3356,15 +3124,38 @@ packages: peerDependencies: vitest: 3.0.9 - '@vitest/utils@2.0.5': - resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} - - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - '@vitest/utils@3.0.9': resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} + '@volar/language-core@2.4.12': + resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} + + '@volar/source-map@2.4.12': + resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} + + '@volar/typescript@2.4.12': + resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@wagmi/connectors@5.7.11': resolution: {integrity: sha512-vJWOXMeYWmczvlsEZHq52yOoC2qu5kU8Saj6Bo+BtyfYcX1tJODZTKed3TMIoKhUx0W3vna1UIwG7GskmxGKKA==} peerDependencies: @@ -3497,13 +3288,34 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -3512,10 +3324,6 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} - engines: {node: '>=14.16'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -3524,10 +3332,6 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -3547,13 +3351,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} - - archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -3883,10 +3680,6 @@ packages: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} - caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -3925,10 +3718,6 @@ packages: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -3945,10 +3734,6 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - char-regex@2.0.2: - resolution: {integrity: sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==} - engines: {node: '>=12.20'} - chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -3964,18 +3749,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chromatic@11.27.0: - resolution: {integrity: sha512-jQ2ufjS+ePpg+NtcPI9B2eOi+pAzlRd2nhd1LgNMsVCC9Bzf5t8mJtyd8v2AUuJS0LdX0QVBgkOnlNv9xviHzA==} - hasBin: true - peerDependencies: - '@chromatic-com/cypress': ^0.*.* || ^1.0.0 - '@chromatic-com/playwright': ^0.*.* || ^1.0.0 - peerDependenciesMeta: - '@chromatic-com/cypress': - optional: true - '@chromatic-com/playwright': - optional: true - ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -3993,10 +3766,6 @@ packages: class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} @@ -4050,16 +3819,10 @@ packages: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -4070,16 +3833,9 @@ packages: comlink@4.4.2: resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -4087,6 +3843,9 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} @@ -4098,6 +3857,12 @@ packages: engines: {node: ^14.13.0 || >=16.0.0} hasBin: true + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -4110,9 +3875,6 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -4178,10 +3940,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - cwd@0.10.0: - resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} - engines: {node: '>=0.8'} - damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -4205,6 +3963,9 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -4281,10 +4042,6 @@ packages: resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} engines: {node: '>=18'} - default-require-extensions@3.0.1: - resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} - engines: {node: '>=8'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -4360,9 +4117,6 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diffable-html@4.1.0: - resolution: {integrity: sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g==} - dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} @@ -4381,31 +4135,12 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dom-serializer@0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} - - domelementtype@1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@2.4.2: - resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} - - domutils@1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -4471,12 +4206,6 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - entities@1.1.2: - resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} - - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -4525,12 +4254,14 @@ packages: es-toolkit@1.33.0: resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} - es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - esbuild-fix-imports-plugin@1.0.19: resolution: {integrity: sha512-VsI6ozJaEOiRYRr/hWHbP8S+Pm7HNjHPbEctWVAUZ5NRUpES1PBLMSkMvB4WXKGniTKw0zupd01BlHog2bqsSg==} + esbuild-plugin-babel@0.2.3: + resolution: {integrity: sha512-hGLL31n+GvBhkHUpPCt1sU4ynzOH7I1IUkKhera66jigi4mHFPL6dfJo44L6/1rfcZudXx+wGdf9VOifzDPqYQ==} + peerDependencies: + '@babel/core': ^7.0.0 + esbuild-register@3.6.0: resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: @@ -4770,13 +4501,6 @@ packages: resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} - expand-tilde@1.2.2: - resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} - engines: {node: '>=0.10.0'} - - expect-playwright@0.8.0: - resolution: {integrity: sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==} - expect-type@1.2.0: resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} engines: {node: '>=12.0.0'} @@ -4789,6 +4513,9 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + exsolve@1.0.4: + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -4887,22 +4614,6 @@ packages: find-babel-config@2.1.2: resolution: {integrity: sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==} - find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - - find-file-up@0.1.3: - resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} - engines: {node: '>=0.10.0'} - - find-pkg@0.1.2: - resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} - engines: {node: '>=0.10.0'} - - find-process@1.4.10: - resolution: {integrity: sha512-ncYFnWEIwL7PzmrK1yZtaccN8GhethD37RzBHG6iOZoFYB4vSmLLXfeWJjeN5nMvCJMjOtBvBBF8OgxEcikiZg==} - hasBin: true - find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -4939,10 +4650,6 @@ packages: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} - foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -4966,13 +4673,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - - fs-exists-sync@0.1.0: - resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} - engines: {node: '>=0.10.0'} - fs-extra@11.3.0: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} @@ -4988,11 +4688,6 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -5078,6 +4773,11 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@11.0.1: + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -5091,14 +4791,6 @@ packages: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} - global-modules@0.2.3: - resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} - engines: {node: '>=0.10.0'} - - global-prefix@0.1.5: - resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} - engines: {node: '>=0.10.0'} - globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -5195,24 +4887,20 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -5223,9 +4911,6 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - htmlparser2@3.10.1: - resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} - http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -5282,6 +4967,10 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -5302,9 +4991,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ink-progress-bar@3.0.0: resolution: {integrity: sha512-GzByB3uEofqjyWC3VmdhYpBq+kzszu5Nwt/NruTDWa7fbw1E6sx6U1n6Kcsfj9D3qwR17dtC5w9uFVMyRA5HZw==} @@ -5525,9 +5211,6 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -5548,10 +5231,6 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-windows@0.2.0: - resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} - engines: {node: '>=0.10.0'} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -5590,14 +5269,6 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} - - istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} - istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} @@ -5606,10 +5277,6 @@ packages: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} - istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} - istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -5637,6 +5304,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.1.0: + resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + engines: {node: 20 || >=22} + jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5691,10 +5362,6 @@ packages: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-junit@16.0.0: - resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} - engines: {node: '>=10.12.0'} - jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5711,14 +5378,6 @@ packages: resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-playwright-preset@4.0.0: - resolution: {integrity: sha512-+dGZ1X2KqtwXaabVjTGxy0a3VzYfvYsWaRcuO8vMhyclHSOpGSI1+5cmlqzzCwQ3+fv0EjkTc7I5aV9lo08dYw==} - peerDependencies: - jest: ^29.3.1 - jest-circus: ^29.3.1 - jest-environment-node: ^29.3.1 - jest-runner: ^29.3.1 - jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -5728,9 +5387,6 @@ packages: jest-resolve: optional: true - jest-process-manager@0.4.0: - resolution: {integrity: sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==} - jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5751,9 +5407,6 @@ packages: resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-serializer-html@7.1.0: - resolution: {integrity: sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA==} - jest-snapshot@29.7.0: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5766,12 +5419,6 @@ packages: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-watch-typeahead@2.2.2: - resolution: {integrity: sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==} - engines: {node: ^14.17.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - jest: ^27.0.0 || ^28.0.0 || ^29.0.0 - jest-watcher@29.7.0: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5798,8 +5445,8 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - joi@17.13.3: - resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -5855,6 +5502,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -5867,9 +5517,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -5906,6 +5553,9 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -6013,6 +5663,10 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -6028,9 +5682,6 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -6047,10 +5698,6 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -6061,9 +5708,17 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lucide-react@0.416.0: resolution: {integrity: sha512-wPWxTzdss1CTz2aqcNWNlbh4YSnH9neJWP3RaeXepxpLCTW+pmu7WcT/wxJe+Q7Y7DqGOxAqakJv0pIK3431Ag==} peerDependencies: @@ -6073,20 +5728,12 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -6102,9 +5749,6 @@ packages: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} - map-or-similar@1.5.0: - resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} - map-visit@1.0.0: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} @@ -6121,9 +5765,6 @@ packages: resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==} engines: {node: '>=8'} - memoizerific@1.11.3: - resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} - merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -6180,6 +5821,13 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -6222,10 +5870,8 @@ packages: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} motion@10.16.2: resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} @@ -6244,6 +5890,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} @@ -6309,10 +5958,6 @@ packages: node-mock-http@1.0.0: resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} - node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -6336,11 +5981,6 @@ packages: nwsapi@2.2.19: resolution: {integrity: sha512-94bcyI3RsqiZufXjkr3ltkI86iEl+I7uiHVDtcq9wJUTwYQJ5odHDeSzkkrRzi80jJ8MaeZgqKjH1bAWAFw9bA==} - nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} - hasBin: true - obj-multiplex@1.0.0: resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} @@ -6437,10 +6077,6 @@ packages: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} - os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - os-locale@5.0.0: resolution: {integrity: sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==} engines: {node: '>=10'} @@ -6516,18 +6152,10 @@ packages: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} - p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -6559,10 +6187,6 @@ packages: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} @@ -6578,6 +6202,9 @@ packages: resolution: {integrity: sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==} engines: {node: '>=10'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-dirname@1.0.2: resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} @@ -6604,6 +6231,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} @@ -6667,28 +6298,20 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} - playwright-core@1.51.1: - resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} - engines: {node: '>=18'} - hasBin: true - - playwright@1.51.1: - resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==} - engines: {node: '>=18'} - hasBin: true - pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} - polished@4.3.1: - resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} - engines: {node: '>=10'} - pony-cause@2.1.11: resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} engines: {node: '>=12.0.0'} @@ -6800,10 +6423,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-on-spawn@1.1.0: - resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} - engines: {node: '>=8'} - process-warning@1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} @@ -6885,24 +6504,9 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - react-confetti@6.4.0: - resolution: {integrity: sha512-5MdGUcqxrTU26I2EU7ltkWPwxvucQTuqMm8dUz72z2YMqTD6s9vMcDUysk7n9jnC+lXuCPeJJ7Knf98VEYE9Rg==} - engines: {node: '>=16'} - peerDependencies: - react: ^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 - react-devtools-core@4.28.5: resolution: {integrity: sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==} - react-docgen-typescript@2.2.2: - resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} - peerDependencies: - typescript: '>= 4.3.x' - - react-docgen@7.1.1: - resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} - engines: {node: '>=16.14.0'} - react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -7031,10 +6635,6 @@ packages: resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true - release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} - repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} @@ -7047,6 +6647,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -7060,10 +6664,6 @@ packages: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} - resolve-dir@0.1.1: - resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} - engines: {node: '>=0.10.0'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -7108,11 +6708,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@5.0.10: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true @@ -7128,6 +6723,11 @@ packages: peerDependencies: rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + rollup-plugin-preserve-use-client@3.0.1: + resolution: {integrity: sha512-4WKtGnQsgeCzT/PnA82V4knXVTKxNrxJFcPVa1Kero2XaLs1yazGSCUwxv6NzVmeNeURqE+A5wLbI+zlPKVgMg==} + peerDependencies: + rollup: ^4.0.0 + rollup@4.36.0: resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -7194,6 +6794,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.1: resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} @@ -7290,10 +6895,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -7355,13 +6956,6 @@ packages: spawn-command@0.0.2: resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} - - spawnd@5.0.0: - resolution: {integrity: sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==} - spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -7436,14 +7030,14 @@ packages: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} - string-length@5.0.1: - resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} - engines: {node: '>=12.20'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -7509,10 +7103,6 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -7628,10 +7218,6 @@ packages: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} - tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -7705,20 +7291,12 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - tscpaths@0.0.9: resolution: {integrity: sha512-tz4qimSJTCjYtHVsoY7pvxLcxhmhgmwzm7fyMEiL3/kPFFVyUuZOwuwcWwjkAsIrSUKJK22A7fNuJUwxzQ+H+w==} hasBin: true @@ -7748,9 +7326,6 @@ packages: typescript: optional: true - tween-functions@1.2.0: - resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -7767,14 +7342,6 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -7795,9 +7362,6 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typescript-eslint@8.26.1: resolution: {integrity: sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -7878,10 +7442,6 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin@1.16.1: - resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} - engines: {node: '>=14.0.0'} - unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} @@ -8061,6 +7621,20 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true + vite-plugin-dts@4.5.3: + resolution: {integrity: sha512-P64VnD00dR+e8S26ESoFELqc17+w7pKkwlBpgXteOljFyT0zDwD8hH4zXp49M/kciy//7ZbVXIwQCekBJjfWzA==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite-plugin-externalize-deps@0.9.0: + resolution: {integrity: sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite@5.4.14: resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -8160,6 +7734,9 @@ packages: jsdom: optional: true + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -8175,16 +7752,6 @@ packages: typescript: optional: true - wait-on@7.2.0: - resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} - engines: {node: '>=12.0.0'} - hasBin: true - - wait-port@0.2.14: - resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} - engines: {node: '>=8'} - hasBin: true - walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -8201,9 +7768,6 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -8241,10 +7805,6 @@ packages: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -8278,9 +7838,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -8337,9 +7894,6 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -8361,6 +7915,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.7.0: resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} @@ -8649,21 +8206,25 @@ snapshots: dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.10)': dependencies: @@ -8689,11 +8250,13 @@ snapshots: dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': dependencies: @@ -8704,41 +8267,49 @@ snapshots: dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + optional: true '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': dependencies: @@ -9277,7 +8848,8 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@bcoe/v8-coverage@0.2.3': {} + '@bcoe/v8-coverage@0.2.3': + optional: true '@bcoe/v8-coverage@1.0.2': {} @@ -9553,25 +9125,13 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 - '@chromatic-com/storybook@1.9.0(react@18.3.1)': - dependencies: - chromatic: 11.27.0 - filesize: 10.1.6 - jsonfile: 6.1.0 - react-confetti: 6.4.0(react@18.3.1) - strip-ansi: 7.1.0 - transitivePeerDependencies: - - '@chromatic-com/cypress' - - '@chromatic-com/playwright' - - react - - '@coinbase/onchainkit@0.38.5(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.24.2)': + '@coinbase/onchainkit@0.38.5(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: '@farcaster/frame-sdk': 0.0.28(typescript@5.7.3)(zod@3.24.2) - '@farcaster/frame-wagmi-connector': 0.0.16(@farcaster/frame-sdk@0.0.28(typescript@5.7.3)(zod@3.24.2))(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) + '@farcaster/frame-wagmi-connector': 0.0.16(@farcaster/frame-sdk@0.0.28(typescript@5.7.3)(zod@3.24.2))(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) '@tanstack/react-query': 5.69.0(react@18.3.1) '@types/react': 18.3.19 - '@wagmi/core': 2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) + '@wagmi/core': 2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) clsx: 2.1.1 graphql: 16.10.0 graphql-request: 6.1.0(graphql@16.10.0) @@ -9913,10 +9473,10 @@ snapshots: - typescript - zod - '@farcaster/frame-wagmi-connector@0.0.16(@farcaster/frame-sdk@0.0.28(typescript@5.7.3)(zod@3.24.2))(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))': + '@farcaster/frame-wagmi-connector@0.0.16(@farcaster/frame-sdk@0.0.28(typescript@5.7.3)(zod@3.24.2))(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))': dependencies: '@farcaster/frame-sdk': 0.0.28(typescript@5.7.3)(zod@3.24.2) - '@wagmi/core': 2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) + '@wagmi/core': 2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) viem: 2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) '@farcaster/frame-wagmi-connector@0.0.16(@farcaster/frame-sdk@0.0.28(typescript@5.8.2)(zod@3.24.2))(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2)))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2))': @@ -9946,12 +9506,6 @@ snapshots: dependencies: graphql: 16.10.0 - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -9981,6 +9535,7 @@ snapshots: get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 + optional: true '@istanbuljs/schema@0.1.3': {} @@ -9992,6 +9547,7 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 + optional: true '@jest/core@29.7.0': dependencies: @@ -10027,10 +9583,7 @@ snapshots: - babel-plugin-macros - supports-color - ts-node - - '@jest/create-cache-key-function@29.7.0': - dependencies: - '@jest/types': 29.6.3 + optional: true '@jest/environment@29.7.0': dependencies: @@ -10038,10 +9591,12 @@ snapshots: '@jest/types': 29.6.3 '@types/node': 20.17.24 jest-mock: 29.7.0 + optional: true '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 + optional: true '@jest/expect@29.7.0': dependencies: @@ -10049,6 +9604,7 @@ snapshots: jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color + optional: true '@jest/fake-timers@29.7.0': dependencies: @@ -10058,6 +9614,7 @@ snapshots: jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 + optional: true '@jest/globals@29.7.0': dependencies: @@ -10067,6 +9624,7 @@ snapshots: jest-mock: 29.7.0 transitivePeerDependencies: - supports-color + optional: true '@jest/reporters@29.7.0': dependencies: @@ -10096,16 +9654,19 @@ snapshots: v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color + optional: true '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 + optional: true '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.25 callsites: 3.1.0 graceful-fs: 4.2.11 + optional: true '@jest/test-result@29.7.0': dependencies: @@ -10113,6 +9674,7 @@ snapshots: '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 + optional: true '@jest/test-sequencer@29.7.0': dependencies: @@ -10120,6 +9682,7 @@ snapshots: graceful-fs: 4.2.11 jest-haste-map: 29.7.0 slash: 3.0.0 + optional: true '@jest/transform@29.7.0': dependencies: @@ -10140,6 +9703,7 @@ snapshots: write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color + optional: true '@jest/types@29.6.3': dependencies: @@ -10149,15 +9713,7 @@ snapshots: '@types/node': 20.17.24 '@types/yargs': 17.0.33 chalk: 4.1.2 - - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2))': - dependencies: - glob: 10.4.5 - magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.8.2) - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) - optionalDependencies: - typescript: 5.8.2 + optional: true '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -10198,12 +9754,6 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@mdx-js/react@3.1.0(@types/react@18.3.19)(react@18.3.1)': - dependencies: - '@types/mdx': 2.0.13 - '@types/react': 18.3.19 - react: 18.3.1 - '@metamask/eth-json-rpc-provider@1.0.1': dependencies: '@metamask/json-rpc-engine': 7.3.3 @@ -10360,6 +9910,41 @@ snapshots: transitivePeerDependencies: - supports-color + '@microsoft/api-extractor-model@7.30.5(@types/node@22.13.10)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.0(@types/node@22.13.10) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.52.3(@types/node@22.13.10)': + dependencies: + '@microsoft/api-extractor-model': 7.30.5(@types/node@22.13.10) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.0(@types/node@22.13.10) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.2(@types/node@22.13.10) + '@rushstack/ts-command-line': 4.23.7(@types/node@22.13.10) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.17.1': + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.10 + + '@microsoft/tsdoc@0.15.1': {} + '@motionone/animation@10.18.0': dependencies: '@motionone/easing': 10.18.0 @@ -10957,6 +10542,40 @@ snapshots: '@rushstack/eslint-patch@1.11.0': {} + '@rushstack/node-core-library@5.13.0(@types/node@22.13.10)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.0 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + optionalDependencies: + '@types/node': 22.13.10 + + '@rushstack/rig-package@0.5.3': + dependencies: + resolve: 1.22.10 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.15.2(@types/node@22.13.10)': + dependencies: + '@rushstack/node-core-library': 5.13.0(@types/node@22.13.10) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.13.10 + + '@rushstack/ts-command-line@4.23.7(@types/node@22.13.10)': + dependencies: + '@rushstack/terminal': 0.15.2(@types/node@22.13.10) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + '@safe-global/safe-apps-provider@0.18.5(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) @@ -11025,303 +10644,48 @@ snapshots: '@noble/hashes': 1.7.1 '@scure/base': 1.2.4 - '@sideway/address@4.1.5': - dependencies: - '@hapi/hoek': 9.3.0 - - '@sideway/formula@3.0.1': {} - - '@sideway/pinpoint@2.0.0': {} - - '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.27.8': + optional: true '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 + optional: true '@sinonjs/fake-timers@10.3.0': dependencies: '@sinonjs/commons': 3.0.1 + optional: true '@socket.io/component-emitter@3.1.2': {} - '@storybook/addon-a11y@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': + '@storybook/core@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@storybook/addon-highlight': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/global': 5.0.0 - '@storybook/test': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - axe-core: 4.10.3 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) + '@storybook/theming': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) + better-opn: 3.0.2 + browser-assert: 1.2.1 + esbuild: 0.25.1 + esbuild-register: 3.6.0(esbuild@0.25.1) + jsdoc-type-pratt-parser: 4.1.0 + process: 0.11.10 + recast: 0.23.11 + semver: 7.7.1 + util: 0.12.5 + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + prettier: 3.5.3 + transitivePeerDependencies: + - bufferutil + - storybook + - supports-color + - utf-8-validate - '@storybook/addon-actions@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': + '@storybook/theming@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': dependencies: - '@storybook/global': 5.0.0 - '@types/uuid': 9.0.8 - dequal: 2.0.3 - polished: 4.3.1 storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - uuid: 9.0.1 - '@storybook/addon-backgrounds@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - ts-dedent: 2.2.0 - - '@storybook/addon-controls@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/global': 5.0.0 - dequal: 2.0.3 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - ts-dedent: 2.2.0 - - '@storybook/addon-docs@8.6.7(@types/react@18.3.19)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.3.19)(react@18.3.1) - '@storybook/blocks': 8.6.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/csf-plugin': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/react-dom-shim': 8.6.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-essentials@8.6.7(@types/react@18.3.19)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/addon-actions': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-backgrounds': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-controls': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-docs': 8.6.7(@types/react@18.3.19)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-highlight': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-measure': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-outline': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-toolbars': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/addon-viewport': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-highlight@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/addon-interactions@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/test': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - polished: 4.3.1 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - ts-dedent: 2.2.0 - - '@storybook/addon-links@8.6.7(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.3.1 - - '@storybook/addon-measure@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - tiny-invariant: 1.3.3 - - '@storybook/addon-outline@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - ts-dedent: 2.2.0 - - '@storybook/addon-toolbars@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/addon-viewport@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - memoizerific: 1.11.3 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/blocks@8.6.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@storybook/builder-vite@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2))': - dependencies: - '@storybook/csf-plugin': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - browser-assert: 1.2.1 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - ts-dedent: 2.2.0 - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) - - '@storybook/components@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/core-common@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/core@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': - dependencies: - '@storybook/theming': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - better-opn: 3.0.2 - browser-assert: 1.2.1 - esbuild: 0.25.1 - esbuild-register: 3.6.0(esbuild@0.25.1) - jsdoc-type-pratt-parser: 4.1.0 - process: 0.11.10 - recast: 0.23.11 - semver: 7.7.1 - util: 0.12.5 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - prettier: 3.5.3 - transitivePeerDependencies: - - bufferutil - - storybook - - supports-color - - utf-8-validate - - '@storybook/csf-plugin@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - unplugin: 1.16.1 - - '@storybook/csf-tools@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/csf@0.1.13': - dependencies: - type-fest: 2.19.0 - - '@storybook/global@5.0.0': {} - - '@storybook/icons@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@storybook/instrumenter@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/global': 5.0.0 - '@vitest/utils': 2.1.9 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/manager-api@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/preview-api@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/react-dom-shim@8.6.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/react-vite@8.6.7(@storybook/test@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.36.0)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2))': - dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) - '@rollup/pluginutils': 5.1.4(rollup@4.36.0) - '@storybook/builder-vite': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) - '@storybook/react': 8.6.7(@storybook/test@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.2) - find-up: 5.0.0 - magic-string: 0.30.17 - react: 18.3.1 - react-docgen: 7.1.1 - react-dom: 18.3.1(react@18.3.1) - resolve: 1.22.10 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - tsconfig-paths: 4.2.0 - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) - optionalDependencies: - '@storybook/test': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - transitivePeerDependencies: - - rollup - - supports-color - - typescript - - '@storybook/react@8.6.7(@storybook/test@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.2)': - dependencies: - '@storybook/components': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/preview-api': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/react-dom-shim': 8.6.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/theming': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - optionalDependencies: - '@storybook/test': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - typescript: 5.8.2 - - '@storybook/test-runner@0.19.1(@swc/helpers@0.5.15)(@types/node@22.13.10)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@babel/core': 7.26.10 - '@babel/generator': 7.26.10 - '@babel/template': 7.26.9 - '@babel/types': 7.26.10 - '@jest/types': 29.6.3 - '@storybook/core-common': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/csf': 0.1.13 - '@storybook/csf-tools': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@storybook/preview-api': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@swc/core': 1.11.11(@swc/helpers@0.5.15) - '@swc/jest': 0.2.37(@swc/core@1.11.11(@swc/helpers@0.5.15)) - expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.13.10) - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-junit: 16.0.0 - jest-playwright-preset: 4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.13.10)) - jest-runner: 29.7.0 - jest-serializer-html: 7.1.0 - jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.13.10)) - nyc: 15.1.0 - playwright: 1.51.1 - transitivePeerDependencies: - - '@swc/helpers' - - '@types/node' - - babel-plugin-macros - - debug - - node-notifier - - storybook - - supports-color - - ts-node - - '@storybook/test@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) - '@testing-library/dom': 10.4.0 - '@testing-library/jest-dom': 6.5.0 - '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) - '@vitest/expect': 2.0.5 - '@vitest/spy': 2.0.5 - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@storybook/theming@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))': - dependencies: - storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - - '@swc/core-darwin-arm64@1.11.11': - optional: true + '@swc/core-darwin-arm64@1.11.11': + optional: true '@swc/core-darwin-x64@1.11.11': optional: true @@ -11378,13 +10742,6 @@ snapshots: '@swc/counter': 0.1.3 tslib: 2.8.1 - '@swc/jest@0.2.37(@swc/core@1.11.11(@swc/helpers@0.5.15))': - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.11.11(@swc/helpers@0.5.15) - '@swc/counter': 0.1.3 - jsonc-parser: 3.3.1 - '@swc/types@0.1.19': dependencies: '@swc/counter': 0.1.3 @@ -11494,16 +10851,6 @@ snapshots: jest: 29.7.0(@types/node@22.13.10) vitest: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) - '@testing-library/jest-dom@6.5.0': - dependencies: - '@adobe/css-tools': 4.4.2 - aria-query: 5.3.2 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - '@testing-library/react@14.3.1(@types/react@18.3.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 @@ -11514,10 +10861,6 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': - dependencies: - '@testing-library/dom': 10.4.0 - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: '@testing-library/dom': 10.4.0 @@ -11527,6 +10870,8 @@ snapshots: tslib: 2.8.1 optional: true + '@types/argparse@1.0.38': {} + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -11563,8 +10908,6 @@ snapshots: dependencies: '@types/ms': 2.1.0 - '@types/doctrine@0.0.9': {} - '@types/estree@1.0.6': {} '@types/express-serve-static-core@5.0.6': @@ -11588,25 +10931,27 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: '@types/node': 20.17.24 + optional: true '@types/http-errors@2.0.4': {} - '@types/istanbul-lib-coverage@2.0.6': {} + '@types/istanbul-lib-coverage@2.0.6': + optional: true '@types/istanbul-lib-report@3.0.3': dependencies: '@types/istanbul-lib-coverage': 2.0.6 + optional: true '@types/istanbul-reports@3.0.4': dependencies: '@types/istanbul-lib-report': 3.0.3 + optional: true '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/mdx@2.0.13': {} - '@types/mime@1.3.5': {} '@types/minimatch@5.1.2': {} @@ -11649,8 +10994,6 @@ snapshots: '@types/resolve@1.20.2': {} - '@types/resolve@1.20.6': {} - '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 @@ -11662,25 +11005,22 @@ snapshots: '@types/node': 20.17.24 '@types/send': 0.17.4 - '@types/stack-utils@2.0.3': {} + '@types/stack-utils@2.0.3': + optional: true '@types/trusted-types@2.0.7': {} - '@types/uuid@9.0.8': {} - - '@types/wait-on@5.3.4': - dependencies: - '@types/node': 20.17.24 - '@types/ws@8.18.0': dependencies: '@types/node': 20.17.24 - '@types/yargs-parser@21.0.3': {} + '@types/yargs-parser@21.0.3': + optional: true '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 + optional: true '@types/yoga-layout@1.9.2': {} @@ -11901,6 +11241,17 @@ snapshots: '@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2': optional: true + '@vitejs/plugin-react@4.3.4(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) + transitivePeerDependencies: + - supports-color + '@vitejs/plugin-react@4.3.4(vite@6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.10 @@ -11926,17 +11277,10 @@ snapshots: std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) + vitest: 3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitest/expect@2.0.5': - dependencies: - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 - chai: 5.2.0 - tinyrainbow: 1.2.0 - '@vitest/expect@3.0.9': dependencies: '@vitest/spy': 3.0.9 @@ -11960,14 +11304,6 @@ snapshots: optionalDependencies: vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) - '@vitest/pretty-format@2.0.5': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/pretty-format@2.1.9': - dependencies: - tinyrainbow: 1.2.0 - '@vitest/pretty-format@3.0.9': dependencies: tinyrainbow: 2.0.0 @@ -11983,10 +11319,6 @@ snapshots: magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@2.0.5': - dependencies: - tinyspy: 3.0.2 - '@vitest/spy@3.0.9': dependencies: tinyspy: 3.0.2 @@ -12000,34 +11332,66 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.12 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) + vitest: 3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) - '@vitest/utils@2.0.5': + '@vitest/utils@3.0.9': dependencies: - '@vitest/pretty-format': 2.0.5 - estree-walker: 3.0.3 + '@vitest/pretty-format': 3.0.9 loupe: 3.1.3 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/utils@2.1.9': + '@volar/language-core@2.4.12': dependencies: - '@vitest/pretty-format': 2.1.9 - loupe: 3.1.3 - tinyrainbow: 1.2.0 + '@volar/source-map': 2.4.12 - '@vitest/utils@3.0.9': + '@volar/source-map@2.4.12': {} + + '@volar/typescript@2.4.12': dependencies: - '@vitest/pretty-format': 3.0.9 - loupe: 3.1.3 - tinyrainbow: 2.0.0 + '@volar/language-core': 2.4.12 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.10 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.0(typescript@5.8.2)': + dependencies: + '@volar/language-core': 2.4.12 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 0.4.14 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.8.2 - '@wagmi/connectors@5.7.11(@types/react@18.3.19)(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2)': + '@vue/shared@3.5.13': {} + + '@wagmi/connectors@5.7.11(@types/react@18.3.19)(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2)': dependencies: '@coinbase/wallet-sdk': 4.3.0 '@metamask/sdk': 0.32.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.5(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) - '@wagmi/core': 2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) + '@wagmi/core': 2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) '@walletconnect/ethereum-provider': 2.19.1(@types/react@18.3.19)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' viem: 2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) @@ -12114,6 +11478,21 @@ snapshots: - react - use-sync-external-store + '@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.7.3) + viem: 2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + zustand: 5.0.0(@types/react@18.3.19)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/query-core': 5.69.0 + typescript: 5.7.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + '@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2))': dependencies: eventemitter3: 5.0.1 @@ -12716,10 +12095,13 @@ snapshots: agent-base@7.1.3: {} - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 + ajv-draft-04@1.0.0(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 + + ajv-formats@3.0.1(ajv@8.13.0): + optionalDependencies: + ajv: 8.13.0 ajv@6.12.6: dependencies: @@ -12728,22 +12110,32 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ajv@8.13.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + alien-signals@0.4.14: {} + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - ansi-escapes@6.2.1: {} - ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -12759,12 +12151,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - append-transform@2.0.0: - dependencies: - default-require-extensions: 3.0.1 - - archy@1.0.0: {} - arg@5.0.2: {} argparse@1.0.10: @@ -12934,6 +12320,7 @@ snapshots: slash: 3.0.0 transitivePeerDependencies: - supports-color + optional: true babel-plugin-cjs-esm-interop@3.0.3(@babel/core@7.26.10): dependencies: @@ -12959,6 +12346,7 @@ snapshots: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color + optional: true babel-plugin-jest-hoist@29.6.3: dependencies: @@ -12966,6 +12354,7 @@ snapshots: '@babel/types': 7.26.10 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 + optional: true babel-plugin-jsx-dom-expressions@0.39.7(@babel/core@7.26.10): dependencies: @@ -13027,12 +12416,14 @@ snapshots: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) + optional: true babel-preset-jest@29.6.3(@babel/core@7.26.10): dependencies: '@babel/core': 7.26.10 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + optional: true babel-preset-solid@1.9.5(@babel/core@7.26.10): dependencies: @@ -13136,8 +12527,10 @@ snapshots: bser@2.1.1: dependencies: node-int64: 0.4.0 + optional: true - buffer-from@1.1.2: {} + buffer-from@1.1.2: + optional: true buffer@6.0.3: dependencies: @@ -13177,13 +12570,6 @@ snapshots: union-value: 1.0.1 unset-value: 1.0.0 - caching-transform@4.0.0: - dependencies: - hasha: 5.2.2 - make-dir: 3.1.0 - package-hash: 4.0.0 - write-file-atomic: 3.0.3 - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -13209,7 +12595,8 @@ snapshots: camelcase@5.3.1: {} - camelcase@6.3.0: {} + camelcase@6.3.0: + optional: true caniuse-lite@1.0.30001706: {} @@ -13221,12 +12608,6 @@ snapshots: loupe: 3.1.3 pathval: 2.0.0 - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -13239,9 +12620,8 @@ snapshots: chalk@5.4.1: {} - char-regex@1.0.2: {} - - char-regex@2.0.2: {} + char-regex@1.0.2: + optional: true chardet@0.7.0: {} @@ -13263,13 +12643,12 @@ snapshots: dependencies: readdirp: 4.1.2 - chromatic@11.27.0: {} - ci-info@2.0.0: {} ci-info@3.9.0: {} - cjs-module-lexer@1.4.3: {} + cjs-module-lexer@1.4.3: + optional: true class-utils@0.3.6: dependencies: @@ -13282,8 +12661,6 @@ snapshots: dependencies: clsx: 2.1.1 - clean-stack@2.2.0: {} - cli-boxes@2.2.1: {} cli-cursor@3.1.0: @@ -13319,29 +12696,25 @@ snapshots: clsx@2.1.1: {} - co@4.6.0: {} + co@4.6.0: + optional: true code-excerpt@3.0.0: dependencies: convert-to-spaces: 1.0.2 - collect-v8-coverage@1.0.2: {} + collect-v8-coverage@1.0.2: + optional: true collection-visit@1.0.0: dependencies: map-visit: 1.0.0 object-visit: 1.0.1 - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} combined-stream@1.0.8: @@ -13350,16 +12723,14 @@ snapshots: comlink@4.4.2: {} - commander@12.1.0: {} - commander@2.20.3: {} - commander@3.0.2: {} - commander@4.1.1: {} commondir@1.0.1: {} + compare-versions@6.1.1: {} + component-emitter@1.3.1: {} concat-map@0.0.1: {} @@ -13376,6 +12747,10 @@ snapshots: tree-kill: 1.2.2 yargs: 17.7.2 + confbox@0.1.8: {} + + confbox@0.2.2: {} + consola@3.4.2: {} content-disposition@0.5.4: @@ -13384,8 +12759,6 @@ snapshots: content-type@1.0.5: {} - convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} convert-to-spaces@1.0.2: {} @@ -13420,6 +12793,7 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true cross-fetch@3.2.0: dependencies: @@ -13454,11 +12828,6 @@ snapshots: csstype@3.1.3: {} - cwd@0.10.0: - dependencies: - find-pkg: 0.1.2 - fs-exists-sync: 0.1.0 - damerau-levenshtein@1.0.8: {} data-urls@5.0.0: @@ -13488,6 +12857,8 @@ snapshots: dependencies: '@babel/runtime': 7.26.10 + de-indent@1.0.2: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -13512,7 +12883,8 @@ snapshots: decode-uri-component@0.2.2: {} - dedent@1.5.3: {} + dedent@1.5.3: + optional: true deep-eql@5.0.2: {} @@ -13548,10 +12920,6 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.0 - default-require-extensions@3.0.1: - dependencies: - strip-bom: 4.0.0 - define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -13599,17 +12967,15 @@ snapshots: detect-libc@2.0.3: {} - detect-newline@3.1.0: {} + detect-newline@3.1.0: + optional: true detect-node-es@1.1.0: {} didyoumean@1.2.2: {} - diff-sequences@29.6.3: {} - - diffable-html@4.1.0: - dependencies: - htmlparser2: 3.10.1 + diff-sequences@29.6.3: + optional: true dijkstrajs@1.0.3: {} @@ -13627,32 +12993,10 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} - dom-serializer@0.2.2: - dependencies: - domelementtype: 2.3.0 - entities: 2.2.0 - - domelementtype@1.3.1: {} - - domelementtype@2.3.0: {} - - domhandler@2.4.2: - dependencies: - domelementtype: 1.3.1 - - domutils@1.7.0: - dependencies: - dom-serializer: 0.2.2 - domelementtype: 1.3.1 - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -13689,7 +13033,8 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - emittery@0.13.1: {} + emittery@0.13.1: + optional: true emoji-regex@10.4.0: {} @@ -13731,15 +13076,12 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - entities@1.1.2: {} - - entities@2.2.0: {} - entities@4.5.0: {} error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 + optional: true es-abstract@1.23.9: dependencies: @@ -13855,10 +13197,12 @@ snapshots: es-toolkit@1.33.0: {} - es6-error@4.1.1: {} - esbuild-fix-imports-plugin@1.0.19: {} + esbuild-plugin-babel@0.2.3(@babel/core@7.26.10): + dependencies: + '@babel/core': 7.26.10 + esbuild-register@3.6.0(esbuild@0.25.1): dependencies: debug: 4.4.0(supports-color@5.5.0) @@ -14221,7 +13565,8 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - exit@0.1.2: {} + exit@0.1.2: + optional: true expand-brackets@2.1.4: dependencies: @@ -14235,12 +13580,6 @@ snapshots: transitivePeerDependencies: - supports-color - expand-tilde@1.2.2: - dependencies: - os-homedir: 1.0.2 - - expect-playwright@0.8.0: {} - expect-type@1.2.0: {} expect@29.7.0: @@ -14250,6 +13589,7 @@ snapshots: jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 jest-util: 29.7.0 + optional: true express@4.21.2: dependencies: @@ -14287,6 +13627,8 @@ snapshots: transitivePeerDependencies: - supports-color + exsolve@1.0.4: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -14360,6 +13702,7 @@ snapshots: fb-watchman@2.0.2: dependencies: bser: 2.1.1 + optional: true fdir@6.4.3(picomatch@4.0.2): optionalDependencies: @@ -14406,27 +13749,6 @@ snapshots: dependencies: json5: 2.2.3 - find-cache-dir@3.3.2: - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - - find-file-up@0.1.3: - dependencies: - fs-exists-sync: 0.1.0 - resolve-dir: 0.1.1 - - find-pkg@0.1.2: - dependencies: - find-file-up: 0.1.3 - - find-process@1.4.10: - dependencies: - chalk: 4.1.2 - commander: 12.1.0 - loglevel: 1.9.2 - find-up@3.0.0: dependencies: locate-path: 3.0.0 @@ -14456,11 +13778,6 @@ snapshots: for-in@1.0.2: {} - foreground-child@2.0.0: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 3.0.7 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -14483,10 +13800,6 @@ snapshots: fresh@0.5.2: {} - fromentries@1.3.2: {} - - fs-exists-sync@0.1.0: {} - fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 @@ -14507,9 +13820,6 @@ snapshots: fs.realpath@1.0.0: {} - fsevents@2.3.2: - optional: true - fsevents@2.3.3: optional: true @@ -14547,7 +13857,8 @@ snapshots: get-nonce@1.0.1: {} - get-package-type@0.1.0: {} + get-package-type@0.1.0: + optional: true get-proto@1.0.1: dependencies: @@ -14604,6 +13915,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.1: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.0 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -14628,18 +13948,6 @@ snapshots: minipass: 4.2.8 path-scurry: 1.11.1 - global-modules@0.2.3: - dependencies: - global-prefix: 0.1.5 - is-windows: 0.2.0 - - global-prefix@0.1.5: - dependencies: - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 0.2.0 - which: 1.3.1 - globals@11.12.0: {} globals@14.0.0: {} @@ -14747,15 +14055,12 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hasha@5.2.2: - dependencies: - is-stream: 2.0.1 - type-fest: 0.8.1 - hasown@2.0.2: dependencies: function-bind: 1.1.2 + he@1.2.0: {} + hey-listen@1.0.8: {} hmac-drbg@1.0.1: @@ -14764,10 +14069,6 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - homedir-polyfill@1.0.3: - dependencies: - parse-passwd: 1.0.0 - html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -14776,15 +14077,6 @@ snapshots: html-escaper@2.0.2: {} - htmlparser2@3.10.1: - dependencies: - domelementtype: 1.3.1 - domhandler: 2.4.2 - domutils: 1.7.0 - entities: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -14840,10 +14132,13 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-lazy@4.0.0: {} + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + optional: true imurmurhash@0.1.4: {} @@ -14856,8 +14151,6 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: {} - ink-progress-bar@3.0.0: dependencies: blacklist: 1.1.4 @@ -14928,7 +14221,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-arrayish@0.2.1: {} + is-arrayish@0.2.1: + optional: true is-async-function@2.1.1: dependencies: @@ -15010,7 +14304,8 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-generator-fn@2.1.0: {} + is-generator-fn@2.1.0: + optional: true is-generator-function@1.1.0: dependencies: @@ -15092,8 +14387,6 @@ snapshots: dependencies: which-typed-array: 1.1.19 - is-typedarray@1.0.0: {} - is-unicode-supported@1.3.0: {} is-unicode-supported@2.1.0: {} @@ -15109,8 +14402,6 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-windows@0.2.0: {} - is-windows@1.0.2: {} is-wsl@2.2.0: @@ -15143,19 +14434,6 @@ snapshots: istanbul-lib-coverage@3.2.2: {} - istanbul-lib-hook@3.0.0: - dependencies: - append-transform: 2.0.0 - - istanbul-lib-instrument@4.0.3: - dependencies: - '@babel/core': 7.26.10 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.26.10 @@ -15165,6 +14443,7 @@ snapshots: semver: 6.3.1 transitivePeerDependencies: - supports-color + optional: true istanbul-lib-instrument@6.0.3: dependencies: @@ -15175,15 +14454,7 @@ snapshots: semver: 7.7.1 transitivePeerDependencies: - supports-color - - istanbul-lib-processinfo@2.0.3: - dependencies: - archy: 1.0.0 - cross-spawn: 7.0.6 - istanbul-lib-coverage: 3.2.2 - p-map: 3.0.0 - rimraf: 3.0.2 - uuid: 8.3.2 + optional: true istanbul-lib-report@3.0.1: dependencies: @@ -15198,6 +14469,7 @@ snapshots: source-map: 0.6.1 transitivePeerDependencies: - supports-color + optional: true istanbul-lib-source-maps@5.0.6: dependencies: @@ -15233,11 +14505,16 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.1.0: + dependencies: + '@isaacs/cliui': 8.0.2 + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 + optional: true jest-circus@29.7.0: dependencies: @@ -15264,6 +14541,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - supports-color + optional: true jest-cli@29.7.0(@types/node@22.13.10): dependencies: @@ -15283,6 +14561,7 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true jest-config@29.7.0(@types/node@20.17.24): dependencies: @@ -15313,6 +14592,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - supports-color + optional: true jest-config@29.7.0(@types/node@22.13.10): dependencies: @@ -15343,6 +14623,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - supports-color + optional: true jest-diff@29.7.0: dependencies: @@ -15350,10 +14631,12 @@ snapshots: diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 + optional: true jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 + optional: true jest-each@29.7.0: dependencies: @@ -15362,6 +14645,7 @@ snapshots: jest-get-type: 29.6.3 jest-util: 29.7.0 pretty-format: 29.7.0 + optional: true jest-environment-node@29.7.0: dependencies: @@ -15371,8 +14655,10 @@ snapshots: '@types/node': 20.17.24 jest-mock: 29.7.0 jest-util: 29.7.0 + optional: true - jest-get-type@29.6.3: {} + jest-get-type@29.6.3: + optional: true jest-haste-map@29.7.0: dependencies: @@ -15386,21 +14672,16 @@ snapshots: jest-util: 29.7.0 jest-worker: 29.7.0 micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-junit@16.0.0: - dependencies: - mkdirp: 1.0.4 - strip-ansi: 6.0.1 - uuid: 8.3.2 - xml: 1.0.1 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + optional: true jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 + optional: true jest-matcher-utils@29.7.0: dependencies: @@ -15408,6 +14689,7 @@ snapshots: jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 + optional: true jest-message-util@29.7.0: dependencies: @@ -15420,50 +14702,22 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 + optional: true jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 20.17.24 jest-util: 29.7.0 - - jest-playwright-preset@4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.13.10)): - dependencies: - expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.13.10) - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-process-manager: 0.4.0 - jest-runner: 29.7.0 - nyc: 15.1.0 - playwright-core: 1.51.1 - rimraf: 3.0.2 - uuid: 8.3.2 - transitivePeerDependencies: - - debug - - supports-color + optional: true jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): optionalDependencies: jest-resolve: 29.7.0 + optional: true - jest-process-manager@0.4.0: - dependencies: - '@types/wait-on': 5.3.4 - chalk: 4.1.2 - cwd: 0.10.0 - exit: 0.1.2 - find-process: 1.4.10 - prompts: 2.4.2 - signal-exit: 3.0.7 - spawnd: 5.0.0 - tree-kill: 1.2.2 - wait-on: 7.2.0 - transitivePeerDependencies: - - debug - - supports-color - - jest-regex-util@29.6.3: {} + jest-regex-util@29.6.3: + optional: true jest-resolve-dependencies@29.7.0: dependencies: @@ -15471,6 +14725,7 @@ snapshots: jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color + optional: true jest-resolve@29.7.0: dependencies: @@ -15483,6 +14738,7 @@ snapshots: resolve: 1.22.10 resolve.exports: 2.0.3 slash: 3.0.0 + optional: true jest-runner@29.7.0: dependencies: @@ -15509,6 +14765,7 @@ snapshots: source-map-support: 0.5.13 transitivePeerDependencies: - supports-color + optional: true jest-runtime@29.7.0: dependencies: @@ -15536,10 +14793,7 @@ snapshots: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - - jest-serializer-html@7.1.0: - dependencies: - diffable-html: 4.1.0 + optional: true jest-snapshot@29.7.0: dependencies: @@ -15565,6 +14819,7 @@ snapshots: semver: 7.7.1 transitivePeerDependencies: - supports-color + optional: true jest-util@29.7.0: dependencies: @@ -15574,6 +14829,7 @@ snapshots: ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.1 + optional: true jest-validate@29.7.0: dependencies: @@ -15583,17 +14839,7 @@ snapshots: jest-get-type: 29.6.3 leven: 3.1.0 pretty-format: 29.7.0 - - jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.13.10)): - dependencies: - ansi-escapes: 6.2.1 - chalk: 5.4.1 - jest: 29.7.0(@types/node@22.13.10) - jest-regex-util: 29.6.3 - jest-watcher: 29.7.0 - slash: 5.1.0 - string-length: 5.0.1 - strip-ansi: 7.1.0 + optional: true jest-watcher@29.7.0: dependencies: @@ -15605,6 +14851,7 @@ snapshots: emittery: 0.13.1 jest-util: 29.7.0 string-length: 4.0.2 + optional: true jest-worker@29.7.0: dependencies: @@ -15612,6 +14859,7 @@ snapshots: jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 + optional: true jest@29.7.0(@types/node@22.13.10): dependencies: @@ -15624,18 +14872,13 @@ snapshots: - babel-plugin-macros - supports-color - ts-node + optional: true jiti@1.21.7: {} jiti@2.4.2: {} - joi@17.13.3: - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.5 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 + jju@1.4.0: {} joycon@3.1.1: {} @@ -15686,7 +14929,8 @@ snapshots: json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@2.3.1: + optional: true json-rpc-engine@6.1.0: dependencies: @@ -15697,6 +14941,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: @@ -15705,8 +14951,6 @@ snapshots: json5@2.2.3: {} - jsonc-parser@3.3.1: {} - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -15748,6 +14992,8 @@ snapshots: kleur@3.0.3: {} + kolorist@1.8.0: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -15836,6 +15082,12 @@ snapshots: load-tsconfig@0.2.5: {} + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.0 + quansync: 0.2.10 + locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -15851,8 +15103,6 @@ snapshots: lodash.debounce@4.0.8: {} - lodash.flattendeep@4.4.0: {} - lodash.merge@4.6.2: {} lodash.sortby@4.7.0: {} @@ -15866,8 +15116,6 @@ snapshots: chalk: 5.4.1 is-unicode-supported: 1.3.0 - loglevel@1.9.2: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -15876,20 +15124,22 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.1.0: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lucide-react@0.416.0(react@18.3.1): dependencies: react: 18.3.1 lz-string@1.5.0: {} - magic-string@0.27.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -15900,10 +15150,6 @@ snapshots: '@babel/types': 7.26.10 source-map-js: 1.2.1 - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - make-dir@4.0.0: dependencies: semver: 7.7.1 @@ -15911,6 +15157,7 @@ snapshots: makeerror@1.0.12: dependencies: tmpl: 1.0.5 + optional: true map-age-cleaner@0.1.3: dependencies: @@ -15918,8 +15165,6 @@ snapshots: map-cache@0.2.2: {} - map-or-similar@1.5.0: {} - map-visit@1.0.0: dependencies: object-visit: 1.0.1 @@ -15934,10 +15179,6 @@ snapshots: mimic-fn: 2.1.0 p-is-promise: 2.1.0 - memoizerific@1.11.3: - dependencies: - map-or-similar: 1.5.0 - merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -15989,6 +15230,14 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.0.8: + dependencies: + brace-expansion: 1.1.11 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -16028,7 +15277,12 @@ snapshots: for-in: 1.0.2 is-extendable: 1.0.1 - mkdirp@1.0.4: {} + mlly@1.7.4: + dependencies: + acorn: 8.14.1 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 motion@10.16.2: dependencies: @@ -16047,6 +15301,8 @@ snapshots: ms@2.1.3: {} + muggle-string@0.4.1: {} + multiformats@9.9.0: {} mz@2.7.0: @@ -16112,14 +15368,11 @@ snapshots: node-gyp-build@4.8.4: {} - node-int64@0.4.0: {} + node-int64@0.4.0: + optional: true node-mock-http@1.0.0: {} - node-preload@0.2.1: - dependencies: - process-on-spawn: 1.1.0 - node-releases@2.0.19: {} nodemon@3.1.9: @@ -16145,38 +15398,6 @@ snapshots: nwsapi@2.2.19: {} - nyc@15.1.0: - dependencies: - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - caching-transform: 4.0.0 - convert-source-map: 1.9.0 - decamelize: 1.2.0 - find-cache-dir: 3.3.2 - find-up: 4.1.0 - foreground-child: 2.0.0 - get-package-type: 0.1.0 - glob: 7.2.3 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 4.0.3 - istanbul-lib-processinfo: 2.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - make-dir: 3.1.0 - node-preload: 0.2.1 - p-map: 3.0.0 - process-on-spawn: 1.1.0 - resolve-from: 5.0.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - spawn-wrap: 2.0.0 - test-exclude: 6.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - supports-color - obj-multiplex@1.0.0: dependencies: end-of-stream: 1.4.4 @@ -16306,8 +15527,6 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 - os-homedir@1.0.2: {} - os-locale@5.0.0: dependencies: execa: 4.1.0 @@ -16438,19 +15657,8 @@ snapshots: p-map@2.1.0: {} - p-map@3.0.0: - dependencies: - aggregate-error: 3.1.0 - p-try@2.2.0: {} - package-hash@4.0.0: - dependencies: - graceful-fs: 4.2.11 - hasha: 5.2.2 - lodash.flattendeep: 4.4.0 - release-zalgo: 1.0.0 - package-json-from-dist@1.0.1: {} package-manager-detector@0.2.11: @@ -16522,11 +15730,10 @@ snapshots: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + optional: true parse-ms@2.1.0: {} - parse-passwd@1.0.0: {} - parse5@7.2.1: dependencies: entities: 4.5.0 @@ -16537,6 +15744,8 @@ snapshots: patch-console@1.0.0: {} + path-browserify@1.0.1: {} + path-dirname@1.0.2: {} path-exists@3.0.0: {} @@ -16554,6 +15763,11 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + path-to-regexp@0.1.12: {} path-type@3.0.0: @@ -16606,25 +15820,26 @@ snapshots: pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + optional: true - pkg-up@3.1.0: + pkg-types@1.3.1: dependencies: - find-up: 3.0.0 + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 - playwright-core@1.51.1: {} + pkg-types@2.1.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.4 + pathe: 2.0.3 - playwright@1.51.1: + pkg-up@3.1.0: dependencies: - playwright-core: 1.51.1 - optionalDependencies: - fsevents: 2.3.2 + find-up: 3.0.0 pngjs@5.0.0: {} - polished@4.3.1: - dependencies: - '@babel/runtime': 7.26.10 - pony-cause@2.1.11: {} posix-character-classes@0.1.1: {} @@ -16705,6 +15920,7 @@ snapshots: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 + optional: true pretty-ms@7.0.1: dependencies: @@ -16712,10 +15928,6 @@ snapshots: process-nextick-args@2.0.1: {} - process-on-spawn@1.1.0: - dependencies: - fromentries: 1.3.2 - process-warning@1.0.0: {} process@0.11.10: {} @@ -16753,7 +15965,8 @@ snapshots: punycode@2.3.1: {} - pure-rand@6.1.0: {} + pure-rand@6.1.0: + optional: true qrcode@1.5.3: dependencies: @@ -16798,11 +16011,6 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - react-confetti@6.4.0(react@18.3.1): - dependencies: - react: 18.3.1 - tween-functions: 1.2.0 - react-devtools-core@4.28.5(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.2 @@ -16811,25 +16019,6 @@ snapshots: - bufferutil - utf-8-validate - react-docgen-typescript@2.2.2(typescript@5.8.2): - dependencies: - typescript: 5.8.2 - - react-docgen@7.1.1: - dependencies: - '@babel/core': 7.26.10 - '@babel/traverse': 7.26.10 - '@babel/types': 7.26.10 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.6 - '@types/doctrine': 0.0.9 - '@types/resolve': 1.20.6 - doctrine: 3.0.0 - resolve: 1.22.10 - strip-indent: 4.0.0 - transitivePeerDependencies: - - supports-color - react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -16840,7 +16029,8 @@ snapshots: react-is@17.0.2: {} - react-is@18.3.1: {} + react-is@18.3.1: + optional: true react-reconciler@0.26.2(react@18.3.1): dependencies: @@ -16982,16 +16172,14 @@ snapshots: dependencies: jsesc: 3.0.2 - release-zalgo@1.0.0: - dependencies: - es6-error: 4.1.1 - repeat-element@1.1.4: {} repeat-string@1.6.1: {} require-directory@2.1.1: {} + require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} requires-port@1.0.0: {} @@ -17001,11 +16189,7 @@ snapshots: resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - - resolve-dir@0.1.1: - dependencies: - expand-tilde: 1.2.2 - global-modules: 0.2.3 + optional: true resolve-from@4.0.0: {} @@ -17015,7 +16199,8 @@ snapshots: resolve-url@0.2.1: {} - resolve.exports@2.0.3: {} + resolve.exports@2.0.3: + optional: true resolve@1.22.10: dependencies: @@ -17043,10 +16228,6 @@ snapshots: reusify@1.1.0: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rimraf@5.0.10: dependencies: glob: 10.4.5 @@ -17060,6 +16241,10 @@ snapshots: '@rollup/plugin-inject': 5.0.5(rollup@4.36.0) rollup: 4.36.0 + rollup-plugin-preserve-use-client@3.0.1(rollup@4.36.0): + dependencies: + rollup: 4.36.0 + rollup@4.36.0: dependencies: '@types/estree': 1.0.6 @@ -17159,6 +16344,10 @@ snapshots: semver@6.3.1: {} + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + semver@7.7.1: {} send@0.19.0: @@ -17284,8 +16473,6 @@ snapshots: slash@3.0.0: {} - slash@5.1.0: {} - slice-ansi@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -17357,6 +16544,7 @@ snapshots: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + optional: true source-map-url@0.4.1: {} @@ -17370,24 +16558,6 @@ snapshots: spawn-command@0.0.2: {} - spawn-wrap@2.0.0: - dependencies: - foreground-child: 2.0.0 - is-windows: 1.0.2 - make-dir: 3.1.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - which: 2.0.2 - - spawnd@5.0.0: - dependencies: - exit: 0.1.2 - signal-exit: 3.0.7 - tree-kill: 1.2.2 - wait-port: 0.2.14 - transitivePeerDependencies: - - supports-color - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -17449,15 +16619,13 @@ snapshots: strict-uri-encode@2.0.0: {} + string-argv@0.3.2: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - - string-length@5.0.1: - dependencies: - char-regex: 2.0.2 - strip-ansi: 7.1.0 + optional: true string-width@4.2.3: dependencies: @@ -17545,7 +16713,8 @@ snapshots: strip-bom@3.0.0: {} - strip-bom@4.0.0: {} + strip-bom@4.0.0: + optional: true strip-final-newline@2.0.0: {} @@ -17553,10 +16722,6 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@3.1.1: {} styled-jsx@5.1.1(react@18.3.1): @@ -17646,6 +16811,7 @@ snapshots: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 + optional: true test-exclude@7.0.1: dependencies: @@ -17680,8 +16846,6 @@ snapshots: tinypool@1.0.2: {} - tinyrainbow@1.2.0: {} - tinyrainbow@2.0.0: {} tinyspy@3.0.2: {} @@ -17690,7 +16854,8 @@ snapshots: dependencies: os-tmpdir: 1.0.2 - tmpl@1.0.5: {} + tmpl@1.0.5: + optional: true to-object-path@0.3.0: dependencies: @@ -17749,8 +16914,6 @@ snapshots: dependencies: typescript: 5.7.3 - ts-dedent@2.2.0: {} - ts-interface-checker@0.1.13: {} tsconfig-paths@3.15.0: @@ -17760,12 +16923,6 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - tscpaths@0.0.9: dependencies: commander: 2.20.3 @@ -17777,7 +16934,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.4.0(@swc/core@1.11.11(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.2)(yaml@2.7.0): + tsup@8.4.0(@microsoft/api-extractor@7.52.3(@types/node@22.13.10))(@swc/core@1.11.11(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.2)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.25.1) cac: 6.7.14 @@ -17796,6 +16953,7 @@ snapshots: tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: + '@microsoft/api-extractor': 7.52.3(@types/node@22.13.10) '@swc/core': 1.11.11(@swc/helpers@0.5.15) postcss: 8.5.3 typescript: 5.8.2 @@ -17805,22 +16963,17 @@ snapshots: - tsx - yaml - tween-functions@1.2.0: {} - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} + type-detect@4.0.8: + optional: true type-fest@0.12.0: {} type-fest@0.21.3: {} - type-fest@0.8.1: {} - - type-fest@2.19.0: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -17859,10 +17012,6 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 - typescript-eslint@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.4.5): dependencies: '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.4.5))(eslint@9.22.0(jiti@2.4.2))(typescript@5.4.5) @@ -17936,11 +17085,6 @@ snapshots: unpipe@1.0.0: {} - unplugin@1.16.1: - dependencies: - acorn: 8.14.1 - webpack-virtual-modules: 0.6.2 - unset-value@1.0.0: dependencies: has-value: 0.3.1 @@ -18026,6 +17170,7 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + optional: true validate-html-nesting@1.2.2: {} @@ -18149,6 +17294,29 @@ snapshots: - tsx - yaml + vite-plugin-dts@4.5.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)): + dependencies: + '@microsoft/api-extractor': 7.52.3(@types/node@22.13.10) + '@rollup/pluginutils': 5.1.4(rollup@4.36.0) + '@volar/typescript': 2.4.12 + '@vue/language-core': 2.2.0(typescript@5.8.2) + compare-versions: 6.1.1 + debug: 4.4.0(supports-color@5.5.0) + kolorist: 1.8.0 + local-pkg: 1.1.1 + magic-string: 0.30.17 + typescript: 5.8.2 + optionalDependencies: + vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite-plugin-externalize-deps@0.9.0(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)): + dependencies: + vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) + vite@5.4.14(@types/node@20.17.24)(lightningcss@1.29.2): dependencies: esbuild: 0.21.5 @@ -18275,6 +17443,8 @@ snapshots: - tsx - yaml + vscode-uri@3.1.0: {} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -18282,7 +17452,7 @@ snapshots: wagmi@2.14.15(@tanstack/query-core@5.69.0)(@tanstack/react-query@5.69.0(react@18.3.1))(@types/react@18.3.19)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2): dependencies: '@tanstack/react-query': 5.69.0(react@18.3.1) - '@wagmi/connectors': 5.7.11(@types/react@18.3.19)(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2) + '@wagmi/connectors': 5.7.11(@types/react@18.3.19)(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(bufferutil@4.0.9)(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2) '@wagmi/core': 2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.23.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) @@ -18355,27 +17525,10 @@ snapshots: - utf-8-validate - zod - wait-on@7.2.0: - dependencies: - axios: 1.8.3 - joi: 17.13.3 - lodash: 4.17.21 - minimist: 1.2.8 - rxjs: 7.8.2 - transitivePeerDependencies: - - debug - - wait-port@0.2.14: - dependencies: - chalk: 2.4.2 - commander: 3.0.2 - debug: 4.4.0(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - walker@1.0.8: dependencies: makeerror: 1.0.12 + optional: true webextension-polyfill@0.10.0: {} @@ -18385,8 +17538,6 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-virtual-modules@0.6.2: {} - whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -18452,10 +17603,6 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -18491,17 +17638,11 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@3.0.3: - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 + optional: true ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: @@ -18525,8 +17666,6 @@ snapshots: xml-name-validator@5.0.0: {} - xml@1.0.1: {} - xmlchars@2.2.0: {} xmlhttprequest-ssl@2.1.2: {} @@ -18539,6 +17678,8 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: {} + yaml@2.7.0: {} yargs-parser@18.1.3: From 8e49fa4d6d8790b8d524a273468437a5d5c5c4d5 Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Mon, 14 Apr 2025 13:58:26 -0600 Subject: [PATCH 06/55] fix: Don't clean out out dir when building in dev mode (#2279) --- packages/onchainkit/package.json | 2 +- packages/onchainkit/vite.config.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/onchainkit/package.json b/packages/onchainkit/package.json index db5c413211..a91118b078 100644 --- a/packages/onchainkit/package.json +++ b/packages/onchainkit/package.json @@ -8,7 +8,7 @@ "scripts": { "build": "pnpm clean && pnpm bundle:prod && pnpm tailwind:prod", "dev": "concurrently \"pnpm tailwind:dev\" \"pnpm bundle:dev\"", - "bundle:dev": "vite build --watch", + "bundle:dev": "NODE_ENV=development vite build --watch", "bundle:prod": "vite build", "tailwind:dev": "tailwind -i ./src/styles/index-with-tailwind.css -o ./dist/styles.css --watch", "tailwind:prod": "tailwindcss -i ./src/styles/index.css -o ./dist/tailwind.css --minify && tailwindcss -i ./src/styles/index-with-tailwind.css -o ./dist/styles.css --minify", diff --git a/packages/onchainkit/vite.config.ts b/packages/onchainkit/vite.config.ts index 592c869608..1c2c73bc59 100644 --- a/packages/onchainkit/vite.config.ts +++ b/packages/onchainkit/vite.config.ts @@ -43,6 +43,7 @@ export default defineConfig({ build: { minify: false, sourcemap: true, + emptyOutDir: process.env.NODE_ENV !== 'development', lib: { entry: resolve(__dirname, 'src/index.ts'), formats: ['es'], From f9ac80c196e30a75ef687c403e21d69cbc27ad9a Mon Sep 17 00:00:00 2001 From: Alissa Crane Date: Mon, 14 Apr 2025 21:32:29 -0700 Subject: [PATCH 07/55] fix wallet modal (#2282) --- packages/onchainkit/src/wallet/components/WalletModal.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/onchainkit/src/wallet/components/WalletModal.tsx b/packages/onchainkit/src/wallet/components/WalletModal.tsx index df86fbf1c4..0b46841c19 100644 --- a/packages/onchainkit/src/wallet/components/WalletModal.tsx +++ b/packages/onchainkit/src/wallet/components/WalletModal.tsx @@ -249,7 +249,6 @@ export function WalletModal({ border.default, 'absolute top-4 right-4', 'flex items-center justify-center p-1', - 'bg-current', 'transition-colors duration-200', )} aria-label="Close modal" From 89647f012b4957737a195b8d59bfa9f4015a1a64 Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Tue, 15 Apr 2025 09:37:25 -0600 Subject: [PATCH 08/55] fix: Separate deafult Wagmi and Query providers (#2280) --- .../src/DefaultOnchainKitProviders.test.tsx | 51 +++++++----- .../src/DefaultOnchainKitProviders.tsx | 79 +++++++++++-------- 2 files changed, 81 insertions(+), 49 deletions(-) diff --git a/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx b/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx index 8f2f9682f0..b346cbf8d0 100644 --- a/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx +++ b/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx @@ -1,7 +1,7 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { QueryClient } from '@tanstack/react-query'; import { render, screen } from '@testing-library/react'; import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'; -import { http, WagmiProvider, createConfig } from 'wagmi'; +import { http, createConfig } from 'wagmi'; import { DefaultOnchainKitProviders } from './DefaultOnchainKitProviders'; import { useProviderDependencies } from './internal/hooks/useProviderDependencies'; @@ -49,8 +49,8 @@ vi.mock('./internal/hooks/useProviderDependencies', () => ({ describe('DefaultOnchainKitProviders', () => { beforeEach(() => { (useProviderDependencies as Mock).mockReturnValue({ - providedWagmiConfig: false, - providedQueryClient: false, + providedWagmiConfig: null, + providedQueryClient: null, }); }); @@ -66,39 +66,54 @@ describe('DefaultOnchainKitProviders', () => { expect(screen.queryAllByTestId('query-client-provider')).toHaveLength(1); }); - it('should not render duplicate default providers when a wagmi provider already exists', () => { + it('should not render duplicate WagmiProvider when a wagmi provider already exists', () => { (useProviderDependencies as Mock).mockReturnValue({ providedWagmiConfig: wagmiConfig, providedQueryClient: null, }); render( - - -
Test Child
-
-
, + +
Test Child
+
, ); expect(screen.getByText('Test Child')).toBeInTheDocument(); - expect(screen.queryAllByTestId('wagmi-provider')).toHaveLength(1); + expect(screen.queryAllByTestId('wagmi-provider')).toHaveLength(0); + expect(screen.queryAllByTestId('query-client-provider')).toHaveLength(1); }); - it('should not render duplicate default providers when a query client already exists', () => { + it('should not render duplicate QueryClientProvider when a query client already exists', () => { (useProviderDependencies as Mock).mockReturnValue({ providedWagmiConfig: null, providedQueryClient: queryClient, }); render( - - -
Test Child
-
-
, + +
Test Child
+
, ); expect(screen.getByText('Test Child')).toBeInTheDocument(); - expect(screen.queryAllByTestId('query-client-provider')).toHaveLength(1); + expect(screen.queryAllByTestId('wagmi-provider')).toHaveLength(1); + expect(screen.queryAllByTestId('query-client-provider')).toHaveLength(0); + }); + + it('should not render any default providers when both providers already exist', () => { + (useProviderDependencies as Mock).mockReturnValue({ + providedWagmiConfig: wagmiConfig, + providedQueryClient: queryClient, + }); + + render( + +
Test Child
+
, + ); + + expect(screen.getByText('Test Child')).toBeInTheDocument(); + expect(screen.queryAllByTestId('wagmi-provider')).toHaveLength(0); + expect(screen.queryAllByTestId('query-client-provider')).toHaveLength(0); }); }); diff --git a/packages/onchainkit/src/DefaultOnchainKitProviders.tsx b/packages/onchainkit/src/DefaultOnchainKitProviders.tsx index 8388e7c346..7e3e4858c4 100644 --- a/packages/onchainkit/src/DefaultOnchainKitProviders.tsx +++ b/packages/onchainkit/src/DefaultOnchainKitProviders.tsx @@ -1,6 +1,6 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { type PropsWithChildren, useMemo } from 'react'; -import { WagmiProvider } from 'wagmi'; +import { Config, WagmiProvider } from 'wagmi'; import { coinbaseWallet } from 'wagmi/connectors'; import { createWagmiConfig } from './core/createWagmiConfig'; import type { CreateWagmiConfigParams } from './core/types'; @@ -23,37 +23,54 @@ export function DefaultOnchainKitProviders({ const { providedWagmiConfig, providedQueryClient } = useProviderDependencies(); - const defaultConfig = useMemo(() => { - // IMPORTANT: Don't create a new Wagmi configuration if one already exists - // This prevents the user-provided WagmiConfig from being overridden - return ( - providedWagmiConfig || - createWagmiConfig({ - apiKey, - appName, - appLogoUrl, - connectors, - }) - ); - }, [apiKey, appName, appLogoUrl, connectors, providedWagmiConfig]); - - const defaultQueryClient = useMemo(() => { - // IMPORTANT: Don't create a new QueryClient if one already exists - // This prevents the user-provided QueryClient from being overridden + return ( + + + {children} + + + ); +} + +function WagmiProviderWithDefault({ + apiKey, + appName, + appLogoUrl, + connectors, + children, + providedWagmiConfig, +}: PropsWithChildren & { + providedWagmiConfig: Config | null; +}) { + if (providedWagmiConfig) return children; + + const config = createWagmiConfig({ + apiKey, + appName, + appLogoUrl, + connectors, + }); + + return {children}; +} + +function QueryClientProviderWithDefault({ + children, + providedQueryClient, +}: PropsWithChildren<{ providedQueryClient: QueryClient | null }>) { + const queryClient = useMemo(() => { return providedQueryClient || new QueryClient(); }, [providedQueryClient]); - // If both dependencies are missing, return a context with default parent providers - // If only one dependency is provided, expect the user to also provide the missing one - if (!providedWagmiConfig && !providedQueryClient) { - return ( - - - {children} - - - ); - } - - return children; + if (providedQueryClient) return children; + + return ( + {children} + ); } From 6539766203e3972c0b1b8d9530d8637dd3d1a5c4 Mon Sep 17 00:00:00 2001 From: Alissa Crane Date: Wed, 16 Apr 2025 09:19:06 -0700 Subject: [PATCH 09/55] chore: show connect button when disconnected in Identity demo (#2285) --- .../playground/components/demo/Identity.tsx | 5 ++- .../components/demo/IdentityCard.tsx | 35 +++++++++++-------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/packages/playground/components/demo/Identity.tsx b/packages/playground/components/demo/Identity.tsx index b615c3598c..94b82217e7 100644 --- a/packages/playground/components/demo/Identity.tsx +++ b/packages/playground/components/demo/Identity.tsx @@ -6,6 +6,7 @@ import { Name, Socials, } from '@coinbase/onchainkit/identity'; +import { ConnectWallet } from '@coinbase/onchainkit/wallet'; import { base, mainnet } from 'viem/chains'; import { useAccount } from 'wagmi'; @@ -15,7 +16,7 @@ export default function IdentityDemo() { return (
- {address && ( + {address ? (

@@ -46,6 +47,8 @@ export default function IdentityDemo() {

+ ) : ( + )}
diff --git a/packages/playground/components/demo/IdentityCard.tsx b/packages/playground/components/demo/IdentityCard.tsx index 042dac4a62..0ae24a247a 100644 --- a/packages/playground/components/demo/IdentityCard.tsx +++ b/packages/playground/components/demo/IdentityCard.tsx @@ -1,30 +1,37 @@ 'use client'; import { IdentityCard } from '@coinbase/onchainkit/identity'; +import { ConnectWallet } from '@coinbase/onchainkit/wallet'; import { base, mainnet } from 'viem/chains'; import { useAccount } from 'wagmi'; export function IdentityCardDemo() { const { address } = useAccount(); - if (!address) { - return null; - } - return (
-
-
-

- Mainnet Identity -

- + {address ? ( +
+
+

+ Mainnet Identity +

+ + +
+
+

Base Identity

+ +
-
-

Base Identity

- + ) : ( +
+
+ Connect wallet to view identity cards +
+
-
+ )}
); } From b43425c8f39ca6dea497c1922366d04175a72c52 Mon Sep 17 00:00:00 2001 From: Paul Cramer Date: Wed, 16 Apr 2025 11:29:27 -0700 Subject: [PATCH 10/55] Fix: Flaky AppchainBridgeProvider network toggle test (#2288) --- .../components/AppchainBridgeProvider.test.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/onchainkit/src/appchain/bridge/components/AppchainBridgeProvider.test.tsx b/packages/onchainkit/src/appchain/bridge/components/AppchainBridgeProvider.test.tsx index 9b6e5df008..d52d3c35f3 100644 --- a/packages/onchainkit/src/appchain/bridge/components/AppchainBridgeProvider.test.tsx +++ b/packages/onchainkit/src/appchain/bridge/components/AppchainBridgeProvider.test.tsx @@ -170,15 +170,17 @@ describe('AppchainBridgeProvider', () => { }); it('should handle network toggle correctly', async () => { - const initialFrom = result.current.from; - const initialTo = result.current.to; + const initialFromId = result.current.from.id; + const initialToId = result.current.to.id; - await waitFor(async () => { + act(() => { result.current.handleToggle(); }); - expect(result.current.from).toEqual(initialTo); - expect(result.current.to).toEqual(initialFrom); + await waitFor(() => { + expect(result.current.from.id).toBe(initialToId); + expect(result.current.to.id).toBe(initialFromId); + }); }); it('should handle amount changes with price updates', async () => { From a1cd8f0f3fe953a535a7b0299620f96503e8aee5 Mon Sep 17 00:00:00 2001 From: Brendan from DeFi Date: Wed, 16 Apr 2025 11:31:22 -0700 Subject: [PATCH 11/55] refactor: send display name (#2283) --- .../components/Send.test.tsx | 76 +++++-- .../wallet-advanced-send/components/Send.tsx | 12 +- .../components/SendAddressInput.test.tsx | 142 +++++------- .../components/SendAddressInput.tsx | 51 +---- .../components/SendAddressSelection.test.tsx | 207 ----------------- .../components/SendAddressSelection.tsx | 77 ------- .../components/SendAddressSelector.test.tsx | 99 ++++++-- .../components/SendAddressSelector.tsx | 42 ++-- .../components/SendButton.test.tsx | 5 +- .../components/SendButton.tsx | 4 +- .../components/SendHeader.test.tsx | 40 +++- .../components/SendHeader.tsx | 14 +- .../components/SendProvider.test.tsx | 47 ++-- .../components/SendProvider.tsx | 55 ++--- .../hooks/useRecipientState.test.tsx | 215 ++++++++++++++++++ .../hooks/useRecipientState.tsx | 99 ++++++++ .../components/wallet-advanced-send/types.ts | 52 +++-- .../utils/resolveAddressInput.test.ts | 69 ------ .../utils/resolveAddressInput.ts | 41 ---- packages/playground/package.json | 2 +- pnpm-lock.yaml | 38 +--- 21 files changed, 688 insertions(+), 699 deletions(-) delete mode 100644 packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelection.test.tsx delete mode 100644 packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelection.tsx create mode 100644 packages/onchainkit/src/wallet/components/wallet-advanced-send/hooks/useRecipientState.test.tsx create mode 100644 packages/onchainkit/src/wallet/components/wallet-advanced-send/hooks/useRecipientState.tsx delete mode 100644 packages/onchainkit/src/wallet/components/wallet-advanced-send/utils/resolveAddressInput.test.ts delete mode 100644 packages/onchainkit/src/wallet/components/wallet-advanced-send/utils/resolveAddressInput.ts diff --git a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/Send.test.tsx b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/Send.test.tsx index 23d2724339..c1c2786013 100644 --- a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/Send.test.tsx +++ b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/Send.test.tsx @@ -5,7 +5,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { ETH_REQUIRED_FOR_SEND } from '../constants'; import type { SendContextType } from '../types'; import { Send } from './Send'; -import { SendAddressSelection } from './SendAddressSelection'; +import { SendAddressInput } from './SendAddressInput'; +import { SendAddressSelector } from './SendAddressSelector'; import { SendAmountInput } from './SendAmountInput'; import { SendButton } from './SendButton'; import { SendFundWallet } from './SendFundWallet'; @@ -16,7 +17,8 @@ import { SendTokenSelector } from './SendTokenSelector'; // Mock all dependencies vi.mock('@/internal/components/Skeleton'); vi.mock('@/internal/hooks/useTheme'); -vi.mock('./SendAddressSelection'); +vi.mock('./SendAddressInput'); +vi.mock('./SendAddressSelector'); vi.mock('./SendAmountInput'); vi.mock('./SendButton'); vi.mock('./SendFundWallet'); @@ -49,8 +51,15 @@ describe('Send', () => { it('renders with SendProvider and applies correct classes', () => { vi.mocked(useSendContext).mockReturnValue({ isInitialized: false, + lifecycleStatus: expect.any(Object), + updateLifecycleStatus: expect.any(Function), ethBalance: 0, - selectedRecipient: { address: null, displayValue: '' }, + recipientState: { + phase: 'input', + input: '', + address: null, + displayValue: null, + }, selectedToken: null, } as SendContextType); @@ -65,7 +74,12 @@ describe('Send', () => { vi.mocked(useSendContext).mockReturnValue({ isInitialized: false, ethBalance: 0, - selectedRecipient: { address: null, displayValue: '' }, + recipientState: { + phase: 'input', + input: '', + address: null, + displayValue: null, + }, selectedToken: null, } as SendContextType); @@ -93,7 +107,12 @@ describe('Send', () => { vi.mocked(useSendContext).mockReturnValue({ isInitialized: false, ethBalance: undefined, - selectedRecipient: { address: null, displayValue: '' }, + recipientState: { + phase: 'input', + input: '', + address: null, + displayValue: null, + }, selectedToken: null, } as SendContextType); @@ -115,21 +134,48 @@ describe('Send', () => { expect(SendHeader).toHaveBeenCalled(); expect(SendFundWallet).toHaveBeenCalled(); - expect(SendAddressSelection).not.toHaveBeenCalled(); + expect(SendAddressInput).not.toHaveBeenCalled(); + }); + + it('renders SendAddressInput when wallet has sufficient ETH', () => { + vi.mocked(useSendContext).mockReturnValue({ + isInitialized: true, + ethBalance: ETH_REQUIRED_FOR_SEND + 0.0000000001, // de-minimis amount above ETH_REQUIRED_FOR_SEND + recipientState: { + phase: 'input', + input: '', + address: null, + displayValue: null, + }, + selectedToken: null, + } as SendContextType); + + render(); + + expect(SendHeader).toHaveBeenCalled(); + expect(SendAddressInput).toHaveBeenCalled(); + expect(SendFundWallet).not.toHaveBeenCalled(); + expect(SendTokenSelector).not.toHaveBeenCalled(); }); - it('renders SendAddressSelection when wallet has sufficient ETH', () => { + it('renders SendAddressSelector when recipient input is validated but no address has been selected', () => { vi.mocked(useSendContext).mockReturnValue({ isInitialized: true, ethBalance: ETH_REQUIRED_FOR_SEND + 0.0000000001, // de-minimis amount above ETH_REQUIRED_FOR_SEND - selectedRecipient: { address: null, displayValue: '' }, + recipientState: { + phase: 'validated', + input: 'test.base.eth', + address: '0x1234567890123456789012345678901234567890' as Address, + displayValue: '0x1234567890123456789012345678901234567890', + }, selectedToken: null, } as SendContextType); render(); expect(SendHeader).toHaveBeenCalled(); - expect(SendAddressSelection).toHaveBeenCalled(); + expect(SendAddressInput).toHaveBeenCalled(); + expect(SendAddressSelector).toHaveBeenCalled(); expect(SendFundWallet).not.toHaveBeenCalled(); expect(SendTokenSelector).not.toHaveBeenCalled(); }); @@ -138,7 +184,9 @@ describe('Send', () => { vi.mocked(useSendContext).mockReturnValue({ isInitialized: true, ethBalance: ETH_REQUIRED_FOR_SEND + 0.0000000001, // de-minimis amount above ETH_REQUIRED_FOR_SEND - selectedRecipient: { + recipientState: { + phase: 'selected', + input: 'test.base.eth', address: '0x1234567890123456789012345678901234567890' as Address, displayValue: '0x1234567890123456789012345678901234567890', }, @@ -148,7 +196,7 @@ describe('Send', () => { render(); expect(SendHeader).toHaveBeenCalled(); - expect(SendAddressSelection).toHaveBeenCalled(); + expect(SendAddressInput).toHaveBeenCalled(); expect(SendTokenSelector).toHaveBeenCalled(); expect(SendAmountInput).not.toHaveBeenCalled(); }); @@ -157,7 +205,9 @@ describe('Send', () => { vi.mocked(useSendContext).mockReturnValue({ isInitialized: true, ethBalance: ETH_REQUIRED_FOR_SEND + 0.0000001, - selectedRecipient: { + recipientState: { + phase: 'selected', + input: 'test.base.eth', address: '0x1234567890123456789012345678901234567890' as Address, displayValue: '0x1234567890123456789012345678901234567890', }, @@ -167,7 +217,7 @@ describe('Send', () => { render(); expect(SendHeader).toHaveBeenCalled(); - expect(SendAddressSelection).toHaveBeenCalled(); + expect(SendAddressInput).toHaveBeenCalled(); expect(SendAmountInput).toHaveBeenCalled(); expect(SendTokenSelector).toHaveBeenCalled(); expect(SendButton).toHaveBeenCalled(); diff --git a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/Send.tsx b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/Send.tsx index c83068fc67..d0a9710b63 100644 --- a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/Send.tsx +++ b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/Send.tsx @@ -2,13 +2,14 @@ import { Skeleton } from '@/internal/components/Skeleton'; import { background, border, cn, color } from '@/styles/theme'; import { ETH_REQUIRED_FOR_SEND } from '../constants'; import type { SendReact } from '../types'; -import { SendAddressSelection } from './SendAddressSelection'; import { SendAmountInput } from './SendAmountInput'; import { SendButton } from './SendButton'; import { SendFundWallet } from './SendFundWallet'; import { SendHeader } from './SendHeader'; import { SendProvider, useSendContext } from './SendProvider'; import { SendTokenSelector } from './SendTokenSelector'; +import { SendAddressInput } from './SendAddressInput'; +import { SendAddressSelector } from './SendAddressSelector'; export function Send({ children = , @@ -36,7 +37,7 @@ export function Send({ } function SendDefaultChildren() { - const { ethBalance, isInitialized, selectedRecipient, selectedToken } = + const { ethBalance, isInitialized, recipientState, selectedToken } = useSendContext(); const walletHasEth = (ethBalance ?? 0) > ETH_REQUIRED_FOR_SEND; @@ -51,12 +52,13 @@ function SendDefaultChildren() { {walletHasEth ? (
- - {selectedRecipient.address && !selectedToken && ( + + {recipientState.phase === 'validated' && } + {recipientState.phase === 'selected' && !selectedToken && ( )}
- {selectedRecipient.address && selectedToken && ( + {recipientState.phase === 'selected' && selectedToken && ( <> diff --git a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressInput.test.tsx b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressInput.test.tsx index 0e6275f1b0..f5a23000f0 100644 --- a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressInput.test.tsx +++ b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressInput.test.tsx @@ -2,9 +2,8 @@ import { TextInput } from '@/internal/components/TextInput'; import { render, screen } from '@testing-library/react'; import type { Address } from 'viem'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { resolveAddressInput } from '../utils/resolveAddressInput'; -import { validateAddressInput } from '../utils/validateAddressInput'; import { SendAddressInput } from './SendAddressInput'; +import { useSendContext } from './SendProvider'; vi.mock('@/internal/components/TextInput', () => ({ TextInput: vi.fn(() => ), @@ -18,26 +17,38 @@ vi.mock('../utils/validateAddressInput', () => ({ validateAddressInput: vi.fn(), })); +vi.mock('./SendProvider', () => ({ + useSendContext: vi.fn(), +})); + +const mockClassNames = { + container: 'custom-container', + label: 'custom-label', + input: 'custom-input', +}; + +const mockSendContext = { + recipientState: { + phase: 'input', + input: '', + address: null, + displayValue: null, + }, + updateRecipientInput: vi.fn(), + validateRecipientInput: vi.fn(), + deselectRecipient: vi.fn(), +}; + describe('SendAddressInput', () => { - const mockProps = { - selectedRecipient: { address: null, displayValue: '' }, - recipientInput: '', - setRecipientInput: vi.fn(), - setValidatedInput: vi.fn(), - handleRecipientInputChange: vi.fn(), - classNames: { - container: 'custom-container', - label: 'custom-label', - input: 'custom-input', - }, - }; + const mockUseSendContext = useSendContext as ReturnType; beforeEach(() => { vi.clearAllMocks(); + mockUseSendContext.mockReturnValue(mockSendContext); }); it('renders with correct structure and classes', () => { - render(); + render(); const container = screen.getByTestId('ockSendAddressInput'); expect(container).toBeInTheDocument(); @@ -58,109 +69,76 @@ describe('SendAddressInput', () => { }); it('displays selectedRecipient.displayValue when available', () => { - const props = { - ...mockProps, - selectedRecipient: { + mockUseSendContext.mockReturnValue({ + ...mockSendContext, + recipientState: { + phase: 'selected', + input: 'test.base.eth', address: '0x1234567890123456789012345678901234567890' as Address, - displayValue: 'user.eth', + displayValue: 'test.base.eth', }, - }; + }); - render(); + render(); expect(TextInput).toHaveBeenCalledWith( expect.objectContaining({ - value: 'user.eth', + value: 'test.base.eth', }), {}, ); }); it('displays recipientInput when no selectedRecipient.displayValue', () => { - const props = { - ...mockProps, - selectedRecipient: { address: null, displayValue: '' }, - recipientInput: 'test-input', - }; + mockUseSendContext.mockReturnValue({ + ...mockSendContext, + recipientState: { + phase: 'selected', + input: '0x1234567890123456789012345678901234567890', + address: '0x1234567890123456789012345678901234567890' as Address, + displayValue: null, + }, + }); - render(); + render(); expect(TextInput).toHaveBeenCalledWith( expect.objectContaining({ - value: 'test-input', + value: '0x1234567890123456789012345678901234567890', }), {}, ); }); - it('calls handleRecipientInputChange on focus when selectedRecipient.address exists', () => { - const props = { - ...mockProps, - selectedRecipient: { + it('calls deselectRecipient on focus', () => { + mockUseSendContext.mockReturnValue({ + ...mockSendContext, + recipientState: { + phase: 'selected', + input: '0x1234567890123456789012345678901234567890', address: '0x1234567890123456789012345678901234567890' as Address, - displayValue: 'user.eth', + displayValue: '0x1234567890123456789012345678901234567890', }, - }; - - render(); - - const { onFocus } = vi.mocked(TextInput).mock.calls[0][0]; - - onFocus?.({} as React.FocusEvent); - - expect(props.handleRecipientInputChange).toHaveBeenCalled(); - }); + }); - it('does not call handleRecipientInputChange on focus when selectedRecipient.address does not exist', () => { - render(); + render(); const { onFocus } = vi.mocked(TextInput).mock.calls[0][0]; onFocus?.({} as React.FocusEvent); - expect(mockProps.handleRecipientInputChange).not.toHaveBeenCalled(); + expect(mockSendContext.deselectRecipient).toHaveBeenCalled(); }); - it('calls setRecipientInput when TextInput setValue is called', () => { - render(); + it('calls updateRecipientInput when TextInput setValue is called', () => { + render(); const { setValue } = vi.mocked(TextInput).mock.calls[0][0]; setValue?.('new-input'); - expect(mockProps.setRecipientInput).toHaveBeenCalledWith('new-input'); - }); - - it('calls resolveAddressInput and setValidatedInput when input changes', async () => { - vi.mocked(resolveAddressInput).mockResolvedValue({ - address: '0x456', - displayValue: 'resolved.eth', - }); - - render(); - - const { onChange } = vi.mocked(TextInput).mock.calls[0][0]; - - await onChange?.('new-input'); - - expect(resolveAddressInput).toHaveBeenCalledWith(null, 'new-input'); - expect(mockProps.setValidatedInput).toHaveBeenCalledWith({ - address: '0x456', - displayValue: 'resolved.eth', - }); - }); - - it('uses validateAddressInput for input validation', () => { - vi.mocked(validateAddressInput).mockResolvedValue( - '0x1234567890123456789012345678901234567890', + expect(mockSendContext.updateRecipientInput).toHaveBeenCalledWith( + 'new-input', ); - - render(); - - const { inputValidator } = vi.mocked(TextInput).mock.calls[0][0]; - - inputValidator?.('test-input'); - - expect(validateAddressInput).toHaveBeenCalledWith('test-input'); }); }); diff --git a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressInput.tsx b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressInput.tsx index e5f3297341..244721031d 100644 --- a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressInput.tsx +++ b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressInput.tsx @@ -2,42 +2,16 @@ import { TextInput } from '@/internal/components/TextInput'; import { background, border, cn, color } from '@/styles/theme'; -import { useCallback } from 'react'; import type { SendAddressInputProps } from '../types'; -import { resolveAddressInput } from '../utils/resolveAddressInput'; -import { validateAddressInput } from '../utils/validateAddressInput'; +import { useSendContext } from './SendProvider'; -export function SendAddressInput({ - selectedRecipient, - recipientInput, - setRecipientInput, - setValidatedInput, - handleRecipientInputChange, - classNames, -}: SendAddressInputProps) { - const displayValue = selectedRecipient?.displayValue || recipientInput; - - const handleFocus = useCallback(() => { - if (selectedRecipient.address) { - handleRecipientInputChange(); - } - }, [selectedRecipient, handleRecipientInputChange]); - - const handleSetValue = useCallback( - async (input: string) => { - const resolved = await resolveAddressInput( - selectedRecipient.address, - input, - ); - setValidatedInput(resolved); - }, - [selectedRecipient.address, setValidatedInput], - ); - - const validateInput = useCallback( - (recipientInput: string) => !!validateAddressInput(recipientInput), - [], - ); +export function SendAddressInput({ classNames }: SendAddressInputProps) { + const { + recipientState, + updateRecipientInput, + validateRecipientInput, + deselectRecipient, + } = useSendContext(); return (
({ - useWalletContext: vi.fn(), -})); - -vi.mock('./SendProvider', () => ({ - useSendContext: vi.fn(), -})); - -vi.mock('./SendAddressInput', () => ({ - SendAddressInput: vi.fn(() =>
), -})); - -vi.mock('./SendAddressSelector', () => ({ - SendAddressSelector: vi.fn(() => ( -
- )), -})); - -vi.mock('../utils/resolveAddressInput', () => ({ - resolveAddressInput: vi.fn(), -})); - -const mockChain = { - id: 8453, - name: 'Base', - nativeCurrency: { - name: 'Ethereum', - symbol: 'ETH', - decimals: 18, - }, -} as Chain; - -const mockSendContext = { - selectedRecipient: { address: null, displayValue: '' }, - handleRecipientSelection: vi.fn(), - handleRecipientInputChange: vi.fn(), -}; - -describe('SendAddressSelection', () => { - const mockUseWalletContext = useWalletContext as ReturnType; - const mockUseSendContext = useSendContext as ReturnType; - - beforeEach(() => { - vi.clearAllMocks(); - mockUseWalletContext.mockReturnValue({ - chain: mockChain, - }); - mockUseSendContext.mockReturnValue(mockSendContext); - }); - - it('renders SendAddressInput with correct props', () => { - render(); - - expect(SendAddressInput).toHaveBeenCalledWith( - expect.objectContaining({ - selectedRecipient: mockSendContext.selectedRecipient, - recipientInput: '', - handleRecipientInputChange: mockSendContext.handleRecipientInputChange, - }), - {}, - ); - - expect(screen.getByTestId('mock-send-address-input')).toBeInTheDocument(); - }); - - it('passes custom classNames to SendAddressInput', () => { - const customClassNames = { - input: { - container: 'custom-container', - label: 'custom-label', - input: 'custom-input', - }, - }; - - render(); - - expect(SendAddressInput).toHaveBeenCalledWith( - expect.objectContaining({ - classNames: customClassNames.input, - }), - {}, - ); - }); - - it('does not render SendAddressSelector when selectedRecipient.address exists', () => { - vi.mocked(mockUseSendContext).mockReturnValue({ - ...mockSendContext, - selectedRecipient: { - address: '0x1234567890123456789012345678901234567890', - displayValue: 'user.eth', - }, - }); - - render(); - - expect(SendAddressSelector).not.toHaveBeenCalled(); - expect( - screen.queryByTestId('mock-send-address-selector'), - ).not.toBeInTheDocument(); - }); - - it('does not render SendAddressSelector when validatedInput.address is null', () => { - render(); - - expect(SendAddressSelector).not.toHaveBeenCalled(); - expect( - screen.queryByTestId('mock-send-address-selector'), - ).not.toBeInTheDocument(); - }); - - it('renders SendAddressSelector when validatedInput.address exists and no selectedRecipient.address', async () => { - const { rerender } = render(); - const { setValidatedInput } = vi.mocked(SendAddressInput).mock.calls[0][0]; - - act(() => { - setValidatedInput({ - address: '0x1234567890123456789012345678901234567890', - displayValue: 'user.eth', - }); - - rerender(); - }); - - expect(SendAddressSelector).toHaveBeenCalledWith( - expect.objectContaining({ - address: '0x1234567890123456789012345678901234567890', - }), - {}, - ); - - expect( - screen.getByTestId('mock-send-address-selector'), - ).toBeInTheDocument(); - }); - - it('passes custom classNames to SendAddressSelector', async () => { - const customClassNames = { - selector: { - container: 'custom-selector-container', - }, - }; - - const { rerender } = render( - , - ); - - const { setValidatedInput } = vi.mocked(SendAddressInput).mock.calls[0][0]; - - act(() => { - setValidatedInput({ - address: '0x1234567890123456789012345678901234567890', - displayValue: 'user.eth', - }); - - rerender(); - }); - - expect(SendAddressSelector).toHaveBeenCalledWith( - expect.objectContaining({ - classNames: customClassNames.selector, - }), - {}, - ); - }); - - it('calls resolveAddressInput and handleRecipientSelection when onClick is triggered', async () => { - vi.mocked(resolveAddressInput).mockResolvedValue({ - address: '0x9876543210987654321098765432109876543210', - displayValue: 'resolved.eth', - }); - - const { rerender } = render(); - - const { setValidatedInput } = vi.mocked(SendAddressInput).mock.calls[0][0]; - act(() => { - setValidatedInput({ - address: '0x1234567890123456789012345678901234567890', - displayValue: 'user.eth', - }); - - rerender(); - }); - - const { onClick } = vi.mocked(SendAddressSelector).mock.calls[0][0]; - - await onClick(); - - expect(resolveAddressInput).toHaveBeenCalledWith( - '0x1234567890123456789012345678901234567890', - 'user.eth', - ); - expect(mockSendContext.handleRecipientSelection).toHaveBeenCalledWith({ - address: '0x9876543210987654321098765432109876543210', - displayValue: 'resolved.eth', - }); - }); -}); diff --git a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelection.tsx b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelection.tsx deleted file mode 100644 index 755e5d5b84..0000000000 --- a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelection.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { useCallback, useMemo, useState } from 'react'; -import { useWalletContext } from '../../WalletProvider'; -import type { - Recipient, - SendAddressInputProps, - SendAddressSelectorProps, -} from '../types'; -import { resolveAddressInput } from '../utils/resolveAddressInput'; -import { SendAddressInput } from './SendAddressInput'; -import { SendAddressSelector } from './SendAddressSelector'; -import { useSendContext } from './SendProvider'; - -type SendAddressSelectionProps = { - classNames?: { - input?: SendAddressInputProps['classNames']; - selector?: SendAddressSelectorProps['classNames']; - }; -}; - -export function SendAddressSelection({ - classNames, -}: SendAddressSelectionProps) { - const [recipientInput, setRecipientInput] = useState(''); - const [validatedInput, setValidatedInput] = useState({ - displayValue: '', - address: null, - }); - - const { chain: senderChain } = useWalletContext(); - const { - selectedRecipient, - handleRecipientSelection, - handleRecipientInputChange, - } = useSendContext(); - - const handleClick = useCallback(async () => { - const resolvedSelection = await resolveAddressInput( - validatedInput.address, - validatedInput.displayValue, - ); - handleRecipientSelection(resolvedSelection); - }, [validatedInput, handleRecipientSelection]); - - const addressSelector = useMemo(() => { - if (selectedRecipient.address || !validatedInput.address) { - return null; - } - return ( - - ); - }, [ - selectedRecipient, - validatedInput, - senderChain, - handleClick, - classNames?.selector, - ]); - - return ( -
- - {addressSelector} -
- ); -} diff --git a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelector.test.tsx b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelector.test.tsx index db13952fdf..0ed57974fd 100644 --- a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelector.test.tsx +++ b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelector.test.tsx @@ -1,8 +1,10 @@ import { Address, Avatar, Name } from '@/identity'; import { fireEvent, render, screen } from '@testing-library/react'; -import type { Address as AddressType, Chain } from 'viem'; +import type { Chain } from 'viem'; import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { useWalletContext } from '../../WalletProvider'; import { SendAddressSelector } from './SendAddressSelector'; +import { useSendContext } from './SendProvider'; vi.mock('@/identity', () => ({ Address: vi.fn(() =>
Address Component
), @@ -10,6 +12,14 @@ vi.mock('@/identity', () => ({ Name: vi.fn(() =>
Name Component
), })); +vi.mock('../../WalletProvider', () => ({ + useWalletContext: vi.fn(), +})); + +vi.mock('./SendProvider', () => ({ + useSendContext: vi.fn(), +})); + const mockChain = { id: 8453, name: 'Base', @@ -20,25 +30,38 @@ const mockChain = { }, } as Chain; +const mockWalletContext = { + chain: mockChain, +}; + +const mockSendContext = { + recipientState: { + phase: 'input', + input: '', + address: null, + displayValue: null, + }, + selectRecipient: vi.fn(), +}; + describe('SendAddressSelector', () => { - const mockProps = { - address: '0x1234567890123456789012345678901234567890' as AddressType, - senderChain: mockChain, - onClick: vi.fn(), - classNames: { - container: 'custom-container', - avatar: 'custom-avatar', - name: 'custom-name', - address: 'custom-address', - }, + const mockUseWalletContext = useWalletContext as ReturnType; + const mockUseSendContext = useSendContext as ReturnType; + const mockClassNames = { + container: 'custom-container', + avatar: 'custom-avatar', + name: 'custom-name', + address: 'custom-address', }; beforeEach(() => { vi.clearAllMocks(); + mockUseSendContext.mockReturnValue(mockSendContext); + mockUseWalletContext.mockReturnValue(mockWalletContext); }); - it('returns null when address is not provided', () => { - render(); + it('returns null when recipientState.address is null', () => { + render(); const container = screen.queryByTestId('ockSendAddressSelector_container'); @@ -46,7 +69,11 @@ describe('SendAddressSelector', () => { }); it('returns null when senderChain is not provided', () => { - render(); + mockUseWalletContext.mockReturnValue({ + ...mockWalletContext, + chain: null, + }); + render(); const container = screen.queryByTestId('ockSendAddressSelector_container'); @@ -54,7 +81,15 @@ describe('SendAddressSelector', () => { }); it('renders with correct structure and classes', () => { - render(); + mockUseSendContext.mockReturnValue({ + ...mockSendContext, + recipientState: { + ...mockSendContext.recipientState, + address: '0x1234567890123456789012345678901234567890', + displayValue: 'test.base.eth', + }, + }); + render(); const button = screen.getByTestId('ockSendAddressSelector_button'); expect(button).toHaveAttribute('type', 'button'); @@ -70,12 +105,20 @@ describe('SendAddressSelector', () => { }); it('passes correct props to identity components', () => { - render(); + mockUseSendContext.mockReturnValue({ + ...mockSendContext, + recipientState: { + ...mockSendContext.recipientState, + address: '0x1234567890123456789012345678901234567890', + displayValue: 'test.base.eth', + }, + }); + render(); expect(Avatar).toHaveBeenCalledWith( expect.objectContaining({ - address: mockProps.address, - chain: mockProps.senderChain, + address: '0x1234567890123456789012345678901234567890', + chain: mockWalletContext.chain, className: 'custom-avatar', }), {}, @@ -83,8 +126,8 @@ describe('SendAddressSelector', () => { expect(Name).toHaveBeenCalledWith( expect.objectContaining({ - address: mockProps.address, - chain: mockProps.senderChain, + address: '0x1234567890123456789012345678901234567890', + chain: mockWalletContext.chain, className: 'custom-name', }), {}, @@ -92,7 +135,7 @@ describe('SendAddressSelector', () => { expect(Address).toHaveBeenCalledWith( expect.objectContaining({ - address: mockProps.address, + address: '0x1234567890123456789012345678901234567890', hasCopyAddressOnClick: false, className: 'custom-address', }), @@ -100,12 +143,20 @@ describe('SendAddressSelector', () => { ); }); - it('calls onClick when button is clicked', () => { - render(); + it('calls onClick when button is clicked and recipientState.address is not null', () => { + mockUseSendContext.mockReturnValue({ + ...mockSendContext, + recipientState: { + ...mockSendContext.recipientState, + address: '0x1234567890123456789012345678901234567890', + displayValue: 'test.base.eth', + }, + }); + render(); const button = screen.getByTestId('ockSendAddressSelector_button'); fireEvent.click(button); - expect(mockProps.onClick).toHaveBeenCalledTimes(1); + expect(mockSendContext.selectRecipient).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelector.tsx b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelector.tsx index bc42df8b26..587f172107 100644 --- a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelector.tsx +++ b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendAddressSelector.tsx @@ -2,15 +2,31 @@ import { Address, Avatar, Name } from '@/identity'; import { background, border, cn, pressable } from '@/styles/theme'; +import { useCallback } from 'react'; +import type { Address as AddressType } from 'viem'; +import { useWalletContext } from '../../WalletProvider'; import type { SendAddressSelectorProps } from '../types'; +import { useSendContext } from './SendProvider'; -export function SendAddressSelector({ - address, - senderChain, - onClick, - classNames, -}: SendAddressSelectorProps) { - if (!address || !senderChain) { +export function SendAddressSelector({ classNames }: SendAddressSelectorProps) { + const { chain } = useWalletContext(); + const { recipientState, selectRecipient } = useSendContext(); + + const handleSelectorClick = useCallback(async () => { + selectRecipient({ + phase: 'selected', + input: recipientState.input, + address: recipientState.address as AddressType, + displayValue: recipientState.displayValue, + }); + }, [ + recipientState.input, + recipientState.address, + recipientState.displayValue, + selectRecipient, + ]); + + if (!recipientState.address || !chain) { return null; } @@ -18,7 +34,7 @@ export function SendAddressSelector({ - {!cancelClose && ( - - )}
); diff --git a/packages/miniapp-manifest-generator/src/components/Timer.test.tsx b/packages/miniapp-manifest-generator/src/components/Timer.test.tsx deleted file mode 100644 index 55da956085..0000000000 --- a/packages/miniapp-manifest-generator/src/components/Timer.test.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import '@testing-library/jest-dom'; -import { act } from 'react'; -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import { Timer } from './Timer'; - -describe('Timer', () => { - beforeEach(() => { - vi.useFakeTimers(); - }); - - afterEach(() => { - vi.useRealTimers(); - }); - - it('should render', () => { - render(); - - expect(screen.getByText('5')).toBeInTheDocument(); - }); - - it('should count down every second', () => { - render(); - - expect(screen.getByText('5')).toBeInTheDocument(); - - act(() => { - vi.advanceTimersByTime(1000); - }); - expect(screen.getByText('4')).toBeInTheDocument(); - - act(() => { - vi.advanceTimersByTime(1000); - }); - expect(screen.getByText('3')).toBeInTheDocument(); - }); - - it('should use custom interval', () => { - render(); - - expect(screen.getByText('5')).toBeInTheDocument(); - - act(() => { - vi.advanceTimersByTime(2000); - }); - expect(screen.getByText('3')).toBeInTheDocument(); - - act(() => { - vi.advanceTimersByTime(2000); - }); - expect(screen.getByText('1')).toBeInTheDocument(); - }); - - it('should support custom format function', () => { - const formatFunc = (timeMs: number) => `${(timeMs / 1000).toFixed(1)}s`; - - render(); - - expect(screen.getByText('5.0s')).toBeInTheDocument(); - - act(() => { - vi.advanceTimersByTime(1000); - }); - expect(screen.getByText('4.0s')).toBeInTheDocument(); - }); - - it('should call callback when timer reaches zero', () => { - const callback = vi.fn(); - render(); - - expect(screen.getByText('2')).toBeInTheDocument(); - - act(() => { - vi.advanceTimersByTime(2000); - }); - - expect(callback).toHaveBeenCalled(); - }); - - it('should stop at zero', () => { - render(); - - expect(screen.getByText('2')).toBeInTheDocument(); - - act(() => { - vi.advanceTimersByTime(2000); - }); - expect(screen.getByText('0')).toBeInTheDocument(); - - act(() => { - vi.advanceTimersByTime(1000); - }); - expect(screen.getByText('0')).toBeInTheDocument(); - }); - - it('should clean up interval on unmount', () => { - const clearIntervalSpy = vi.spyOn(window, 'clearInterval'); - const { unmount } = render(); - - unmount(); - expect(clearIntervalSpy).toHaveBeenCalled(); - }); -}); diff --git a/packages/miniapp-manifest-generator/src/components/Timer.tsx b/packages/miniapp-manifest-generator/src/components/Timer.tsx deleted file mode 100644 index 6615d2923e..0000000000 --- a/packages/miniapp-manifest-generator/src/components/Timer.tsx +++ /dev/null @@ -1,42 +0,0 @@ -'use client'; - -import { useEffect, useState } from 'react'; - -type TimerProps = { - startMs: number; - interval?: number; - formatFunc?: (timeMs: number) => string; - callback?: () => void; -}; - -/** - * A timer component that displays a countdown timer and calls a callback when the timer is complete. - * @param {number} props.startMs - The start time in milliseconds - * @param {number} props.interval - The countdown interval in milliseconds, defaults to 1000 - * @param {function} props.formatFunc - The formatter function to display time, defaults to displaying seconds. - * @param {function} props.callback - The callback to call on timer complete - * @returns {React.ReactNode} The Timer component. - */ -export function Timer({ - startMs, - interval = 1000, - formatFunc = (time) => (time / 1000).toFixed(), - callback = () => {}, -}: TimerProps) { - const [timeMs, setTimeMs] = useState(startMs); - - useEffect(() => { - if (timeMs <= 0) { - callback(); - return; - } - - const timer = setInterval(() => { - setTimeMs((prev) => prev - interval); - }, interval); - - return () => clearInterval(timer); - }, [interval, callback, timeMs]); - - return {formatFunc(timeMs)}; -} From c811694a6e337c96c26b7f032c51786bc3154d9e Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Thu, 1 May 2025 11:53:31 -0600 Subject: [PATCH 39/55] fix: Basenames bidirectional validation (#2329) --- .changeset/twenty-news-hide.md | 5 ++ .../src/identity/hooks/useAddress.test.tsx | 6 +- .../src/identity/hooks/useAddresses.test.tsx | 47 ++------------- .../src/identity/hooks/useAddresses.ts | 7 +-- packages/onchainkit/src/identity/types.ts | 4 -- .../src/identity/utils/getAddress.test.ts | 37 +++--------- .../src/identity/utils/getAddress.ts | 24 ++------ .../src/identity/utils/getAddresses.test.ts | 57 +------------------ .../src/identity/utils/getAddresses.ts | 23 +------- .../src/identity/utils/getName.test.ts | 5 -- .../onchainkit/src/identity/utils/getName.ts | 2 - .../onchainkit/src/identity/utils/getNames.ts | 4 +- 12 files changed, 31 insertions(+), 190 deletions(-) create mode 100644 .changeset/twenty-news-hide.md diff --git a/.changeset/twenty-news-hide.md b/.changeset/twenty-news-hide.md new file mode 100644 index 0000000000..344f8636de --- /dev/null +++ b/.changeset/twenty-news-hide.md @@ -0,0 +1,5 @@ +--- +"@coinbase/onchainkit": patch +--- + +fix: Basename resolution diff --git a/packages/onchainkit/src/identity/hooks/useAddress.test.tsx b/packages/onchainkit/src/identity/hooks/useAddress.test.tsx index 55c91ecd22..ed24a85720 100644 --- a/packages/onchainkit/src/identity/hooks/useAddress.test.tsx +++ b/packages/onchainkit/src/identity/hooks/useAddress.test.tsx @@ -1,7 +1,6 @@ import { publicClient } from '@/core/network/client'; -import { getChainPublicClient } from '@/core/network/getChainPublicClient'; import { renderHook, waitFor } from '@testing-library/react'; -import { base, baseSepolia, mainnet } from 'viem/chains'; +import { base, baseSepolia } from 'viem/chains'; import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'; import { getNewReactQueryTestProvider } from './getNewReactQueryTestProvider'; import { useAddress } from './useAddress'; @@ -55,7 +54,6 @@ describe('useAddress', () => { expect(result.current.data).toBe(testEnsAddress); expect(result.current.isLoading).toBe(false); }); - expect(getChainPublicClient).toHaveBeenCalledWith(mainnet); }); it('should return the loading state true while still fetching ENS address', async () => { @@ -83,7 +81,6 @@ describe('useAddress', () => { expect(result.current.data).toBe(testEnsAddress); expect(result.current.isLoading).toBe(false); }); - expect(getChainPublicClient).toHaveBeenCalledWith(base); }); it('should return correct base sepolia address', async () => { @@ -100,7 +97,6 @@ describe('useAddress', () => { expect(result.current.data).toBe(testEnsAddress); expect(result.current.isLoading).toBe(false); }); - expect(getChainPublicClient).toHaveBeenCalledWith(baseSepolia); }); it('correctly maps cacheTime to gcTime for backwards compatibility', async () => { diff --git a/packages/onchainkit/src/identity/hooks/useAddresses.test.tsx b/packages/onchainkit/src/identity/hooks/useAddresses.test.tsx index 1a710dabd1..70dbbb4797 100644 --- a/packages/onchainkit/src/identity/hooks/useAddresses.test.tsx +++ b/packages/onchainkit/src/identity/hooks/useAddresses.test.tsx @@ -1,7 +1,6 @@ import { publicClient } from '@/core/network/client'; import { renderHook, waitFor } from '@testing-library/react'; import type { Address } from 'viem'; -import { base, baseSepolia, mainnet, optimism } from 'viem/chains'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { getAddresses } from '../utils/getAddresses'; import { getNewReactQueryTestProvider } from './getNewReactQueryTestProvider'; @@ -70,18 +69,16 @@ describe('useAddresses', () => { expect(getAddresses).toHaveBeenCalledWith({ names: testNames, - chain: mainnet, }); }); - it('returns the correct addresses for custom chain', async () => { + it('returns the correct addresses for different name inputs', async () => { vi.mocked(getAddresses).mockResolvedValue(testAddresses); const { result } = renderHook( () => useAddresses({ names: testNames, - chain: base, }), { wrapper: getNewReactQueryTestProvider(), @@ -95,20 +92,17 @@ describe('useAddresses', () => { expect(getAddresses).toHaveBeenCalledWith({ names: testNames, - chain: base, }); }); - it('returns error for unsupported chain', async () => { - const errorMessage = - 'ChainId not supported, name resolution is only supported on Ethereum and Base.'; + it('returns error when name resolution fails', async () => { + const errorMessage = 'Error resolving names'; vi.mocked(getAddresses).mockRejectedValue(errorMessage); const { result } = renderHook( () => useAddresses({ names: testNames, - chain: optimism, }), { wrapper: getNewReactQueryTestProvider(), @@ -151,11 +145,7 @@ describe('useAddresses', () => { const options = mockUseQuery.mock.calls[0][0]; expect(options).toHaveProperty('queryKey'); - expect(options.queryKey).toEqual([ - 'useAddresses', - testNames.join(','), - mainnet.id, - ]); + expect(options.queryKey).toEqual(['useAddresses', testNames.join(',')]); }); it('merges custom queryOptions with default options', async () => { @@ -213,7 +203,7 @@ describe('useAddresses', () => { expect(optionsWithBoth).toHaveProperty('gcTime', mockGcTime); }); - it('creates a stable query key based on names and chain', async () => { + it('creates a stable query key based on names', async () => { vi.mocked(getAddresses).mockResolvedValue(testAddresses); const { result, rerender } = renderHook( @@ -251,7 +241,6 @@ describe('useAddresses', () => { expect(getAddresses).toHaveBeenCalledWith({ names: testNames, - chain: mainnet, }); }); @@ -291,32 +280,6 @@ describe('useAddresses', () => { expect(getAddresses).toHaveBeenCalledWith({ names: testNames, - chain: mainnet, - }); - }); - - it('supports Base Sepolia chain', async () => { - vi.mocked(getAddresses).mockResolvedValue(testAddresses); - - const { result } = renderHook( - () => - useAddresses({ - names: testNames, - chain: baseSepolia, - }), - { - wrapper: getNewReactQueryTestProvider(), - }, - ); - - await waitFor(() => { - expect(result.current.data).toEqual(testAddresses); - expect(result.current.isPending).toBe(false); - }); - - expect(getAddresses).toHaveBeenCalledWith({ - names: testNames, - chain: baseSepolia, }); }); diff --git a/packages/onchainkit/src/identity/hooks/useAddresses.ts b/packages/onchainkit/src/identity/hooks/useAddresses.ts index 378fd8ef4b..4cfa308041 100644 --- a/packages/onchainkit/src/identity/hooks/useAddresses.ts +++ b/packages/onchainkit/src/identity/hooks/useAddresses.ts @@ -1,7 +1,6 @@ import { getAddresses } from '@/identity/utils/getAddresses'; import { DEFAULT_QUERY_OPTIONS } from '@/internal/constants'; import { useQuery } from '@tanstack/react-query'; -import { mainnet } from 'viem/chains'; import type { GetAddressReturnType, UseAddressesOptions, @@ -13,15 +12,15 @@ import type { * multiple Ethereum addresses from ENS names or Basenames in a single batch request. */ export const useAddresses = ( - { names, chain = mainnet }: UseAddressesOptions, + { names }: UseAddressesOptions, queryOptions?: UseQueryOptions, ) => { const namesKey = names.join(','); - const queryKey = ['useAddresses', namesKey, chain.id]; + const queryKey = ['useAddresses', namesKey]; return useQuery({ queryKey, - queryFn: () => getAddresses({ names, chain }), + queryFn: () => getAddresses({ names }), enabled: !!names.length, ...DEFAULT_QUERY_OPTIONS, // Use cacheTime as gcTime for backward compatibility diff --git a/packages/onchainkit/src/identity/types.ts b/packages/onchainkit/src/identity/types.ts index 89d55f99fb..b8e59d0665 100644 --- a/packages/onchainkit/src/identity/types.ts +++ b/packages/onchainkit/src/identity/types.ts @@ -146,8 +146,6 @@ export type GetAddress = { export type GetAddresses = { /** Array of names to resolve addresses for */ names: Array; - /** Optional chain for domain resolution */ - chain?: Chain; }; /** @@ -301,8 +299,6 @@ export type UseAddressOptions = { export type UseAddressesOptions = { /** Array of ENS or Basenames to resolve addresses for */ names: Array; - /** Optional chain for domain resolution */ - chain?: Chain; }; /** diff --git a/packages/onchainkit/src/identity/utils/getAddress.test.ts b/packages/onchainkit/src/identity/utils/getAddress.test.ts index b403be77ef..e4fb83e68d 100644 --- a/packages/onchainkit/src/identity/utils/getAddress.test.ts +++ b/packages/onchainkit/src/identity/utils/getAddress.test.ts @@ -1,6 +1,4 @@ import { publicClient } from '@/core/network/client'; -import { getChainPublicClient } from '@/core/network/getChainPublicClient'; -import { base, baseSepolia, mainnet, optimism } from 'viem/chains'; import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'; import { getAddress } from './getAddress'; @@ -24,27 +22,6 @@ describe('getAddress', () => { const address = await getAddress({ name }); expect(address).toBe(expectedAddress); expect(mockGetEnsAddress).toHaveBeenCalledWith({ name }); - expect(getChainPublicClient).toHaveBeenCalledWith(mainnet); - }); - - it('should resolve to base mainnet address', async () => { - const name = 'shrek.base.eth'; - const expectedAddress = '0x1234'; - mockGetEnsAddress.mockResolvedValue(expectedAddress); - const address = await getAddress({ name, chain: base }); - expect(address).toBe(expectedAddress); - expect(getChainPublicClient).toHaveBeenCalledWith(base); - expect(getChainPublicClient).not.toHaveBeenCalledWith(mainnet); - }); - - it('should resolve to baseSepolia address', async () => { - const name = 'shrek.base.eth'; - const expectedAddress = '0x1234'; - mockGetEnsAddress.mockResolvedValue(expectedAddress); - const address = await getAddress({ name, chain: baseSepolia }); - expect(address).toBe(expectedAddress); - expect(getChainPublicClient).toHaveBeenCalledWith(baseSepolia); - expect(getChainPublicClient).not.toHaveBeenCalledWith(mainnet); }); it('should return null if address is not found', async () => { @@ -53,14 +30,14 @@ describe('getAddress', () => { const address = await getAddress({ name }); expect(address).toBeNull(); expect(mockGetEnsAddress).toHaveBeenCalledWith({ name }); - expect(getChainPublicClient).toHaveBeenCalledWith(mainnet); }); - it('should throw an error on unsupported chain', async () => { - await expect( - getAddress({ name: 'test.ens', chain: optimism }), - ).rejects.toBe( - 'ChainId not supported, name resolution is only supported on Ethereum and Base.', - ); + it('should resolve basename correctly', async () => { + const name = 'shrek.base.eth'; + const expectedAddress = '0x1234'; + mockGetEnsAddress.mockResolvedValue(expectedAddress); + const address = await getAddress({ name }); + expect(address).toBe(expectedAddress); + expect(mockGetEnsAddress).toHaveBeenCalledWith({ name }); }); }); diff --git a/packages/onchainkit/src/identity/utils/getAddress.ts b/packages/onchainkit/src/identity/utils/getAddress.ts index b30a0ecdac..0e2e09e4f9 100644 --- a/packages/onchainkit/src/identity/utils/getAddress.ts +++ b/packages/onchainkit/src/identity/utils/getAddress.ts @@ -1,35 +1,19 @@ import { getChainPublicClient } from '@/core/network/getChainPublicClient'; -import { isBase } from '@/core/utils/isBase'; -import { isEthereum } from '@/core/utils/isEthereum'; -import { RESOLVER_ADDRESSES_BY_CHAIN_ID } from '@/identity/constants'; import type { GetAddress, GetAddressReturnType } from '@/identity/types'; -import { isBasename } from '@/identity/utils/isBasename'; import { mainnet } from 'viem/chains'; +const mainnetClient = getChainPublicClient(mainnet); + /** * Get address from ENS name or Basename. */ export const getAddress = async ({ name, - chain = mainnet, }: GetAddress): Promise => { - const chainIsBase = isBase({ chainId: chain.id }); - const chainIsEthereum = isEthereum({ chainId: chain.id }); - const chainSupportsUniversalResolver = chainIsEthereum || chainIsBase; - - if (!chainSupportsUniversalResolver) { - return Promise.reject( - 'ChainId not supported, name resolution is only supported on Ethereum and Base.', - ); - } - - const client = getChainPublicClient(chain); // Gets address for ENS name. - const address = await client.getEnsAddress({ + const address = await mainnetClient.getEnsAddress({ name, - universalResolverAddress: isBasename(name) - ? RESOLVER_ADDRESSES_BY_CHAIN_ID[chain.id] - : undefined, }); + return address ?? null; }; diff --git a/packages/onchainkit/src/identity/utils/getAddresses.test.ts b/packages/onchainkit/src/identity/utils/getAddresses.test.ts index 8eb2bf6390..704d435614 100644 --- a/packages/onchainkit/src/identity/utils/getAddresses.test.ts +++ b/packages/onchainkit/src/identity/utils/getAddresses.test.ts @@ -1,9 +1,7 @@ import { publicClient } from '@/core/network/client'; -import { isBase } from '@/core/utils/isBase'; -import { isEthereum } from '@/core/utils/isEthereum'; import { isBasename } from '@/identity/utils/isBasename'; import type { Address } from 'viem'; -import { base, mainnet, optimism } from 'viem/chains'; +import { mainnet } from 'viem/chains'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import type { Mock } from 'vitest'; import { RESOLVER_ADDRESSES_BY_CHAIN_ID } from '../constants'; @@ -11,14 +9,6 @@ import { getAddresses } from './getAddresses'; vi.mock('@/core/network/client'); -vi.mock('@/core/utils/isBase', () => ({ - isBase: vi.fn(), -})); - -vi.mock('@/core/utils/isEthereum', () => ({ - isEthereum: vi.fn(), -})); - vi.mock('@/identity/utils/isBasename', () => ({ isBasename: vi.fn(), })); @@ -39,10 +29,6 @@ describe('getAddresses', () => { beforeEach(() => { vi.clearAllMocks(); - vi.mocked(isBase).mockImplementation(({ chainId }) => chainId === base.id); - vi.mocked(isEthereum).mockImplementation( - ({ chainId }) => chainId === mainnet.id, - ); vi.mocked(isBasename).mockImplementation( (name) => name.includes('.base.eth') || name.includes('.basetest.eth'), ); @@ -53,7 +39,7 @@ describe('getAddresses', () => { expect(addresses).toEqual([]); }); - it('fetches addresses for multiple ENS names on mainnet', async () => { + it('fetches addresses for multiple ENS names', async () => { mockGetEnsAddress.mockImplementation((params) => { if (params.name === testNames[0]) return Promise.resolve(testAddresses[0]); @@ -79,45 +65,6 @@ describe('getAddresses', () => { }); }); - it('fetches addresses for multiple names on Base chain', async () => { - mockGetEnsAddress.mockImplementation((params) => { - if (params.name === testNames[0]) - return Promise.resolve(testAddresses[0]); - if (params.name === testNames[1]) - return Promise.resolve(testAddresses[1]); - if (params.name === testNames[2]) - return Promise.resolve(testAddresses[2]); - return Promise.resolve(null); - }); - - const addresses = await getAddresses({ names: testNames, chain: base }); - - expect(addresses).toEqual(testAddresses); - expect(mockGetEnsAddress).toHaveBeenCalledTimes(3); - testNames.forEach((name, index) => { - const isBasenameName = isBasename(name); - expect(mockGetEnsAddress).toHaveBeenNthCalledWith(index + 1, { - name, - universalResolverAddress: isBasenameName - ? RESOLVER_ADDRESSES_BY_CHAIN_ID[base.id] - : undefined, - }); - }); - }); - - it('rejects for unsupported chains', async () => { - await expect( - getAddresses({ - names: testNames, - chain: optimism, - }), - ).rejects.toBe( - 'ChainId not supported, name resolution is only supported on Ethereum and Base.', - ); - - expect(mockGetEnsAddress).not.toHaveBeenCalled(); - }); - it('handles partial failures in address resolution', async () => { mockGetEnsAddress.mockImplementation((params) => { if (params.name === testNames[0]) diff --git a/packages/onchainkit/src/identity/utils/getAddresses.ts b/packages/onchainkit/src/identity/utils/getAddresses.ts index 2375d6770d..54fd12cbc2 100644 --- a/packages/onchainkit/src/identity/utils/getAddresses.ts +++ b/packages/onchainkit/src/identity/utils/getAddresses.ts @@ -1,34 +1,20 @@ import { getChainPublicClient } from '@/core/network/getChainPublicClient'; -import { isBase } from '@/core/utils/isBase'; -import { isEthereum } from '@/core/utils/isEthereum'; -import { RESOLVER_ADDRESSES_BY_CHAIN_ID } from '@/identity/constants'; import type { GetAddressReturnType, GetAddresses } from '@/identity/types'; -import { isBasename } from '@/identity/utils/isBasename'; import { mainnet } from 'viem/chains'; +const mainnetClient = getChainPublicClient(mainnet); + /** * An asynchronous function to fetch multiple Ethereum addresses from ENS names or Basenames * in a single batch request. */ export const getAddresses = async ({ names, - chain = mainnet, }: GetAddresses): Promise => { if (!names || names.length === 0) { return []; } - const chainIsBase = isBase({ chainId: chain.id }); - const chainIsEthereum = isEthereum({ chainId: chain.id }); - const chainSupportsUniversalResolver = chainIsEthereum || chainIsBase; - - if (!chainSupportsUniversalResolver) { - return Promise.reject( - 'ChainId not supported, name resolution is only supported on Ethereum and Base.', - ); - } - - const client = getChainPublicClient(chain); const results: GetAddressReturnType[] = Array(names.length).fill(null); try { @@ -42,12 +28,9 @@ export const getAddresses = async ({ } const addressPromises = validItems.map(({ name, index }) => - client + mainnetClient .getEnsAddress({ name, - universalResolverAddress: isBasename(name) - ? RESOLVER_ADDRESSES_BY_CHAIN_ID[chain.id] - : undefined, }) .then((address) => { return { index, address }; diff --git a/packages/onchainkit/src/identity/utils/getName.test.ts b/packages/onchainkit/src/identity/utils/getName.test.ts index dfc945c01c..930d44d32d 100644 --- a/packages/onchainkit/src/identity/utils/getName.test.ts +++ b/packages/onchainkit/src/identity/utils/getName.test.ts @@ -43,7 +43,6 @@ describe('getName', () => { expect(mockGetEnsName).toHaveBeenCalledWith({ address: walletAddress }); expect(mockGetAddress).toHaveBeenCalledWith({ name: expectedEnsName, - chain: mainnet, }); }); @@ -60,7 +59,6 @@ describe('getName', () => { expect(mockGetEnsName).toHaveBeenCalledWith({ address: walletAddress }); expect(mockGetAddress).toHaveBeenCalledWith({ name: ensName, - chain: mainnet, }); }); @@ -75,7 +73,6 @@ describe('getName', () => { expect(name).toBeNull(); expect(mockGetAddress).toHaveBeenCalledWith({ name: ensName, - chain: mainnet, }); }); @@ -91,7 +88,6 @@ describe('getName', () => { expect(mockGetEnsName).toHaveBeenCalledWith({ address: walletAddress }); expect(mockGetAddress).toHaveBeenCalledWith({ name: ensName, - chain: mainnet, }); }); @@ -107,7 +103,6 @@ describe('getName', () => { expect(mockReadContract).toHaveBeenCalled(); expect(mockGetAddress).toHaveBeenCalledWith({ name: expectedBaseName, - chain: base, }); expect(mockGetEnsName).not.toHaveBeenCalled(); diff --git a/packages/onchainkit/src/identity/utils/getName.ts b/packages/onchainkit/src/identity/utils/getName.ts index 67a8270d04..c49bb65469 100644 --- a/packages/onchainkit/src/identity/utils/getName.ts +++ b/packages/onchainkit/src/identity/utils/getName.ts @@ -44,7 +44,6 @@ export const getName = async ({ try { const resolvedAddress = await getAddress({ name: basename, - chain: base, }); if ( @@ -80,7 +79,6 @@ export const getName = async ({ try { const resolvedAddress = await getAddress({ name: ensName, - chain: mainnet, }); if ( diff --git a/packages/onchainkit/src/identity/utils/getNames.ts b/packages/onchainkit/src/identity/utils/getNames.ts index db0d61f9aa..a41805e76c 100644 --- a/packages/onchainkit/src/identity/utils/getNames.ts +++ b/packages/onchainkit/src/identity/utils/getNames.ts @@ -1,5 +1,5 @@ import type { Basename, GetNameReturnType, GetNames } from '@/identity/types'; -import { base, mainnet } from 'viem/chains'; +import { mainnet } from 'viem/chains'; import { getChainPublicClient } from '../../core/network/getChainPublicClient'; import { isBase } from '../../core/utils/isBase'; import { isEthereum } from '../../core/utils/isEthereum'; @@ -70,7 +70,6 @@ export const getNames = async ({ ); const resolvedAddresses = await getAddresses({ names: basenames, - chain: base, }); // Update results with validated basenames @@ -150,7 +149,6 @@ export const getNames = async ({ const ensNames = ensNamesWithIndices.map(({ ensName }) => ensName); const resolvedAddresses = await getAddresses({ names: ensNames, - chain: mainnet, }); // Update results with validated ENS names From 1cc007e347726237d54bbec72bf6cb6306c601b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 14:11:08 -0700 Subject: [PATCH 40/55] =?UTF-8?q?chore:=20version=20packages=20v0.38.10=20?= =?UTF-8?q?=F0=9F=8C=8A=20(#2330)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Alissa Crane --- .changeset/open-boxes-shine.md | 5 ----- .changeset/twenty-news-hide.md | 5 ----- packages/create-onchain/CHANGELOG.md | 6 ++++++ packages/create-onchain/package.json | 2 +- packages/onchainkit/CHANGELOG.md | 6 ++++++ packages/onchainkit/package.json | 2 +- 6 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 .changeset/open-boxes-shine.md delete mode 100644 .changeset/twenty-news-hide.md diff --git a/.changeset/open-boxes-shine.md b/.changeset/open-boxes-shine.md deleted file mode 100644 index 08a8c839ee..0000000000 --- a/.changeset/open-boxes-shine.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"create-onchain": patch ---- - -feat: Skip manifest generation when creating a new minikit app diff --git a/.changeset/twenty-news-hide.md b/.changeset/twenty-news-hide.md deleted file mode 100644 index 344f8636de..0000000000 --- a/.changeset/twenty-news-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@coinbase/onchainkit": patch ---- - -fix: Basename resolution diff --git a/packages/create-onchain/CHANGELOG.md b/packages/create-onchain/CHANGELOG.md index dc2229145c..8425300d83 100644 --- a/packages/create-onchain/CHANGELOG.md +++ b/packages/create-onchain/CHANGELOG.md @@ -1,5 +1,11 @@ # create-onchain +## 0.0.20 + +### Patch Changes + +- **chore**: Removed manifest prompt during create-onchain process. By @dgca #2326 + ## 0.0.19 ### Patch Changes diff --git a/packages/create-onchain/package.json b/packages/create-onchain/package.json index 6dfe1ba69e..0ff161ad9e 100644 --- a/packages/create-onchain/package.json +++ b/packages/create-onchain/package.json @@ -1,7 +1,7 @@ { "name": "create-onchain", "description": "Instantly create onchain applications with OnchainKit.", - "version": "0.0.19", + "version": "0.0.20", "license": "MIT", "publishConfig": { "access": "public" diff --git a/packages/onchainkit/CHANGELOG.md b/packages/onchainkit/CHANGELOG.md index e47f5e2bb1..379b6759ba 100644 --- a/packages/onchainkit/CHANGELOG.md +++ b/packages/onchainkit/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.38.10 + +### Patch Changes + +- **fix**: Fixed Basenames resolution. By @dgca #2329 + ## 0.38.9 ### Patch Changes diff --git a/packages/onchainkit/package.json b/packages/onchainkit/package.json index 668cd04f79..4b28f2f592 100644 --- a/packages/onchainkit/package.json +++ b/packages/onchainkit/package.json @@ -1,6 +1,6 @@ { "name": "@coinbase/onchainkit", - "version": "0.38.9", + "version": "0.38.10", "type": "module", "repository": "https://github.com/coinbase/onchainkit.git", "license": "MIT", From 421b03d35d95f8c41b88d339f28fb8fa5946cf5c Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Fri, 2 May 2025 11:56:41 -0600 Subject: [PATCH 41/55] fix: getSocials (#2333) --- .../src/identity/utils/getSocials.test.ts | 18 +----------------- .../src/identity/utils/getSocials.ts | 17 +---------------- 2 files changed, 2 insertions(+), 33 deletions(-) diff --git a/packages/onchainkit/src/identity/utils/getSocials.test.ts b/packages/onchainkit/src/identity/utils/getSocials.test.ts index 058f0114ea..dce7dcf902 100644 --- a/packages/onchainkit/src/identity/utils/getSocials.test.ts +++ b/packages/onchainkit/src/identity/utils/getSocials.test.ts @@ -2,7 +2,7 @@ import { isBase } from '@/core/utils/isBase'; import { isEthereum } from '@/core/utils/isEthereum'; import { http } from 'viem'; import { createPublicClient } from 'viem'; -import { base, mainnet, sepolia } from 'viem/chains'; +import { base, mainnet } from 'viem/chains'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { getChainPublicClient } from '../../core/network/getChainPublicClient'; import { getSocials } from './getSocials'; @@ -86,22 +86,6 @@ describe('getSocials', () => { expect(mockClient.getEnsText).toHaveBeenCalledTimes(4); }); - it('should throw an error for unsupported chains', async () => { - const ensName = 'test.eth'; - vi.mocked(isBase).mockReturnValue(false); - vi.mocked(isEthereum).mockReturnValue(false); - - const unsupportedChain = sepolia; - - await expect( - getSocials({ ensName, chain: unsupportedChain }), - ).rejects.toEqual( - 'ChainId not supported, socials resolution is only supported on Ethereum and Base.', - ); - - expect(mockClient.getEnsText).not.toHaveBeenCalled(); - }); - it('should normalize the ENS name', async () => { const ensName = 'Test.eth'; vi.mocked(isEthereum).mockReturnValue(true); diff --git a/packages/onchainkit/src/identity/utils/getSocials.ts b/packages/onchainkit/src/identity/utils/getSocials.ts index bdee109c1d..8df01aac5c 100644 --- a/packages/onchainkit/src/identity/utils/getSocials.ts +++ b/packages/onchainkit/src/identity/utils/getSocials.ts @@ -1,11 +1,8 @@ import { getChainPublicClient } from '@/core/network/getChainPublicClient'; -import { isBase } from '@/core/utils/isBase'; -import { isEthereum } from '@/core/utils/isEthereum'; import type { GetSocialsReturnType } from '@/identity/types'; import type { Chain } from 'viem'; import { mainnet } from 'viem/chains'; import { normalize } from 'viem/ens'; -import { RESOLVER_ADDRESSES_BY_CHAIN_ID } from '../constants'; export type GetSocials = { ensName: string; @@ -14,19 +11,8 @@ export type GetSocials = { export const getSocials = async ({ ensName, - chain = mainnet, }: GetSocials): Promise => { - const chainIsBase = isBase({ chainId: chain.id }); - const chainIsEthereum = isEthereum({ chainId: chain.id }); - const chainSupportsUniversalResolver = chainIsEthereum || chainIsBase; - - if (!chainSupportsUniversalResolver) { - return Promise.reject( - 'ChainId not supported, socials resolution is only supported on Ethereum and Base.', - ); - } - - const client = getChainPublicClient(chain); + const client = getChainPublicClient(mainnet); const normalizedName = normalize(ensName); const fetchTextRecord = async (key: string) => { @@ -34,7 +20,6 @@ export const getSocials = async ({ const result = await client.getEnsText({ name: normalizedName, key, - universalResolverAddress: RESOLVER_ADDRESSES_BY_CHAIN_ID[chain.id], }); return result || null; } catch (error) { From 8cc7a783cf28b94fa69800a070465db15de5acc2 Mon Sep 17 00:00:00 2001 From: GarmashAlex Date: Fri, 2 May 2025 22:43:21 +0300 Subject: [PATCH 42/55] docs: fix broken link (#2331) --- packages/onchainkit/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/onchainkit/CHANGELOG.md b/packages/onchainkit/CHANGELOG.md index 379b6759ba..fed9c3615f 100644 --- a/packages/onchainkit/CHANGELOG.md +++ b/packages/onchainkit/CHANGELOG.md @@ -204,7 +204,7 @@ To fully disable telemetry collection, set the `analytics` flag to `false` in your OnchainKit Provider: - Learn more at https://onchainkit.xyz/guides/telemetry + Learn more at https://docs.base.org/builderkits/onchainkit/guides/telemetry ## 0.36.11 From 293c336609cd064b4855a2ad8d1fb516e7e9e024 Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Tue, 6 May 2025 14:27:01 -0500 Subject: [PATCH 43/55] feat: Make sign up button optional (#2332) --- .../src/DefaultOnchainKitProviders.test.tsx | 167 ++++++++++++++++++ .../src/DefaultOnchainKitProviders.tsx | 47 ++--- .../src/OnchainKitProvider.test.tsx | 10 ++ .../onchainkit/src/OnchainKitProvider.tsx | 27 +-- packages/onchainkit/src/core/types.ts | 5 + packages/onchainkit/src/useOnchainKit.tsx | 8 +- .../wallet/components/WalletModal.test.tsx | 95 ++++++++++ .../src/wallet/components/WalletModal.tsx | 47 ++--- .../playground/components/AppProvider.tsx | 13 ++ .../playground/components/DemoOptions.tsx | 7 +- .../components/form/wallet-sign-up.tsx | 37 ++++ 11 files changed, 392 insertions(+), 71 deletions(-) create mode 100644 packages/playground/components/form/wallet-sign-up.tsx diff --git a/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx b/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx index b346cbf8d0..7caed98350 100644 --- a/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx +++ b/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx @@ -4,6 +4,10 @@ import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'; import { http, createConfig } from 'wagmi'; import { DefaultOnchainKitProviders } from './DefaultOnchainKitProviders'; import { useProviderDependencies } from './internal/hooks/useProviderDependencies'; +import { useOnchainKit } from './useOnchainKit'; + +// Mock the coinbase wallet connector +const mockCoinbaseWallet = vi.fn(); const queryClient = new QueryClient(); const wagmiConfig = createConfig({ @@ -46,12 +50,43 @@ vi.mock('./internal/hooks/useProviderDependencies', () => ({ })), })); +vi.mock('./useOnchainKit', () => ({ + useOnchainKit: vi.fn(() => ({ + apiKey: 'mock-api-key', + config: { + appearance: { + name: 'Mock App', + logo: 'https://example.com/logo.png', + }, + wallet: { + preference: 'all', + }, + }, + })), +})); + +// Mock wagmi/connectors +vi.mock('wagmi/connectors', () => { + return { + coinbaseWallet: (params: { + preference?: string; + appName?: string; + appLogoUrl?: string; + }) => { + mockCoinbaseWallet(params); + // Return a connector function that Wagmi expects + return () => ({ id: 'coinbaseWalletSDK' }); + }, + }; +}); + describe('DefaultOnchainKitProviders', () => { beforeEach(() => { (useProviderDependencies as Mock).mockReturnValue({ providedWagmiConfig: null, providedQueryClient: null, }); + vi.clearAllMocks(); }); it('should wrap children in default providers', () => { @@ -116,4 +151,136 @@ describe('DefaultOnchainKitProviders', () => { expect(screen.queryAllByTestId('wagmi-provider')).toHaveLength(0); expect(screen.queryAllByTestId('query-client-provider')).toHaveLength(0); }); + + it('should pass the wallet preference to the coinbaseWallet connector', () => { + // Mock useOnchainKit to return smartWalletOnly preference + (useOnchainKit as Mock).mockReturnValue({ + apiKey: 'mock-api-key', + config: { + appearance: { + name: 'Mock App', + logo: 'https://example.com/logo.png', + }, + wallet: { + preference: 'smartWalletOnly', + }, + }, + }); + + render( + +
Test Child
+
, + ); + + // Verify coinbaseWallet was called with the correct preference + expect(mockCoinbaseWallet).toHaveBeenCalledWith( + expect.objectContaining({ + preference: 'smartWalletOnly', + }), + ); + }); + + it('should pass the default preference "all" when no preference is specified', () => { + // Mock useOnchainKit to return config without preference + (useOnchainKit as Mock).mockReturnValue({ + apiKey: 'mock-api-key', + config: { + appearance: { + name: 'Mock App', + logo: 'https://example.com/logo.png', + }, + wallet: {}, + }, + }); + + render( + +
Test Child
+
, + ); + + // Verify coinbaseWallet was called with the default preference + expect(mockCoinbaseWallet).toHaveBeenCalledWith( + expect.objectContaining({ + preference: undefined, + }), + ); + }); + + it('should pass eoaOnly preference to the coinbaseWallet connector', () => { + // Mock useOnchainKit to return eoaOnly preference + (useOnchainKit as Mock).mockReturnValue({ + apiKey: 'mock-api-key', + config: { + appearance: { + name: 'Mock App', + logo: 'https://example.com/logo.png', + }, + wallet: { + preference: 'eoaOnly', + }, + }, + }); + + render( + +
Test Child
+
, + ); + + // Verify coinbaseWallet was called with eoaOnly preference + expect(mockCoinbaseWallet).toHaveBeenCalledWith( + expect.objectContaining({ + preference: 'eoaOnly', + }), + ); + }); + + it('should handle undefined appearance values', () => { + // Mock useOnchainKit to return undefined appearance values + (useOnchainKit as Mock).mockReturnValue({ + apiKey: null, + config: { + wallet: { + preference: 'all', + }, + }, + }); + + render( + +
Test Child
+
, + ); + + // Verify coinbaseWallet was called with undefined app name and logo + expect(mockCoinbaseWallet).toHaveBeenCalledWith( + expect.objectContaining({ + appName: undefined, + appLogoUrl: undefined, + }), + ); + }); + + it('should handle missing config entirely', () => { + // Mock useOnchainKit to return no config + (useOnchainKit as Mock).mockReturnValue({ + apiKey: 'test-api-key', + }); + + render( + +
Test Child
+
, + ); + + expect(screen.getByText('Test Child')).toBeInTheDocument(); + expect(mockCoinbaseWallet).toHaveBeenCalledWith( + expect.objectContaining({ + appName: undefined, + appLogoUrl: undefined, + }), + ); + }); }); diff --git a/packages/onchainkit/src/DefaultOnchainKitProviders.tsx b/packages/onchainkit/src/DefaultOnchainKitProviders.tsx index 8bbd9e402c..bc8ce0bc91 100644 --- a/packages/onchainkit/src/DefaultOnchainKitProviders.tsx +++ b/packages/onchainkit/src/DefaultOnchainKitProviders.tsx @@ -3,34 +3,16 @@ import { type PropsWithChildren, useMemo, useState } from 'react'; import { Config, WagmiProvider } from 'wagmi'; import { coinbaseWallet } from 'wagmi/connectors'; import { createWagmiConfig } from './core/createWagmiConfig'; -import type { CreateWagmiConfigParams } from './core/types'; import { useProviderDependencies } from './internal/hooks/useProviderDependencies'; +import { useOnchainKit } from './useOnchainKit'; -export function DefaultOnchainKitProviders({ - apiKey, - appName, - appLogoUrl, - connectors = [ - coinbaseWallet({ - appName, - appLogoUrl, - preference: 'all', - }), - ], - children, -}: PropsWithChildren) { +export function DefaultOnchainKitProviders({ children }: PropsWithChildren) { // Check the React context for WagmiProvider and QueryClientProvider const { providedWagmiConfig, providedQueryClient } = useProviderDependencies(); return ( - + {children} @@ -39,23 +21,30 @@ export function DefaultOnchainKitProviders({ } function WagmiProviderWithDefault({ - apiKey, - appName, - appLogoUrl, - connectors, children, providedWagmiConfig, -}: PropsWithChildren & { +}: PropsWithChildren<{ providedWagmiConfig: Config | null; -}) { +}>) { + const onchainKitConfig = useOnchainKit(); + const [config] = useState(() => { if (providedWagmiConfig) return providedWagmiConfig; + const appName = onchainKitConfig.config?.appearance?.name ?? undefined; + const appLogoUrl = onchainKitConfig.config?.appearance?.logo ?? undefined; + return createWagmiConfig({ - apiKey, + apiKey: onchainKitConfig.apiKey ?? undefined, appName, appLogoUrl, - connectors, + connectors: [ + coinbaseWallet({ + appName, + appLogoUrl, + preference: onchainKitConfig.config?.wallet?.preference, + }), + ], }); }); diff --git a/packages/onchainkit/src/OnchainKitProvider.test.tsx b/packages/onchainkit/src/OnchainKitProvider.test.tsx index c98fa761ec..248b2b322d 100644 --- a/packages/onchainkit/src/OnchainKitProvider.test.tsx +++ b/packages/onchainkit/src/OnchainKitProvider.test.tsx @@ -191,6 +191,8 @@ describe('OnchainKitProvider', () => { paymaster: paymasterUrl, wallet: { display: 'classic', + preference: 'all', + signUpEnabled: true, termsUrl: 'https://base.org/terms-of-service', privacyUrl: 'https://base.org/privacy-policy', supportedWallets: { @@ -236,6 +238,8 @@ describe('OnchainKitProvider', () => { paymaster: null, wallet: { display: 'classic', + preference: 'all', + signUpEnabled: true, termsUrl: 'https://base.org/terms-of-service', privacyUrl: 'https://base.org/privacy-policy', supportedWallets: { @@ -320,6 +324,8 @@ describe('OnchainKitProvider', () => { paymaster: 'https://example.com', wallet: { display: 'classic', + preference: 'all', + signUpEnabled: true, termsUrl: 'https://base.org/terms-of-service', privacyUrl: 'https://base.org/privacy-policy', supportedWallets: { @@ -459,6 +465,8 @@ describe('OnchainKitProvider', () => { const customConfig: AppConfig = { wallet: { display: 'modal', + preference: 'eoaOnly', + signUpEnabled: false, termsUrl: 'https://example.com/terms', privacyUrl: 'https://example.com/privacy', supportedWallets: { @@ -489,6 +497,8 @@ describe('OnchainKitProvider', () => { config: expect.objectContaining({ wallet: { display: 'modal', + preference: 'eoaOnly', + signUpEnabled: false, termsUrl: 'https://example.com/terms', privacyUrl: 'https://example.com/privacy', supportedWallets: { diff --git a/packages/onchainkit/src/OnchainKitProvider.tsx b/packages/onchainkit/src/OnchainKitProvider.tsx index fc42fa83c7..936d027ed5 100644 --- a/packages/onchainkit/src/OnchainKitProvider.tsx +++ b/packages/onchainkit/src/OnchainKitProvider.tsx @@ -1,21 +1,14 @@ 'use client'; - -import { - ONCHAIN_KIT_CONFIG, - setOnchainKitConfig, -} from '@/core/OnchainKitConfig'; -import { createContext, useMemo } from 'react'; +import { setOnchainKitConfig } from '@/core/OnchainKitConfig'; +import { useMemo } from 'react'; import { DefaultOnchainKitProviders } from './DefaultOnchainKitProviders'; import OnchainKitProviderBoundary from './OnchainKitProviderBoundary'; import { DEFAULT_PRIVACY_URL, DEFAULT_TERMS_URL } from './core/constants'; -import type { OnchainKitContextType } from './core/types'; import { COINBASE_VERIFIED_ACCOUNT_SCHEMA_ID } from './identity/constants'; import { checkHashLength } from './internal/utils/checkHashLength'; import type { OnchainKitProviderReact } from './types'; import { generateUUIDWithInsecureFallback } from './utils/crypto'; - -export const OnchainKitContext = - createContext(ONCHAIN_KIT_CONFIG); +import { OnchainKitContext } from './useOnchainKit'; /** * Provides the OnchainKit React Context to the app. @@ -60,6 +53,8 @@ export function OnchainKitProvider({ paymaster: config?.paymaster || defaultPaymasterUrl, wallet: { display: config?.wallet?.display ?? 'classic', + preference: config?.wallet?.preference ?? 'all', + signUpEnabled: config?.wallet?.signUpEnabled ?? true, termsUrl: config?.wallet?.termsUrl || DEFAULT_TERMS_URL, privacyUrl: config?.wallet?.privacyUrl || DEFAULT_PRIVACY_URL, supportedWallets: { @@ -89,14 +84,10 @@ export function OnchainKitProvider({ ]); return ( - - + + {children} - - + + ); } diff --git a/packages/onchainkit/src/core/types.ts b/packages/onchainkit/src/core/types.ts index ad253b6e05..d595957d39 100644 --- a/packages/onchainkit/src/core/types.ts +++ b/packages/onchainkit/src/core/types.ts @@ -1,6 +1,7 @@ import type { EASSchemaUid } from '@/identity/types'; import type { Address, Chain } from 'viem'; import type { CreateConnectorFn } from 'wagmi'; +import { type CoinbaseWalletParameters } from 'wagmi/connectors'; /** * Note: exported as public Type @@ -25,6 +26,10 @@ export type AppConfig = { wallet?: { /** Determines the display style of the wallet modal */ display?: ConnectWalletDisplay | null; + /** Preference for the type of wallet to display for the Coinbase connector. Defaults to 'all' */ + preference?: Extract['preference'], string>; + /** Enable/disable sign up in the wallet modal. Defaults to true*/ + signUpEnabled?: boolean; /** URL to the terms of service for the wallet modal */ termsUrl?: string | null; /** URL to the privacy policy for the wallet modal */ diff --git a/packages/onchainkit/src/useOnchainKit.tsx b/packages/onchainkit/src/useOnchainKit.tsx index b01cbf5c0d..38bb551751 100644 --- a/packages/onchainkit/src/useOnchainKit.tsx +++ b/packages/onchainkit/src/useOnchainKit.tsx @@ -1,5 +1,9 @@ -import { useContext } from 'react'; -import { OnchainKitContext } from './OnchainKitProvider'; +import { createContext, useContext } from 'react'; +import { ONCHAIN_KIT_CONFIG } from '@/core/OnchainKitConfig'; +import { OnchainKitContextType } from './core/types'; + +export const OnchainKitContext = + createContext(ONCHAIN_KIT_CONFIG); export function useOnchainKit() { return useContext(OnchainKitContext); diff --git a/packages/onchainkit/src/wallet/components/WalletModal.test.tsx b/packages/onchainkit/src/wallet/components/WalletModal.test.tsx index 756f72eace..4c0f64e407 100644 --- a/packages/onchainkit/src/wallet/components/WalletModal.test.tsx +++ b/packages/onchainkit/src/wallet/components/WalletModal.test.tsx @@ -1143,4 +1143,99 @@ describe('WalletModal', () => { window.ethereum = originalEthereum; window.open = originalWindowOpen; }); + + it('does not show Sign Up button when signUpEnabled is set to false', () => { + (useOnchainKit as Mock).mockReturnValue({ + config: { + appearance: {}, + wallet: { + signUpEnabled: false, + supportedWallets: { rabby: false }, + }, + }, + }); + + render(); + + expect(screen.queryByText('Sign up')).not.toBeInTheDocument(); + expect(screen.queryByText('Connect your wallet')).toBeInTheDocument(); + }); + + it('shows Sign Up button when signUpEnabled is true', () => { + (useOnchainKit as Mock).mockReturnValue({ + config: { + appearance: {}, + wallet: { + signUpEnabled: true, + supportedWallets: { rabby: false }, + }, + }, + }); + + render(); + + expect(screen.getByText('Sign up')).toBeInTheDocument(); + }); + + it('shows Sign Up button by default when signUpEnabled is not specified', () => { + (useOnchainKit as Mock).mockReturnValue({ + config: { + appearance: {}, + wallet: { + supportedWallets: { rabby: false }, + }, + }, + }); + + render(); + + expect(screen.getByText('Sign up')).toBeInTheDocument(); + }); + + it('changes layout when signUpEnabled is false', () => { + (useOnchainKit as Mock).mockReturnValue({ + config: { + appearance: {}, + wallet: { + signUpEnabled: false, + supportedWallets: { rabby: false }, + }, + }, + }); + + render(); + + // "Connect your wallet" should be present + const connectText = screen.getByText('Connect your wallet'); + expect(connectText).toBeInTheDocument(); + + // When signUpEnabled is false, there should be no divider line + const dialog = screen.getByTestId('ockModalOverlay'); + const dividers = dialog.querySelectorAll('.border-\\[0\\.5px\\]'); + expect(dividers.length).toBe(0); + }); + + it('includes divider line when signUpEnabled is true', () => { + (useOnchainKit as Mock).mockReturnValue({ + config: { + appearance: {}, + wallet: { + signUpEnabled: true, + supportedWallets: { rabby: false }, + }, + }, + }); + + render(); + + // "Connect your wallet" should be present with divider + expect( + screen.getByText('or continue with an existing wallet'), + ).toBeInTheDocument(); + + // When signUpEnabled is true, there should be a divider line + const dialog = screen.getByTestId('ockModalOverlay'); + const dividers = dialog.querySelectorAll('.border-\\[0\\.5px\\]'); + expect(dividers.length).toBe(1); + }); }); diff --git a/packages/onchainkit/src/wallet/components/WalletModal.tsx b/packages/onchainkit/src/wallet/components/WalletModal.tsx index 0b46841c19..5bac16b524 100644 --- a/packages/onchainkit/src/wallet/components/WalletModal.tsx +++ b/packages/onchainkit/src/wallet/components/WalletModal.tsx @@ -50,6 +50,7 @@ export function WalletModal({ trust: false, frame: false, }; + const isSignUpEnabled = config?.wallet?.signUpEnabled ?? true; const handleCoinbaseWalletConnection = useCallback(() => { try { @@ -280,27 +281,31 @@ export function WalletModal({ )}
- + {isSignUpEnabled && ( + + )}
-
-
-
+ {isSignUpEnabled && ( +
+
+
+ )}
- or continue with an existing wallet + {isSignUpEnabled + ? 'or continue with an existing wallet' + : 'Connect your wallet'}
diff --git a/packages/playground/components/AppProvider.tsx b/packages/playground/components/AppProvider.tsx index d953a8d83c..cc55f0f86e 100644 --- a/packages/playground/components/AppProvider.tsx +++ b/packages/playground/components/AppProvider.tsx @@ -41,6 +41,8 @@ type State = { isSponsored?: boolean; vaultAddress?: Address; setVaultAddress: (vaultAddress: Address) => void; + isSignUpEnabled: boolean; + setIsSignUpEnabled: (isSignUpEnabled: boolean) => void; }; export const defaultState: State = { @@ -53,6 +55,8 @@ export const defaultState: State = { setNFTToken: () => {}, setIsSponsored: () => {}, setVaultAddress: () => {}, + isSignUpEnabled: true, + setIsSignUpEnabled: () => {}, }; export const AppContext = createContext(defaultState); @@ -125,6 +129,12 @@ export const AppProvider = ({ children }: { children: React.ReactNode }) => { defaultValue: '0x7BfA7C4f149E7415b73bdeDfe609237e29CBF34A', }); + const [isSignUpEnabled, setIsSignUpEnabled] = useStateWithStorage({ + key: 'isSignUpEnabled', + defaultValue: true, + parser: (v) => v === 'true', + }); + // Load initial values from localStorage useEffect(() => { const storedPaymasters = localStorage.getItem('paymasters'); @@ -170,6 +180,8 @@ export const AppProvider = ({ children }: { children: React.ReactNode }) => { isSponsored, vaultAddress, setVaultAddress, + isSignUpEnabled, + setIsSignUpEnabled, }} > { paymaster: paymasters?.[chainId || 8453]?.url, wallet: { display: 'modal', + signUpEnabled: isSignUpEnabled, termsUrl: 'https://www.coinbase.com/legal/cookie', privacyUrl: 'https://www.coinbase.com/legal/privacy', supportedWallets: { diff --git a/packages/playground/components/DemoOptions.tsx b/packages/playground/components/DemoOptions.tsx index 87c65e112f..9b7cb78327 100644 --- a/packages/playground/components/DemoOptions.tsx +++ b/packages/playground/components/DemoOptions.tsx @@ -11,7 +11,7 @@ import { NFTOptions } from './form/nft-options'; import { SwapConfig } from './form/swap-config'; import { TransactionOptions } from './form/transaction-options'; import { WalletType } from './form/wallet-type'; - +import { WalletSignUp } from './form/wallet-sign-up'; const COMMON_OPTIONS = [ ActiveComponent, ComponentMode, @@ -20,7 +20,7 @@ const COMMON_OPTIONS = [ ]; const COMPONENT_CONFIG: Partial< - Record React.JSX.Element)[]> + Record React.JSX.Element>> > = { [OnchainKitComponent.Buy]: [Chain, PaymasterUrl, IsSponsored, SwapConfig], [OnchainKitComponent.Checkout]: [ @@ -64,6 +64,9 @@ const COMPONENT_CONFIG: Partial< ], [OnchainKitComponent.Earn]: [EarnOptions], [OnchainKitComponent.Signature]: [Chain], + [OnchainKitComponent.Wallet]: [WalletSignUp], + [OnchainKitComponent.WalletDefault]: [WalletSignUp], + [OnchainKitComponent.WalletAdvancedDefault]: [WalletSignUp], }; export default function DemoOptions({ diff --git a/packages/playground/components/form/wallet-sign-up.tsx b/packages/playground/components/form/wallet-sign-up.tsx new file mode 100644 index 0000000000..085bad345b --- /dev/null +++ b/packages/playground/components/form/wallet-sign-up.tsx @@ -0,0 +1,37 @@ +import { Label } from '@/components/ui/label'; +import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; +import { useContext } from 'react'; +import { AppContext } from '@/components/AppProvider'; + +export function WalletSignUp() { + const { isSignUpEnabled, setIsSignUpEnabled } = useContext(AppContext); + + return ( +
+ + setIsSignUpEnabled(value === 'enabled')} + > +
+ + +
+
+
+ ); +} From 436729daa52ed907b28bcd586546602d254e8945 Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Tue, 6 May 2025 15:53:47 -0500 Subject: [PATCH 44/55] chore: Release changesets (#2342) --- .changeset/little-meals-lay.md | 5 +++++ .changeset/plain-planes-tickle.md | 5 +++++ .changeset/pretty-clowns-pay.md | 5 +++++ .changeset/rude-friends-bathe.md | 5 +++++ 4 files changed, 20 insertions(+) create mode 100644 .changeset/little-meals-lay.md create mode 100644 .changeset/plain-planes-tickle.md create mode 100644 .changeset/pretty-clowns-pay.md create mode 100644 .changeset/rude-friends-bathe.md diff --git a/.changeset/little-meals-lay.md b/.changeset/little-meals-lay.md new file mode 100644 index 0000000000..30a7db2e2c --- /dev/null +++ b/.changeset/little-meals-lay.md @@ -0,0 +1,5 @@ +--- +"@coinbase/onchainkit": patch +--- + +feat: Make "Sign Up" button optional in ``. By @dgca #2332 diff --git a/.changeset/plain-planes-tickle.md b/.changeset/plain-planes-tickle.md new file mode 100644 index 0000000000..e3cce2c91f --- /dev/null +++ b/.changeset/plain-planes-tickle.md @@ -0,0 +1,5 @@ +--- +"@coinbase/onchainkit": patch +--- + +fix: Use mainnet to resolve ENS social media accounts. By @dgca #2333 diff --git a/.changeset/pretty-clowns-pay.md b/.changeset/pretty-clowns-pay.md new file mode 100644 index 0000000000..6762fe4f1e --- /dev/null +++ b/.changeset/pretty-clowns-pay.md @@ -0,0 +1,5 @@ +--- +"@coinbase/onchainkit": patch +--- + +feat: Configure Coinbase wallet preference via ``. By @dgca #2332 diff --git a/.changeset/rude-friends-bathe.md b/.changeset/rude-friends-bathe.md new file mode 100644 index 0000000000..3503b6da71 --- /dev/null +++ b/.changeset/rude-friends-bathe.md @@ -0,0 +1,5 @@ +--- +"@coinbase/onchainkit": patch +--- + +fix: Broken link in CHANGELOG. By @GarmashAlex #2331 From 11beba009f3ebe659b43e484fec9ae84b23bf439 Mon Sep 17 00:00:00 2001 From: xtbase Date: Tue, 6 May 2025 14:44:34 -0700 Subject: [PATCH 45/55] Chore: workflow improvement for vscode/cursor users (#2334) --- packages/onchainkit/.vscode/extensions.json | 7 +++++++ packages/onchainkit/.vscode/settings.json | 5 +++++ 2 files changed, 12 insertions(+) create mode 100644 packages/onchainkit/.vscode/extensions.json create mode 100644 packages/onchainkit/.vscode/settings.json diff --git a/packages/onchainkit/.vscode/extensions.json b/packages/onchainkit/.vscode/extensions.json new file mode 100644 index 0000000000..9547c5d9b5 --- /dev/null +++ b/packages/onchainkit/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "bradlc.vscode-tailwindcss" + ] +} \ No newline at end of file diff --git a/packages/onchainkit/.vscode/settings.json b/packages/onchainkit/.vscode/settings.json new file mode 100644 index 0000000000..150fd8a518 --- /dev/null +++ b/packages/onchainkit/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "*.css": "tailwindcss" + } +} \ No newline at end of file From 181788449190df13b9bd381166e75d81a51e6a1a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 11:09:54 -0500 Subject: [PATCH 46/55] =?UTF-8?q?chore:=20version=20packages=20?= =?UTF-8?q?=F0=9F=9A=80=20(#2343)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Dan Cortes <3639170+dgca@users.noreply.github.com> --- .changeset/little-meals-lay.md | 5 ----- .changeset/plain-planes-tickle.md | 5 ----- .changeset/pretty-clowns-pay.md | 5 ----- .changeset/rude-friends-bathe.md | 5 ----- packages/onchainkit/CHANGELOG.md | 9 +++++++++ packages/onchainkit/package.json | 2 +- 6 files changed, 10 insertions(+), 21 deletions(-) delete mode 100644 .changeset/little-meals-lay.md delete mode 100644 .changeset/plain-planes-tickle.md delete mode 100644 .changeset/pretty-clowns-pay.md delete mode 100644 .changeset/rude-friends-bathe.md diff --git a/.changeset/little-meals-lay.md b/.changeset/little-meals-lay.md deleted file mode 100644 index 30a7db2e2c..0000000000 --- a/.changeset/little-meals-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@coinbase/onchainkit": patch ---- - -feat: Make "Sign Up" button optional in ``. By @dgca #2332 diff --git a/.changeset/plain-planes-tickle.md b/.changeset/plain-planes-tickle.md deleted file mode 100644 index e3cce2c91f..0000000000 --- a/.changeset/plain-planes-tickle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@coinbase/onchainkit": patch ---- - -fix: Use mainnet to resolve ENS social media accounts. By @dgca #2333 diff --git a/.changeset/pretty-clowns-pay.md b/.changeset/pretty-clowns-pay.md deleted file mode 100644 index 6762fe4f1e..0000000000 --- a/.changeset/pretty-clowns-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@coinbase/onchainkit": patch ---- - -feat: Configure Coinbase wallet preference via ``. By @dgca #2332 diff --git a/.changeset/rude-friends-bathe.md b/.changeset/rude-friends-bathe.md deleted file mode 100644 index 3503b6da71..0000000000 --- a/.changeset/rude-friends-bathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@coinbase/onchainkit": patch ---- - -fix: Broken link in CHANGELOG. By @GarmashAlex #2331 diff --git a/packages/onchainkit/CHANGELOG.md b/packages/onchainkit/CHANGELOG.md index fed9c3615f..7b72fdc3d3 100644 --- a/packages/onchainkit/CHANGELOG.md +++ b/packages/onchainkit/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.38.11 + +### Patch Changes + +- **feat**: Make "Sign Up" button optional in ``. By @dgca #2332 +- **fix**: Use mainnet to resolve ENS social media accounts. By @dgca #2333 +- **feat**: Configure Coinbase wallet preference via ``. By @dgca #2332 +- **fix**: Broken link in CHANGELOG. By @GarmashAlex #2331 + ## 0.38.10 ### Patch Changes diff --git a/packages/onchainkit/package.json b/packages/onchainkit/package.json index 4b28f2f592..8cdbe28c82 100644 --- a/packages/onchainkit/package.json +++ b/packages/onchainkit/package.json @@ -1,6 +1,6 @@ { "name": "@coinbase/onchainkit", - "version": "0.38.10", + "version": "0.38.11", "type": "module", "repository": "https://github.com/coinbase/onchainkit.git", "license": "MIT", From 0cf7de712b6663f30ad219730d63a6e9dc622682 Mon Sep 17 00:00:00 2001 From: Alissa Crane Date: Wed, 7 May 2025 09:34:04 -0700 Subject: [PATCH 47/55] chore: enable paymaster for wallet advanced Send (#2335) --- .../src/wallet/components/Wallet.tsx | 3 +- .../src/wallet/components/WalletIsland.tsx | 8 ++- .../src/wallet/components/WalletProvider.tsx | 6 +- .../components/SendButton.test.tsx | 70 +------------------ .../components/SendButton.tsx | 47 ++----------- packages/onchainkit/src/wallet/types.ts | 4 ++ .../playground/components/DemoOptions.tsx | 1 + .../components/demo/WalletIsland.tsx | 5 +- 8 files changed, 30 insertions(+), 114 deletions(-) diff --git a/packages/onchainkit/src/wallet/components/Wallet.tsx b/packages/onchainkit/src/wallet/components/Wallet.tsx index 158ca60e06..c5226b5f63 100644 --- a/packages/onchainkit/src/wallet/components/Wallet.tsx +++ b/packages/onchainkit/src/wallet/components/Wallet.tsx @@ -32,6 +32,7 @@ export function Wallet({ className, draggable, draggableStartingPosition, + isSponsored, }: WalletReact) { const componentTheme = useTheme(); const isMounted = useIsMounted(); @@ -42,7 +43,7 @@ export function Wallet({ } return ( - + + {portfolioSvg}
} diff --git a/packages/onchainkit/src/wallet/components/WalletProvider.tsx b/packages/onchainkit/src/wallet/components/WalletProvider.tsx index 257fb8a581..0f18c517c7 100644 --- a/packages/onchainkit/src/wallet/components/WalletProvider.tsx +++ b/packages/onchainkit/src/wallet/components/WalletProvider.tsx @@ -23,9 +23,11 @@ const WalletContext = createContext(emptyContext); export type WalletProviderReact = { children: ReactNode; + /** Whether to sponsor transactions for Send feature of advanced wallet implementation */ + isSponsored?: boolean; }; -export function WalletProvider({ children }: WalletProviderReact) { +export function WalletProvider({ children, isSponsored }: WalletProviderReact) { const { chain } = useOnchainKit(); const [isConnectModalOpen, setIsConnectModalOpen] = useState(false); const [isSubComponentOpen, setIsSubComponentOpen] = useState(false); @@ -81,6 +83,7 @@ export function WalletProvider({ children }: WalletProviderReact) { isActiveFeatureClosing, setIsActiveFeatureClosing, animations, + isSponsored, }; }, [ address, @@ -95,6 +98,7 @@ export function WalletProvider({ children }: WalletProviderReact) { activeFeature, isActiveFeatureClosing, animations, + isSponsored, ]); return ( diff --git a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendButton.test.tsx b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendButton.test.tsx index dff0394e68..0adb64a8af 100644 --- a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendButton.test.tsx +++ b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendButton.test.tsx @@ -135,6 +135,7 @@ describe('SendButton', () => { mockUseWalletContext.mockReturnValue({ ...mockWalletContext, ...mockWalletAdvancedContext, + isSponsored: false, }); mockUseSendContext.mockReturnValue(mockSendContext); mockUseTransactionContext.mockReturnValue(mockTransactionContext); @@ -164,39 +165,6 @@ describe('SendButton', () => { ).toBeInTheDocument(); }); - it('passes custom label to TransactionButton', () => { - render(); - - expect(TransactionButton).toHaveBeenCalledWith( - expect.objectContaining({ - text: 'Custom Send', - }), - {}, - ); - }); - - it('passes isSponsored prop to Transaction', () => { - render(); - - expect(Transaction).toHaveBeenCalledWith( - expect.objectContaining({ - isSponsored: true, - }), - {}, - ); - }); - - it('passes className to TransactionButton', () => { - render(); - - expect(TransactionButton).toHaveBeenCalledWith( - expect.objectContaining({ - className: 'custom-button-class', - }), - {}, - ); - }); - it('disables button when input amount is invalid', () => { mockUseSendContext.mockReturnValue({ ...mockSendContext, @@ -213,17 +181,6 @@ describe('SendButton', () => { ); }); - it('disables button when disabled prop is true', () => { - render(); - - expect(TransactionButton).toHaveBeenCalledWith( - expect.objectContaining({ - disabled: true, - }), - {}, - ); - }); - it('uses default chain when wallet chain is null', () => { mockUseWalletContext.mockReturnValue({ ...mockWalletContext, @@ -347,29 +304,6 @@ describe('SendButton', () => { expect(mockSendContext.updateLifecycleStatus).not.toHaveBeenCalled(); }); - it('passes custom overrides to TransactionButton', () => { - const pendingOverride = { text: 'Sending...' }; - const successOverride = { text: 'Sent!' }; - const errorOverride = { text: 'Failed!' }; - - render( - , - ); - - expect(TransactionButton).toHaveBeenCalledWith( - expect.objectContaining({ - pendingOverride, - successOverride, - errorOverride, - }), - {}, - ); - }); - it('handles null wallet address correctly', () => { mockUseWalletContext.mockReturnValue({ ...mockWalletContext, @@ -404,7 +338,7 @@ describe('SendButton', () => { setActiveFeature, }); - render(); + render(); const { onComplete } = mockDefaultSendTxSuccessHandler.mock.calls[0][0]; diff --git a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendButton.tsx b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendButton.tsx index 6ec2f06a30..3216242700 100644 --- a/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendButton.tsx +++ b/packages/onchainkit/src/wallet/components/wallet-advanced-send/components/SendButton.tsx @@ -8,10 +8,7 @@ import { useTransactionContext } from '@/transaction/components/TransactionProvi import { TransactionStatus } from '@/transaction/components/TransactionStatus'; import { TransactionStatusAction } from '@/transaction/components/TransactionStatusAction'; import { TransactionStatusLabel } from '@/transaction/components/TransactionStatusLabel'; -import type { - LifecycleStatus, - TransactionButtonReact, -} from '@/transaction/types'; +import type { LifecycleStatus } from '@/transaction/types'; import { useCallback } from 'react'; import { parseUnits } from 'viem'; import { type Chain, base } from 'viem/chains'; @@ -21,25 +18,8 @@ import { defaultSendTxSuccessHandler } from '../utils/defaultSendTxSuccessHandle import { getSendCalldata } from '../utils/getSendCalldata'; import { useSendContext } from './SendProvider'; -type SendButtonProps = { - label?: string; - isSponsored?: boolean; - className?: string; -} & Pick< - TransactionButtonReact, - 'disabled' | 'pendingOverride' | 'successOverride' | 'errorOverride' ->; - -export function SendButton({ - label, - isSponsored = false, - className, - disabled, - pendingOverride, - successOverride, - errorOverride, -}: SendButtonProps) { - const { chain: senderChain } = useWalletContext(); +export function SendButton() { + const { chain: senderChain, isSponsored } = useWalletContext(); const { recipientState, cryptoAmount: inputAmount, @@ -54,7 +34,6 @@ export function SendButton({ }); const disableSendButton = - disabled || Boolean(error) || !validateAmountInput({ inputAmount: inputAmount ?? '', @@ -62,8 +41,7 @@ export function SendButton({ selectedToken: selectedToken ?? undefined, }); - const buttonLabel = - label ?? getDefaultSendButtonLabel(inputAmount, selectedToken); + const buttonLabel = getDefaultSendButtonLabel(inputAmount, selectedToken); const handleStatus = useCallback( (status: LifecycleStatus) => { @@ -96,11 +74,7 @@ export function SendButton({ @@ -119,18 +93,10 @@ function SendTransactionButton({ label, senderChain, disabled, - pendingOverride, - successOverride, - errorOverride, - className, }: { label: string; senderChain?: Chain | null; disabled?: boolean; - pendingOverride?: TransactionButtonReact['pendingOverride']; - successOverride?: TransactionButtonReact['successOverride']; - errorOverride?: TransactionButtonReact['errorOverride']; - className?: string; }) { const { address, setActiveFeature } = useWalletContext(); const { transactionHash, transactionId } = useTransactionContext(); @@ -151,11 +117,8 @@ function SendTransactionButton({ return ( ); diff --git a/packages/onchainkit/src/wallet/types.ts b/packages/onchainkit/src/wallet/types.ts index 5861761c74..36f2eccc61 100644 --- a/packages/onchainkit/src/wallet/types.ts +++ b/packages/onchainkit/src/wallet/types.ts @@ -112,6 +112,8 @@ export type WalletContextType = { container: string; content: string; }; + /** Whether to sponsor transactions for Send feature of advanced wallet implementation */ + isSponsored?: boolean; }; /** @@ -119,6 +121,8 @@ export type WalletContextType = { */ export type WalletReact = { children?: React.ReactNode; + /** Whether to sponsor transactions for Send feature of advanced wallet implementation */ + isSponsored?: boolean; className?: string; } & ( | { draggable?: true; draggableStartingPosition?: { x: number; y: number } } diff --git a/packages/playground/components/DemoOptions.tsx b/packages/playground/components/DemoOptions.tsx index 9b7cb78327..67bba17f67 100644 --- a/packages/playground/components/DemoOptions.tsx +++ b/packages/playground/components/DemoOptions.tsx @@ -23,6 +23,7 @@ const COMPONENT_CONFIG: Partial< Record React.JSX.Element>> > = { [OnchainKitComponent.Buy]: [Chain, PaymasterUrl, IsSponsored, SwapConfig], + [OnchainKitComponent.WalletIsland]: [PaymasterUrl, IsSponsored], [OnchainKitComponent.Checkout]: [ Chain, PaymasterUrl, diff --git a/packages/playground/components/demo/WalletIsland.tsx b/packages/playground/components/demo/WalletIsland.tsx index 237c754ce5..20d63bdc66 100644 --- a/packages/playground/components/demo/WalletIsland.tsx +++ b/packages/playground/components/demo/WalletIsland.tsx @@ -1,5 +1,8 @@ import { WalletIsland } from '@coinbase/onchainkit/wallet'; +import { AppContext } from '../AppProvider'; +import { useContext } from 'react'; export default function WalletIslandDemo() { - return ; + const { isSponsored } = useContext(AppContext); + return ; } From 0b433fe8fb8bb2379427b216d39020743df3b5ab Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Wed, 7 May 2025 14:17:48 -0500 Subject: [PATCH 48/55] fix: MiniKit frames connector (#2347) --- .changeset/chatty-pants-trade.md | 5 +++++ .../onchainkit/src/DefaultOnchainKitProviders.tsx | 15 ++++++++++++--- .../onchainkit/src/minikit/MiniKitProvider.tsx | 7 +------ 3 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 .changeset/chatty-pants-trade.md diff --git a/.changeset/chatty-pants-trade.md b/.changeset/chatty-pants-trade.md new file mode 100644 index 0000000000..3ac9781dae --- /dev/null +++ b/.changeset/chatty-pants-trade.md @@ -0,0 +1,5 @@ +--- +"@coinbase/onchainkit": patch +--- + +fix: MiniKit frames connector diff --git a/packages/onchainkit/src/DefaultOnchainKitProviders.tsx b/packages/onchainkit/src/DefaultOnchainKitProviders.tsx index bc8ce0bc91..2566a8a2b4 100644 --- a/packages/onchainkit/src/DefaultOnchainKitProviders.tsx +++ b/packages/onchainkit/src/DefaultOnchainKitProviders.tsx @@ -5,14 +5,21 @@ import { coinbaseWallet } from 'wagmi/connectors'; import { createWagmiConfig } from './core/createWagmiConfig'; import { useProviderDependencies } from './internal/hooks/useProviderDependencies'; import { useOnchainKit } from './useOnchainKit'; +import type { CreateWagmiConfigParams } from './core/types'; -export function DefaultOnchainKitProviders({ children }: PropsWithChildren) { +export function DefaultOnchainKitProviders({ + children, + connectors, +}: PropsWithChildren<{ connectors?: CreateWagmiConfigParams['connectors'] }>) { // Check the React context for WagmiProvider and QueryClientProvider const { providedWagmiConfig, providedQueryClient } = useProviderDependencies(); return ( - + {children} @@ -23,8 +30,10 @@ export function DefaultOnchainKitProviders({ children }: PropsWithChildren) { function WagmiProviderWithDefault({ children, providedWagmiConfig, + connectors, }: PropsWithChildren<{ providedWagmiConfig: Config | null; + connectors?: CreateWagmiConfigParams['connectors']; }>) { const onchainKitConfig = useOnchainKit(); @@ -38,7 +47,7 @@ function WagmiProviderWithDefault({ apiKey: onchainKitConfig.apiKey ?? undefined, appName, appLogoUrl, - connectors: [ + connectors: connectors ?? [ coinbaseWallet({ appName, appLogoUrl, diff --git a/packages/onchainkit/src/minikit/MiniKitProvider.tsx b/packages/onchainkit/src/minikit/MiniKitProvider.tsx index 4fd9c40a5f..0692cd63c5 100644 --- a/packages/onchainkit/src/minikit/MiniKitProvider.tsx +++ b/packages/onchainkit/src/minikit/MiniKitProvider.tsx @@ -125,12 +125,7 @@ export function MiniKitProvider({ return ( - +
Date: Wed, 7 May 2025 14:32:51 -0500 Subject: [PATCH 49/55] =?UTF-8?q?chore:=20version=20packages=20?= =?UTF-8?q?=F0=9F=9A=80=20(#2348)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Dan Cortes <3639170+dgca@users.noreply.github.com> --- .changeset/chatty-pants-trade.md | 5 ----- packages/onchainkit/CHANGELOG.md | 6 ++++++ packages/onchainkit/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/chatty-pants-trade.md diff --git a/.changeset/chatty-pants-trade.md b/.changeset/chatty-pants-trade.md deleted file mode 100644 index 3ac9781dae..0000000000 --- a/.changeset/chatty-pants-trade.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@coinbase/onchainkit": patch ---- - -fix: MiniKit frames connector diff --git a/packages/onchainkit/CHANGELOG.md b/packages/onchainkit/CHANGELOG.md index 7b72fdc3d3..5ea61259ae 100644 --- a/packages/onchainkit/CHANGELOG.md +++ b/packages/onchainkit/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.38.12 + +### Patch Changes + +- **fix**: MiniKit frames connector. By @dgca #2347 + ## 0.38.11 ### Patch Changes diff --git a/packages/onchainkit/package.json b/packages/onchainkit/package.json index 8cdbe28c82..5a87750a1f 100644 --- a/packages/onchainkit/package.json +++ b/packages/onchainkit/package.json @@ -1,6 +1,6 @@ { "name": "@coinbase/onchainkit", - "version": "0.38.11", + "version": "0.38.12", "type": "module", "repository": "https://github.com/coinbase/onchainkit.git", "license": "MIT", From eff917edae6fb397c8cea6ff8895760bd40a42a5 Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Wed, 7 May 2025 17:13:34 -0500 Subject: [PATCH 50/55] fix: Update wagmi config if connectors change (#2350) --- .changeset/afraid-wombats-agree.md | 5 + .../src/DefaultOnchainKitProviders.test.tsx | 107 +++++++++++++++++- .../src/DefaultOnchainKitProviders.tsx | 29 ++++- 3 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 .changeset/afraid-wombats-agree.md diff --git a/.changeset/afraid-wombats-agree.md b/.changeset/afraid-wombats-agree.md new file mode 100644 index 0000000000..c96e0ab9d4 --- /dev/null +++ b/.changeset/afraid-wombats-agree.md @@ -0,0 +1,5 @@ +--- +"@coinbase/onchainkit": patch +--- + +fix: Update wagmi config if connectors change diff --git a/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx b/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx index 7caed98350..2984f85610 100644 --- a/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx +++ b/packages/onchainkit/src/DefaultOnchainKitProviders.test.tsx @@ -2,13 +2,24 @@ import { QueryClient } from '@tanstack/react-query'; import { render, screen } from '@testing-library/react'; import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'; import { http, createConfig } from 'wagmi'; +import type { CreateConnectorFn } from 'wagmi'; import { DefaultOnchainKitProviders } from './DefaultOnchainKitProviders'; import { useProviderDependencies } from './internal/hooks/useProviderDependencies'; import { useOnchainKit } from './useOnchainKit'; +import type { CreateWagmiConfigParams } from './core/types'; // Mock the coinbase wallet connector const mockCoinbaseWallet = vi.fn(); +// Mock for the createWagmiConfig +const mockCreateWagmiConfig = vi.fn(); +vi.mock('./core/createWagmiConfig', () => ({ + createWagmiConfig: (params: CreateWagmiConfigParams) => { + mockCreateWagmiConfig(params); + return { mock: 'config', params }; + }, +})); + const queryClient = new QueryClient(); const wagmiConfig = createConfig({ chains: [ @@ -27,8 +38,10 @@ vi.mock('wagmi', async (importOriginal) => { const actual = await importOriginal(); return { ...actual, - WagmiProvider: vi.fn(({ children }) => ( -
{children}
+ WagmiProvider: vi.fn(({ children, config }) => ( +
+ {children} +
)), }; }); @@ -65,6 +78,30 @@ vi.mock('./useOnchainKit', () => ({ })), })); +// Create mock connector function that satisfies the CreateConnectorFn interface +const createMockConnector = (id: string): CreateConnectorFn => { + return () => ({ + id, + name: `Mock ${id}`, + type: 'mock', + icon: undefined, + rdns: undefined, + supportsSimulation: false, + connect: async () => ({ + accounts: [], + chainId: 1, + }), + disconnect: async () => {}, + getAccounts: async () => [], + getChainId: async () => 1, + getProvider: async () => ({}), + isAuthorized: async () => false, + onAccountsChanged: () => {}, + onChainChanged: () => {}, + onDisconnect: () => {}, + }); +}; + // Mock wagmi/connectors vi.mock('wagmi/connectors', () => { return { @@ -74,8 +111,8 @@ vi.mock('wagmi/connectors', () => { appLogoUrl?: string; }) => { mockCoinbaseWallet(params); - // Return a connector function that Wagmi expects - return () => ({ id: 'coinbaseWalletSDK' }); + // Return a connector function that satisfies the CreateConnectorFn interface + return createMockConnector('coinbaseWalletSDK'); }, }; }); @@ -283,4 +320,66 @@ describe('DefaultOnchainKitProviders', () => { }), ); }); + + it('should update the Wagmi config when connectors change', async () => { + const { rerender } = render( + +
Test Child
+
, + ); + + // Initial config creation + expect(mockCreateWagmiConfig).toHaveBeenCalledTimes(1); + + // First call parameters + const firstCallParams = mockCreateWagmiConfig.mock.calls[0][0]; + expect(firstCallParams.connectors).toBeDefined(); + + // Clear mocks to check rerender behavior + mockCreateWagmiConfig.mockClear(); + + // Create a different connector + const newConnector = createMockConnector('newConnector'); + + // Re-render with new connectors + rerender( + +
Test Child
+
, + ); + + // Should create a new config with the new connectors + expect(mockCreateWagmiConfig).toHaveBeenCalledTimes(1); + + // Second call parameters + const secondCallParams = mockCreateWagmiConfig.mock.calls[0][0]; + expect(secondCallParams.connectors).toEqual([newConnector]); + }); + + it('should not update the Wagmi config when the same connectors are passed', async () => { + // Create an initial connector + const initialConnectors = [createMockConnector('initialConnector')]; + + const { rerender } = render( + +
Test Child
+
, + ); + + // Initial config creation + expect(mockCreateWagmiConfig).toHaveBeenCalledTimes(1); + + // Clear mocks to check rerender behavior + mockCreateWagmiConfig.mockClear(); + + // Re-render with the same connectors + rerender( + +
Test Child
+
, + ); + + // Should not create a new config + expect(mockCreateWagmiConfig).not.toHaveBeenCalled(); + }); }); diff --git a/packages/onchainkit/src/DefaultOnchainKitProviders.tsx b/packages/onchainkit/src/DefaultOnchainKitProviders.tsx index 2566a8a2b4..e4660cd9df 100644 --- a/packages/onchainkit/src/DefaultOnchainKitProviders.tsx +++ b/packages/onchainkit/src/DefaultOnchainKitProviders.tsx @@ -1,5 +1,12 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { type PropsWithChildren, useMemo, useState } from 'react'; +import { + type PropsWithChildren, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; import { Config, WagmiProvider } from 'wagmi'; import { coinbaseWallet } from 'wagmi/connectors'; import { createWagmiConfig } from './core/createWagmiConfig'; @@ -36,8 +43,10 @@ function WagmiProviderWithDefault({ connectors?: CreateWagmiConfigParams['connectors']; }>) { const onchainKitConfig = useOnchainKit(); + const prevConnectorsRef = + useRef(connectors); - const [config] = useState(() => { + const getWagmiConfig = useCallback(() => { if (providedWagmiConfig) return providedWagmiConfig; const appName = onchainKitConfig.config?.appearance?.name ?? undefined; @@ -55,8 +64,24 @@ function WagmiProviderWithDefault({ }), ], }); + }, [ + onchainKitConfig.apiKey, + onchainKitConfig.config, + connectors, + providedWagmiConfig, + ]); + + const [config, setConfig] = useState(() => { + return getWagmiConfig(); }); + useEffect(() => { + if (prevConnectorsRef.current !== connectors) { + setConfig(getWagmiConfig()); + prevConnectorsRef.current = connectors; + } + }, [connectors, getWagmiConfig]); + if (providedWagmiConfig) { return children; } From f7a35dde382d09e59c858f36ca448cde32f0ae30 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 17:22:37 -0500 Subject: [PATCH 51/55] =?UTF-8?q?chore:=20version=20packages=20?= =?UTF-8?q?=F0=9F=9A=80=20(#2352)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Dan Cortes <3639170+dgca@users.noreply.github.com> --- .changeset/afraid-wombats-agree.md | 5 ----- packages/onchainkit/CHANGELOG.md | 6 ++++++ packages/onchainkit/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/afraid-wombats-agree.md diff --git a/.changeset/afraid-wombats-agree.md b/.changeset/afraid-wombats-agree.md deleted file mode 100644 index c96e0ab9d4..0000000000 --- a/.changeset/afraid-wombats-agree.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@coinbase/onchainkit": patch ---- - -fix: Update wagmi config if connectors change diff --git a/packages/onchainkit/CHANGELOG.md b/packages/onchainkit/CHANGELOG.md index 5ea61259ae..1230b656b5 100644 --- a/packages/onchainkit/CHANGELOG.md +++ b/packages/onchainkit/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.38.13 + +### Patch Changes + +- **fix**: Update wagmi config if connectors change. By @dgca #2350 + ## 0.38.12 ### Patch Changes diff --git a/packages/onchainkit/package.json b/packages/onchainkit/package.json index 5a87750a1f..ff2a7caa38 100644 --- a/packages/onchainkit/package.json +++ b/packages/onchainkit/package.json @@ -1,6 +1,6 @@ { "name": "@coinbase/onchainkit", - "version": "0.38.12", + "version": "0.38.13", "type": "module", "repository": "https://github.com/coinbase/onchainkit.git", "license": "MIT", From 5c78d7738f2445a5bec00f92866ef82e4a9007c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 11:48:24 -0600 Subject: [PATCH 52/55] chore(deps-dev): bump vite from 6.2.3 to 6.2.7 (#2327) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../miniapp-manifest-generator/package.json | 2 +- packages/onchainkit/package.json | 2 +- pnpm-lock.yaml | 1050 +++++++++++++---- 3 files changed, 837 insertions(+), 217 deletions(-) diff --git a/packages/miniapp-manifest-generator/package.json b/packages/miniapp-manifest-generator/package.json index 908a5fe6e0..7d3346ac19 100644 --- a/packages/miniapp-manifest-generator/package.json +++ b/packages/miniapp-manifest-generator/package.json @@ -41,7 +41,7 @@ "tailwindcss": "^4.0.9", "typescript": "~5.7.2", "typescript-eslint": "^8.24.1", - "vite": "^6.2.0", + "vite": "^5.4.19", "vitest": "^3.0.5" }, "packageManager": "pnpm@10.6.3" diff --git a/packages/onchainkit/package.json b/packages/onchainkit/package.json index ff2a7caa38..fff6be3d53 100644 --- a/packages/onchainkit/package.json +++ b/packages/onchainkit/package.json @@ -74,7 +74,7 @@ "tailwindcss-animate": "^1.0.7", "tscpaths": "^0.0.9", "tsup": "^8.3.5", - "vite": "^5.3.3", + "vite": "^5.4.19", "vite-plugin-dts": "^4.5.3", "vite-plugin-externalize-deps": "^0.9.0", "vitest": "^3.0.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0616c4e98..e824a6ef5a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,13 +89,13 @@ importers: version: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) vitest: specifier: ^3.0.5 - version: 3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) + version: 3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2) packages/miniapp-manifest-generator: dependencies: '@coinbase/onchainkit': specifier: latest - version: 0.38.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) + version: 0.38.10(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -117,7 +117,7 @@ importers: version: 9.22.0 '@tailwindcss/vite': specifier: ^4.0.9 - version: 4.0.17(vite@6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0)) + version: 4.0.17(vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2)) '@testing-library/jest-dom': specifier: 6.4.7 version: 6.4.7(@jest/globals@29.7.0)(jest@29.7.0(@types/node@22.13.10))(vitest@3.0.9) @@ -135,7 +135,7 @@ importers: version: 18.3.5(@types/react@18.3.19) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0)) + version: 4.3.4(vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2)) '@vitest/coverage-v8': specifier: ^3.0.5 version: 3.0.9(vitest@3.0.9) @@ -167,11 +167,11 @@ importers: specifier: ^8.24.1 version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3) vite: - specifier: ^6.2.0 - version: 6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0) + specifier: ^5.4.19 + version: 5.4.19(@types/node@22.13.10)(lightningcss@1.29.2) vitest: specifier: ^3.0.5 - version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) + version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2) packages/onchainkit: dependencies: @@ -232,7 +232,7 @@ importers: version: 18.3.5(@types/react@18.3.19) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) + version: 4.3.4(vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2)) '@vitest/coverage-v8': specifier: ^3.0.5 version: 3.0.9(vitest@3.0.9) @@ -294,17 +294,17 @@ importers: specifier: ^8.3.5 version: 8.4.0(@microsoft/api-extractor@7.52.3(@types/node@22.13.10))(@swc/core@1.11.11(@swc/helpers@0.5.15))(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.2)(yaml@2.7.0) vite: - specifier: ^5.3.3 - version: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) + specifier: ^5.4.19 + version: 5.4.19(@types/node@22.13.10)(lightningcss@1.29.2) vite-plugin-dts: specifier: ^4.5.3 - version: 4.5.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) + version: 4.5.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2)) vite-plugin-externalize-deps: specifier: ^0.9.0 - version: 0.9.0(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) + version: 0.9.0(vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2)) vitest: specifier: ^3.0.5 - version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) + version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2) packages/playground: dependencies: @@ -426,20 +426,32 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.8': resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.27.1': + resolution: {integrity: sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==} + engines: {node: '>=6.9.0'} + '@babel/core@7.26.10': resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} engines: {node: '>=6.9.0'} + '@babel/core@7.27.1': + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.26.10': resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + '@babel/generator@7.27.1': + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.25.9': @@ -450,6 +462,10 @@ packages: resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.1': + resolution: {integrity: sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==} + engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.26.9': resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} engines: {node: '>=6.9.0'} @@ -479,12 +495,22 @@ packages: resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.26.0': resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.27.1': + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.25.9': resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} @@ -493,6 +519,10 @@ packages: resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.25.9': resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} @@ -513,14 +543,26 @@ packages: resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.25.9': resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} engines: {node: '>=6.9.0'} @@ -529,13 +571,17 @@ packages: resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.27.1': + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.26.10': resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.27.1': + resolution: {integrity: sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -632,6 +678,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -648,6 +700,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -696,6 +754,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -1089,28 +1153,32 @@ packages: resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + '@babel/runtime@7.27.1': + resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} '@babel/template@7.26.9': resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + '@babel/template@7.27.1': + resolution: {integrity: sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==} engines: {node: '>=6.9.0'} '@babel/traverse@7.26.10': resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.27.1': + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.10': resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1240,10 +1308,9 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@coinbase/onchainkit@0.38.7': - resolution: {integrity: sha512-2mdCgGrH8RZSqP/xh4ML2gPORMdKUMWw1xKm+0x5IwDt1A77Z3WWuCxKT1IA2gEvgdcU2SfTs1eZsfR0eljqmA==} + '@coinbase/onchainkit@0.38.10': + resolution: {integrity: sha512-NDNEgufLfD7B1ea38UK/x8nIpAkX9IIkmNQH6l658mQ0uC572sRyeGqaCI/Bh1dl+WsDRksSZHFW493tIBbEQA==} peerDependencies: - '@types/react': ^18 || ^19 react: ^18 || ^19 react-dom: ^18 || ^19 @@ -1308,6 +1375,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -1320,6 +1393,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -1332,6 +1411,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -1344,6 +1429,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -1356,6 +1447,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -1368,6 +1465,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -1380,6 +1483,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -1392,6 +1501,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -1404,6 +1519,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -1416,6 +1537,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -1428,6 +1555,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -1440,6 +1573,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -1452,6 +1591,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -1464,6 +1609,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -1476,6 +1627,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -1488,6 +1645,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -1500,12 +1663,24 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.1': resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -1518,12 +1693,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.1': resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -1536,6 +1723,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -1548,6 +1741,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -1560,6 +1759,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -1572,6 +1777,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -1584,6 +1795,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.5.1': resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2455,96 +2672,196 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.40.1': + resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.36.0': resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.40.1': + resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.36.0': resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.40.1': + resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.36.0': resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.40.1': + resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.36.0': resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.40.1': + resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.36.0': resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.40.1': + resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': + resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.36.0': resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.40.1': + resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.36.0': resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.40.1': + resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.36.0': resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.40.1': + resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': + resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': + resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.36.0': resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.40.1': + resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.40.1': + resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.36.0': resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.40.1': + resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.36.0': resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.40.1': + resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.36.0': resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.40.1': + resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.36.0': resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.40.1': + resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.36.0': resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.40.1': + resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.36.0': resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.40.1': + resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==} + cpu: [x64] + os: [win32] + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -2871,6 +3188,9 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/express-serve-static-core@5.0.6': resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} @@ -3624,11 +3944,11 @@ packages: blacklist@1.1.4: resolution: {integrity: sha512-DWdfwimA1WQxVC69Vs1Fy525NbYwisMSCdYQmW9zyzOByz9OB/tQwrKZ3T3pbTkuFjnkJFlJuyiDjPiXL5kzew==} - bn.js@4.12.1: - resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} - 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.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} @@ -3662,6 +3982,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bs58@6.0.0: resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} @@ -3741,6 +4066,9 @@ packages: caniuse-lite@1.0.30001715: resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + caniuse-lite@1.0.30001717: + resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} + chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} @@ -4038,8 +4366,8 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -4188,6 +4516,9 @@ packages: electron-to-chromium@1.5.120: resolution: {integrity: sha512-oTUp3gfX1gZI+xfD2djr2rzQdHCwHzPQrrK0CD7WpTdF0nPdQ/INcRVjWgLdCT4a9W3jFObR9DAfsuyFQnI8CQ==} + electron-to-chromium@1.5.150: + resolution: {integrity: sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==} + elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -4304,6 +4635,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -6767,6 +7103,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.40.1: + resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rrweb-cssom@0.7.1: resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} @@ -7701,27 +8042,22 @@ packages: terser: optional: true - vite@6.2.3: - resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' + '@types/node': ^18.0.0 || >=20.0.0 less: '*' lightningcss: ^1.21.0 sass: '*' sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 + terser: ^5.4.0 peerDependenciesMeta: '@types/node': optional: true - jiti: - optional: true less: optional: true lightningcss: @@ -7736,10 +8072,6 @@ packages: optional: true terser: optional: true - tsx: - optional: true - yaml: - optional: true vitest@3.0.9: resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} @@ -8030,8 +8362,17 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.1': + optional: true + '@babel/core@7.26.10': dependencies: '@ampproject/remapping': 2.3.0 @@ -8052,6 +8393,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.27.1': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.1 + '@babel/template': 7.27.1 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + convert-source-map: 2.0.0 + debug: 4.4.0(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/generator@7.26.10': dependencies: '@babel/parser': 7.26.10 @@ -8060,10 +8422,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/generator@7.27.0': + '@babel/generator@7.27.1': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.1 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 @@ -8081,6 +8443,15 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.27.1': + dependencies: + '@babel/compat-data': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.5 + lru-cache: 5.1.1 + semver: 6.3.1 + optional: true + '@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -8130,6 +8501,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -8139,12 +8518,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/helper-optimise-call-expression@7.25.9': dependencies: '@babel/types': 7.26.10 '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': + optional: true + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -8172,10 +8564,18 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': + optional: true + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': + optional: true + '@babel/helper-wrap-function@7.25.9': dependencies: '@babel/template': 7.26.9 @@ -8189,13 +8589,19 @@ snapshots: '@babel/template': 7.26.9 '@babel/types': 7.26.10 + '@babel/helpers@7.27.1': + dependencies: + '@babel/template': 7.27.1 + '@babel/types': 7.27.1 + optional: true + '@babel/parser@7.26.10': dependencies: '@babel/types': 7.26.10 - '@babel/parser@7.27.0': + '@babel/parser@7.27.1': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 optional: true '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': @@ -8251,28 +8657,28 @@ snapshots: dependencies: '@babel/core': 7.26.10 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.10)': @@ -8295,16 +8701,22 @@ snapshots: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': @@ -8312,52 +8724,58 @@ snapshots: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 optional: true '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': @@ -8365,6 +8783,12 @@ snapshots: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -8874,9 +9298,7 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.27.1': {} '@babel/template@7.26.9': dependencies: @@ -8884,11 +9306,11 @@ snapshots: '@babel/parser': 7.26.10 '@babel/types': 7.26.10 - '@babel/template@7.27.0': + '@babel/template@7.27.1': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.1 + '@babel/types': 7.27.1 optional: true '@babel/traverse@7.26.10': @@ -8903,15 +9325,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.27.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.1 + '@babel/template': 7.27.1 + '@babel/types': 7.27.1 + debug: 4.4.0(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/types@7.26.10': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/types@7.27.0': + '@babel/types@7.27.1': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 optional: true '@bcoe/v8-coverage@0.2.3': @@ -9191,12 +9626,11 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 - '@coinbase/onchainkit@0.38.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': + '@coinbase/onchainkit@0.38.10(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(bufferutil@4.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)': dependencies: '@farcaster/frame-sdk': 0.0.28(typescript@5.7.3)(zod@3.24.2) '@farcaster/frame-wagmi-connector': 0.0.16(@farcaster/frame-sdk@0.0.28(typescript@5.7.3)(zod@3.24.2))(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.27.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)))(viem@2.27.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) '@tanstack/react-query': 5.69.0(react@18.3.1) - '@types/react': 18.3.19 '@wagmi/core': 2.16.7(@tanstack/query-core@5.69.0)(@types/react@18.3.19)(react@18.3.1)(typescript@5.7.3)(viem@2.27.2(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2)) clsx: 2.1.1 graphql: 16.10.0 @@ -9220,6 +9654,7 @@ snapshots: - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@tanstack/query-core' + - '@types/react' - '@upstash/redis' - '@vercel/blob' - '@vercel/kv' @@ -9238,7 +9673,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 @@ -9303,144 +9738,219 @@ snapshots: '@esbuild/aix-ppc64@0.25.1': optional: true + '@esbuild/aix-ppc64@0.25.3': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.25.1': optional: true + '@esbuild/android-arm64@0.25.3': + optional: true + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.25.1': optional: true + '@esbuild/android-arm@0.25.3': + optional: true + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.25.1': optional: true + '@esbuild/android-x64@0.25.3': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.25.1': optional: true + '@esbuild/darwin-arm64@0.25.3': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.25.1': optional: true + '@esbuild/darwin-x64@0.25.3': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.25.1': optional: true + '@esbuild/freebsd-arm64@0.25.3': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.25.1': optional: true + '@esbuild/freebsd-x64@0.25.3': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.25.1': optional: true + '@esbuild/linux-arm64@0.25.3': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.25.1': optional: true + '@esbuild/linux-arm@0.25.3': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.25.1': optional: true + '@esbuild/linux-ia32@0.25.3': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.25.1': optional: true + '@esbuild/linux-loong64@0.25.3': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.25.1': optional: true + '@esbuild/linux-mips64el@0.25.3': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.25.1': optional: true + '@esbuild/linux-ppc64@0.25.3': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.25.1': optional: true + '@esbuild/linux-riscv64@0.25.3': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.25.1': optional: true + '@esbuild/linux-s390x@0.25.3': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.25.1': optional: true + '@esbuild/linux-x64@0.25.3': + optional: true + '@esbuild/netbsd-arm64@0.25.1': optional: true + '@esbuild/netbsd-arm64@0.25.3': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.25.1': optional: true + '@esbuild/netbsd-x64@0.25.3': + optional: true + '@esbuild/openbsd-arm64@0.25.1': optional: true + '@esbuild/openbsd-arm64@0.25.3': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.25.1': optional: true + '@esbuild/openbsd-x64@0.25.3': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.25.1': optional: true + '@esbuild/sunos-x64@0.25.3': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.25.1': optional: true + '@esbuild/win32-arm64@0.25.3': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.25.1': optional: true + '@esbuild/win32-ia32@0.25.3': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.25.1': optional: true + '@esbuild/win32-x64@0.25.3': + optional: true + '@eslint-community/eslint-utils@4.5.1(eslint@9.22.0(jiti@2.4.2))': dependencies: eslint: 9.22.0(jiti@2.4.2) @@ -9752,7 +10262,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.1 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -10550,60 +11060,120 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.36.0': optional: true + '@rollup/rollup-android-arm-eabi@4.40.1': + optional: true + '@rollup/rollup-android-arm64@4.36.0': optional: true + '@rollup/rollup-android-arm64@4.40.1': + optional: true + '@rollup/rollup-darwin-arm64@4.36.0': optional: true + '@rollup/rollup-darwin-arm64@4.40.1': + optional: true + '@rollup/rollup-darwin-x64@4.36.0': optional: true + '@rollup/rollup-darwin-x64@4.40.1': + optional: true + '@rollup/rollup-freebsd-arm64@4.36.0': optional: true + '@rollup/rollup-freebsd-arm64@4.40.1': + optional: true + '@rollup/rollup-freebsd-x64@4.36.0': optional: true + '@rollup/rollup-freebsd-x64@4.40.1': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.36.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.36.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.40.1': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.36.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-arm64-musl@4.36.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.40.1': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.36.0': optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.36.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.36.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.40.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.1': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.36.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-x64-gnu@4.36.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.40.1': + optional: true + '@rollup/rollup-linux-x64-musl@4.36.0': optional: true + '@rollup/rollup-linux-x64-musl@4.40.1': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.36.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.40.1': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.36.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.40.1': + optional: true + '@rollup/rollup-win32-x64-msvc@4.36.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.40.1': + optional: true + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.11.0': {} @@ -10730,8 +11300,8 @@ snapshots: '@storybook/theming': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) better-opn: 3.0.2 browser-assert: 1.2.1 - esbuild: 0.25.1 - esbuild-register: 3.6.0(esbuild@0.25.1) + esbuild: 0.25.3 + esbuild-register: 3.6.0(esbuild@0.25.3) jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.11 @@ -10865,13 +11435,13 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.0.17 '@tailwindcss/oxide-win32-x64-msvc': 4.0.17 - '@tailwindcss/vite@4.0.17(vite@6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0))': + '@tailwindcss/vite@4.0.17(vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2))': dependencies: '@tailwindcss/node': 4.0.17 '@tailwindcss/oxide': 4.0.17 lightningcss: 1.29.2 tailwindcss: 4.0.17 - vite: 6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0) + vite: 5.4.19(@types/node@22.13.10)(lightningcss@1.29.2) '@tanstack/query-core@5.69.0': {} @@ -10882,8 +11452,8 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/runtime': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.27.1 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -10915,7 +11485,7 @@ snapshots: optionalDependencies: '@jest/globals': 29.7.0 jest: 29.7.0(@types/node@22.13.10) - vitest: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) + vitest: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2) '@testing-library/react@14.3.1(@types/react@18.3.19)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -10963,7 +11533,7 @@ snapshots: '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 optional: true '@types/body-parser@1.19.5': @@ -10981,6 +11551,8 @@ snapshots: '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} + '@types/express-serve-static-core@5.0.6': dependencies: '@types/node': 20.17.24 @@ -11312,25 +11884,14 @@ snapshots: '@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2': optional: true - '@vitejs/plugin-react@4.3.4(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2))': - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) - transitivePeerDependencies: - - supports-color - - '@vitejs/plugin-react@4.3.4(vite@6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0))': + '@vitejs/plugin-react@4.3.4(vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0) + vite: 5.4.19(@types/node@22.13.10)(lightningcss@1.29.2) transitivePeerDependencies: - supports-color @@ -11348,7 +11909,7 @@ snapshots: std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) + vitest: 3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2) transitivePeerDependencies: - supports-color @@ -11403,7 +11964,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.12 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0) + vitest: 3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2) '@vitest/utils@3.0.9': dependencies: @@ -12379,13 +12940,13 @@ snapshots: axobject-query@4.1.0: {} - babel-jest@29.7.0(@babel/core@7.26.10): + babel-jest@29.7.0(@babel/core@7.27.1): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.1 '@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.10) + babel-preset-jest: 29.6.3(@babel/core@7.27.1) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -12410,7 +12971,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -12421,8 +12982,8 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.1 + '@babel/types': 7.27.1 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 optional: true @@ -12469,31 +13030,31 @@ snapshots: transitivePeerDependencies: - supports-color - babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) + babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.1): + dependencies: + '@babel/core': 7.27.1 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.1) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.1) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.1) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.1) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.1) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.1) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.1) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.1) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.1) optional: true - babel-preset-jest@29.6.3(@babel/core@7.26.10): + babel-preset-jest@29.6.3(@babel/core@7.27.1): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.1 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.1) optional: true babel-preset-solid@1.9.5(@babel/core@7.26.10): @@ -12529,9 +13090,9 @@ snapshots: blacklist@1.1.4: {} - bn.js@4.12.1: {} + bn.js@4.12.2: {} - bn.js@5.2.1: {} + bn.js@5.2.2: {} body-parser@1.20.3: dependencies: @@ -12591,6 +13152,14 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) + browserslist@4.24.5: + dependencies: + caniuse-lite: 1.0.30001717 + electron-to-chromium: 1.5.150 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.5) + optional: true + bs58@6.0.0: dependencies: base-x: 5.0.1 @@ -12673,6 +13242,9 @@ snapshots: caniuse-lite@1.0.30001715: {} + caniuse-lite@1.0.30001717: + optional: true + chai@5.2.0: dependencies: assertion-error: 2.0.1 @@ -12956,7 +13528,7 @@ snapshots: decode-uri-component@0.2.2: {} - dedent@1.5.3: + dedent@1.6.0: optional: true deep-eql@5.0.2: {} @@ -13096,9 +13668,12 @@ snapshots: electron-to-chromium@1.5.120: {} + electron-to-chromium@1.5.150: + optional: true + elliptic@6.6.1: dependencies: - bn.js: 4.12.1 + bn.js: 4.12.2 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -13276,10 +13851,10 @@ snapshots: dependencies: '@babel/core': 7.26.10 - esbuild-register@3.6.0(esbuild@0.25.1): + esbuild-register@3.6.0(esbuild@0.25.3): dependencies: debug: 4.4.0(supports-color@5.5.0) - esbuild: 0.25.1 + esbuild: 0.25.3 transitivePeerDependencies: - supports-color @@ -13337,6 +13912,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.1 '@esbuild/win32-x64': 0.25.1 + esbuild@0.25.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -14424,7 +15027,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 is-regex@1.2.1: dependencies: @@ -14509,8 +15112,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 + '@babel/core': 7.27.1 + '@babel/parser': 7.27.1 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -14520,8 +15123,8 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 + '@babel/core': 7.27.1 + '@babel/parser': 7.27.1 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.1 @@ -14598,7 +15201,7 @@ snapshots: '@types/node': 20.17.24 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.3 + dedent: 1.6.0 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -14638,10 +15241,10 @@ snapshots: jest-config@29.7.0(@types/node@20.17.24): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.1 '@jest/test-sequencer': 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.27.1) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -14669,10 +15272,10 @@ snapshots: jest-config@29.7.0(@types/node@22.13.10): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.1 '@jest/test-sequencer': 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.27.1) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -14766,7 +15369,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -14870,15 +15473,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.26.10 - '@babel/generator': 7.27.0 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/core': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.1) + '@babel/types': 7.27.1 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.1) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -15799,7 +16402,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -16348,6 +16951,32 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.36.0 fsevents: 2.3.3 + rollup@4.40.1: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.1 + '@rollup/rollup-android-arm64': 4.40.1 + '@rollup/rollup-darwin-arm64': 4.40.1 + '@rollup/rollup-darwin-x64': 4.40.1 + '@rollup/rollup-freebsd-arm64': 4.40.1 + '@rollup/rollup-freebsd-x64': 4.40.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.1 + '@rollup/rollup-linux-arm-musleabihf': 4.40.1 + '@rollup/rollup-linux-arm64-gnu': 4.40.1 + '@rollup/rollup-linux-arm64-musl': 4.40.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.1 + '@rollup/rollup-linux-riscv64-gnu': 4.40.1 + '@rollup/rollup-linux-riscv64-musl': 4.40.1 + '@rollup/rollup-linux-s390x-gnu': 4.40.1 + '@rollup/rollup-linux-x64-gnu': 4.40.1 + '@rollup/rollup-linux-x64-musl': 4.40.1 + '@rollup/rollup-win32-arm64-msvc': 4.40.1 + '@rollup/rollup-win32-ia32-msvc': 4.40.1 + '@rollup/rollup-win32-x64-msvc': 4.40.1 + fsevents: 2.3.3 + rrweb-cssom@0.7.1: {} rrweb-cssom@0.8.0: {} @@ -17187,6 +17816,13 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.3(browserslist@4.24.5): + dependencies: + browserslist: 4.24.5 + escalade: 3.2.0 + picocolors: 1.1.1 + optional: true + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -17330,16 +17966,15 @@ snapshots: - utf-8-validate - zod - vite-node@3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0): + vite-node@3.0.9(@types/node@20.17.24)(lightningcss@1.29.2): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@5.5.0) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0) + vite: 5.4.19(@types/node@20.17.24)(lightningcss@1.29.2) transitivePeerDependencies: - '@types/node' - - jiti - less - lightningcss - sass @@ -17348,19 +17983,16 @@ snapshots: - sugarss - supports-color - terser - - tsx - - yaml - vite-node@3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0): + vite-node@3.0.9(@types/node@22.13.10)(lightningcss@1.29.2): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@5.5.0) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0) + vite: 5.4.19(@types/node@22.13.10)(lightningcss@1.29.2) transitivePeerDependencies: - '@types/node' - - jiti - less - lightningcss - sass @@ -17369,10 +18001,8 @@ snapshots: - sugarss - supports-color - terser - - tsx - - yaml - vite-plugin-dts@4.5.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)): + vite-plugin-dts@4.5.3(@types/node@22.13.10)(rollup@4.36.0)(typescript@5.8.2)(vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2)): dependencies: '@microsoft/api-extractor': 7.52.3(@types/node@22.13.10) '@rollup/pluginutils': 5.1.4(rollup@4.36.0) @@ -17385,15 +18015,15 @@ snapshots: magic-string: 0.30.17 typescript: 5.8.2 optionalDependencies: - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) + vite: 5.4.19(@types/node@22.13.10)(lightningcss@1.29.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)): + vite-plugin-externalize-deps@0.9.0(vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2)): dependencies: - vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) + vite: 5.4.19(@types/node@22.13.10)(lightningcss@1.29.2) vite@5.4.14(@types/node@20.17.24)(lightningcss@1.29.2): dependencies: @@ -17415,31 +18045,27 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.29.2 - vite@6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0): + vite@5.4.19(@types/node@20.17.24)(lightningcss@1.29.2): dependencies: - esbuild: 0.25.1 + esbuild: 0.21.5 postcss: 8.5.3 - rollup: 4.36.0 + rollup: 4.40.1 optionalDependencies: '@types/node': 20.17.24 fsevents: 2.3.3 - jiti: 2.4.2 lightningcss: 1.29.2 - yaml: 2.7.0 - vite@6.2.3(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0): + vite@5.4.19(@types/node@22.13.10)(lightningcss@1.29.2): dependencies: - esbuild: 0.25.1 + esbuild: 0.21.5 postcss: 8.5.3 - rollup: 4.36.0 + rollup: 4.40.1 optionalDependencies: '@types/node': 22.13.10 fsevents: 2.3.3 - jiti: 2.4.2 lightningcss: 1.29.2 - yaml: 2.7.0 - vitest@3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0): + vitest@3.0.9(@types/debug@4.1.12)(@types/node@20.17.24)(@vitest/ui@3.0.9)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@5.4.14(@types/node@20.17.24)(lightningcss@1.29.2)) @@ -17459,7 +18085,7 @@ snapshots: tinypool: 1.0.2 tinyrainbow: 2.0.0 vite: 5.4.14(@types/node@20.17.24)(lightningcss@1.29.2) - vite-node: 3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0) + vite-node: 3.0.9(@types/node@20.17.24)(lightningcss@1.29.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -17467,7 +18093,6 @@ snapshots: '@vitest/ui': 3.0.9(vitest@3.0.9) jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - - jiti - less - lightningcss - msw @@ -17477,10 +18102,8 @@ snapshots: - sugarss - supports-color - terser - - tsx - - yaml - vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2)(yaml@2.7.0): + vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.10)(@vitest/ui@3.0.9)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.2): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)) @@ -17500,7 +18123,7 @@ snapshots: tinypool: 1.0.2 tinyrainbow: 2.0.0 vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2) - vite-node: 3.0.9(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.0) + vite-node: 3.0.9(@types/node@22.13.10)(lightningcss@1.29.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -17508,7 +18131,6 @@ snapshots: '@vitest/ui': 3.0.9(vitest@3.0.9) jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - - jiti - less - lightningcss - msw @@ -17518,8 +18140,6 @@ snapshots: - sugarss - supports-color - terser - - tsx - - yaml vscode-uri@3.1.0: {} From a1e63d125a22270cdcfb4940bc30c27c4d1ba835 Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Tue, 13 May 2025 09:55:43 -0600 Subject: [PATCH 53/55] chore: Use signed commits for Changesets action (#2351) --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 710d86c678..9040e95f8b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,11 +34,12 @@ jobs: - name: Handle Release Pull Request or Publish to npm id: changesets - uses: changesets/action@v1 + uses: changesets/action@v1.5.0 with: title: 'chore: version packages 🚀' commit: 'chore: version packages 🚀' publish: pnpm release:publish + commitMode: github-api env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} From 930c40188ed083b672422118185a188eea1b679e Mon Sep 17 00:00:00 2001 From: Dan Cortes <3639170+dgca@users.noreply.github.com> Date: Tue, 13 May 2025 12:34:33 -0700 Subject: [PATCH 54/55] chore: Update MiniKit mini app manifest (#2355) --- .changeset/heavy-clowns-stare.md | 5 + packages/create-onchain/src/minikit.test.ts | 58 ++++++++++-- packages/create-onchain/src/minikit.ts | 88 ++++++++++++++---- .../templates/minikit-basic/README.md | 26 ++++-- .../app/.well-known/farcaster.json/route.ts | 37 ++++++-- .../templates/minikit-basic/app/layout.tsx | 20 ++-- .../templates/minikit-basic/public/hero.png | Bin 0 -> 11776 bytes .../templates/minikit-basic/public/icon.png | Bin 0 -> 17815 bytes .../templates/minikit-basic/public/logo.png | Bin 1349 -> 2374 bytes .../minikit-basic/public/screenshot.png | Bin 0 -> 31589 bytes .../templates/minikit-basic/public/splash.png | Bin 0 -> 3928 bytes .../templates/minikit-snake/README.md | 26 ++++-- .../app/.well-known/farcaster.json/route.ts | 37 ++++++-- .../templates/minikit-snake/app/layout.tsx | 9 +- .../templates/minikit-snake/public/hero.png | Bin 0 -> 11776 bytes .../templates/minikit-snake/public/icon.png | Bin 0 -> 17815 bytes .../minikit-snake/public/screenshot.png | Bin 0 -> 31589 bytes .../templates/minikit-snake/public/splash.png | Bin 0 -> 3928 bytes packages/create-onchain/tsconfig.json | 4 +- 19 files changed, 233 insertions(+), 77 deletions(-) create mode 100644 .changeset/heavy-clowns-stare.md create mode 100644 packages/create-onchain/templates/minikit-basic/public/hero.png create mode 100644 packages/create-onchain/templates/minikit-basic/public/icon.png create mode 100644 packages/create-onchain/templates/minikit-basic/public/screenshot.png create mode 100644 packages/create-onchain/templates/minikit-basic/public/splash.png create mode 100644 packages/create-onchain/templates/minikit-snake/public/hero.png create mode 100644 packages/create-onchain/templates/minikit-snake/public/icon.png create mode 100644 packages/create-onchain/templates/minikit-snake/public/screenshot.png create mode 100644 packages/create-onchain/templates/minikit-snake/public/splash.png diff --git a/.changeset/heavy-clowns-stare.md b/.changeset/heavy-clowns-stare.md new file mode 100644 index 0000000000..a37ad75b9e --- /dev/null +++ b/.changeset/heavy-clowns-stare.md @@ -0,0 +1,5 @@ +--- +"create-onchain": patch +--- + +feat: Align farcaster.json manifest to reflect latest spec diff --git a/packages/create-onchain/src/minikit.test.ts b/packages/create-onchain/src/minikit.test.ts index 77b24a99ab..ccffdb730a 100644 --- a/packages/create-onchain/src/minikit.test.ts +++ b/packages/create-onchain/src/minikit.test.ts @@ -98,6 +98,40 @@ vi.spyOn(process, 'exit').mockImplementation((code) => { const logSpy = vi.spyOn(console, 'log'); +const getExpectedEnv = ( + projectName: string, + clientKey: string, +) => `# Shared/OnchainKit variables + +NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME=${projectName} +NEXT_PUBLIC_URL= +NEXT_PUBLIC_ICON_URL=$NEXT_PUBLIC_URL/logo.png +NEXT_PUBLIC_ONCHAINKIT_API_KEY=${clientKey} + +# Frame metadata + +FARCASTER_HEADER= +FARCASTER_PAYLOAD= +FARCASTER_SIGNATURE= +NEXT_PUBLIC_APP_ICON=$NEXT_PUBLIC_URL/icon.png +# Optional Frame metadata items below +NEXT_PUBLIC_APP_SUBTITLE= +NEXT_PUBLIC_APP_DESCRIPTION= +NEXT_PUBLIC_APP_SPLASH_IMAGE=$NEXT_PUBLIC_URL/splash.png +NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR="#000000" +NEXT_PUBLIC_APP_PRIMARY_CATEGORY= +NEXT_PUBLIC_APP_HERO_IMAGE=$NEXT_PUBLIC_URL/hero.png +NEXT_PUBLIC_APP_TAGLINE= +NEXT_PUBLIC_APP_OG_TITLE=${projectName} +NEXT_PUBLIC_APP_OG_DESCRIPTION= +NEXT_PUBLIC_APP_OG_IMAGE=$NEXT_PUBLIC_URL/hero.png + +# Redis config + +REDIS_URL= +REDIS_TOKEN= +`; + describe('MiniKit', () => { const originalGetArgs = process.argv; @@ -146,9 +180,7 @@ describe('MiniKit', () => { expect(fs.promises.writeFile).toHaveBeenCalledWith( expect.any(String), - expect.stringContaining( - 'NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME=test-project\nNEXT_PUBLIC_ONCHAINKIT_API_KEY=test-key\nNEXT_PUBLIC_URL=\nNEXT_PUBLIC_SPLASH_IMAGE_URL=$NEXT_PUBLIC_URL/logo.png\nNEXT_PUBLIC_SPLASH_BACKGROUND_COLOR=FFFFFF\nNEXT_PUBLIC_IMAGE_URL=$NEXT_PUBLIC_URL/logo.png\nNEXT_PUBLIC_ICON_URL=$NEXT_PUBLIC_URL/logo.png\nNEXT_PUBLIC_VERSION=next\nREDIS_URL=\nREDIS_TOKEN=', - ), + expect.stringContaining(getExpectedEnv('test-project', 'test-key')), ); expect(logSpy).toHaveBeenCalledWith( expect.stringContaining('Created new MiniKit project in'), @@ -172,9 +204,7 @@ describe('MiniKit', () => { expect(fs.promises.writeFile).toHaveBeenCalledWith( expect.any(String), - expect.stringContaining( - 'NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME=test-project\nNEXT_PUBLIC_ONCHAINKIT_API_KEY=test-key\nNEXT_PUBLIC_URL=\nNEXT_PUBLIC_SPLASH_IMAGE_URL=$NEXT_PUBLIC_URL/logo.png\nNEXT_PUBLIC_SPLASH_BACKGROUND_COLOR=FFFFFF\nNEXT_PUBLIC_IMAGE_URL=$NEXT_PUBLIC_URL/logo.png\nNEXT_PUBLIC_ICON_URL=$NEXT_PUBLIC_URL/logo.png\nNEXT_PUBLIC_VERSION=next\nREDIS_URL=\nREDIS_TOKEN=', - ), + expect.stringContaining(getExpectedEnv('test-project', 'test-key')), ); expect(logSpy).toHaveBeenCalledWith( expect.stringContaining('Created new MiniKit project in'), @@ -238,9 +268,19 @@ describe('MiniKit', () => { expect(open).toHaveBeenCalledWith('http://localhost:3333'); expect(fs.promises.writeFile).toHaveBeenCalledWith( expect.any(String), - expect.stringContaining( - 'FARCASTER_HEADER=test-header\nFARCASTER_PAYLOAD=test-payload\nFARCASTER_SIGNATURE=test-signature\nNEXT_PUBLIC_URL=test-domain', - ), + expect.stringContaining('FARCASTER_HEADER=test-header'), + ); + expect(fs.promises.writeFile).toHaveBeenCalledWith( + expect.any(String), + expect.stringContaining('FARCASTER_PAYLOAD=test-payload'), + ); + expect(fs.promises.writeFile).toHaveBeenCalledWith( + expect.any(String), + expect.stringContaining('FARCASTER_SIGNATURE=test-signature'), + ); + expect(fs.promises.writeFile).toHaveBeenCalledWith( + expect.any(String), + expect.stringContaining('NEXT_PUBLIC_URL=test-domain'), ); expect(logSpy).toHaveBeenCalledWith( expect.stringContaining( diff --git a/packages/create-onchain/src/minikit.ts b/packages/create-onchain/src/minikit.ts index 0e368cc75f..68e6705213 100644 --- a/packages/create-onchain/src/minikit.ts +++ b/packages/create-onchain/src/minikit.ts @@ -69,20 +69,52 @@ export async function createMiniKitManifest(envPath?: string) { try { const webpageData = await getWebpageData(); + // get existing next public url to re-update on subsequent runs - const domain = - existingEnv.match(/NEXT_PUBLIC_URL=(.*)/)?.[1] || '$NEXT_PUBLIC_URL'; - const envContent = `FARCASTER_HEADER=${webpageData.header}\nFARCASTER_PAYLOAD=${webpageData.payload}\nFARCASTER_SIGNATURE=${webpageData.signature}\nNEXT_PUBLIC_URL=${webpageData.domain}`; + let domain = + existingEnv.match(/NEXT_PUBLIC_URL=(.*)/)?.[1]?.trim() || + '$NEXT_PUBLIC_URL'; + + const envKeys = { + FARCASTER_HEADER: { + value: webpageData.header, + added: false, + }, + FARCASTER_PAYLOAD: { + value: webpageData.payload, + added: false, + }, + FARCASTER_SIGNATURE: { + value: webpageData.signature, + added: false, + }, + NEXT_PUBLIC_URL: { + value: webpageData.domain, + added: false, + }, + }; + const updatedEnv = existingEnv + .replaceAll(domain, webpageData.domain) .split('\n') - .map((line) => line.replace(domain, webpageData.domain)) - .filter( - (line) => - !line.startsWith('FARCASTER_') && !line.startsWith('NEXT_PUBLIC_URL'), - ) - .concat(envContent) - .join('\n'); - await fs.promises.writeFile(envPath, updatedEnv); + .map((line) => { + const [key] = line.split('='); + + if (key in envKeys) { + envKeys[key as keyof typeof envKeys].added = true; + return `${key}=${envKeys[key as keyof typeof envKeys].value}`; + } + + return line; + }); + + Object.entries(envKeys).forEach(([key, { added }]) => { + if (!added) { + updatedEnv.push(`${key}=${envKeys[key as keyof typeof envKeys].value}`); + } + }); + + await fs.promises.writeFile(envPath, updatedEnv.join('\n')); console.log( pc.blue( @@ -199,16 +231,36 @@ export async function createMiniKitTemplate( const envPath = path.join(root, '.env'); await fs.promises.writeFile( envPath, - `NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME=${projectName} -NEXT_PUBLIC_ONCHAINKIT_API_KEY=${clientKey} + `# Shared/OnchainKit variables + +NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME=${projectName} NEXT_PUBLIC_URL= -NEXT_PUBLIC_SPLASH_IMAGE_URL=$NEXT_PUBLIC_URL/logo.png -NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR=FFFFFF -NEXT_PUBLIC_IMAGE_URL=$NEXT_PUBLIC_URL/logo.png NEXT_PUBLIC_ICON_URL=$NEXT_PUBLIC_URL/logo.png -NEXT_PUBLIC_VERSION=next +NEXT_PUBLIC_ONCHAINKIT_API_KEY=${clientKey} + +# Frame metadata + +FARCASTER_HEADER= +FARCASTER_PAYLOAD= +FARCASTER_SIGNATURE= +NEXT_PUBLIC_APP_ICON=$NEXT_PUBLIC_URL/icon.png +# Optional Frame metadata items below +NEXT_PUBLIC_APP_SUBTITLE= +NEXT_PUBLIC_APP_DESCRIPTION= +NEXT_PUBLIC_APP_SPLASH_IMAGE=$NEXT_PUBLIC_URL/splash.png +NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR="#000000" +NEXT_PUBLIC_APP_PRIMARY_CATEGORY= +NEXT_PUBLIC_APP_HERO_IMAGE=$NEXT_PUBLIC_URL/hero.png +NEXT_PUBLIC_APP_TAGLINE= +NEXT_PUBLIC_APP_OG_TITLE=${projectName} +NEXT_PUBLIC_APP_OG_DESCRIPTION= +NEXT_PUBLIC_APP_OG_IMAGE=$NEXT_PUBLIC_URL/hero.png + +# Redis config + REDIS_URL= -REDIS_TOKEN=`, +REDIS_TOKEN= +`, ); spinner.succeed(); diff --git a/packages/create-onchain/templates/minikit-basic/README.md b/packages/create-onchain/templates/minikit-basic/README.md index eab74bce34..29a0a18fb8 100644 --- a/packages/create-onchain/templates/minikit-basic/README.md +++ b/packages/create-onchain/templates/minikit-basic/README.md @@ -31,21 +31,29 @@ The environment variables enable the following features: - Redis API keys - Enable Webhooks and background notifications for your application by storing users notification details ```bash -# Required for Frame metadata -NEXT_PUBLIC_URL= -NEXT_PUBLIC_VERSION= +# Shared/OnchainKit variables NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME= +NEXT_PUBLIC_URL= NEXT_PUBLIC_ICON_URL= -NEXT_PUBLIC_IMAGE_URL= -NEXT_PUBLIC_SPLASH_IMAGE_URL= -NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR= +NEXT_PUBLIC_ONCHAINKIT_API_KEY= -# Required to allow users to add your frame +# Frame metadata FARCASTER_HEADER= FARCASTER_PAYLOAD= FARCASTER_SIGNATURE= - -# Required for webhooks and background notifications +NEXT_PUBLIC_APP_ICON= +NEXT_PUBLIC_APP_SUBTITLE= +NEXT_PUBLIC_APP_DESCRIPTION= +NEXT_PUBLIC_APP_SPLASH_IMAGE= +NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR= +NEXT_PUBLIC_APP_PRIMARY_CATEGORY= +NEXT_PUBLIC_APP_HERO_IMAGE= +NEXT_PUBLIC_APP_TAGLINE= +NEXT_PUBLIC_APP_OG_TITLE= +NEXT_PUBLIC_APP_OG_DESCRIPTION= +NEXT_PUBLIC_APP_OG_IMAGE= + +# Redis config REDIS_URL= REDIS_TOKEN= ``` diff --git a/packages/create-onchain/templates/minikit-basic/app/.well-known/farcaster.json/route.ts b/packages/create-onchain/templates/minikit-basic/app/.well-known/farcaster.json/route.ts index 10d2a1f2cc..3c6a7f8cb0 100644 --- a/packages/create-onchain/templates/minikit-basic/app/.well-known/farcaster.json/route.ts +++ b/packages/create-onchain/templates/minikit-basic/app/.well-known/farcaster.json/route.ts @@ -1,3 +1,16 @@ +function withValidProperties( + properties: Record, +) { + return Object.fromEntries( + Object.entries(properties).filter(([key, value]) => { + if (Array.isArray(value)) { + return value.length > 0; + } + return !!value; + }), + ); +} + export async function GET() { const URL = process.env.NEXT_PUBLIC_URL; @@ -7,16 +20,24 @@ export async function GET() { payload: process.env.FARCASTER_PAYLOAD, signature: process.env.FARCASTER_SIGNATURE, }, - frame: { - version: process.env.NEXT_PUBLIC_VERSION, + frame: withValidProperties({ + version: "1", name: process.env.NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME, + subtitle: process.env.NEXT_PUBLIC_APP_SUBTITLE, + description: process.env.NEXT_PUBLIC_APP_DESCRIPTION, + screenshotUrls: [], + iconUrl: process.env.NEXT_PUBLIC_APP_ICON, + splashImageUrl: process.env.NEXT_PUBLIC_APP_SPLASH_IMAGE, + splashBackgroundColor: process.env.NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR, homeUrl: URL, - iconUrl: process.env.NEXT_PUBLIC_ICON_URL, - imageUrl: process.env.NEXT_PUBLIC_IMAGE_URL, - buttonTitle: `Launch ${process.env.NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME}`, - splashImageUrl: process.env.NEXT_PUBLIC_SPLASH_IMAGE_URL, - splashBackgroundColor: `#${process.env.NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR}`, webhookUrl: `${URL}/api/webhook`, - }, + primaryCategory: process.env.NEXT_PUBLIC_APP_PRIMARY_CATEGORY, + tags: [], + heroImageUrl: process.env.NEXT_PUBLIC_APP_HERO_IMAGE, + tagline: process.env.NEXT_PUBLIC_APP_TAGLINE, + ogTitle: process.env.NEXT_PUBLIC_APP_OG_TITLE, + ogDescription: process.env.NEXT_PUBLIC_APP_OG_DESCRIPTION, + ogImageUrl: process.env.NEXT_PUBLIC_APP_OG_IMAGE, + }), }); } diff --git a/packages/create-onchain/templates/minikit-basic/app/layout.tsx b/packages/create-onchain/templates/minikit-basic/app/layout.tsx index 404c2b0535..bd1b4d6cd1 100644 --- a/packages/create-onchain/templates/minikit-basic/app/layout.tsx +++ b/packages/create-onchain/templates/minikit-basic/app/layout.tsx @@ -1,9 +1,8 @@ -import './theme.css'; -import '@coinbase/onchainkit/styles.css'; -import type { Metadata, Viewport } from 'next'; -import './globals.css'; -import { Providers } from './providers'; - +import "./theme.css"; +import "@coinbase/onchainkit/styles.css"; +import type { Metadata, Viewport } from "next"; +import "./globals.css"; +import { Providers } from "./providers"; export const viewport: Viewport = { width: "device-width", @@ -18,16 +17,17 @@ export async function generateMetadata(): Promise { "Generated by `create-onchain --mini`, a Next.js template for MiniKit", other: { "fc:frame": JSON.stringify({ - version: process.env.NEXT_PUBLIC_VERSION, - imageUrl: process.env.NEXT_PUBLIC_IMAGE_URL, + version: "next", + imageUrl: process.env.NEXT_PUBLIC_APP_HERO_IMAGE, button: { title: `Launch ${process.env.NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME}`, action: { type: "launch_frame", name: process.env.NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME, url: URL, - splashImageUrl: process.env.NEXT_PUBLIC_SPLASH_IMAGE_URL, - splashBackgroundColor: `#${process.env.NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR}`, + splashImageUrl: process.env.NEXT_PUBLIC_SPLASH_IMAGE, + splashBackgroundColor: + process.env.NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR, }, }, }), diff --git a/packages/create-onchain/templates/minikit-basic/public/hero.png b/packages/create-onchain/templates/minikit-basic/public/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ec486188f7cbf8f5470a7e9fe26bab7b79ab47 GIT binary patch literal 11776 zcmeHtc{G&o`~N+*LZ}RtU5l)(qAZb;CA%;tJ1LYUV^2*kAE(Zo=YHvJ~o69hnD6kBZQc; z5n}M($O0q!ssR@8!|JYS?uigPH})TgVxMk@L7bL1Mj#Fy@(RFyRNpa4 zW52m#HaPfsa0JH=Kjd^)0ygTPTgd=FA}$QP*rPc&hykIxSTgW~R9pYM^uJ>IuSv9W zBUMut78ZL4huybthq$a>HQU6&p01_geL3Ja!JBrxtIDF{^_x#x5m4)R>%8f-c3mOJ~%qcQQT2gr6#>^U-i-w^+^Ru z0#Pi%Q3uKKiazhkCl>8(Y($7Mx^~O`wJPCeR({8RI2utFz7_Wn=4kq%W)c=}!ajY{ zsqOq#v+z~k(o8_v7GMIhhM}s9@5Un%hek#sLWKQf z#Ulb*-8N^{5km%gfaBoag&b)R$AKqHwi&bh3t}cEX``=Bp*vy;) zv+Lf~){eO8Cw&|1UbUH?o@VLKOerW3%0WL&F=_p?|LVjULy}Xp`*^us*LW}ST*3IE zMz!agHf4rg&L7}KuBR&*$YPq2X6KLHw8}6YaT81OH7aa>t-F!pE9drIvXsHy7$aFc zqmyUCeX%}jv^(Y8r6V%44r_?%dexmqw|N92bT|Wp5mjljFr}#9HkT?7|zI z9SXbkU3+6?*hVlRGCp%Q?D3T27e?+40;K($o6Vx$)SceKOQvE5Mn06)PCZ(XV#G0d zVIee^aJ}L7;OGpCE;_CQ6q>Xjk~3BLZspkGOeKvxJfG)U*Ut0vfvauUog5^60-F*0 zc2Z=l9y+D%mWLcUpb#Fgr8!`g-@y9osGV4dfD~(N~CzHo-=phF+H#I5E(Syy(gr z*BVpq-!lKZEXmzu_U)+rq2tGemY0`LSS=;$@1V92P$8CFrRW?X9d5e?N!`W=gQNKi zZi>ISfwSc$y8y@8I!=?$AHNYuuVjN;E{{YO9Zpr-F|+X%vd{o_&R?lp$_)w;Vw-Gi z?%NjlLE{PY8XwYceYXj@Ry-upl>^awL?{f#XL^%{dS>|#1~Vg7McCV&eNo3cP;+7N z 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 literal 0 HcmV?d00001 diff --git a/packages/create-onchain/templates/minikit-basic/public/icon.png b/packages/create-onchain/templates/minikit-basic/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3c828cfc8f5c5c399fe48b1b498f3994cf5f47 GIT binary patch literal 17815 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 ut6xS8UzdQS0zp$~r>&3fZ8w^Mx7@J~D3L#BR zn-H0XhaFd{qUMK4{k^~TAIJ|?RW+5WRIRE;QLDC5QZ;Rrh=26qk`_`>cqN3qcqEJW zf!AxV?e)GU_uOR`uUS9#&K<(Se31p--MKUKnRCxM_nf;}0H`n}O$tm&l?ha`OrVlw z0+lQisAQQyCCdaVStd})GJ#5#2~@I7pps<*l`IpeWEl=rQ3|K5V}C6kL(h10q+#Vdf|<|fF)})eO&hy0pPq-q;Xoujj$gj?62EYIzf#e0 zs;Z);)rX$mez;sNsCj+2Q5Z9i>({Q}?0fGP&r$I>FbJr2LBk`@z~}Q}ety3Ap4DpQ zfB*c&p9x=haD4{`_B@8k$qC4m!{J0em%|%>`6EQ|7=JqDTUuJMsk^%bCMm}*xTdz2 zzb7KH{QiMQ5s%-5Y^B*OvNNdbH*`V7)(iovS>4DpqliVLWj~XcoW$Y7NBQS8Kf79y zA0{i3;XBJIm70ZrT@WHN%tE(r-3qtcz2y4@V{UF1`}aRqxgQnuy{jMI0?|h$9jIoV z-+B5l5`T%rvY#bauy@}+IGxVQtc}k^W2|%0Nh+3fpak=qgM&yWldFOhi^Xu{$Wfud zbT3LOPy*=j)UfFL$Q^-bDbdvJ=C@oq{QP;IIoIeG-qNTeb-Q5LvHM!(CC zuXd!qCtmK31h^)V(Ar zS57c{cI@CFM5inrH^rb14jwQxB{EvNfoc#B9()SP>1pUuCX>Og{(fFasa9XA8z@=R zlME*1oH8I#fI2oja?1}_A5>jH31EFg1A2RVxpm19f%NB1o(zx+>oCmyWN~0VL8u;ir8u~1G zb^##?0VUt2HQJ1pwj^Dssi_1DR(8XzmKt@D$T&nK#VXAG@gui?{>#`m)GynXz5 ziF+a6dj8yL)G^;G`x+>tpv>Z<%O422G~qUKFc`$M-+zwvh30s}Ot$D|YHDin+J9@W z;@sJ@CGBSI-yI#Bu&t*LHmjZIt-8*4>+f**2HrXG4?gYhT3>$Qj*ZUFF5VN$tMXDC z8aJ2C;mVcIc;#Q)FtPYE+6|NY(QBt11RIaeBf3|hI1U7*=fwA`4Bd+JAnLx{eWzIN zye;aqmwR2d4Bsr)w6=wHG<`fGQ-7+H%Vl{XIvO3v%~*s-Y?-cuz)^r2?ij-Jo4<#- z>>NCHH-2>b1-uh^7e-4ePz{XT?!b=TeguLWSg=x&W`QNgGl9aX6c$9BZ23xnL!r;{ z-kFnZ8JjE{d_>gO{4h=(J%LZ77r0gC)f_f@`{4c6Iz&=pJ+IZu21(LjZhzUj4cmLZ z#**(zB$MS^B2-kFWk004x_TTOI)+a^x`fmJ|F0Bl?Q41%lT+8ZrRLN^N;jLlfz1sY z4F@W<>-qTLK@OC5#jV!T=(xmW9Bu0Ycxq@^N>O<}pT^=_BUg}7(=b}Pfod=ZzjX*M zmz!?@69JM*r@22p^z^9Ej(@y+MY^w=w~%{x!R2;yAo|A2^PVH=th-4^KCpZ9 zLoD#5AVZV|&{l7+*N+FT>q*wRYxiE}1Ld|ssG8J2uou<1=FkPy?eUDDhcqMrie>?CBTvpnqu9iJcvDM()e?5e^Lt_w?E}*rw^@c`cO2Zbe zp6rU9!Td2kp18oRb$>Zo7p>cE78}BI(PfXJ2lo4K{2I+KcR^ITe5lnbZJ||Gief35 zo&+(QnOPC0sA$|wZVq~+GY>Vo1%i@gsKWP-8r#dVDK=Piq-(lNOsl3Fr7SC`EOaTe zta6mh&BLKA*YdFNsY^c#!O-XJ9F~G|hCr`46$e7I5nb&RU4K9);}a}!v>N6|lhdW$ zPMVUPzw5y-9(keAt|(JPA&`EL4_$Q|kjdX}b-S!CoSk?dQ!HSWi}F@x`Sie^Kk>t2 zHX$Ni<-4}Fc9wweD2trZS7Gv)8P6 ztlnm$E}%5kFJHRI3dIh{6#3=Q=hu)*QGMV6*v_ble9?vTXZUwIRY`4R@{RQkjW~63 ztSa}}>n@Iv-u(OPXk=@8y_I%4p1x`P?|;6@S76oHqJNfB52bd;*uUOFW8+$32nEYr zgY)Ok;6~^=s#VfjAfYd=;rLr`aHt|vwUJepPW^8Tmp(Xe;06lgU5K z;kSIh6ZyfFRy7oS>ThlMdi~W`SXBR13QUL9e#d@Cl_m977{6msdS6}xQd?KYEBStZ zpzxopsDCJy#%PV6W<8|vc!*nMA`zEnl{Ah^aU%NMRai1vD70d-*b&Yqu>R#OhHsTI zaQxdtJDg59oi4sjkoxl}X2F?Ey7=WTGA5Z*oK`*b@OHKAKvvE2O4G^c8NN=>=8Y*g zYPxUtHfcLZmipbe^O~E*r0TxhEcR8(1S(l3P&LUifl8JMRI*H!9{pyw%~Vp}ffoaedi zCFheggbTgR{q(u#dCoac+Xvt&9BlN%!HN^gj1$U?6UvMe%72U#%8V1rj1$U?6UvMe z%8V1rj1$Vt0DK@E4kMXNq0wldR=bOOy^h0*xX@fKkJ-7oJ;#d0BIb)%V9V&SIMSJE zjE=^^#n#p)s?|GKytRP!^~ccVhSzGh|rzrEO`DOMd^OhyUjo-1YJag?su!d&Y80x z;xNH3loAm=4hkhGdK?zmh3Z7-E{7>fS%p$$nv99`oPS*2EJ5`eY(l-tBrj~ss9u3h zD9N+fs50O=jsO5LMbwnsT8;f zdKqOc)Fu&ig373%CMYYR1r%UL$A;%1G$PpL`0xkVtxxXbUx+ubV;oXYNWv=g-*OV$s%(XI@iR+B!Y^SP#P=K8UBc(?&Od`Z)PuGC6sPY ziB4iFu}s>rdjVsiBvSI$oSI4pGD?kwQh$jg2}NllfMcogOoG;QBB8<__seg>wv z)h1?)h0<1mG+UeUufdJ6&`lpMw(auX(l-#NbRMP{Cnee-8xk&S>h=4r2j|bJy?^ZQ zfsjX*pXrdz=fA+dJT3!wFTfPz)g~%wPQCLkB>Da7<>p7NjR@Lm(*qSflH(}d?#42^ zh{V`xj!%}7OJ72gM}%BHdsDzPur?Aj>#-=V^Rl~9V(YigY1y!Gi^S1w;dP_ZuT zX`}5=ramK*N$2vT5ljk}nbL|%9)G|5{G*i!dhTy3GFJkah+c(l>PeAGw<>+{i7xb< zU)38z=LkBi--<)GEJYXzqQzla)9kcJyxZmW&yDNNpSs^Z<4Gj7vugAzGy|&s07=A~ z#b^mGG!S~Ra4)r002ovPDHLkV1l>wj$;4- diff --git a/packages/create-onchain/templates/minikit-basic/public/screenshot.png b/packages/create-onchain/templates/minikit-basic/public/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..46987b6ee276eb9d806d235678afacf311bf8b1b GIT binary patch literal 31589 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 literal 0 HcmV?d00001 diff --git a/packages/create-onchain/templates/minikit-snake/README.md b/packages/create-onchain/templates/minikit-snake/README.md index 78f0ebfe8f..75faeb2e88 100644 --- a/packages/create-onchain/templates/minikit-snake/README.md +++ b/packages/create-onchain/templates/minikit-snake/README.md @@ -31,21 +31,29 @@ The environment variables enable the following features: - Redis API keys - Enable Webhooks and background notifications for your application by storing users notification details ```bash -# Required for Frame metadata -NEXT_PUBLIC_URL= -NEXT_PUBLIC_VERSION= +# Shared/OnchainKit variables NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME= +NEXT_PUBLIC_URL= NEXT_PUBLIC_ICON_URL= -NEXT_PUBLIC_IMAGE_URL= -NEXT_PUBLIC_SPLASH_IMAGE_URL= -NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR= +NEXT_PUBLIC_ONCHAINKIT_API_KEY= -# Required to allow users to add your frame +# Frame metadata FARCASTER_HEADER= FARCASTER_PAYLOAD= FARCASTER_SIGNATURE= - -# Required for webhooks and background notifications +NEXT_PUBLIC_APP_ICON= +NEXT_PUBLIC_APP_SUBTITLE= +NEXT_PUBLIC_APP_DESCRIPTION= +NEXT_PUBLIC_APP_SPLASH_IMAGE= +NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR= +NEXT_PUBLIC_APP_PRIMARY_CATEGORY= +NEXT_PUBLIC_APP_HERO_IMAGE= +NEXT_PUBLIC_APP_TAGLINE= +NEXT_PUBLIC_APP_OG_TITLE= +NEXT_PUBLIC_APP_OG_DESCRIPTION= +NEXT_PUBLIC_APP_OG_IMAGE= + +# Redis config REDIS_URL= REDIS_TOKEN= ``` diff --git a/packages/create-onchain/templates/minikit-snake/app/.well-known/farcaster.json/route.ts b/packages/create-onchain/templates/minikit-snake/app/.well-known/farcaster.json/route.ts index 10d2a1f2cc..3c6a7f8cb0 100644 --- a/packages/create-onchain/templates/minikit-snake/app/.well-known/farcaster.json/route.ts +++ b/packages/create-onchain/templates/minikit-snake/app/.well-known/farcaster.json/route.ts @@ -1,3 +1,16 @@ +function withValidProperties( + properties: Record, +) { + return Object.fromEntries( + Object.entries(properties).filter(([key, value]) => { + if (Array.isArray(value)) { + return value.length > 0; + } + return !!value; + }), + ); +} + export async function GET() { const URL = process.env.NEXT_PUBLIC_URL; @@ -7,16 +20,24 @@ export async function GET() { payload: process.env.FARCASTER_PAYLOAD, signature: process.env.FARCASTER_SIGNATURE, }, - frame: { - version: process.env.NEXT_PUBLIC_VERSION, + frame: withValidProperties({ + version: "1", name: process.env.NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME, + subtitle: process.env.NEXT_PUBLIC_APP_SUBTITLE, + description: process.env.NEXT_PUBLIC_APP_DESCRIPTION, + screenshotUrls: [], + iconUrl: process.env.NEXT_PUBLIC_APP_ICON, + splashImageUrl: process.env.NEXT_PUBLIC_APP_SPLASH_IMAGE, + splashBackgroundColor: process.env.NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR, homeUrl: URL, - iconUrl: process.env.NEXT_PUBLIC_ICON_URL, - imageUrl: process.env.NEXT_PUBLIC_IMAGE_URL, - buttonTitle: `Launch ${process.env.NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME}`, - splashImageUrl: process.env.NEXT_PUBLIC_SPLASH_IMAGE_URL, - splashBackgroundColor: `#${process.env.NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR}`, webhookUrl: `${URL}/api/webhook`, - }, + primaryCategory: process.env.NEXT_PUBLIC_APP_PRIMARY_CATEGORY, + tags: [], + heroImageUrl: process.env.NEXT_PUBLIC_APP_HERO_IMAGE, + tagline: process.env.NEXT_PUBLIC_APP_TAGLINE, + ogTitle: process.env.NEXT_PUBLIC_APP_OG_TITLE, + ogDescription: process.env.NEXT_PUBLIC_APP_OG_DESCRIPTION, + ogImageUrl: process.env.NEXT_PUBLIC_APP_OG_IMAGE, + }), }); } diff --git a/packages/create-onchain/templates/minikit-snake/app/layout.tsx b/packages/create-onchain/templates/minikit-snake/app/layout.tsx index d5d985ff69..1c2f5de727 100644 --- a/packages/create-onchain/templates/minikit-snake/app/layout.tsx +++ b/packages/create-onchain/templates/minikit-snake/app/layout.tsx @@ -17,16 +17,17 @@ export async function generateMetadata(): Promise { "Generated by `create-onchain --template=minikit-snake`, a Next.js template for MiniKit", other: { "fc:frame": JSON.stringify({ - version: process.env.NEXT_PUBLIC_VERSION, - imageUrl: process.env.NEXT_PUBLIC_IMAGE_URL, + version: "next", + imageUrl: process.env.NEXT_PUBLIC_APP_HERO_IMAGE, button: { title: `Launch ${process.env.NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME}`, action: { type: "launch_frame", name: process.env.NEXT_PUBLIC_ONCHAINKIT_PROJECT_NAME, url: URL, - splashImageUrl: process.env.NEXT_PUBLIC_SPLASH_IMAGE_URL, - splashBackgroundColor: `#${process.env.NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR}`, + splashImageUrl: process.env.NEXT_PUBLIC_SPLASH_IMAGE, + splashBackgroundColor: + process.env.NEXT_PUBLIC_SPLASH_BACKGROUND_COLOR, }, }, }), diff --git a/packages/create-onchain/templates/minikit-snake/public/hero.png b/packages/create-onchain/templates/minikit-snake/public/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ec486188f7cbf8f5470a7e9fe26bab7b79ab47 GIT binary patch literal 11776 zcmeHtc{G&o`~N+*LZ}RtU5l)(qAZb;CA%;tJ1LYUV^2*kAE(Zo=YHvJ~o69hnD6kBZQc; z5n}M($O0q!ssR@8!|JYS?uigPH})TgVxMk@L7bL1Mj#Fy@(RFyRNpa4 zW52m#HaPfsa0JH=Kjd^)0ygTPTgd=FA}$QP*rPc&hykIxSTgW~R9pYM^uJ>IuSv9W zBUMut78ZL4huybthq$a>HQU6&p01_geL3Ja!JBrxtIDF{^_x#x5m4)R>%8f-c3mOJ~%qcQQT2gr6#>^U-i-w^+^Ru z0#Pi%Q3uKKiazhkCl>8(Y($7Mx^~O`wJPCeR({8RI2utFz7_Wn=4kq%W)c=}!ajY{ zsqOq#v+z~k(o8_v7GMIhhM}s9@5Un%hek#sLWKQf z#Ulb*-8N^{5km%gfaBoag&b)R$AKqHwi&bh3t}cEX``=Bp*vy;) zv+Lf~){eO8Cw&|1UbUH?o@VLKOerW3%0WL&F=_p?|LVjULy}Xp`*^us*LW}ST*3IE zMz!agHf4rg&L7}KuBR&*$YPq2X6KLHw8}6YaT81OH7aa>t-F!pE9drIvXsHy7$aFc zqmyUCeX%}jv^(Y8r6V%44r_?%dexmqw|N92bT|Wp5mjljFr}#9HkT?7|zI z9SXbkU3+6?*hVlRGCp%Q?D3T27e?+40;K($o6Vx$)SceKOQvE5Mn06)PCZ(XV#G0d zVIee^aJ}L7;OGpCE;_CQ6q>Xjk~3BLZspkGOeKvxJfG)U*Ut0vfvauUog5^60-F*0 zc2Z=l9y+D%mWLcUpb#Fgr8!`g-@y9osGV4dfD~(N~CzHo-=phF+H#I5E(Syy(gr z*BVpq-!lKZEXmzu_U)+rq2tGemY0`LSS=;$@1V92P$8CFrRW?X9d5e?N!`W=gQNKi zZi>ISfwSc$y8y@8I!=?$AHNYuuVjN;E{{YO9Zpr-F|+X%vd{o_&R?lp$_)w;Vw-Gi z?%NjlLE{PY8XwYceYXj@Ry-upl>^awL?{f#XL^%{dS>|#1~Vg7McCV&eNo3cP;+7N z zI|S>69*@{8Vg}(O6QW404OUm*pd49PSg`LUS6Cy&2L?jVZ|aX`ecsxhdp`Zz7eN>l zg~8~3!md7xX@X12K(08Botzn!7&=6o)#N5brv;56l%7ClR{g5g^Py*UmQPqXVr69o zU|9<=JE*`}P++YvSe~-Re+vk2P;%WQ=+~UsKDLV?M8nQ75x|e9W2S%*K>|DC;Fx2$`yZJf@8fXw`PS*T^Ss z!Q&7?4t8oh|2@jW!Bnum6MYx4ea8e4k7!6ENj zX?*WXQ>kPCp@pIt8OMAF4Gg3~>l2mLH$Xg8?8tS!KWUo#jOqQ+P8*y7-(#+Vl0XxO z^6LmmV>*_VY)KoU-8{ohQ1lrC`Cv|`DgiDzAy#7a#RaMySw~lqRer%P3@8EMF;uMU~o4TYT6@Er>7N>w~ z09AO?W%q!VjHE+xM}OPEB-qH7+H#`V?5CWp>~13l1g34EBVlo@^SdBK<`)$eDhLf) zfgJ~v>TZl@VkC6Q3n4_>4~$o7MVj#o%#8sT_R9!$L8PO&H;qaaH=HmAo-NP7v%xz- z*Ky*mUArJXp)LpwlmqM9?)r%5MXElSnD6H)3|=O6$*Ai{CHEiGZTPoNL)Z= zx{0JovzfGnu1#227!(XY!5bcAd~|#2IdX>|f&m$`b4w7Q$T`#M!f5=lIn2vdi@-4* zoYvGW=t>3mI?Rm3kHLP@f=VQDn_~+L0t*|ExFU@FN_sEFeI)&qzhjdj@clsx_L2f! z$0ghTRFa1i_rQtK+WF24p(fzt>$?5`vJl~yurMh#3}?|1cyedWwI~)CSGLUePlJO5 zoH9Va2WlY$>rHn@?3No&0Ew#i<%<*FKdTbTn z0F;HN3A<($o1dD}74SWP(E6A*EhstbV(|0lq8@le*$ta1hy_c9bU0BbCME{Q$3an{ z5T+>hLf85m$)?&Hy5`nG>)PP1rhXIR#7$G0Dea(=k^n;Z$8fYpQimCRAD526Mp%of zeH7H5Qh)mN>0x0Q0fA65K<)BlVp~Rie$!84;SnDN3(uJgCK($kbs48ZOi&?<1ta zv00w^-%1P!e-9e~Nb_-;#~h2TMGzpj1G~iG$?530ll^;@AFnM8f_Z1mTXvdBWR9ht zWklp9?95MCXr1t`Gs!3Bd}l)j2)sb%@Iem|kqbb_L61sLHuL~f|094OV&}wfuIFYP zs>3AGyiQ0>j~_Fti^B$}+d*YJfsXaaS_GDVF%6$7;F@yhKdx360W*z{b?O;n>X*bq z%$40B6xsE_s%l7;kRHiGXdYvqFC<$cXg#n_g5lHgeVhfxTZbqC3s68~mVcY-p8vMT zTe}*QqZKgD_qt)4XHR6pfcBcZSU^OO-MySx(F~&yB#i3 z1Z0~jSZ*q_o>rqkBw;;0Juv)gZMduaX6|}grJIA4Xotq!6)o-7(<;Rin<5=d3+!`c zY*hZ6R>_>eKH(rOh!lsvyzX!pfSU9=I^BKQSCJIAo>nO*vBmv88bYjtr$OqNx=44( z%$2#+_h7L@jzbqJF~^?;m_vBX}gqb-b+>bF;4@3>im5_VKut#cMPZQL)C}zD&0kQWDg&< zTvctP_Kmh~z!4zDR)&;LH@!!u|85gpDT>KGt;tFVVO~Q4$NPVpS>>GGDD|LqgW@v7 zt@rOe#mvO>rk9cjwy$OS-=a=ozk~Z~83_p%*Q~6LddpH?etvprnY}V>%?9{Hr5m8| zmQ&g9YHN7bIC4P88Y~RNa7Mc#N?7HZG&wF{tnOi*R%{i~!eXO%Xr6*^`!o+Kfb{Hs zQp368Nl7rX{G;aS79I(fr&k-<4%B!|R(s5Kpu#<1K>XST+2O|@ed zHIbgXC4O`IY57X~JR+Zi@KKm*UmIRCpPGs?z5453&9J6h#2*iA(iP41o{c^{Gk`~r zFk^d^aBU&Pd^M4C)El}6zg(?l_H@17np4;Kg*Gru3xZ*-er6||IR^7C;HCdqnvy=xaiv8;B))Yp*hE5}o2>VmJ{2b0r>rKE6;altEvFq4>m(UJ#hou9~rGlJ>oo#JJ(OPA0x~GPQRhv6`sgJ)`&2z2(o|}M<$?2G+2l;P!qeH@ zKI_y@*lUb5o2|p;+t4D|46OyqC8KQrv7%l1)|CTOA>w3KHnwi2c+W;@l>XYw0rTRBQ1YjT&NCSQJS!e-{_ zxh;c@VXcbLjpQsH=dZA?OUyPZRJhXL_9QKE)LX)a+EDqUec|hOt7dbHM+_!JcAaNM zZTC!>a2MHu`(*wdJ5p=XEpz-nKEm>PojH+5Y381F^~e3I);(-U1T#6AXuH;L-?Cb| zEebPdx8x1x@wp3QO`&0O! z5D&_~Uamkm(hRLE!b|mx=_BeHMMdpj&paMp-E=;8wJ)IW)vjmZwQ?$ajAe|CZ2Ad- zk}JitTV5f`VOLtO3GD;^FxE2bfH+`KRkTq;^ax!vx&6{uZEjA`*Ma2C?ysqZ}x&JP!ny*mmWPcF5& zT`jP836h_r3NN`n^&Q!ULwVsKVEKp104Ryp>}JOVY#P*KtF;e~d`gW>&b=7t7O}ec zTIiB>Ch6OV}tGvPHc69V>3YI>gC#*BZGv#$Lav{uh7_vq*9 zd;dzG8PWNaapeRaYQ&+rv1MZauL8O2daxhwp&QId)Z&OS zQ9{XcA?bm-vGVeu^?9GgVgHbom5&GKKhHxY-@wF+EM+p-#!`RrWX6gwTP9aDlN5hZ zxohpcXYEvXjgDHmFr3#S|Y3%g^WCjzd2jb)a}u z7~%*DkPH~Pacjx4C~W3ekFdD}6SC0~gE}ud?~w0miV!}FO)RiNj8h=AF)R-5buuq7 zK-In$j)xOw_;1<`&$rC|-j)9(nzNJ%b{6%g%p_wlYXlNLa`@|owsqb ztR%C6n;6sjvvgAQo68+O%(BCg0dpE|S&L3^4pucYYjik0!k?TwTl!`zqUeC(DD2A! zJl3vvxa-xmAg{BCycGh;;7hNQZ`BxOaxQo5v;9x;*d>uWtWKLw8lVl&GazwBI5)h_ zS?xCOxq{EP;8tM=m=Wm|n^_gZ=mS&Mvgpl-@(nv+XPMXL_UE-}l1Q}&=+Co^EzMQX zRHPPcP4)t?yIwY?b2dqoc$)z_wZkeVT1E#{mWNqbzJ{hC#0s=aEOr|4U$A58)P>rJe9VsAF5$YFdu%cR zCKEryWULoyfaPkL^9!LCP<8=5pi~M~$NC{nHuy-fp#}5<7=YDB5SovQnC(ht#343p z%K0YJ8KUSd3u>igE(7Y<$A$#nCvRNq=B^imX8;7m{ zcEgo?z$re!(#P9U~N1VN;)?>bq%R<>nQowv55xDAMx84F09CROk4EAYVG*FhWl3) zj+-nNdxS-6DA;H6X0OcgH`H<^C)|Cet0KIXz}7mqu{*me7Cv225jG$}@zEQzIy)ENq9uPWkvv{xY8E;@012j`HsFsG(RpcX~h8X1AGXz4;4nqxx;I z45Tmg$NPTl>z(!ymsczT6@E`VTQ$6TeK-b@9X+cB$;sIYnlb&8N-D4CrzQrTtz`PD zizW@o*0g4guMnXT+hw?TRSHo~RJ``mxH|p9G)_FEsOX-@M27r}$m5EWLx1!aS5HoN zHwqiQ2 zqO?+;4X7-JjVrY3^(+r;D7UyFBE73qU zwwT~=&mX0wKN>Uk#WUVCiy~cKJX)Y@3vB@~Vh+#M&_l!3o`K_CiaOSYl1^+R1+TB} zLli^oC3m*?3%&Gr*Btw;p;}A1J-K5-SsWwM^SOX(lFP(UT=9h^> zlUT?1fPA+2uE=08R3IHavSDCHBEmpQFlfsE--1b5hifbFg#^m` z2jD^Wt(suiU4#o`@0`W-z2iUoidaw`)+T$)tCMD+mf(WOSHbmVKP9o9@Bhy`fh#HZ zmA=xIBFCR{t=;XZz7;4*zORs@=G)twO3sZb-ED=V9|gC+9dq{i{cCME1{SK%G4TGJ zN`xX;3{%7tvic4$JBE=9Zc4%iaw<<2QV{txIGF6Gj&|`EU@DESA>Bubi+2c7wZE!5 zCYDn#Fd#n6{j-bOW>*urGNQ(cy(B-a%(SI2eAubnu;xi&n0FG0q81ji!Rme_JGiXc z+pv-$A+0Sc=(gJ2e0>X|Zvt+0dpLQ|AL{5yt#T8XfBWQczSs4k9Nme7?K4chPtitlAvnUu#%JKL|4VO+gNz+d&AW(4*LRN4I&TIFN{hn_86SONrqpfVX{w5-ku~^~g z=t!(g{N3bfvAb(Ccc^UFt}*E79PQ;)ZN`soyI%MmuCbxvOD@HXroOl8<{kCtWkd7O z-2;PDHD*QlwvjCJRfw7ovFCb=&DrAnxFPiVt%Y7Z;@!55AyiD4YoD~QH*USHM~ci! zU>E0WkU^^DnBYGPiiXxLi2UyppQw6d>xO}W{m`{u+vV=7tf#EvY$HK`69TK-t|alM z{+9kEu=xjvv1Fv_a?6#?kjc$o4~KFAK+q3`7a239=*Mq@@C_f=&<{Dud_3rL3A`!R?532#WTn0=(0F-af#iM{v0-k*)FirvauN8eEZ(25Q7%%AB_594G5 zXBI}R4gnm&0*s9OTKi;Qva_L=?HhJz=7wTORwmu$Av?A%6zlxUG%>Y;jM@^Xnx;)c zA?4sPf9!awjv()FHi z&|j=#)`Vo&!7E?le`+>-oLUpb+LZ&c_vC z)q33UmDNvB|AUN}m?2+`7itn~nXKO)D;$b?28Xvc#j!R#RoLNP_DpcaaCw&J??p*j zbBcZ_!D5&0zjs0GU6}eepOVhhoRHN07q@;1!*;S-t&{-`>OtMa{LfC)T(8AUN=!FVI=`WNYA6aBas$dj&i`Y+Fj(yl$^Zwb&AE$00XBY&+mR0U(dQZ@p^Xg+Y z|7Hgwmn9(^?iwr4hZiy$u-(i5=CSmx5xzfp?=g2%d+t-y+yPx{9I9-ArP_N0eXftr zOnG#FU-lS?ce!b&NuxLofA}DR(3u>yjjBTyMfc8Av$uaPzmi{`KzgyjMiXPZ2wx6i-9ES)UqZ_o0DvRs6Juyt&k+hw>MaM|wUKi-alo zO_1vn*1PRVE7bgfR>AZAop%R~|n9(_gIo5L$NSKEwNg;IIzoXYfg1 z;px~qzOKUeVd>`&c&IDh&urVQud-nFkme@fr<9Dp0FU@pEWVtSm*46h@r#uG7%fWlG&T;l835Sex@|`or=4QzmO&_T4>Lnb2 zf38opjkl!aT)8qhUSaV>eh>v3T z&E=lGcmI68_rHA(S*_T2+9yV|KS?%`Oo^;diw+28eNBv>Q4JM=&zjydc8}F5^mJBP zEKS^9wVPx^?V4EIplEAe)2&vUQI~}Q>_e$MS=(s47A&{KF*b)%Y}B_O9b z^Q1ivqpN=cWn${Ixy@FO&gf5kz3?pbt(yP`qAY{m*PU{caR^L;2GS30L)x5KGtnor zXhO1giF#%xi@k!)RKkeryT_<8qsh7F9kIIIWU>9F?0GK$Ku0H9QxQ^t8$PVx2U!?? zkOSQNu04Vb;qSj+Xa4si*8hI6`~UWF@~UudO~;qJ?{)yRKuAkn?^LFm&CUM-;U<2? literal 0 HcmV?d00001 diff --git a/packages/create-onchain/templates/minikit-snake/public/icon.png b/packages/create-onchain/templates/minikit-snake/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3c828cfc8f5c5c399fe48b1b498f3994cf5f47 GIT binary patch literal 17815 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 ut&b7%6HMqQWl> zE=HC{2=e3x+lnJ2f&?xd*lT1RfSK&UU=SSAKyhDh6>!EzluT`f#)xS-J^G0u-b@SF!J#W9M-q^%bufH`WRlnP5Q(9E` zTdGv^MS6fw%7bz}&DR%hn&tgeIkC%3sQHBamg|wPjG6Y6K4N#`!;=&4%3Nx_NU*`p zbr7>s)_;W=WEEHymZje|Snv9qIrM7Rts(}=Q;j)2n$bu445JB^Q@pIX&XTie?d%RADMYp!f) zIJ9=@$?C87w++J#TJLCghGtB!1VPqUb`ih)I|3oS%&pT@FMYzjo|l)WBlbA`FrQw? z5>ZGuQ0?HI+uSS|ghYmwNgs_Naq1}vTM25uYHZv)-x#MF}byswRYXPi`V$WcN z#HcDO^Xr~Hd;0wO$qNV#kzgU>0E>)AN#o3KTKKbq79N3=iJ{?o)-WK+i|5X1ktSXQUlKc* zq4PO9qWF2(Zh3hIJQcR*wrhax_B6|R4V!L+}3_j?sPNdzWGtaJj71^=gm>x+qt zzwdLFlsc}{%x98Xk#)~x_;3m$ z+KXSw2XPGfav;U?xqOS!y9`gfSf)!c&N{VDsrsu3+-3h(dopoKW_9aQ5t3p@&!eb4Ef=D?p$it(}XRUPcS!(Hh zx^2RwJ0LOZPjRUxLfh>yCQ&jUW@o+hp8k5mCm_H<3grtNtGJbEh*V% z9+eUnKBy?&G#_DkO9wxcJJu@I&4cixGvzdA1&EKweLi)AG11{?&9Vm%6O+`ysY<`8 z0Av)8WuW+UI8$ECRPItZ^TgqDrD_Jfbv+!kNfcQgUB;WFed0G529kDME5DJTV}46J zj+H(lIdc#75(B{(j8&3~e)UJ917{ASM4x|8kA?nUgv0vvm8~@tq~H*Yu2N*d9CNg~ z!>zROsGDo&4wFdogsDxGehR688&=0|5*g%)iqZFGo|pVKOo5bsip3VXBdEpL0_Mgq zIlA43o0~g>w<}Uch*F@JMUqAPUH<&}lu_92Z8^IwnCXr@pC0_J!9kw{cTUO6Ri%Bv zZ`J9Rs;}b`Q~pz83MJA6e*{j3JyA=YukfgW=SJ35avQ_0ZSAfj;%|3d=@&(_3WN0aHYh6ocl{MVzX8^DC!wE#D8~IODd` zAK3|O#Y%M+jC}Zf3IK8I=r4zz`%st|6LE38uL@hOr*+kK%U+KW6gz<;We5 zZ-O(KKN53@^Z3rg+J#50awOTP;{)U4r!eui)H7{1zW>P4NlsEz>F~OiF8}Dn$R73h ztobvqK+WhWvT$LSq$2BFp+(Z#`Hq`h`6``ce37j`VjT_YJ){Tf9pR=bY5FnsF~;ZH zUq;$v`y6Ts=rpCbF)%0@pG8JU9DgT=dg(U{6b4_(8Q~$`UN(!rNV$E6#PlkE_rl$R!x>_*0O4k=BKsmMj`JJFdZcKcee9 zP^sF^z*nZCsyY&S0FF%yMwE2bu*svZ$bIJEY}1*DgKD@`xJC-O*m9?{QVud5iIf0# z1o;Tp*~>hR_2LV^na_eSo;r-z-__XY3~JCH_sn5uH5~c`9D4bKfuKJO@=-EIFo6_I zAZT`rJRR;-(J^yyLkX;}!vwxGCBPq*Qs8q1RfTDz(5JbtcXyH>b7i*}EI?&=-l3G?9>(r(`#uY%>&gLNvu zLd6H30joxn0wXBe3ZYW7U7RaWa`l48MNLTrVMlet#3jMh{L$UAlZAQc%K4OF<#9yo z9wM$Bz%m%qpO{|8nAHaLrD;Gbd@TqxvT~bK z8YZI4O?{s$^izd?1Zw`{ku>&RkjPnZny~XQ1|t$(ZuFyP77PUrZf;I4ui;{~i-zOy zWP`cUUGxQwK5#(eqR?3h>~DsLwPhOi{BwCe0Fa@e8>}~{+0~-=9eMxmU3vF51X%*d zBW+spSw-0NOfGniv^;>nlx~>CIESVLlsBLR=b)sq8kB(NCv_k|p87i}Pa7%0sgRKQt6^VoD1@trUfP8wku@|FLIyiGZ`TK5Y)#F-cL9{u9kn||usZ}0el%eZ)j!atWIG(f8xXkq&3muu z;i(mvy-6m7v>O)h<{U-EyPbE=`J$x|50Q9hWu2;#80Ah%VQ~ z7HO!ea&N501}=z-Dhe8KRVF8uo`ytS?}P2}z=HOpSV6=~zwoHJJeW605RA&#e5L;W zY5gG3>2hrtkb46ZAetJ=${#MlDQbfCbUy9pcMK^zi^}B!x;%UuJ5f_W{<>v9Y~mse z-4re8wS2PhteU`eSnwbqll*cXdQ0Y)Q~dm{jbQwJKmfl%0NayMllxe&@F;B)gu>HbHzm{|xnL8JMUOd{{DcO(vP2-^(s348m7%WV&H ztv3zCAb3|;8zvB3E*;+;6i^~aB4{CBJnC{)`5pm6I7hql6!~ym9b${RTzr0bYHI4n zh06sAFySnBrgB_%GiBTVeC9D#5Fz=1)I*Yu9ZINI#jOuK6s9&eH^XV0!5-&RvtJS{ zZ?sN>4U&dS(Qe|J01NpDktTZf_yO2Uh_ep1z~f(IO9%qFXXOOZD{LdXna_Oim|kQ+ zDBoe(2IKPET%+0JBQ~5a=_IJ(5>9x#hA_(|K7QBZN^}Um5QfvIoqv4Fd}b-wUsB~Z z229|2aJiV#=564pCd{x5<9F50JR3~pa+djz=<@~Pe4;G)j0XMQy`v2^1)I`GeXg@& zbyS(U2MaSov4drZlyBoo!;BV#+?N5G#K4~D!P+`qA#j2Tx;;=T2j*rsG~8`|Yp-i6 z3qjP%N>JAvH9{Qd)8)onS?rWh`7Lz+HbWhqKt!M!cli5c)J}|oYLDL}x=^-==a;3X z@-IZtA@TaKJoB{o$y9uP#eezSOCW(tTx1n{g-m@+Vl(QzE70F@aQ)5M-y{w$|GN&b)5r7VV)yn7 zvq+k=?FY~e9{eEe;f&cWBT)GB8z%RPH=rw^HRSh<Lk!Se64Yjg8tayDcp}(QP2LfWbl=L{ z+SjkZir|@GV#x_mfxnMA`;R~Ts3ysR;J?9nnm;0kb!?-VUWW(rq9FM*o;pcN4 zNF8oVIQ~PhG&57~N4E`&G_Glcl|C6m&Z8$A!L>szZ#q5F9tI)7BOZV`7^Vjw-AB@ zJan-6kLRzM(JoyIY>DrNAp`;WI;i2D2M&No%yQt`_3MoIkGWgwsnkMnLe-$b`;@%t zN1gq;&(nMi@Bs|uUcg%nEf(PAHdexDgv~GIq4R(DjsbrGP@keIEN=@uREMzG_P^XN z5jNZPX~Xv7i~be%1qi8nX|@;VU-Ci(BA{_Vy7{?q^wSCyj#sZ<-TV9$HCfYK(6HjE zY2yGHAM)-$XFtvajWb}iu;r5nXvSAr7#hPWPgbZ1kMB_>7=q7B0enM@gz00lU*a<$ zk^x0@$OR#2N8`Ia?5aByuvMIgbN%5tydqM!ih8xIYmOBtxVkp4#phd zU&{Cq+YfH)AqVJ?x|^U`ejWcfHjf~K>M9*qKc7mL#~_c@V7MeT%&p{T#H;YZ zgX8x$p@@6Z9~hh7eI`(qase&L~@5AqsL` zwj-o;I5By(bcIebVjlmW+cx|Pg!yv=c_H$a4?oUJf{to}w@n($SE`$W3kc-qRzN!< zaA40+dPju|xp3&D5?DQC)(+Ix^@SgR^5o{rfcLs3prbkvuRkoy5czcUAd0~9%DMyG zBW+g&D_0i;+m+0nx}8UlIogWa>lu(qlJh-AN>HB0S}bV(J{a_Xm6a6+?{9I)5KF^p zI5>efshOF7>bFy30h`R>m(j}vnASQj+XEQ@)>s)#G_*3~cU2SOWf~_xJKi`COG2B( zSl&jeodAxJAe54YfOI_L2`!L@Jtam*zeXsUwy(ir!ht0vOmhke3bG-APDEmtKHM=- z2j6QqwBInbyVnGOmxmD=qO3`S7jMAgVX6Gt?)&LUg95^*;H{}dh^IHc78I_A>m&_# z$9lh$^G;;EPn572vHQz68lsO+}@XwjdqXpbNE{P?&3PqUTwlIwTESoFxZ-Gk4mpBK$6NUq=L1Chc2=0G&loT{g5AQ%5%kc# zzt2+s)rF2USkRE7=+XuYvPPaZcJpRH2+p_PZ)Yk%fiW{u{a4Wcl@l>70x_uXmg*ZtcP4 zl1w)Dpy*LdLEgb*s#OyPyK&q#bqMYGx5nrSIMKM875nVnLV`>_@o{Wf>S8R`@i3!V z8kTqihhI2VNqpjG)k9->Wp#bV9T1c|vu=HoZ9-3))>-=bAwNBP3U|&7n=cEDR1#?I zx2pM@o`*4&Q{PhT<0>nv9uHsGO?ld(lEA}AW9?*{pE#1H)3UN|WSjipW#DeULN3sm zELS2pq6)1jq=iL@&94PKy$*G1-op{psTF_~^Ho3xbH+IJMBz&y+J$}n7H5t8x6mbh ziDktxqdil0+dZ>ops>~a>M+lcXz)#*-ZuY5FhAzm2?)(m){}4oG602$!1pG;9@76^hN=6R zr~;iQKX=A)(9@6PE5&o87hdhNPhB_{sqbhnarj<@qR6@Rp^)9k67}~V-fgb+TzJ5S zl%JWGzNeN4%$)|KCBu-cAskRTmO0?^L#bU85)LFeHqtvd^KZG=8^RX+4>2O5{!8XZIRW1Um+D6xX}=VB&S5VTXV1 z^1$sox37Kp@Bxwj3|jxyaP^}-V_EXO;gyw&^07?cxq8k)F2vmT?@wdB<$1#l`O zBpp-x#5EkEqSkS)@z$YG74V*Pl)W-cYt4qsov36V6CWNej5F~w`1E&+mz-y{uUO{b z!td5Yq)Kp@kD|lz4;t%|_yt7bm_^UOYRu7fB@6yIFJ~C6v||U@41l?~Aka7g<;Ou% zeMVlL$%T20WcM72mu>nliZ6ad@WP-b9`B}mx4%CthfGZ7rf|G63>gtT?ZBJMS6(5^ zXvszw{Qys409}()RaJfB^gRK|&vwbYq>~x)J(Z%lzq@}sr{|FCNi6H{rO%z-i|s~M zWIPurhaWiVYru|cVChQ}@-XXbGnp|d_MzJ2`psAG${XVdz-8y>^3YrHSa@S`F1rrh zxq3fysqc1H7Uz=tRPS8tKVLb^!svcWFwjYI12{;}%$yby(@k}lo#I2Y57fF)ukifgWXN#@@aL(g>ya|!Qna3n>2Ub zb0xb;YuEyZnx}rZLA;fjt>||g(CS(XO29J7St6N`4jgn_x0q9G!rvkxGhoJ>Qg7eB3IOLNSX5(& z>Ku=zhCK}#_{D~-Dc*K{nV+XZcg^Q6mMzjbKp0Co9?Ko^qmSG!9D%RR9jQ|k3NWw> zq)M{w0bB(^4{k6+fQOlEXT~+#^C5eRC7@jmoDV%1-YS!r2uQm=@g8|~TvuZU>MWBb z80&~aT1~a8E(c>tzzd=w2%8K`Txo+t%w_jakD?P25=0Mj4Z5abV-~*aHivXR88T1V z-Sqd@nA6((zgicUo@LiTznlLiga0}p=uZ>GJMi)UG${;D2Y&vW8Rh>!bdJ9Z^pM-f ziI3eYtF!H1>{~f&XKI6f6tZ=%twyq8>aG{^i(FTi@PBn~NjunOzPCT}miJmmx_79f z0YY&O$01Dz$cp=_KdAdR5thdwpQ20lTr8-aUh#i;)I`&^rV7i(#%9QVg*vv-SKJhq zycV(~gQN2;`;|F0moOJKBC((+#5qu%%T34ZSR>3(yZY+x;&$V2^q6{K7y?aJ5R>+Y6tYB)BUMRi+U3QyRId_bI?Z=s^7wW^7Cwall5p>a}kUU;VV`=%RaHam>PCdw<2Y#!6 zQPwzPuwIn2JoDY|<2xyfZuNnx>r|I9XN)^H;P@a+hFg7`4ltmeki)qO+sTBaFFixWv& zHvjr9wsmzrM}l@MPD%-b)@(CKj8iE46cYQ7;tJ+H)6o?09{Z(e!=_te_;gK11S z5?`X*Tdc@{5KriATX93=Plx!NF~*XLRJI;BOi@&9d|p)$3}-{-^zoS z?taf)S`=*>o%mg!BvYSixSWcR`q>$g{%~wdVUENIb*<&~>*YwJ{3jU;=XvRipPpT8 zZC#h5-7FMbkp#EVRh&8&RqteSgJ_2j2_DUiig5R+4vK|bjGqA?;w4PIP;TNsMQs#T zj_*r)IsAz^eeT16;je}uCh|&%b8wJX;f-stIml=;$gvyDzesv7mlrrqQj(dYm(9hX zG5?83`sESuXPD6+cVB2ScL%nFZ%0%hyla1=^&v^4*|;ossMy5d=kc-7dWk5GN_(tI z;`CcVVUevxNz>N0oohqiR$c}pD9$6jtk@MFYUaEyV%(z$fj2n@;gPmv%p0kvvfSruq2vrz zXZ6&mJ}=$tit}73++mJsiQNLzX$=F*l`754zaGX zO2VAa)h^4P?BBogg@;K&7}7eK!1}Q|$i~~=-T|b;Adrb}@|KJjdaKl-sDrg7(iOZB zt$W^itdxIjXZZT1^%^ZOV&J0&9N#M8x8_FU1us8{nAcqyFVcVF`t}oiQ`rC!(sckz zhEGCVTnbnxoPT{U%ozH?n>jSY0s-fvcvx^6->HkoTyC1N=M;6!{E^TVja8o-@&%&e zF9=P*)a0^DpK?2w<3uahX-Gq8L*%DY_Pah$;U&*5VKEUAfjGd`K=lp(0ZWo^Vf4YxftzM}9)Cf(Rt@*^a$kCJflc zyYqIY{^#-*n1CyAhv)k{xLy-20?3c4 zgmmC9ebhm;fbjQx>J@>KAZ9Ojz-&m}dw8~81G4CyoElB|a!YDJNTtmzsFjnWqZmZ% z{xB5f-eLCOQHdMT@){1SAU};^tFg+e@k4!F&BG1j~uQ{O~>Yct3R-H-93qZME@F1_nVS zK|h$z*|-Pwzqk;Btd>E&$(TM&f>t^)IRheA*1i;mMBEyTun|2E(nD*P_((kTnx2CK zb;BOFd%G?j0vZtL7Lq}F`An!XR#vKdm*pfKLSTh$-sljIINOMgT*!Pq zl+7q(RT2gt_6bb^Q4bUiNyNO*TtSXh1*@-q-vCs7GK{`QMz%+q{gTzJe*(q@ZI<((?!8UFAd94_|K&6WrhlLQr)G$ApWq_NhKb#Syi54gwzqfo}BNZrmSp`02 zl(zo}s%su^JeviLmu zUArI%&oygfKL+y>j=;_oa;SJxU+G7*_jXW&{>xOnL&fx|G6S?W2((53mMaCR1-UQ$ zporUHAWa7y?C}R`Vn9+LqykXn3w6$%?OVAQ{+|1|T&wPfTae!=5En?vdR zGd~Sd*6FJg@)%}djbQCij{czqWLL+<+Q66;fUE*cpc>@Gr&Th3CdcL47;H5H)n;oI7yxLgCe;V@?8cP^2-F`yUOlGF(aj1t`iH;}^6>!O-V2H@)JMKBv`8M7jfLpzT;4^J5meCeAtVe+yKC=eXYXyFeXJ-2qJY3&I{CE_ zh4oV$tPGilG(FGTC@%`@c|j(GG6daCsrj>L&6CnO>ZQ>oI;bar^h69w?riJ3f(a$owtn|N7`5irJ@YgWDS#8o)TMfBWW|8s)>|~6Bj_^4JG#SwhT{-6DQ#w+I_hgAcx+`ha4v)j?((>t*OkWJ)%+T^+y7%<;?ra7iqt^TX z*1m!u;ajUc{k&P=s~knq4*eVyP?j(L$%UM?LIYm8|2^Xe8=!_v zz<%A@F5}{}?|%8xG62=2Oe*ugtPBMaU!Y4$;h%OvL&=XZ%@tc@^t;oKFqMriK$!bj zN4cb&5y!`gR4tQ{e7KSM)uM1A*tc%|7UH}pCYn#SDCDnEl`?#0fJ{J*lAC8a(}EY~ z8~^*@2Q8x$qFYI}sa{O96(}yq2tx2sgz?dE>r^5@H3lIF(oQ~!%O&o_#a5){qd=Py znxm(Dx&nCwmG5j@H>!2qJbJtx!NQbZfqYbN!N)vzQZPga2!$8IQuslcj;^$=4fs|I zZO9>lza+Rf0Okc;1qB)ZqXpYv@|{ay7SI;x)Bn5T`v1`vZOw@C{r`Is#?6CO0(3$5`+=yp&=@cXRFj*vvqG}}cu_f$o7FePXnP+c?++7F*Z zR~^@f(JrwD7>yt)WsOv@?k-hGyE5uC;COrLK}tv_<#^ZE5yFwlXYS3k6;uX?wDfW6^uHn z1Y<2q@!69%*zL9Wf3f|-#HY`%=*;|O?1J*NF1u;b0yuF9idY1neoxn z=W1)P2;=dR??vUy)1_cai!*ij?;ola@b#OUGM^hO4p#q4&!s!_Sp->~2cCs*{q4nd zld%&Fgo3+>^xlE{7f68t)n^5-cuEcQsV`KA#kCpEn=4lYh9L7DKxSn~ymWodg}%)| z;d5zA`~{Zsn5)f)^~Ihne}g+=7vA0fvMg}x$l|*a97CA@WMy)|0Me+}(tS%WL zJYVmJE{&ar*aj((R^a)YUc7cGQPy%x=-OTTxQqq8^QW=LmBp~M6sI)jOb`FU;Ez30 z1WW2#-PoTQHu2EFui0}}Qz=?dy?Jc+oolt)bDSAX`&?rmV_CdHK-7s_t91xvV!0=T)<2s40sxfqBHmc1=Mn@wsg!p;K<)7ao zk^D4b7)4P5?i*Sv5Xae%-~PT0ib4>IA&5$gmO=Y{N9Wrb1fWZ(Z~RrjIe=%Zz7WWd zkPJ|qQ1$y0BLIS=o0;Zg3OrECcnCV0(z0g-O2U9y4M7JItAqqs&2GxJ4(~6KjP?Y$?S>!|d6RjPtk-=MqQD(*N=yGGCd8-L90@Q7 zt))1sqcItwrDRGipSAHk1t^;ae$t#8>Tm$6kUAWAqz`bfm|iEM*bQ*czKiGi_;}C( zXi#l%i&c0XqJ_4lK-)Q#LI4_x0biR#9X)368wE2*fZJ*^7kvk5{nf1mnCSs30!j;L?(g@0yN{Hq z3Sz0Fpe-KTGK`mUPbrFYBsjvbfIf$1p+dfzI60mGxY-E8l%mrWEbVf|WmyViZCMbu z(JEQ=Z5KJ`!{xRBRELOgSij>kMYo1@!K^LuSvd#-#lz(s3&EHH=bwP*AOVXhlCb=V z(zJ-&8J&L-e9_3ymta{aa^PM!F#A>^4`wLotTTi7ApI=_aA+LB1TQ7X`F>3rNruxU zXajDygp!x!w*zFL?ICLN;?83re=}=?%6oVKQIZ!MJm^a@rYJ&^Iv+|Qhj&12UA?C$ z3n};M33NTMtz_H)y$1SX(}gD5Kww%Q?}dK3G@YTvIYgAAWgFga=V>TGTOy<%>pZj; z@5vYqzv9rVH3Zi*0f9iDQrOy^_jl`jGj8h+Rv5yG6oC6Lw~XQxz4kVRm(JlIR&vw; zs)|x*YvLuxdgicU0oR19R6K(CpaI+-9gXw#Eb%$ma|s|mZID+omGLb->G}PI5Pit? z?}C|CavxA6qJ)L7+yue|!NwXk-T)NdUepx8pNmrQB|e9hj0zNv_)DnwIUb6b^5o0?#pn6%K{@ol&XW6 zfV$^Ha7khAc=CnV%@QiN zfih_JJqRM{(TqXWY}N7`hxm@5Sx7Vk-jIY-WjY6xs>`xcdzcA_@MIN~(oodkXi37l zfjQh#q_qPx6%A3r(*9dL^r ztRjYs@$PaX2rmGwt2VlaBi`VHU3LQxBx?q5n4z79SD_)Rx!6eL81P-o9YM6-3xceO ztOqPg-q!BwS@$47nao}nQ~G97=%@G=Cm!5_g;!+(@yDL?cIazt5=r?);$XOv1b!bh-e@w55eJqPc1qbIhD;HfwE8rXB+CWH1da z7OWyei%VACsFk_*%WiSME))8)AIjqah;*J9j%EJpqf0v9`&6A`O%1`t(Ia(JAU+kS z7pT_?`a?YL?r{U9!4t(jwuMfA4#^k_LrFy~754ZFp1tydcXv{2>WJsz_{U> z>WWtf>~(bxOyv&E-LI7)!H{Oqo*+RrC{@!h{eAZ=y7#VqI^w~Q(ft6tP$euiKeeJ_ zBqKZV#$@oj>hLb(nEtk@As1P=-RE_rQfr<=p>GAtSy~UolCSQA=NaWFpaTf=-d9Mjx`WC+KfwTYv zPbhyDttBk!ckOoQrE1~q&P2B~@W99tL?d+_TuU$K99sJB$dn7Fsp@aRp9PE_Ds9P{ z*F8GA`Vx1lBtTEgGMny_`9EGhzn6wj0rt#*^og@SZ4o9D@=)L$KCHVoI&RMdc^UA0M|TQK*7y%B^(d9TKKj*| zg+4I!ZBM*<6WY0+$ ztyYEpAqr^|m1?mg|HpV`v@(oea(Srsci-GSNjU_qKSEBSysX8b zf9*)4dVKf{u>K<-A%ApU7yQ9eXV#LBUI1{z3E(4qz*@DdQdzuXA_O%q#C-VhB0M<9 zwa#ja<#uwU)(&>tHk6?_X0Vhio$&r8GTI7T3Y4-;c@NieM#NB{xF%3#x_l~izf z{E3}75N1bhn`k#5iff4C^otAE-ND{(nszh2cIB+MNmSTa(@-oes(|PYCiagtiRo0i zc~{KaEB-KpMKihciGxWv`P*V)>d;kS3M!=QQy`oOp0im$hTx|`J(y(o)%#9$NA)GN zCx2Zl*P+YXau9kX9ajx@3I3M7Ui4>SOU)u=U`L07HE7-ik(IFI$itWWo$t?xIF+n{ zzpsl?V8#UAo&Lvbh`KuGSu^K3LQBpFgJM~Cd^NravRqd};%w(`{yuI5S;JH&sK%{kT_elf zdoH#8SxoZd>(^fM8pTD{DTXW$HP>|iVMe;33>;s$wJdx1#xn^=)=2lkEmx>Xrya+} zNH;|8yVkyCW6Ky%S*!e|x*DRplFN6FUWvf$dRj?Xa;>NFkl$LRnO%jK%Gzj;edDo1 zD|@OIU-{F~3i=7pnjEzHIU;1XWBVZBX&U8&i4lDRe_0!&W~< zvKg+-bjYo$)^oxw4~L|=q=8S{pW7?#H~gjrENo&-`ikw+U(B{;IMqS0>-Tj?^N=BL zF{mM)3}+8N(k&?Bgijz3(9i#aFdm+g{?A^p|96o8-rM<`oj0ZZ|DI*~|A=}*_=O;E zAbx-kl=eb@-K;@EHjB3Y7Z}%-GQUYYs(|?T+TS?d{fNZI-(1=cNC$qdZTwXnzK#D5 zLuuo`!*JM3Q{B3M|2qt>jlb5l*^$P2ZwhBqb5O&+c{?^u2L$5?Y12H0qn>2bcWgRV z;1`ii|G4QNH~k}AgiUA-g(;i<5!sBbHseRQ2b%zClR(%c5YUUTNj+`SYp5P<0;ElV igzCX2K>F_jqy!|8?@GHyj3_PRbYS1Xy+y_j;r|G&D4qbagb*)Y$#kKtQT5 zHYrJ`2C%!1sV5B$Gsj;8(4?esQx5^2Xl)ct$pGIfbwh8D)I-wHl*KcjJz=1sVcpc# zL_T@}*qqUGgKG0K{?79QvG`B+h)>*Qg5S0^Aky`P%o40V>BtM+-T*JFTTdi9tA%uR zsXmd3x^-K28q>?%#t`fA+noj@CH&plhR?X#s6Ykl!IwQRV_##Vi(vLv zyKAVA%M_!1uLcN!N`$&_Z1kpfetvaTRaJ)KOoR84-aPjng9`U8w+bK2<))^Kf8X8R zwV>5$Nx|h?saTk02qW@*>8(M-?9c&W3C*X1z)Q8d-i>p=2=I(vr>J1n0?^uY-KZt+ zK^umCp%u^UO)CEd3|@Umo1nQ{bbQ^ez$O%yuWFHpXzc!WCe~hGKOl!%;33xrvS#E;_wg z1Kz>0bV?@sk(EmFtot?gR<@+U`N_nGd10%@kMjvxV&dZG2GQTA=`p&37c;(;qVuEq zHsu8gPS(b&ir@rp|M}l$P3MQ>8GkCz89S?B=oh!lwI3!eL~r%1Zzlj2x(SOtG}E-ZWid%W6n z047ShoK<>9cZzfxl^umCi|8sMoI){|1^#jG#uvVIR2_l6Q5XLcFeH?Ng(%1lit;g0 zT#j4j7^Pe{LM(vJwy^N-hpXe z|Bg{J(Ys=TBI(8|J&0$s;e{0S*0pK&dG@E6gD3msVJfnZ;d$L)Vql+W1rFK}t0*OL z`u4sUz>rfg@{Z2HW-sX6mYtyB%}#7H`*mN)@IV^83Fz_mZO{IPEG5G7Q59xeu$Q@E z#)_qryM0_8anp9@$@F9*8*qphqMK@a+HCc*WS-2>K1!uDkvQyvrL}I~dZpD;6084> z9rDme`x=vvt(Wl{j=NIX+OSk*+_Zo$6dYhyDwUIpW@sOoVT%bZC;6ip=s6C3kdxy# zqUfwos09p*LBNeI9Vq1f-x6<^mEeZz&XfFQ64WOAB8=??wq#Q(oJWLFlZll7&7nBd zf@ek+t)5+8Li7$bF<7ji=m1(61bKXH$>tlliN?R(rE+Gh8FHb04i#bLqz-Ea`rYEM zEj#A^mo9;N>v;1QYf)BD67dnh_J$cYW?_W-Z1Ci`<+p;TZD-h!upF>7B| zL+1y5$n$zxs0q6xO{HCU^FQg!!#tsL+a@+19#i77(c*@+a(B7ax?bOiFbwm`Xa=Q= z8*C}W9z4wydhBF`747aV6c_zrmFhjUX%sZ|$|)HT^y>2h_<MFk2CW@)Ug;s;x=f^)Z z$Z8hvwO-ASkz?x01p0&a7n3}RVP$2_%SF=*k(T11-7QP@LVTiE1NK90RZ85@#q!Db zsYT7S%*EFHd?uZXU-HXFsfKzi9pyqoe*0Qt`oD4BK7RIQ3TcrqOmO9 zM=uO0#9?0I&9m#D4r#N(rjm=>xOTTBoM^48AFBlo!FYZUh&F95!+tIme#Zu<`P;vm zZUA^rWgWtW-a`_^B$^mhT^e&{%xfwuJDA%m&UzY@@N;Y*D!djx-w_mTdqZE%P%xgN{ft=4Pe zmUctrmhL+6*-Jxdenx+5l3qu1;JYfAV=518WTB4<&ujhwve+WgRDHxG>|#gD!{PEr zOD7Myr*C$;;jrQNV{gkkS7=@JuCOI|3<*Gt&Z8tBxjwWg(b{j%XnrVJVly4 zXzgpJ5J6GvWQK6Y`L$U?^+mLX&h$r7SfQELB6C-j1f2U#4Z>U9k8TGnSUg&+*MXQFPgL(AR3qI!-BW0+(pT;Y>Piz4!;E z;-jNzTQ}PEI6lZ|WoymT{HY3WlyM(Ggb}`mZE-iB)G+P~5@E1$R!N3=6ykTD%zk5~3xrZY?v!*;sE6?JyN;dOQwt%j z_1}kGc9G`+6dBA@C)KbAnTh{-`R(|4`rImqy>Qd~D!uM8x?7BK@n1(gTC$>s|E6QHK6FzlT{BtdL18+8*DX*rF&l)Zc9l>1S~ z4!Hd1Lt3d8Yw0yon2(Cgs@cklAOsmK+^v~#UZHqkG@NaJH+|*s-UZI8i(Mk_&&(K7 z8bq7GpV7?ZfTRI-pA*e!QeiL}y1&N4q?1H*&((nQeqZdviHAweu<~E_4Q}e;xfGCG zS?SQ$*H?;)kit*lnh#DI#)4(846`GzuvdO@tB&_Rt{N2@8hB&*`IpnVC1l0g7L{AG z{ab;jE(maUOm*kH4AaDQ8jnP+K^(fIcc0$VDGq;w5{9RM1pJ*F#q?QE-ZcWEPI?@) z$n#|ug(d5$6ahD3I4@|;xqgX1@HC@veTq^lTD@ki2qJIS?>$xKOt_%GjOC2y%@!Wi zc}L-86KbnlQa}WVT(Rg4fp{22>}i6AUw@Vf{297bww)QJS5%2@@cewPWa@l89j4Xj zsi?#CAjoeabzWL-4%H@j4)XO%eXSq8TdANrtSm6!#X zEo9#EQ_`t>w*XdxIytBh^?#+Cky7qR*&5(Fltl7cG!BzNpE#soPN&aUi*+PxT1+G{ z>Pn6kwk%_B)~xyLNfS~`$HFV*} zJ0`vabEnX06z-0ii<|eekbYDdM2aa%G(&HGIy$3Ks4c?JJn(xo&S4={oy+v9&@qZI zz^;gTD5K4x+=3`LT#6Hbxq3_0JwiJg{8;x0eM)w=v{)kSNn-S9#h-njX^0g<{xhAo ze-xI0Uyy5^Roh$+%O|*duS?X{g}xRf6sFR2@+}g207`{*9fFw^t!0r>p%>#dj=s>* z!kzBDaKtFXEP+p$vCe$>#k|icJl&Ice@VNv;4-vYEYjIU?@s|hl2OriTd|@Y^B(Ad=S*wsJ{ogTKbwLD67!_1BYQ^VE_OC literal 0 HcmV?d00001 diff --git a/packages/create-onchain/tsconfig.json b/packages/create-onchain/tsconfig.json index 7176235d11..ac4cd152c4 100644 --- a/packages/create-onchain/tsconfig.json +++ b/packages/create-onchain/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "ES2020", - "module": "ES2020", + "target": "ES2021", + "module": "ESNext", "moduleResolution": "node", "esModuleInterop": true, "strict": true, From bb07ea0c0df5524737bb3f48317b9341fdc949fc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 14 May 2025 10:11:22 -0700 Subject: [PATCH 55/55] =?UTF-8?q?chore:=20version=20packages=20?= =?UTF-8?q?=F0=9F=9A=80=20(#2362)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Dan Cortes <3639170+dgca@users.noreply.github.com> --- .changeset/heavy-clowns-stare.md | 5 ----- packages/create-onchain/CHANGELOG.md | 6 ++++++ packages/create-onchain/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/heavy-clowns-stare.md diff --git a/.changeset/heavy-clowns-stare.md b/.changeset/heavy-clowns-stare.md deleted file mode 100644 index a37ad75b9e..0000000000 --- a/.changeset/heavy-clowns-stare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"create-onchain": patch ---- - -feat: Align farcaster.json manifest to reflect latest spec diff --git a/packages/create-onchain/CHANGELOG.md b/packages/create-onchain/CHANGELOG.md index 8425300d83..3d7317aaed 100644 --- a/packages/create-onchain/CHANGELOG.md +++ b/packages/create-onchain/CHANGELOG.md @@ -1,5 +1,11 @@ # create-onchain +## 0.0.21 + +### Patch Changes + +- **feat**: Align farcaster.json manifest to reflect latest spec + ## 0.0.20 ### Patch Changes diff --git a/packages/create-onchain/package.json b/packages/create-onchain/package.json index 0ff161ad9e..da443a7d26 100644 --- a/packages/create-onchain/package.json +++ b/packages/create-onchain/package.json @@ -1,7 +1,7 @@ { "name": "create-onchain", "description": "Instantly create onchain applications with OnchainKit.", - "version": "0.0.20", + "version": "0.0.21", "license": "MIT", "publishConfig": { "access": "public"