diff --git a/.github/workflows/docker-prod.yaml b/.github/workflows/docker-prod.yaml index ee5f0f6c..5e5394ac 100644 --- a/.github/workflows/docker-prod.yaml +++ b/.github/workflows/docker-prod.yaml @@ -27,8 +27,8 @@ jobs: security-events: write env: REGISTRY: ${{ secrets.RESEARCH_ACCOUNT_ID }}.dkr.ecr.us-east-1.amazonaws.com - ROLE_FOR_OIDC: "arn:aws:iam::${{ secrets.ROOT_ACCOUNT_ID }}:role/github-actions-research-account-oidc-role" - ROLE_TO_ASSUME: "arn:aws:iam::${{ secrets.RESEARCH_ACCOUNT_ID }}:role/GithubOIDCResearchAccountRole" + ROLE_FOR_OIDC: 'arn:aws:iam::${{ secrets.ROOT_ACCOUNT_ID }}:role/github-actions-research-account-oidc-role' + ROLE_TO_ASSUME: 'arn:aws:iam::${{ secrets.RESEARCH_ACCOUNT_ID }}:role/GithubOIDCResearchAccountRole' steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0 @@ -53,7 +53,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 with: - platforms: "arm64" + platforms: 'arm64' - name: Set up Docker Buildx uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 @@ -82,6 +82,7 @@ jobs: build-args: | VITE_EXPORT_ENV=production VITE_APP_CFG_FEATURE_FLAG_ANALYTICS_ENABLED=true + VITE_APP_CFG_FEATURE_FLAG_MAINNET_NETWORKS_DISABLED=true VITE_GA_TAG_ID=${{ secrets.VITE_GA_TAG_ID_PROD }} secrets: | npm_token=${{ secrets.NPM_TOKEN }} @@ -115,6 +116,7 @@ jobs: build-args: | VITE_EXPORT_ENV=production VITE_APP_CFG_FEATURE_FLAG_ANALYTICS_ENABLED=true + VITE_APP_CFG_FEATURE_FLAG_MAINNET_NETWORKS_DISABLED=true VITE_GA_TAG_ID=${{ secrets.VITE_GA_TAG_ID_PROD }} secrets: | npm_token=${{ secrets.NPM_TOKEN }} @@ -125,11 +127,11 @@ jobs: runs-on: ubuntu-latest needs: build-and-push env: - ROLE_FOR_OIDC: "arn:aws:iam::${{ secrets.ROOT_ACCOUNT_ID }}:role/github-actions-research-account-oidc-role" - ROLE_TO_ASSUME: "arn:aws:iam::${{ secrets.RESEARCH_ACCOUNT_ID }}:role/GithubOIDCResearchAccountRole" - ECS_CLUSTER: "contracts-ui-builder-prod-cluster" - ECS_SERVICE: "contracts-ui-builder-prod-service" - AWS_REGION: "us-east-1" + ROLE_FOR_OIDC: 'arn:aws:iam::${{ secrets.ROOT_ACCOUNT_ID }}:role/github-actions-research-account-oidc-role' + ROLE_TO_ASSUME: 'arn:aws:iam::${{ secrets.RESEARCH_ACCOUNT_ID }}:role/GithubOIDCResearchAccountRole' + ECS_CLUSTER: 'contracts-ui-builder-prod-cluster' + ECS_SERVICE: 'contracts-ui-builder-prod-service' + AWS_REGION: 'us-east-1' permissions: contents: read id-token: write diff --git a/.github/workflows/docker-stg.yaml b/.github/workflows/docker-stg.yaml index 24093bff..116e68f1 100644 --- a/.github/workflows/docker-stg.yaml +++ b/.github/workflows/docker-stg.yaml @@ -20,9 +20,9 @@ on: workflow_dispatch: inputs: branch: - description: "Branch to build from" + description: 'Branch to build from' required: true - default: "main" + default: 'main' type: string # Prevent concurrent staging deployments @@ -45,8 +45,8 @@ jobs: security-events: write env: REGISTRY: ${{ secrets.RESEARCH_ACCOUNT_ID }}.dkr.ecr.us-east-1.amazonaws.com - ROLE_FOR_OIDC: "arn:aws:iam::${{ secrets.ROOT_ACCOUNT_ID }}:role/github-actions-research-account-oidc-role" - ROLE_TO_ASSUME: "arn:aws:iam::${{ secrets.RESEARCH_ACCOUNT_ID }}:role/GithubOIDCResearchAccountRole" + ROLE_FOR_OIDC: 'arn:aws:iam::${{ secrets.ROOT_ACCOUNT_ID }}:role/github-actions-research-account-oidc-role' + ROLE_TO_ASSUME: 'arn:aws:iam::${{ secrets.RESEARCH_ACCOUNT_ID }}:role/GithubOIDCResearchAccountRole' steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0 @@ -59,7 +59,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 with: - platforms: "arm64" + platforms: 'arm64' - name: Set up Docker Buildx uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 @@ -89,6 +89,7 @@ jobs: VITE_EXPORT_ENV=staging ADAPTER_DIST_TAG=rc VITE_APP_CFG_FEATURE_FLAG_ANALYTICS_ENABLED=true + VITE_APP_CFG_FEATURE_FLAG_MAINNET_NETWORKS_DISABLED=true VITE_GA_TAG_ID=${{ secrets.VITE_GA_TAG_ID_STAGING }} secrets: | npm_token=${{ secrets.NPM_TOKEN }} @@ -123,6 +124,7 @@ jobs: VITE_EXPORT_ENV=staging ADAPTER_DIST_TAG=rc VITE_APP_CFG_FEATURE_FLAG_ANALYTICS_ENABLED=true + VITE_APP_CFG_FEATURE_FLAG_MAINNET_NETWORKS_DISABLED=true VITE_GA_TAG_ID=${{ secrets.VITE_GA_TAG_ID_STAGING }} secrets: | npm_token=${{ secrets.NPM_TOKEN }} @@ -133,11 +135,11 @@ jobs: runs-on: ubuntu-latest needs: build-and-push env: - ROLE_FOR_OIDC: "arn:aws:iam::${{ secrets.ROOT_ACCOUNT_ID }}:role/github-actions-research-account-oidc-role" - ROLE_TO_ASSUME: "arn:aws:iam::${{ secrets.RESEARCH_ACCOUNT_ID }}:role/GithubOIDCResearchAccountRole" - ECS_CLUSTER: "contracts-ui-builder-stg-cluster" - ECS_SERVICE: "contracts-ui-builder-stg-service" - AWS_REGION: "us-east-1" + ROLE_FOR_OIDC: 'arn:aws:iam::${{ secrets.ROOT_ACCOUNT_ID }}:role/github-actions-research-account-oidc-role' + ROLE_TO_ASSUME: 'arn:aws:iam::${{ secrets.RESEARCH_ACCOUNT_ID }}:role/GithubOIDCResearchAccountRole' + ECS_CLUSTER: 'contracts-ui-builder-stg-cluster' + ECS_SERVICE: 'contracts-ui-builder-stg-service' + AWS_REGION: 'us-east-1' permissions: contents: read id-token: write diff --git a/Dockerfile b/Dockerfile index 5b25414f..189a59cc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,10 @@ ENV VITE_EXPORT_ENV=$VITE_EXPORT_ENV ARG VITE_APP_CFG_FEATURE_FLAG_ANALYTICS_ENABLED=false ENV VITE_APP_CFG_FEATURE_FLAG_ANALYTICS_ENABLED=$VITE_APP_CFG_FEATURE_FLAG_ANALYTICS_ENABLED +# Disable mainnet network selection on hosted UI Builder deployments +ARG VITE_APP_CFG_FEATURE_FLAG_MAINNET_NETWORKS_DISABLED=false +ENV VITE_APP_CFG_FEATURE_FLAG_MAINNET_NETWORKS_DISABLED=$VITE_APP_CFG_FEATURE_FLAG_MAINNET_NETWORKS_DISABLED + # Accept build argument for Google Analytics tag ID ARG VITE_GA_TAG_ID ENV VITE_GA_TAG_ID=$VITE_GA_TAG_ID diff --git a/apps/builder/package.json b/apps/builder/package.json index b8724ea8..f1999160 100644 --- a/apps/builder/package.json +++ b/apps/builder/package.json @@ -35,13 +35,13 @@ "@openzeppelin/adapter-polkadot": "^2.0.2", "@openzeppelin/adapter-solana": "^2.0.0", "@openzeppelin/adapter-stellar": "^2.0.2", - "@openzeppelin/ui-components": "^3.0.0", + "@openzeppelin/ui-components": "^3.0.1", "@openzeppelin/ui-react": "^3.0.0", "@openzeppelin/ui-renderer": "^3.0.0", "@openzeppelin/ui-storage": "^1.2.2", "@openzeppelin/ui-styles": "^1.1.0", - "@openzeppelin/ui-types": "^3.0.0", - "@openzeppelin/ui-utils": "^3.0.0", + "@openzeppelin/ui-types": "^3.1.1", + "@openzeppelin/ui-utils": "^3.0.1", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-dialog": "^1.1.15", @@ -70,7 +70,7 @@ "lucide-react": "^0.510.0", "react": "^19.2.4", "react-dom": "^19.2.4", - "react-hook-form": "^7.72.1", + "react-hook-form": "^7.79.0", "sonner": "^2.0.7", "tailwind-merge": "^3.5.0", "tailwindcss-animate": "^1.0.7", diff --git a/apps/builder/src/components/Common/DevToolsDropdown.tsx b/apps/builder/src/components/Common/DevToolsDropdown.tsx index 3846d25b..70944b5e 100644 --- a/apps/builder/src/components/Common/DevToolsDropdown.tsx +++ b/apps/builder/src/components/Common/DevToolsDropdown.tsx @@ -1,4 +1,4 @@ -import { Settings, Wrench } from 'lucide-react'; +import { Database, Settings, Wrench } from 'lucide-react'; import { DropdownMenu, @@ -11,6 +11,8 @@ import { } from '@openzeppelin/ui-components'; import { useWalletState } from '@openzeppelin/ui-react'; +import { seedMockMainnetContractUIWithToast } from '../../dev/seedMockMainnetContractUI'; + /** * Developer tools dropdown component for testing and debugging features. */ @@ -91,6 +93,12 @@ export const DevToolsDropdown = () => { Trigger Explorer Error + + Mainnet Disable Testing + void seedMockMainnetContractUIWithToast()}> + + Seed saved mainnet config + ); diff --git a/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkRow.tsx b/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkRow.tsx index 8b6f9d48..a5a607fe 100644 --- a/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkRow.tsx +++ b/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkRow.tsx @@ -11,6 +11,8 @@ export interface NetworkRowProps { network: NetworkConfig; isSelected: boolean; isLoading?: boolean; + disabled?: boolean; + disabledLabel?: string; onSelect: () => void; onOpenSettings?: (event: React.MouseEvent) => void; } @@ -19,6 +21,8 @@ export function NetworkRow({ network, isSelected, isLoading = false, + disabled = false, + disabledLabel, onSelect, onOpenSettings, }: NetworkRowProps) { @@ -27,20 +31,24 @@ export function NetworkRow({ return (
{ e.stopPropagation(); - onSelect(); + if (!disabled) { + onSelect(); + } }} > {/* Network info display area */} @@ -52,22 +60,22 @@ export function NetworkRow({ {/* Network name and details */}
-
-
- - {network.name} - - {/* Network details inline for more compact layout */} -
- -
-
+ + {network.name} + +
+
- {/* Action buttons */} -
+ {/* Disabled badge or action buttons */} +
+ {disabled && disabledLabel ? ( + + {disabledLabel} + + ) : null} {isLoading ? (
@@ -75,38 +83,42 @@ export function NetworkRow({
) : ( <> - {/* Select button - visible on hover */} - + {!disabled && ( + <> + {/* Select button - visible on hover */} + - {/* Settings button - visible on mobile, hover-only on desktop */} - {onOpenSettings && ( - )} - title="Configure network settings" - > - - + )} )} diff --git a/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkSelectionPanel.tsx b/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkSelectionPanel.tsx index ec3a843c..49a3c8e7 100644 --- a/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkSelectionPanel.tsx +++ b/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkSelectionPanel.tsx @@ -1,11 +1,11 @@ import { Search } from 'lucide-react'; import { useCallback, useEffect, useState } from 'react'; -import { Input } from '@openzeppelin/ui-components'; +import { Input, NetworkAvailabilityNotice } from '@openzeppelin/ui-components'; import { useRuntimeContext } from '@openzeppelin/ui-react'; import { NetworkSettingsDialog } from '@openzeppelin/ui-renderer'; import type { Ecosystem, NetworkConfig, RelayerCapability } from '@openzeppelin/ui-types'; -import { logger } from '@openzeppelin/ui-utils'; +import { getNetworkAvailability, isNetworkSelectable, logger } from '@openzeppelin/ui-utils'; import { getEcosystemMetadata } from '../../../../core/ecosystemManager'; import { networkService } from '../../../../core/networks/service'; @@ -46,10 +46,15 @@ export function NetworkSelectionPanel({ const handleNetworkClick = useCallback( (networkId: string) => { + const network = networks.find((item) => item.id === networkId); + if (network && !isNetworkSelectable(network)) { + return; + } + setClickedNetworkId(networkId); onNetworkSelected(networkId); }, - [onNetworkSelected] + [networks, onNetworkSelected] ); // Resolve the relayer capability for the settings dialog. @@ -109,6 +114,11 @@ export function NetworkSelectionPanel({ return (
+ + {/* Search filter */}
@@ -202,17 +212,23 @@ function NetworkGroup({ {/* Vertical stack container for row-based layout */}
- {networks.map((network) => ( -
- onNetworkSelected(network.id)} - onOpenSettings={(e) => onOpenNetworkSettings(network, e)} - /> -
- ))} + {networks.map((network) => { + const availability = getNetworkAvailability(network); + + return ( +
+ onNetworkSelected(network.id)} + onOpenSettings={(e) => onOpenNetworkSettings(network, e)} + /> +
+ ); + })}
); diff --git a/apps/builder/src/components/UIBuilder/hooks/builder/__tests__/useBuilderLifecycle.deeplink.test.ts b/apps/builder/src/components/UIBuilder/hooks/builder/__tests__/useBuilderLifecycle.deeplink.test.ts index 86c47c53..029b42e1 100644 --- a/apps/builder/src/components/UIBuilder/hooks/builder/__tests__/useBuilderLifecycle.deeplink.test.ts +++ b/apps/builder/src/components/UIBuilder/hooks/builder/__tests__/useBuilderLifecycle.deeplink.test.ts @@ -9,11 +9,23 @@ const { setActiveNetworkIdMock, trackEcosystemSelectionMock, trackNetworkSelectionMock, + getNetworkByIdMock, + isNetworkSelectableMock, + getDisabledNetworkRejectionToastMock, + contractUIStorageGetMock, + toastErrorMock, + resolveNetworkIdFromDeepLinkMock, } = vi.hoisted(() => ({ parseDeepLinkMock: vi.fn(), setActiveNetworkIdMock: vi.fn(), trackEcosystemSelectionMock: vi.fn(), trackNetworkSelectionMock: vi.fn(), + getNetworkByIdMock: vi.fn(), + isNetworkSelectableMock: vi.fn(), + getDisabledNetworkRejectionToastMock: vi.fn(), + contractUIStorageGetMock: vi.fn(), + toastErrorMock: vi.fn(), + resolveNetworkIdFromDeepLinkMock: vi.fn(), })); vi.mock('@openzeppelin/ui-utils', () => ({ @@ -26,20 +38,37 @@ vi.mock('@openzeppelin/ui-utils', () => ({ routerService: { navigate: vi.fn(), }, + isNetworkSelectable: isNetworkSelectableMock, + getDisabledNetworkRejectionToast: getDisabledNetworkRejectionToastMock, })); vi.mock('sonner', () => ({ toast: { - error: vi.fn(), + error: toastErrorMock, }, })); vi.mock('../../../../../storage', () => ({ contractUIStorage: { - get: vi.fn(), + get: contractUIStorageGetMock, }, })); +vi.mock('@/core/ecosystemManager', () => ({ + getNetworkById: getNetworkByIdMock, +})); + +vi.mock('@/core/deeplink', () => ({ + extractDeepLinkParams: (params: Record) => ({ + ecosystem: (params.ecosystem || '').trim(), + networkId: params.networkId || params.networkid || null, + address: params.contractAddress || params.address || params.identifier || null, + forcedService: typeof params.service === 'string' ? params.service : null, + chainId: params.chainId || null, + }), + resolveNetworkIdFromDeepLink: resolveNetworkIdFromDeepLinkMock, +})); + vi.mock('@openzeppelin/ui-react', () => ({ useWalletState: () => ({ setActiveNetworkId: setActiveNetworkIdMock, @@ -122,4 +151,102 @@ describe('useBuilderLifecycle deep link ecosystem sync', () => { expect(trackEcosystemSelectionMock).not.toHaveBeenCalled(); }); + + it('rejects deep links targeting a disabled network', async () => { + parseDeepLinkMock.mockReturnValue({ + ecosystem: 'evm', + networkId: 'ethereum-mainnet', + address: '0xabc', + }); + resolveNetworkIdFromDeepLinkMock.mockResolvedValue('ethereum-mainnet'); + getNetworkByIdMock.mockResolvedValue({ + id: 'ethereum-mainnet', + name: 'Ethereum Mainnet', + type: 'mainnet', + }); + isNetworkSelectableMock.mockReturnValue(false); + getDisabledNetworkRejectionToastMock.mockReturnValue({ + title: 'Mainnet networks are disabled on this hosted UI Builder', + description: + 'Testnet and devnet networks remain available here. To use mainnet, deploy UI Builder yourself from the source repository.', + }); + + const { loadingRef, savedIdRef } = createRefs(); + const autoSave = { pause: vi.fn(), resume: vi.fn(), isPaused: false }; + + const { result } = renderHook(() => useBuilderLifecycle(loadingRef, savedIdRef, autoSave)); + + await act(async () => { + await result.current.initializePageState(); + }); + + expect(getDisabledNetworkRejectionToastMock).toHaveBeenCalledWith('UI Builder'); + expect(toastErrorMock).toHaveBeenCalledWith( + 'Mainnet networks are disabled on this hosted UI Builder', + expect.objectContaining({ + description: + 'Testnet and devnet networks remain available here. To use mainnet, deploy UI Builder yourself from the source repository.', + }) + ); + expect(setActiveNetworkIdMock).not.toHaveBeenCalled(); + expect(trackNetworkSelectionMock).not.toHaveBeenCalled(); + expect(uiBuilderStore.getState().selectedNetworkConfigId).toBeNull(); + expect(uiBuilderStore.getState().pendingNetworkId).toBeNull(); + }); +}); + +describe('useBuilderLifecycle saved configuration loading', () => { + const createRefs = () => ({ + loadingRef: { current: false }, + savedIdRef: { current: null as string | null }, + }); + + beforeEach(() => { + vi.clearAllMocks(); + uiBuilderStore.resetWizard(); + }); + + it('rejects loading a saved configuration on a disabled mainnet network', async () => { + contractUIStorageGetMock.mockResolvedValue({ + id: 'saved-mainnet', + title: 'Old Mainnet UI', + ecosystem: 'evm', + networkId: 'ethereum-mainnet', + contractAddress: '0xabc', + functionId: 'transfer', + formConfig: { functionId: 'transfer', title: 'Old Mainnet UI', fields: [] }, + }); + getNetworkByIdMock.mockResolvedValue({ + id: 'ethereum-mainnet', + name: 'Ethereum Mainnet', + type: 'mainnet', + }); + isNetworkSelectableMock.mockReturnValue(false); + getDisabledNetworkRejectionToastMock.mockReturnValue({ + title: 'Mainnet networks are disabled on this hosted UI Builder', + description: + 'Testnet and devnet networks remain available here. To use mainnet, deploy UI Builder yourself from the source repository.', + }); + + const { loadingRef, savedIdRef } = createRefs(); + const autoSave = { pause: vi.fn(), resume: vi.fn(), isPaused: false }; + + const { result } = renderHook(() => useBuilderLifecycle(loadingRef, savedIdRef, autoSave)); + + await act(async () => { + await result.current.load('saved-mainnet'); + }); + + expect(getDisabledNetworkRejectionToastMock).toHaveBeenCalledWith('UI Builder'); + expect(toastErrorMock).toHaveBeenCalledWith( + 'Mainnet networks are disabled on this hosted UI Builder', + expect.objectContaining({ + description: + 'Testnet and devnet networks remain available here. To use mainnet, deploy UI Builder yourself from the source repository.', + }) + ); + expect(setActiveNetworkIdMock).not.toHaveBeenCalled(); + expect(savedIdRef.current).toBeNull(); + expect(uiBuilderStore.getState().loadedConfigurationId).toBeNull(); + }); }); diff --git a/apps/builder/src/components/UIBuilder/hooks/builder/useBuilderLifecycle.ts b/apps/builder/src/components/UIBuilder/hooks/builder/useBuilderLifecycle.ts index c34fce00..d676a1e7 100644 --- a/apps/builder/src/components/UIBuilder/hooks/builder/useBuilderLifecycle.ts +++ b/apps/builder/src/components/UIBuilder/hooks/builder/useBuilderLifecycle.ts @@ -3,7 +3,13 @@ import { useCallback } from 'react'; import { useWalletState } from '@openzeppelin/ui-react'; import { ContractSchema, type Ecosystem } from '@openzeppelin/ui-types'; -import { logger, parseDeepLink, routerService } from '@openzeppelin/ui-utils'; +import { + getDisabledNetworkRejectionToast, + isNetworkSelectable, + logger, + parseDeepLink, + routerService, +} from '@openzeppelin/ui-utils'; import { extractDeepLinkParams, resolveNetworkIdFromDeepLink } from '@/core/deeplink'; import { getNetworkById } from '@/core/ecosystemManager'; @@ -57,6 +63,15 @@ export function useBuilderLifecycle( return; } + const savedNetwork = await getNetworkById(savedUI.networkId); + if (savedNetwork && !isNetworkSelectable(savedNetwork)) { + const toastCopy = getDisabledNetworkRejectionToast('UI Builder'); + toast.error(toastCopy.title, { + description: toastCopy.description, + }); + return; + } + // Track the loaded configuration ID for auto-save updates BEFORE any state changes savedConfigIdRef.current = id; logger.info('Setting savedConfigIdRef', `ID: ${id}`); @@ -198,6 +213,18 @@ export function useBuilderLifecycle( if (resolvedNetworkId && urlAddress) { const network = await getNetworkById(resolvedNetworkId); + if (network && !isNetworkSelectable(network)) { + const toastCopy = getDisabledNetworkRejectionToast('UI Builder'); + toast.error(toastCopy.title, { + description: toastCopy.description, + }); + + if (typeof window !== 'undefined' && window.location.search) { + routerService.navigate(window.location.pathname); + } + return; + } + if (network) { // Track network selection from deep link trackNetworkSelection(network.id, urlEcosystem); diff --git a/apps/builder/src/dev/seedMockMainnetContractUI.ts b/apps/builder/src/dev/seedMockMainnetContractUI.ts new file mode 100644 index 00000000..893489e1 --- /dev/null +++ b/apps/builder/src/dev/seedMockMainnetContractUI.ts @@ -0,0 +1,69 @@ +import { toast } from 'sonner'; + +import { contractUIStorage } from '../storage'; + +const MOCK_MAINNET_SEED_TITLE = '[TEST] Ethereum Mainnet (pre-disable)'; + +/** + * Dev-only helper (requires `show_dev_tools`). Inserts a saved UI configuration on + * ethereum-mainnet for testing mainnet-disable behavior when loading legacy records. + */ +export async function seedMockMainnetContractUI(): Promise { + const existing = (await contractUIStorage.getAll()).find( + (record) => record.title === MOCK_MAINNET_SEED_TITLE + ); + if (existing) { + return existing.id; + } + + const contractAddress = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0'; + + return contractUIStorage.save({ + title: MOCK_MAINNET_SEED_TITLE, + ecosystem: 'evm', + networkId: 'ethereum-mainnet', + contractAddress, + functionId: 'transfer', + formConfig: { + id: 'transfer', + functionId: 'transfer', + title: MOCK_MAINNET_SEED_TITLE, + contractAddress, + layout: { columns: 1, spacing: 'normal', labelPosition: 'top' }, + validation: { mode: 'onChange', showErrors: 'inline' }, + submitButton: { text: 'Submit', loadingText: 'Submitting...' }, + fields: [ + { + id: 'seed-to', + name: 'to', + label: 'Recipient', + type: 'blockchain-address', + placeholder: '0x...', + helperText: '', + defaultValue: '', + validation: { required: true }, + width: 'full', + isHidden: false, + isHardcoded: false, + readOnly: false, + }, + ], + }, + metadata: { + isManuallyRenamed: true, + seededForMainnetDisableTest: true, + }, + }); +} + +export async function seedMockMainnetContractUIWithToast(): Promise { + try { + const id = await seedMockMainnetContractUI(); + toast.success('Mock mainnet configuration seeded', { + description: `Look for "${MOCK_MAINNET_SEED_TITLE}" in the sidebar (id: ${id}).`, + }); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + toast.error('Failed to seed mock mainnet configuration', { description: message }); + } +} diff --git a/apps/builder/src/export/__tests__/__snapshots__/ExportSnapshotTests.test.ts.snap b/apps/builder/src/export/__tests__/__snapshots__/ExportSnapshotTests.test.ts.snap index 1b1ccc1b..e4c85ef9 100644 --- a/apps/builder/src/export/__tests__/__snapshots__/ExportSnapshotTests.test.ts.snap +++ b/apps/builder/src/export/__tests__/__snapshots__/ExportSnapshotTests.test.ts.snap @@ -342,11 +342,11 @@ exports[`Export Snapshot Tests > evm Export Snapshots > should match snapshot fo { "dependencies": { "@openzeppelin/adapter-evm": "^2.1.0", - "@openzeppelin/ui-components": "^3.0.0", + "@openzeppelin/ui-components": "^3.0.1", "@openzeppelin/ui-react": "^3.0.0", "@openzeppelin/ui-renderer": "^3.0.0", - "@openzeppelin/ui-types": "^3.1.0", - "@openzeppelin/ui-utils": "^3.0.0", + "@openzeppelin/ui-types": "^3.1.1", + "@openzeppelin/ui-utils": "^3.0.1", "@tanstack/react-query": "^5.0.0", "@wagmi/core": "^2.20.3", "react": "^19.2.1", @@ -709,11 +709,11 @@ exports[`Export Snapshot Tests > polkadot Export Snapshots > should match snapsh { "dependencies": { "@openzeppelin/adapter-polkadot": "^2.1.0", - "@openzeppelin/ui-components": "^3.0.0", + "@openzeppelin/ui-components": "^3.0.1", "@openzeppelin/ui-react": "^3.0.0", "@openzeppelin/ui-renderer": "^3.0.0", - "@openzeppelin/ui-types": "^3.1.0", - "@openzeppelin/ui-utils": "^3.0.0", + "@openzeppelin/ui-types": "^3.1.1", + "@openzeppelin/ui-utils": "^3.0.1", "@tanstack/react-query": "^5.0.0", "@wagmi/core": "^2.20.3", "react": "^19.2.1", diff --git a/apps/builder/src/export/assemblers/__tests__/generateAndAddAppConfig.test.ts b/apps/builder/src/export/assemblers/__tests__/generateAndAddAppConfig.test.ts index 062da84b..0e4e4991 100644 --- a/apps/builder/src/export/assemblers/__tests__/generateAndAddAppConfig.test.ts +++ b/apps/builder/src/export/assemblers/__tests__/generateAndAddAppConfig.test.ts @@ -186,6 +186,18 @@ describe('generateAndAddAppConfig', () => { }); }); + it('should not include hosted-only mainnet disable flag in exported app.config.json.example', async () => { + const projectFiles: Record = {}; + const networkConfig = createNetworkConfig('evm', 'ethereum-sepolia'); + const formConfig = createFormConfig('custom'); + + await generateAndAddAppConfig(projectFiles, networkConfig, mockTemplateProcessor, formConfig); + + const exampleConfig = JSON.parse(projectFiles['public/app.config.json.example']); + expect(exampleConfig.featureFlags?.mainnet_networks_disabled).toBeUndefined(); + expect(exampleConfig.disabledNetworkIds).toBeUndefined(); + }); + it('should not generate app.config.json for custom kit', async () => { const projectFiles: Record = {}; const networkConfig = createNetworkConfig('solana', 'solana-devnet'); diff --git a/apps/builder/src/export/assemblers/copyAdapterPatchFiles.ts b/apps/builder/src/export/assemblers/copyAdapterPatchFiles.ts index df4cf49a..371d3681 100644 --- a/apps/builder/src/export/assemblers/copyAdapterPatchFiles.ts +++ b/apps/builder/src/export/assemblers/copyAdapterPatchFiles.ts @@ -6,15 +6,6 @@ import { adapterPatchSourceDescriptions } from '../shared/adapterPackageSources' const LOG_SYSTEM = 'File Assembly (copyAdapterPatchFiles)'; -const siblingAdapterPatchModules = import.meta.glob( - '../../../../../../openzeppelin-adapters/packages/adapter-*/patches/*.patch', - { - query: '?raw', - import: 'default', - eager: true, - } -); - const installedAdapterPatchModules = import.meta.glob( '../../../../../node_modules/@openzeppelin/adapter-*/patches/*.patch', { @@ -25,19 +16,13 @@ const installedAdapterPatchModules = import.meta.glob( ); /** - * Pre-load patch files from all supported adapter-package locations. - * - * Resolution order matters: - * 1. sibling `openzeppelin-adapters` checkout for local extraction work - * 2. installed `node_modules/@openzeppelin/adapter-*` packages - */ -const patchModuleSources = [siblingAdapterPatchModules, installedAdapterPatchModules] as const; - -/** - * Pre-load all patch files from adapter packages using Vite's glob import. + * Pre-load patch files from installed adapter packages using Vite's glob import. * This is required because Vite needs static analysis of imports at build time. + * + * Patches are read from `node_modules/@openzeppelin/adapter-*`, which covers both + * published npm installs and `dev:adapters:local` linked checkouts. */ -const patchModules = patchModuleSources.flatMap((modules) => Object.entries(modules)); +const patchModules = Object.entries(installedAdapterPatchModules); /** * Copies patch files from the adapter package to the exported project. diff --git a/apps/builder/src/export/shared/adapterPackageSources.json b/apps/builder/src/export/shared/adapterPackageSources.json index 31c8a5d8..bd2b0f26 100644 --- a/apps/builder/src/export/shared/adapterPackageSources.json +++ b/apps/builder/src/export/shared/adapterPackageSources.json @@ -14,8 +14,6 @@ "@openzeppelin/adapter-stellar": "adapter-stellar" }, "patchSourceDescriptions": [ - "sibling openzeppelin-adapters checkout", - "installed @openzeppelin/adapter-* package", - "legacy ui-builder workspace fallback" + "installed @openzeppelin/adapter-* package" ] } diff --git a/apps/builder/src/export/templates/typescript-react-vite/package.json b/apps/builder/src/export/templates/typescript-react-vite/package.json index 09593132..f73f00eb 100644 --- a/apps/builder/src/export/templates/typescript-react-vite/package.json +++ b/apps/builder/src/export/templates/typescript-react-vite/package.json @@ -12,9 +12,9 @@ "check-deps": "npm outdated" }, "dependencies": { - "@openzeppelin/ui-components": "^3.0.0", + "@openzeppelin/ui-components": "^3.0.1", "@openzeppelin/ui-renderer": "^3.0.0", - "@openzeppelin/ui-utils": "^3.0.0", + "@openzeppelin/ui-utils": "^3.0.1", "react": "^19.2.1", "react-dom": "^19.2.1", "react-hook-form": "^7.60.0" diff --git a/apps/builder/src/export/versions.ts b/apps/builder/src/export/versions.ts index cabb912e..f43040b5 100644 --- a/apps/builder/src/export/versions.ts +++ b/apps/builder/src/export/versions.ts @@ -14,8 +14,8 @@ export const packageVersions = { '@openzeppelin/ui-react': '3.0.0', '@openzeppelin/ui-renderer': '3.0.0', '@openzeppelin/ui-storage': '1.2.2', - '@openzeppelin/ui-types': '3.1.0', - '@openzeppelin/ui-components': '3.0.0', - '@openzeppelin/ui-utils': '3.0.0', + '@openzeppelin/ui-types': '3.1.1', + '@openzeppelin/ui-components': '3.0.1', + '@openzeppelin/ui-utils': '3.0.1', '@openzeppelin/ui-styles': '1.1.0', }; diff --git a/apps/builder/tsconfig.typecheck.json b/apps/builder/tsconfig.typecheck.json index 6b4c4cc5..04d7a522 100644 --- a/apps/builder/tsconfig.typecheck.json +++ b/apps/builder/tsconfig.typecheck.json @@ -2,6 +2,9 @@ "extends": "./tsconfig.json", "compilerOptions": { "noEmit": true, + "emitDeclarationOnly": false, + "declaration": false, + "declarationMap": false, "paths": { "@/*": ["./src/*"] } diff --git a/docs/LOCAL_DEVELOPMENT.md b/docs/LOCAL_DEVELOPMENT.md index 8ea67588..9ba0ea42 100644 --- a/docs/LOCAL_DEVELOPMENT.md +++ b/docs/LOCAL_DEVELOPMENT.md @@ -233,13 +233,14 @@ pnpm dev # Restart dev server ### Switching Between Modes -If you experience issues after switching between local and npm modes: +`oz-ui-dev use local` and `oz-ui-dev use remote` automatically clear root and workspace `node_modules` before reinstalling, so pnpm re-applies `.pnpmfile.cjs` rewrites. You should not need a manual cleanup in normal use. + +If you still experience stale resolution after switching modes: ```bash -# Clean and reinstall pnpm clean rm -rf node_modules -pnpm install # or pnpm dev:local +pnpm dev:local ``` ### Verifying Local Mode is Active @@ -252,6 +253,34 @@ Using local packages for /path/to/ui-builder adapters: 5 tarballs -> /path/to/ui-builder/.packed-packages/local-dev/adapters.json ``` +### Testing hosted mainnet disable locally + +Hosted UI Builder builds set `mainnet_networks_disabled` via Docker (`VITE_APP_CFG_FEATURE_FLAG_MAINNET_NETWORKS_DISABLED=true`). Self-hosted local dev does not enable that policy by default. + +To test the hosted mainnet-disable UX locally, add to `apps/builder/public/app.config.local.json`: + +```json +{ + "featureFlags": { + "mainnet_networks_disabled": true + } +} +``` + +Or set in `apps/builder/.env.local`: + +```bash +VITE_APP_CFG_FEATURE_FLAG_MAINNET_NETWORKS_DISABLED=true +``` + +Dev-only sidebar tools (mainnet seed helpers) require `show_dev_tools`: + +```bash +VITE_APP_CFG_FEATURE_FLAG_SHOW_DEV_TOOLS=true +``` + +Do not enable `show_dev_tools` in staging or production deployments. + ## Best Practices 1. **Keep All Repos Updated**: Pull latest changes from ui-builder, openzeppelin-ui, and openzeppelin-adapters regularly diff --git a/package.json b/package.json index 39e3b1a0..cb5cc581 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@commitlint/cz-commitlint": "^19.8.1", "@ianvs/prettier-plugin-sort-imports": "4.5.1", "@openzeppelin/docs-utils": "^0.1.6", - "@openzeppelin/ui-dev-cli": "^0.6.0", + "@openzeppelin/ui-dev-cli": "^0.6.1", "@tailwindcss/postcss": "^4.2.2", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7bd6c49..377fec0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,6 +24,10 @@ overrides: '@midnight-ntwrk/midnight-js-network-id': 2.0.2 '@midnight-ntwrk/midnight-js-types': 2.0.2 '@midnight-ntwrk/midnight-js-utils': 2.0.2 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 + '@openzeppelin/ui-components': 3.0.1 + react-hook-form: 7.79.0 axios@<1.16.0: ^1.16.0 hono@<4.12.21: ^4.12.21 protobufjs@<7.5.8: ^7.5.8 @@ -67,8 +71,8 @@ importers: specifier: ^0.1.6 version: 0.1.6 '@openzeppelin/ui-dev-cli': - specifier: ^0.6.0 - version: 0.6.0 + specifier: ^0.6.1 + version: 0.6.1 '@tailwindcss/postcss': specifier: ^4.2.2 version: 4.2.2 @@ -140,34 +144,34 @@ importers: version: 1.9.5(4480ce4a757a0261748c63c6238f7fbd) '@hookform/resolvers': specifier: ^4.1.3 - version: 4.1.3(react-hook-form@7.72.1(react@19.2.4)) + version: 4.1.3(react-hook-form@7.79.0(react@19.2.4)) '@icons-pack/react-simple-icons': specifier: ^12.9.0 version: 12.9.0(react@19.2.4) '@openzeppelin/adapter-evm': specifier: '>=2.0.2-0 <3.0.0' - version: 2.0.2(abc59de9370e99bc462001014585c183) + version: 2.0.2(a6ab15e4a742d38f5e2a58de34e72101) '@openzeppelin/adapter-midnight': specifier: '>=2.0.1-0 <3.0.0' - version: 2.0.1(@openzeppelin/ui-components@3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-react@3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-types@3.0.0)(@openzeppelin/ui-utils@3.0.0)(@types/react@19.2.14)(bufferutil@4.1.0)(crossws@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) + version: 2.0.1(@openzeppelin/ui-components@3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-react@3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-types@3.1.1)(@openzeppelin/ui-utils@3.0.1)(@types/react@19.2.14)(bufferutil@4.1.0)(crossws@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) '@openzeppelin/adapter-polkadot': specifier: '>=2.0.2-0 <3.0.0' - version: 2.0.2(45af91f293345fc4186f85559869d581) + version: 2.0.2(6d4188a31e1186f28ad6eca5fe60189c) '@openzeppelin/adapter-solana': specifier: '>=2.0.0-0 <3.0.0' - version: 2.0.0(@openzeppelin/ui-types@3.0.0)(@openzeppelin/ui-utils@3.0.0)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6) + version: 2.0.0(@openzeppelin/ui-types@3.1.1)(@openzeppelin/ui-utils@3.0.1)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6) '@openzeppelin/adapter-stellar': specifier: '>=2.0.2-0 <3.0.0' - version: 2.0.2(6c1dceabd81d6c272cbfabd204acf447) + version: 2.0.2(2b0327c1100eab91763e0bb8d76ede81) '@openzeppelin/ui-components': - specifier: ^3.0.0 - version: 3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) + specifier: 3.0.1 + version: 3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) '@openzeppelin/ui-react': specifier: ^3.0.0 version: 3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) '@openzeppelin/ui-renderer': specifier: ^3.0.0 - version: 3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react-hook-form@7.72.1(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) + version: 3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react-hook-form@7.79.0(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) '@openzeppelin/ui-storage': specifier: ^1.2.2 version: 1.2.2(@types/react@19.2.14)(react@19.2.4) @@ -175,11 +179,11 @@ importers: specifier: ^1.1.0 version: 1.1.0 '@openzeppelin/ui-types': - specifier: ^3.0.0 - version: 3.0.0 + specifier: 3.1.1 + version: 3.1.1 '@openzeppelin/ui-utils': - specifier: ^3.0.0 - version: 3.0.0 + specifier: 3.0.1 + version: 3.0.1 '@radix-ui/react-accordion': specifier: ^1.2.12 version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -265,8 +269,8 @@ importers: specifier: ^19.2.4 version: 19.2.4(react@19.2.4) react-hook-form: - specifier: ^7.72.1 - version: 7.72.1(react@19.2.4) + specifier: 7.79.0 + version: 7.79.0(react@19.2.4) sonner: specifier: ^2.0.7 version: 2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -315,7 +319,7 @@ importers: version: 4.0.0 '@openzeppelin/adapters-vite': specifier: '>=2.0.0-0 <3.0.0' - version: 2.0.0(a92292d9b7b2776dc50cdec8b07dbf25) + version: 2.0.0(50a78304bd0aaaea7ad0048eef4b8023) '@tailwindcss/vite': specifier: ^4.2.2 version: 4.2.2(vite@7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0)) @@ -1110,7 +1114,7 @@ packages: '@hookform/resolvers@4.1.3': resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} peerDependencies: - react-hook-form: ^7.0.0 + react-hook-form: 7.79.0 '@hot-wallet/sdk@1.0.11': resolution: {integrity: sha512-qRDH/4yqnRCnk7L/Qd0/LDOKDUKWcFgvf6eRELJkP0OgxIe65i/iXaG+u2lL0mLbTGkiWYk67uAvEerNUv2gzA==} @@ -1524,33 +1528,33 @@ packages: '@openzeppelin/adapter-evm@2.0.2': resolution: {integrity: sha512-/hpolOfuUMVV6/QEz600bMCoeju9jK7XFwCkaQgpKJIXVfkNz1aFhYgcnzrocL6D2A3OJV17733Ponuc7HoVKA==} peerDependencies: - '@openzeppelin/ui-components': ^2.0.0 + '@openzeppelin/ui-components': 3.0.1 '@openzeppelin/ui-react': ^2.0.1 - '@openzeppelin/ui-types': ^2.0.0 - '@openzeppelin/ui-utils': ^2.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@rainbow-me/rainbowkit': ^2.2.8 '@tanstack/react-query': ^5.74.7 react: ^19.0.0 react-dom: ^19.0.0 - react-hook-form: ^7.62.0 + react-hook-form: 7.79.0 viem: ^2.28.0 wagmi: ^2.15.0 '@openzeppelin/adapter-midnight@2.0.1': resolution: {integrity: sha512-xylUaiERxyk/VWPr6ooYO9FfFcFVZ6IW68vpigciNlDTX4fiSC3rO52+psBUeDN4oh8rfkwx6HROn6oAxMBj5g==} peerDependencies: - '@openzeppelin/ui-components': ^2.0.0 + '@openzeppelin/ui-components': 3.0.1 '@openzeppelin/ui-react': ^2.0.1 - '@openzeppelin/ui-types': ^2.0.0 - '@openzeppelin/ui-utils': ^2.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 react: ^19.0.0 react-dom: ^19.0.0 '@openzeppelin/adapter-polkadot@2.0.2': resolution: {integrity: sha512-2Km4Q9FD4hIS1YJIAsFhQsXYAL1BpUPFTgnSIvyUFTAZjv6nLbCsXMm9ITAHYZvDrnaEPijVrg0kapkBGZwsww==} peerDependencies: - '@openzeppelin/ui-types': ^2.0.0 - '@openzeppelin/ui-utils': ^2.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@rainbow-me/rainbowkit': ^2.2.8 '@tanstack/react-query': ^5.74.7 react: ^18.0.0 || ^19.0.0 @@ -1561,19 +1565,19 @@ packages: '@openzeppelin/adapter-solana@2.0.0': resolution: {integrity: sha512-xu3oGpqy3SW94YXYK74jhBuRKHF+A5eu9P3r0kaWI19Ln9Pjg038Zzc0mEh7jzZkvyvtCSb62GqBVbh8wJeH5A==} peerDependencies: - '@openzeppelin/ui-types': ^2.0.0 - '@openzeppelin/ui-utils': ^2.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 react: ^19.0.0 '@openzeppelin/adapter-stellar@2.0.2': resolution: {integrity: sha512-3Sq4mP7Cvlvs4dHCbNNOIVDTxWZjWqt0nlzxcMIo2IJS8EuMZuf/1jo3TtSOuIpdH0Pzw0fZbZ4gMKZjzKdqIQ==} peerDependencies: - '@openzeppelin/ui-components': ^2.0.0 - '@openzeppelin/ui-types': ^2.0.0 - '@openzeppelin/ui-utils': ^2.0.0 + '@openzeppelin/ui-components': 3.0.1 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 react: ^19.0.0 react-dom: ^19.0.0 - react-hook-form: ^7.62.0 + react-hook-form: 7.79.0 '@openzeppelin/adapters-vite@2.0.0': resolution: {integrity: sha512-P3bCGfDbdzUlN+i1qvvf/SpyhnVXHKttYfieVcqQthVou/hIGVjWkXImXq5BICxYjNXt+J86XmwnU76eMOcARA==} @@ -1604,14 +1608,14 @@ packages: resolution: {integrity: sha512-G3Zhg0imaT9Ej1cE9Cq5d4uQvW+DinD2GvRuiPWo3+O9KI8ivBnGJkjEGgK9Ja3/QsUNIfx8Gk5Mdw2sPXjVWA==} engines: {node: '>=22.14.0', npm: use pnpm, pnpm: '>=9', yarn: use pnpm} - '@openzeppelin/ui-components@3.0.0': - resolution: {integrity: sha512-hAra6B/nrtsYuBpPIv8vwOQjEjDoZKN9eOkCnOPTn+O0XNBXry6d06CelK63U7/mimDpbSxe8WpzynI5jkGfTQ==} + '@openzeppelin/ui-components@3.0.1': + resolution: {integrity: sha512-J1oPHW9lmRjp/ECqAOcpoYDBqF9w+le45ekbDRMd0KbwHXXd7twES/swsQkU62zL7TWW1KekmmwWn4Gx5QKEBg==} peerDependencies: react: ^19.0.0 react-dom: ^19.0.0 - '@openzeppelin/ui-dev-cli@0.6.0': - resolution: {integrity: sha512-NE4m41YM/YiDSOpv5VUrpXLvP7ziLyl6UZ0+pz9pi/P4NRNkciKq+TNSmJlCLlPJ/g7dYvKCGBWPZ8a1ROSAAg==} + '@openzeppelin/ui-dev-cli@0.6.1': + resolution: {integrity: sha512-W5hdgcHuKJSpBUXqL+5l6fE5CMK/6jFnl23saLG/IsmgC9XSdYetl+wkiNjOFoVNQqlvVao5TPyRRXJYxrkA0g==} engines: {node: '>=20.19.0'} hasBin: true @@ -1627,7 +1631,7 @@ packages: peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - react-hook-form: ^7.0.0 + react-hook-form: 7.79.0 '@openzeppelin/ui-storage@1.2.2': resolution: {integrity: sha512-ZceuO4q6fva1boHQYJ7EnN+PuPFD7MFWDzEOgpGCIxEVQCwq2WdZRJKd18pOEtz0Cfn0izNxrym/bwuhtSxRMQ==} @@ -1641,11 +1645,11 @@ packages: resolution: {integrity: sha512-RGsMf4SARvzHJr0VesNss8JVgRGvqEINcK/e2XFXJb6QvkmaPzOoJylJGrMn5IevI0JWsyAXzhSrGRLmlBKpbg==} engines: {node: '>=20.19.0'} - '@openzeppelin/ui-types@3.0.0': - resolution: {integrity: sha512-PBM+Kkq+e21bDRcWjK2IosjiwzJgcDTBGw9bg6aO+muNDnAznwquCe/colLx1TqdiZZfvYHJCY2luv9YDTl2QQ==} + '@openzeppelin/ui-types@3.1.1': + resolution: {integrity: sha512-0vcFoW4E1eLGZZJ5O89Og8HBaSOND34qIUmMDYQ2XftDBVCgVetzRTDTRFA+MsNrcD/fa2L1e6GnuI1kIzTTrA==} - '@openzeppelin/ui-utils@3.0.0': - resolution: {integrity: sha512-uNlt4JziKpT/QWcSsYQtI4srodAYgpU/3hf4SOFZfN8a9M5ok0EmprdYPkvod3u/dX8w3sJtmadR4tGMjebsIQ==} + '@openzeppelin/ui-utils@3.0.1': + resolution: {integrity: sha512-Uo8TVLKDiwvy3WoJbKpC/Ev0bsGAhWMf/tSg2eOPzDPNwn8lDOK1hjH07n25dDaBcWBd/CA9Y/AgIyZ2XGrrvA==} '@pkgr/core@0.2.9': resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} @@ -5089,6 +5093,9 @@ packages: date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} @@ -7696,8 +7703,8 @@ packages: peerDependencies: react: ^19.2.4 - react-hook-form@7.72.1: - resolution: {integrity: sha512-RhwBoy2ygeVZje+C+bwJ8g0NjTdBmDlJvAUHTxRjTmSUKPYsKfMphkS2sgEMotsY03bP358yEYlnUeZy//D9Ig==} + react-hook-form@7.79.0: + resolution: {integrity: sha512-mhYp/MTmXvzYX6AJcJVko0rktoIhhmRnEouObj4wF5i/tCttgJvnp1+9wRkpITZjDTqpo4IOSJqu0dBlPlV/Lw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -8753,6 +8760,10 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). @@ -10087,10 +10098,10 @@ snapshots: dependencies: graphql: 16.14.0 - '@hookform/resolvers@4.1.3(react-hook-form@7.72.1(react@19.2.4))': + '@hookform/resolvers@4.1.3(react-hook-form@7.79.0(react@19.2.4))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.72.1(react@19.2.4) + react-hook-form: 7.79.0(react@19.2.4) '@hot-wallet/sdk@1.0.11(bufferutil@4.1.0)(near-api-js@5.1.1)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: @@ -10770,13 +10781,13 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@openzeppelin/adapter-evm@2.0.2(abc59de9370e99bc462001014585c183)': + '@openzeppelin/adapter-evm@2.0.2(a6ab15e4a742d38f5e2a58de34e72101)': dependencies: '@openzeppelin/relayer-sdk': 1.9.0 - '@openzeppelin/ui-components': 3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) + '@openzeppelin/ui-components': 3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) '@openzeppelin/ui-react': 3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) - '@openzeppelin/ui-types': 3.0.0 - '@openzeppelin/ui-utils': 3.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@rainbow-me/rainbowkit': 2.2.10(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(viem@2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76))(wagmi@2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.96.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': 5.96.2(react@19.2.4) '@wagmi/connectors': 5.7.13(@react-native-async-storage/async-storage@1.24.0(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(@wagmi/core@2.22.1(@tanstack/query-core@5.96.2)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)))(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76))(zod@3.25.76) @@ -10786,7 +10797,7 @@ snapshots: lucide-react: 0.510.0(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-hook-form: 7.72.1(react@19.2.4) + react-hook-form: 7.79.0(react@19.2.4) viem: 2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76) wagmi: 2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.96.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76))(zod@3.25.76) transitivePeerDependencies: @@ -10821,7 +10832,7 @@ snapshots: - utf-8-validate - zod - '@openzeppelin/adapter-midnight@2.0.1(@openzeppelin/ui-components@3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-react@3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-types@3.0.0)(@openzeppelin/ui-utils@3.0.0)(@types/react@19.2.14)(bufferutil@4.1.0)(crossws@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6)': + '@openzeppelin/adapter-midnight@2.0.1(@openzeppelin/ui-components@3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-react@3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-types@3.1.1)(@openzeppelin/ui-utils@3.0.1)(@types/react@19.2.14)(bufferutil@4.1.0)(crossws@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6)': dependencies: '@midnight-ntwrk/compact-runtime': 0.9.0 '@midnight-ntwrk/dapp-connector-api': 3.0.0(rxjs@7.8.2) @@ -10837,10 +10848,10 @@ snapshots: '@midnight-ntwrk/midnight-js-utils': 2.0.2 '@midnight-ntwrk/wallet-sdk-address-format': 2.0.0(@midnight-ntwrk/zswap@4.0.0) '@midnight-ntwrk/zswap': 4.0.0 - '@openzeppelin/ui-components': 3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) + '@openzeppelin/ui-components': 3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) '@openzeppelin/ui-react': 3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) - '@openzeppelin/ui-types': 3.0.0 - '@openzeppelin/ui-utils': 3.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@types/jszip': 3.4.1 jszip: 3.10.1 lodash-es: 4.18.1 @@ -10857,11 +10868,11 @@ snapshots: - subscriptions-transport-ws - utf-8-validate - '@openzeppelin/adapter-polkadot@2.0.2(45af91f293345fc4186f85559869d581)': + '@openzeppelin/adapter-polkadot@2.0.2(6d4188a31e1186f28ad6eca5fe60189c)': dependencies: '@openzeppelin/relayer-sdk': 1.9.0 - '@openzeppelin/ui-types': 3.0.0 - '@openzeppelin/ui-utils': 3.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@rainbow-me/rainbowkit': 2.2.10(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(viem@2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76))(wagmi@2.19.5(@react-native-async-storage/async-storage@1.24.0(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6)))(@tanstack/query-core@5.96.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': 5.96.2(react@19.2.4) '@wagmi/connectors': 5.7.13(@react-native-async-storage/async-storage@1.24.0(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6)))(@types/react@19.2.14)(@wagmi/core@2.22.1(@tanstack/query-core@5.96.2)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76)))(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6)(viem@2.47.10(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@3.25.76))(zod@3.25.76) @@ -10905,10 +10916,10 @@ snapshots: - utf-8-validate - zod - '@openzeppelin/adapter-solana@2.0.0(@openzeppelin/ui-types@3.0.0)(@openzeppelin/ui-utils@3.0.0)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6)': + '@openzeppelin/adapter-solana@2.0.0(@openzeppelin/ui-types@3.1.1)(@openzeppelin/ui-utils@3.0.1)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: - '@openzeppelin/ui-types': 3.0.0 - '@openzeppelin/ui-utils': 3.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@project-serum/anchor': 0.26.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) @@ -10926,13 +10937,13 @@ snapshots: - typescript - utf-8-validate - '@openzeppelin/adapter-stellar@2.0.2(6c1dceabd81d6c272cbfabd204acf447)': + '@openzeppelin/adapter-stellar@2.0.2(2b0327c1100eab91763e0bb8d76ede81)': dependencies: '@creit.tech/stellar-wallets-kit': 1.9.5(4480ce4a757a0261748c63c6238f7fbd) '@openzeppelin/relayer-sdk': 1.9.0 - '@openzeppelin/ui-components': 3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) - '@openzeppelin/ui-types': 3.0.0 - '@openzeppelin/ui-utils': 3.0.0 + '@openzeppelin/ui-components': 3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@stellar/stellar-sdk': 14.6.1 '@stellar/stellar-xdr-json': 23.0.1 '@web3icons/react': 4.1.17(react@19.2.4)(typescript@5.9.3) @@ -10941,7 +10952,7 @@ snapshots: lucide-react: 0.510.0(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-hook-form: 7.72.1(react@19.2.4) + react-hook-form: 7.79.0(react@19.2.4) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10981,15 +10992,15 @@ snapshots: - utf-8-validate - ws - '@openzeppelin/adapters-vite@2.0.0(a92292d9b7b2776dc50cdec8b07dbf25)': + '@openzeppelin/adapters-vite@2.0.0(50a78304bd0aaaea7ad0048eef4b8023)': dependencies: vite: 7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(yaml@2.9.0) optionalDependencies: - '@openzeppelin/adapter-evm': 2.0.2(abc59de9370e99bc462001014585c183) - '@openzeppelin/adapter-midnight': 2.0.1(@openzeppelin/ui-components@3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-react@3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-types@3.0.0)(@openzeppelin/ui-utils@3.0.0)(@types/react@19.2.14)(bufferutil@4.1.0)(crossws@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) - '@openzeppelin/adapter-polkadot': 2.0.2(45af91f293345fc4186f85559869d581) - '@openzeppelin/adapter-solana': 2.0.0(@openzeppelin/ui-types@3.0.0)(@openzeppelin/ui-utils@3.0.0)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@openzeppelin/adapter-stellar': 2.0.2(6c1dceabd81d6c272cbfabd204acf447) + '@openzeppelin/adapter-evm': 2.0.2(a6ab15e4a742d38f5e2a58de34e72101) + '@openzeppelin/adapter-midnight': 2.0.1(@openzeppelin/ui-components@3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-react@3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3))(@openzeppelin/ui-types@3.1.1)(@openzeppelin/ui-utils@3.0.1)(@types/react@19.2.14)(bufferutil@4.1.0)(crossws@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(utf-8-validate@6.0.6) + '@openzeppelin/adapter-polkadot': 2.0.2(6d4188a31e1186f28ad6eca5fe60189c) + '@openzeppelin/adapter-solana': 2.0.0(@openzeppelin/ui-types@3.1.1)(@openzeppelin/ui-utils@3.0.1)(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.83.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@6.0.6))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@openzeppelin/adapter-stellar': 2.0.2(2b0327c1100eab91763e0bb8d76ede81) '@openzeppelin/docs-utils@0.1.6': dependencies: @@ -11010,10 +11021,10 @@ snapshots: - debug - supports-color - '@openzeppelin/ui-components@3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3)': + '@openzeppelin/ui-components@3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3)': dependencies: - '@openzeppelin/ui-types': 3.0.0 - '@openzeppelin/ui-utils': 3.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -11032,14 +11043,14 @@ snapshots: '@web3icons/react': 4.1.17(react@19.2.4)(typescript@5.9.3) class-variance-authority: 0.7.1 clsx: 2.1.1 - date-fns: 4.1.0 + date-fns: 4.4.0 lodash: 4.18.1 lucide-react: 0.510.0(react@19.2.4) next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-day-picker: 9.14.0(react@19.2.4) react-dom: 19.2.4(react@19.2.4) - react-hook-form: 7.72.1(react@19.2.4) + react-hook-form: 7.79.0(react@19.2.4) sonner: 2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) tailwind-merge: 3.5.0 tailwindcss-animate: 1.0.7(tailwindcss@4.2.2) @@ -11050,7 +11061,7 @@ snapshots: - tailwindcss - typescript - '@openzeppelin/ui-dev-cli@0.6.0': + '@openzeppelin/ui-dev-cli@0.6.1': dependencies: '@clack/prompts': 0.10.1 '@openzeppelin/ui-tailwind-utils': 0.1.1 @@ -11059,9 +11070,9 @@ snapshots: '@openzeppelin/ui-react@3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3)': dependencies: - '@openzeppelin/ui-components': 3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) - '@openzeppelin/ui-types': 3.0.0 - '@openzeppelin/ui-utils': 3.0.0 + '@openzeppelin/ui-components': 3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@tanstack/react-query': 5.96.2(react@19.2.4) lucide-react: 0.510.0(react@19.2.4) react: 19.2.4 @@ -11073,13 +11084,13 @@ snapshots: - tailwindcss - typescript - '@openzeppelin/ui-renderer@3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react-hook-form@7.72.1(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3)': + '@openzeppelin/ui-renderer@3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react-hook-form@7.79.0(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3)': dependencies: - '@hookform/resolvers': 4.1.3(react-hook-form@7.72.1(react@19.2.4)) - '@openzeppelin/ui-components': 3.0.0(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) + '@hookform/resolvers': 4.1.3(react-hook-form@7.79.0(react@19.2.4)) + '@openzeppelin/ui-components': 3.0.1(@babel/runtime@7.29.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) '@openzeppelin/ui-react': 3.0.0(@babel/runtime@7.29.2)(@tanstack/react-query@5.96.2(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.2.2)(typescript@5.9.3) - '@openzeppelin/ui-types': 3.0.0 - '@openzeppelin/ui-utils': 3.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-label': 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-progress': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -11089,7 +11100,7 @@ snapshots: lucide-react: 0.503.0(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-hook-form: 7.72.1(react@19.2.4) + react-hook-form: 7.79.0(react@19.2.4) tailwind-merge: 3.5.0 transitivePeerDependencies: - '@babel/runtime' @@ -11101,8 +11112,8 @@ snapshots: '@openzeppelin/ui-storage@1.2.2(@types/react@19.2.14)(react@19.2.4)': dependencies: - '@openzeppelin/ui-types': 3.0.0 - '@openzeppelin/ui-utils': 3.0.0 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 dexie: 4.4.2 dexie-react-hooks: 1.1.7(@types/react@19.2.14)(dexie@4.4.2)(react@19.2.4) react: 19.2.4 @@ -11113,14 +11124,14 @@ snapshots: '@openzeppelin/ui-tailwind-utils@0.1.1': {} - '@openzeppelin/ui-types@3.0.0': {} + '@openzeppelin/ui-types@3.1.1': {} - '@openzeppelin/ui-utils@3.0.0': + '@openzeppelin/ui-utils@3.0.1': dependencies: - '@openzeppelin/ui-types': 3.0.0 + '@openzeppelin/ui-types': 3.1.1 clsx: 2.1.1 tailwind-merge: 3.5.0 - uuid: 11.1.0 + uuid: 14.0.0 validator: 13.15.35 '@pkgr/core@0.2.9': {} @@ -16248,6 +16259,8 @@ snapshots: date-fns@4.1.0: {} + date-fns@4.4.0: {} + dayjs@1.11.13: {} debug@2.6.9: @@ -19124,7 +19137,7 @@ snapshots: react: 19.2.4 scheduler: 0.27.0 - react-hook-form@7.72.1(react@19.2.4): + react-hook-form@7.79.0(react@19.2.4): dependencies: react: 19.2.4 @@ -20285,6 +20298,8 @@ snapshots: uuid@11.1.0: {} + uuid@14.0.0: {} + uuid@8.3.2: {} uuid@9.0.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 24eaec3b..d32f311b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -33,6 +33,10 @@ overrides: '@midnight-ntwrk/midnight-js-network-id': 2.0.2 '@midnight-ntwrk/midnight-js-types': 2.0.2 '@midnight-ntwrk/midnight-js-utils': 2.0.2 + '@openzeppelin/ui-types': 3.1.1 + '@openzeppelin/ui-utils': 3.0.1 + '@openzeppelin/ui-components': 3.0.1 + react-hook-form: 7.79.0 # Security overrides — see PR adding these for full advisory list 'axios@<1.16.0': ^1.16.0 'hono@<4.12.21': ^4.12.21