From a00c9fb767c970f271778ab6b5aed6de6eb05f7b Mon Sep 17 00:00:00 2001 From: Aleksandr Pasevin Date: Wed, 17 Jun 2026 23:16:30 +0200 Subject: [PATCH 1/3] feat(builder): disable mainnet networks on hosted deployments Show mainnets as disabled with a self-host notice, reject deep links and saved configs on blocked networks, and bump to published @openzeppelin/ui-* packages. --- .github/workflows/docker-prod.yaml | 18 +- .github/workflows/docker-stg.yaml | 22 +- Dockerfile | 4 + apps/builder/package.json | 8 +- .../components/Common/DevToolsDropdown.tsx | 10 +- .../components/NetworkRow.tsx | 102 ++-- .../components/NetworkSelectionPanel.tsx | 44 +- .../useBuilderLifecycle.deeplink.test.ts | 76 ++- .../hooks/builder/useBuilderLifecycle.ts | 29 +- .../src/dev/seedMockMainnetContractUI.ts | 69 +++ .../ExportSnapshotTests.test.ts.snap | 12 +- .../__tests__/generateAndAddAppConfig.test.ts | 12 + .../typescript-react-vite/package.json | 4 +- apps/builder/src/export/versions.ts | 6 +- apps/builder/tsconfig.typecheck.json | 3 + docs/LOCAL_DEVELOPMENT.md | 35 +- package.json | 8 +- pnpm-lock.yaml | 473 +++++++----------- 18 files changed, 539 insertions(+), 396 deletions(-) create mode 100644 apps/builder/src/dev/seedMockMainnetContractUI.ts 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 9ee7729e..f37cad70 100644 --- a/apps/builder/package.json +++ b/apps/builder/package.json @@ -35,13 +35,13 @@ "@openzeppelin/adapter-polkadot": "^2.0.0", "@openzeppelin/adapter-solana": "^2.0.0", "@openzeppelin/adapter-stellar": "^2.0.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-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..ac072442 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..af13b141 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,21 @@ const { setActiveNetworkIdMock, trackEcosystemSelectionMock, trackNetworkSelectionMock, + getNetworkByIdMock, + isNetworkSelectableMock, + getDisabledNetworkRejectionToastMock, + contractUIStorageGetMock, + toastErrorMock, } = 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(), })); vi.mock('@openzeppelin/ui-utils', () => ({ @@ -26,20 +36,26 @@ 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('@openzeppelin/ui-react', () => ({ useWalletState: () => ({ setActiveNetworkId: setActiveNetworkIdMock, @@ -123,3 +139,59 @@ describe('useBuilderLifecycle deep link ecosystem sync', () => { expect(trackEcosystemSelectionMock).not.toHaveBeenCalled(); }); }); + +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 2b0f600c..2482178c 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.0.1", - "@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.0.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.0.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.0.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 6bf245fc..ee82c9d4 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/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 9de001c2..34cfd8b8 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.0.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 57cbdf64..edc6390b 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.5.1", + "@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", @@ -112,7 +112,11 @@ "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "2.0.2", "@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" + "@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" }, "patchedDependencies": { "@midnight-ntwrk/compact-runtime@0.9.0": "patches/@midnight-ntwrk__compact-runtime@0.9.0.patch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 36d8fe03..e6cbeef8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: ^0.1.6 version: 0.1.6 '@openzeppelin/ui-dev-cli': - specifier: ^0.5.1 - version: 0.5.1 + specifier: ^0.6.1 + version: 0.6.1 '@tailwindcss/postcss': specifier: ^4.2.2 version: 4.2.2 @@ -103,34 +103,34 @@ importers: version: 1.9.5(0c23d77749bb03ec7600707f2125523f) '@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.0-0 <3.0.0' - version: 2.0.0(abc59de9370e99bc462001014585c183) + version: 2.0.0(a6ab15e4a742d38f5e2a58de34e72101) '@openzeppelin/adapter-midnight': specifier: '>=2.0.0-0 <3.0.0' - version: 2.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-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.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-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.0-0 <3.0.0' - version: 2.0.0(45af91f293345fc4186f85559869d581) + version: 2.0.0(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.0-0 <3.0.0' - version: 2.0.0(b49eeeb96ea9207816752cdd5431953f) + version: 2.0.0(a8ed744cefb91b074b67ab2e7e163f3b) '@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) @@ -138,11 +138,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) @@ -228,8 +228,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) @@ -278,7 +278,7 @@ importers: version: 4.0.0 '@openzeppelin/adapters-vite': specifier: '>=2.0.0-0 <3.0.0' - version: 2.0.0(72c7d3ce6e2c28f47d65452f01f58303) + version: 2.0.0(1a47b8fd2dc2ad3287c705b82d104893) '@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.46.1)(yaml@2.8.3)) @@ -413,10 +413,6 @@ packages: '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - '@babel/code-frame@7.28.6': - resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -425,18 +421,10 @@ packages: resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.6': - resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} - engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.6': - resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} @@ -475,19 +463,10 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.29.2': resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} @@ -584,10 +563,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} @@ -596,18 +571,10 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.6': - resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.6': - resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} - engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -1593,8 +1560,14 @@ packages: react: ^19.0.0 react-dom: ^19.0.0 - '@openzeppelin/ui-dev-cli@0.5.1': - resolution: {integrity: sha512-4c6Uhd/NQQW+F+RkmCbJWrcvMMfjiP2LwCrAOorCTp61X4uy9PsCO6Q2WdYgu0BhV5wkCiwtXYqiVWWWRJfk2w==} + '@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.1': + resolution: {integrity: sha512-W5hdgcHuKJSpBUXqL+5l6fE5CMK/6jFnl23saLG/IsmgC9XSdYetl+wkiNjOFoVNQqlvVao5TPyRRXJYxrkA0g==} engines: {node: '>=20.19.0'} hasBin: true @@ -1620,15 +1593,25 @@ packages: '@openzeppelin/ui-styles@1.1.0': resolution: {integrity: sha512-PSGe8k1M3zymLuhs3pus6MlhTgpTj7XFMEICTdTQYPDno/u6XL9AZM6hXlsK5dVlZTVjvmu3//LZ/K+81/Wc+Q==} + '@openzeppelin/ui-tailwind-utils@0.1.1': + 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==} + '@paulmillr/qr@0.2.1': resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} - deprecated: 'The package is now available as "qr": npm install qr' + deprecated: 'Switch to "qr" (new package name) for security updates: npm install qr' '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -4335,11 +4318,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} @@ -4642,9 +4620,6 @@ packages: bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@1.1.13: resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} @@ -5092,8 +5067,8 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} - 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==} @@ -7063,9 +7038,6 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} @@ -7473,10 +7445,6 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -7762,8 +7730,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 @@ -8845,6 +8813,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). @@ -8926,46 +8898,6 @@ packages: peerDependencies: vite: ^2 || ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.3.2: resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -9384,12 +9316,6 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 - '@babel/code-frame@7.28.6': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -9398,26 +9324,6 @@ snapshots: '@babel/compat-data@7.28.6': {} - '@babel/core@7.28.6': - dependencies: - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.28.6 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/template': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -9438,14 +9344,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.6': - dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.2 @@ -9466,17 +9364,8 @@ snapshots: '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)': - dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -9485,7 +9374,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -9497,20 +9386,11 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.28.6': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.28.6 - '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.28.6': - dependencies: - '@babel/types': 7.28.6 - '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 @@ -9590,37 +9470,23 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/runtime@7.28.6': {} - '@babel/runtime@7.29.2': {} '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 - - '@babel/traverse@7.28.6': - dependencies: - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.28.6 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.6 - '@babel/template': 7.28.6 - '@babel/types': 7.28.6 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 '@babel/traverse@7.29.0': dependencies: @@ -9634,11 +9500,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.28.6': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -9977,7 +9838,7 @@ snapshots: '@creit.tech/xbull-wallet-connect@0.4.0': dependencies: - rxjs: 7.8.1 + rxjs: 7.8.2 tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 @@ -10245,10 +10106,10 @@ snapshots: dependencies: graphql: 16.13.2 - '@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: @@ -10985,13 +10846,13 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@openzeppelin/adapter-evm@2.0.0(abc59de9370e99bc462001014585c183)': + '@openzeppelin/adapter-evm@2.0.0(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) @@ -11001,7 +10862,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: @@ -11036,7 +10897,7 @@ snapshots: - utf-8-validate - zod - '@openzeppelin/adapter-midnight@2.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-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.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-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) @@ -11052,10 +10913,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 @@ -11072,11 +10933,11 @@ snapshots: - subscriptions-transport-ws - utf-8-validate - '@openzeppelin/adapter-polkadot@2.0.0(45af91f293345fc4186f85559869d581)': + '@openzeppelin/adapter-polkadot@2.0.0(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) @@ -11119,10 +10980,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)) @@ -11140,13 +11001,13 @@ snapshots: - typescript - utf-8-validate - '@openzeppelin/adapter-stellar@2.0.0(b49eeeb96ea9207816752cdd5431953f)': + '@openzeppelin/adapter-stellar@2.0.0(a8ed744cefb91b074b67ab2e7e163f3b)': dependencies: '@creit.tech/stellar-wallets-kit': 1.9.5(0c23d77749bb03ec7600707f2125523f) '@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.0 '@web3icons/react': 4.1.17(react@19.2.4)(typescript@5.9.3) @@ -11155,7 +11016,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' @@ -11195,15 +11056,15 @@ snapshots: - utf-8-validate - ws - '@openzeppelin/adapters-vite@2.0.0(72c7d3ce6e2c28f47d65452f01f58303)': + '@openzeppelin/adapters-vite@2.0.0(1a47b8fd2dc2ad3287c705b82d104893)': dependencies: vite: 7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) optionalDependencies: - '@openzeppelin/adapter-evm': 2.0.0(abc59de9370e99bc462001014585c183) - '@openzeppelin/adapter-midnight': 2.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-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.0(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.0(b49eeeb96ea9207816752cdd5431953f) + '@openzeppelin/adapter-evm': 2.0.0(a6ab15e4a742d38f5e2a58de34e72101) + '@openzeppelin/adapter-midnight': 2.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-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.0(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.0(a8ed744cefb91b074b67ab2e7e163f3b) '@openzeppelin/docs-utils@0.1.6': dependencies: @@ -11245,14 +11106,54 @@ 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.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) + transitivePeerDependencies: + - '@babel/runtime' + - '@types/react' + - '@types/react-dom' + - tailwindcss + - typescript + + '@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.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) + '@radix-ui/react-dialog': 1.1.15(@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-dropdown-menu': 2.1.16(@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-popover': 1.1.15(@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) + '@radix-ui/react-radio-group': 1.3.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-select': 2.2.6(@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-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-tabs': 1.1.13(@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-toast': 1.2.15(@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-tooltip': 1.2.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) + '@uiw/react-textarea-code-editor': 3.1.1(@babel/runtime@7.29.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@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.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) @@ -11263,9 +11164,10 @@ snapshots: - tailwindcss - typescript - '@openzeppelin/ui-dev-cli@0.5.1': + '@openzeppelin/ui-dev-cli@0.6.1': dependencies: '@clack/prompts': 0.10.1 + '@openzeppelin/ui-tailwind-utils': 0.1.1 commander: 13.1.0 picocolors: 1.1.1 @@ -11285,9 +11187,9 @@ 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)) + '@hookform/resolvers': 4.1.3(react-hook-form@7.79.0(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) '@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 @@ -11301,7 +11203,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' @@ -11323,8 +11225,12 @@ snapshots: '@openzeppelin/ui-styles@1.1.0': {} + '@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': dependencies: '@openzeppelin/ui-types': 3.0.0 @@ -11333,6 +11239,14 @@ snapshots: uuid: 11.1.0 validator: 13.15.35 + '@openzeppelin/ui-utils@3.0.1': + dependencies: + '@openzeppelin/ui-types': 3.1.1 + clsx: 2.1.1 + tailwind-merge: 3.5.0 + uuid: 14.0.0 + validator: 13.15.35 + '@paulmillr/qr@0.2.1': {} '@pkgjs/parseargs@0.11.0': @@ -12357,7 +12271,7 @@ snapshots: '@scure/bip32@1.7.0': dependencies: - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 @@ -13763,7 +13677,7 @@ snapshots: '@testing-library/react@16.3.2(@testing-library/dom@10.4.0)(@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)': dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 '@testing-library/dom': 10.4.0 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -14037,24 +13951,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/benchmark@2.1.5': {} @@ -14366,9 +14280,9 @@ snapshots: '@vitejs/plugin-react@4.7.0(vite@7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))': dependencies: - '@babel/core': 7.28.6 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 @@ -14403,13 +14317,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))': + '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) '@vitest/pretty-format@3.2.4': dependencies: @@ -15004,7 +14918,7 @@ snapshots: '@noble/hashes': 1.7.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - uint8arrays: 3.1.0 + uint8arrays: 3.1.1 '@walletconnect/safe-json@1.0.2': dependencies: @@ -15663,11 +15577,9 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 - - acorn@8.15.0: {} + acorn: 8.16.0 acorn@8.16.0: {} @@ -16012,11 +15924,6 @@ snapshots: bowser@2.14.1: {} - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@1.1.13: dependencies: balanced-match: 1.0.2 @@ -16507,7 +16414,7 @@ snapshots: dependencies: '@babel/runtime': 7.29.2 - date-fns@4.1.0: {} + date-fns@4.4.0: {} dayjs@1.11.13: {} @@ -16923,7 +16830,7 @@ snapshots: hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 3.1.5 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 @@ -17056,8 +16963,8 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -17189,10 +17096,6 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -17709,7 +17612,7 @@ snapshots: cli-width: 3.0.0 external-editor: 3.1.0 figures: 3.2.0 - lodash: 4.17.21 + lodash: 4.18.1 mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 @@ -18480,13 +18383,13 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 source-map-js: 1.2.1 make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 makeerror@1.0.12: dependencies: @@ -18770,10 +18673,6 @@ snapshots: dependencies: brace-expansion: 5.0.5 - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - minimatch@3.1.5: dependencies: brace-expansion: 1.1.13 @@ -19221,8 +19120,6 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.3: {} - picomatch@4.0.4: {} pidtree@0.6.0: {} @@ -19362,7 +19259,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/node': 24.10.13 - long: 5.2.5 + long: 5.3.2 protobufjs@7.5.4: dependencies: @@ -19438,7 +19335,7 @@ snapshots: dependencies: '@date-fns/tz': 1.4.1 '@tabby_ai/hijri-converter': 1.0.5 - date-fns: 4.1.0 + date-fns: 4.4.0 date-fns-jalali: 4.1.0-0 react: 19.2.4 @@ -19455,7 +19352,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 @@ -20297,8 +20194,8 @@ snapshots: tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tinypool@1.1.1: {} @@ -20648,6 +20545,8 @@ snapshots: uuid@11.1.0: {} + uuid@14.0.0: {} + uuid@8.3.2: {} uuid@9.0.1: {} @@ -20747,7 +20646,7 @@ snapshots: debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - jiti @@ -20777,22 +20676,6 @@ snapshots: dependencies: vite: 7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) - vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3): - dependencies: - esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.8 - rollup: 4.60.1 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.10.13 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.32.0 - terser: 5.46.1 - yaml: 2.8.3 - vite@7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3): dependencies: esbuild: 0.27.7 @@ -20813,7 +20696,7 @@ snapshots: dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) + '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -20824,14 +20707,14 @@ snapshots: expect-type: 1.3.0 magic-string: 0.30.21 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) vite-node: 3.2.4(@types/node@24.10.13)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: From 07fc8e39034f98315f4286a5ff0987fca814dc7d Mon Sep 17 00:00:00 2001 From: Aleksandr Pasevin Date: Wed, 17 Jun 2026 23:22:13 +0200 Subject: [PATCH 2/3] fix(export): load adapter patches from node_modules only Sync export adapter versions to latest npm releases and refresh snapshots. Avoid eager sibling openzeppelin-adapters globs that break Vitest when a local adapters checkout is present. --- .../ExportSnapshotTests.test.ts.snap | 4 +-- .../assemblers/copyAdapterPatchFiles.ts | 25 ++++--------------- .../export/shared/adapterPackageSources.json | 1 - apps/builder/src/export/versions.ts | 6 ++--- 4 files changed, 10 insertions(+), 26 deletions(-) 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 2482178c..e4c85ef9 100644 --- a/apps/builder/src/export/__tests__/__snapshots__/ExportSnapshotTests.test.ts.snap +++ b/apps/builder/src/export/__tests__/__snapshots__/ExportSnapshotTests.test.ts.snap @@ -341,7 +341,7 @@ export default function GeneratedForm({ adapter, isWalletConnected }: GeneratedF exports[`Export Snapshot Tests > evm Export Snapshots > should match snapshot for package.json structure > package-json-evm 1`] = ` { "dependencies": { - "@openzeppelin/adapter-evm": "^2.0.1", + "@openzeppelin/adapter-evm": "^2.1.0", "@openzeppelin/ui-components": "^3.0.1", "@openzeppelin/ui-react": "^3.0.0", "@openzeppelin/ui-renderer": "^3.0.0", @@ -708,7 +708,7 @@ export default function GeneratedForm({ adapter, isWalletConnected }: GeneratedF exports[`Export Snapshot Tests > polkadot Export Snapshots > should match snapshot for package.json structure > package-json-polkadot 1`] = ` { "dependencies": { - "@openzeppelin/adapter-polkadot": "^2.0.0", + "@openzeppelin/adapter-polkadot": "^2.1.0", "@openzeppelin/ui-components": "^3.0.1", "@openzeppelin/ui-react": "^3.0.0", "@openzeppelin/ui-renderer": "^3.0.0", 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..7ae5aa8c 100644 --- a/apps/builder/src/export/shared/adapterPackageSources.json +++ b/apps/builder/src/export/shared/adapterPackageSources.json @@ -14,7 +14,6 @@ "@openzeppelin/adapter-stellar": "adapter-stellar" }, "patchSourceDescriptions": [ - "sibling openzeppelin-adapters checkout", "installed @openzeppelin/adapter-* package", "legacy ui-builder workspace fallback" ] diff --git a/apps/builder/src/export/versions.ts b/apps/builder/src/export/versions.ts index 34cfd8b8..f43040b5 100644 --- a/apps/builder/src/export/versions.ts +++ b/apps/builder/src/export/versions.ts @@ -6,11 +6,11 @@ */ export const packageVersions = { - '@openzeppelin/adapter-evm': '2.0.1', + '@openzeppelin/adapter-evm': '2.1.0', '@openzeppelin/adapter-midnight': '2.0.1', - '@openzeppelin/adapter-polkadot': '2.0.0', + '@openzeppelin/adapter-polkadot': '2.1.0', '@openzeppelin/adapter-solana': '2.0.0', - '@openzeppelin/adapter-stellar': '2.0.0', + '@openzeppelin/adapter-stellar': '2.0.2', '@openzeppelin/ui-react': '3.0.0', '@openzeppelin/ui-renderer': '3.0.0', '@openzeppelin/ui-storage': '1.2.2', From f1208478619bef2d45dcbef1932807ef90d3dc23 Mon Sep 17 00:00:00 2001 From: Aleksandr Pasevin Date: Thu, 18 Jun 2026 10:47:21 +0200 Subject: [PATCH 3/3] fix(builder): address Copilot review feedback on hosted mainnet PR Set aria-selected false for disabled network rows, remove stale patch source description, and add deep-link rejection test for disabled networks. --- .../components/NetworkRow.tsx | 2 +- .../useBuilderLifecycle.deeplink.test.ts | 55 +++++++++++++++++++ .../export/shared/adapterPackageSources.json | 3 +- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkRow.tsx b/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkRow.tsx index ac072442..a5a607fe 100644 --- a/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkRow.tsx +++ b/apps/builder/src/components/UIBuilder/StepChainSelection/components/NetworkRow.tsx @@ -42,7 +42,7 @@ export function NetworkRow({ ? 'border-muted-foreground/40 bg-card' : 'border-border bg-card' )} - aria-selected={isSelected} + aria-selected={isSelected && !disabled} aria-disabled={disabled} onClick={(e) => { e.stopPropagation(); 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 af13b141..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 @@ -14,6 +14,7 @@ const { getDisabledNetworkRejectionToastMock, contractUIStorageGetMock, toastErrorMock, + resolveNetworkIdFromDeepLinkMock, } = vi.hoisted(() => ({ parseDeepLinkMock: vi.fn(), setActiveNetworkIdMock: vi.fn(), @@ -24,6 +25,7 @@ const { getDisabledNetworkRejectionToastMock: vi.fn(), contractUIStorageGetMock: vi.fn(), toastErrorMock: vi.fn(), + resolveNetworkIdFromDeepLinkMock: vi.fn(), })); vi.mock('@openzeppelin/ui-utils', () => ({ @@ -56,6 +58,17 @@ 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, @@ -138,6 +151,48 @@ 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', () => { diff --git a/apps/builder/src/export/shared/adapterPackageSources.json b/apps/builder/src/export/shared/adapterPackageSources.json index 7ae5aa8c..bd2b0f26 100644 --- a/apps/builder/src/export/shared/adapterPackageSources.json +++ b/apps/builder/src/export/shared/adapterPackageSources.json @@ -14,7 +14,6 @@ "@openzeppelin/adapter-stellar": "adapter-stellar" }, "patchSourceDescriptions": [ - "installed @openzeppelin/adapter-* package", - "legacy ui-builder workspace fallback" + "installed @openzeppelin/adapter-* package" ] }