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