@openzeppelin/contracts-ui-builder-adapter-evm
Version:
EVM Adapter for Contracts UI Builder
1,353 lines (1,327 loc) • 221 kB
JavaScript
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __esm = (fn, res) => function __init() {
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
// src/wallet/rainbowkit/rainbowkitAssetManager.ts
var rainbowkitAssetManager_exports = {};
__export(rainbowkitAssetManager_exports, {
ensureRainbowKitAssetsLoaded: () => ensureRainbowKitAssetsLoaded
});
async function ensureRainbowKitAssetsLoaded() {
if (loadedAssets) {
import_contracts_ui_builder_utils12.logger.debug("RainbowKitAssetManager", "Assets already loaded, returning cached.");
return loadedAssets;
}
if (!providerPromise) {
providerPromise = import("@rainbow-me/rainbowkit").then((module2) => {
const component = module2.RainbowKitProvider;
import_contracts_ui_builder_utils12.logger.info("RainbowKitAssetManager", "RainbowKitProvider module loaded.");
return component;
}).catch((err) => {
import_contracts_ui_builder_utils12.logger.error("RainbowKitAssetManager", "Failed to load RainbowKitProvider module:", err);
return null;
});
}
if (!cssPromise) {
cssPromise = import("@rainbow-me/rainbowkit/styles.css").then(() => {
import_contracts_ui_builder_utils12.logger.info("RainbowKitAssetManager", "RainbowKit CSS loaded successfully.");
return true;
}).catch((err) => {
import_contracts_ui_builder_utils12.logger.error("RainbowKitAssetManager", "Failed to load RainbowKit CSS:", err);
return false;
});
}
try {
const [ProviderComponent, cssLoadedSuccess] = await Promise.all([providerPromise, cssPromise]);
loadedAssets = { ProviderComponent, cssLoaded: cssLoadedSuccess };
if (!ProviderComponent || !cssLoadedSuccess) {
import_contracts_ui_builder_utils12.logger.warn(
"RainbowKitAssetManager",
"One or more RainbowKit assets failed to load.",
loadedAssets
);
}
return loadedAssets;
} catch (error) {
import_contracts_ui_builder_utils12.logger.error("RainbowKitAssetManager", "Error in Promise.all for asset loading:", error);
loadedAssets = { ProviderComponent: null, cssLoaded: false };
return loadedAssets;
}
}
var import_contracts_ui_builder_utils12, loadedAssets, providerPromise, cssPromise;
var init_rainbowkitAssetManager = __esm({
"src/wallet/rainbowkit/rainbowkitAssetManager.ts"() {
"use strict";
import_contracts_ui_builder_utils12 = require("@openzeppelin/contracts-ui-builder-utils");
loadedAssets = null;
providerPromise = null;
cssPromise = null;
}
});
// src/index.ts
var index_exports = {};
__export(index_exports, {
EvmAdapter: () => EvmAdapter,
abiComparisonService: () => abiComparisonService,
arbitrumMainnet: () => arbitrumMainnet,
arbitrumSepolia: () => arbitrumSepolia,
avalancheFuji: () => avalancheFuji,
avalancheMainnet: () => avalancheMainnet,
baseMainnet: () => baseMainnet,
baseSepolia: () => baseSepolia,
bscMainnet: () => bscMainnet,
bscTestnet: () => bscTestnet,
ethereumMainnet: () => ethereumMainnet,
ethereumSepolia: () => ethereumSepolia,
evmAdapterConfig: () => evmAdapterConfig,
evmMainnetNetworks: () => evmMainnetNetworks,
evmNetworks: () => evmNetworks,
evmTestnetNetworks: () => evmTestnetNetworks,
extractRainbowKitCustomizations: () => extractRainbowKitCustomizations,
isRainbowKitCustomizations: () => isRainbowKitCustomizations,
lineaMainnet: () => lineaMainnet,
lineaSepolia: () => lineaSepolia,
optimismMainnet: () => optimismMainnet,
optimismSepolia: () => optimismSepolia,
polygonAmoy: () => polygonAmoy,
polygonMainnet: () => polygonMainnet,
polygonZkEvmCardona: () => polygonZkEvmCardona,
polygonZkEvmMainnet: () => polygonZkEvmMainnet,
scrollMainnet: () => scrollMainnet,
scrollSepolia: () => scrollSepolia,
zkSyncEraMainnet: () => zkSyncEraMainnet,
zksyncSepoliaTestnet: () => zksyncSepoliaTestnet
});
module.exports = __toCommonJS(index_exports);
// src/adapter.ts
var import_contracts_ui_builder_utils38 = require("@openzeppelin/contracts-ui-builder-utils");
// src/abi/comparison.ts
var import_contracts_ui_builder_utils = require("@openzeppelin/contracts-ui-builder-utils");
// src/abi/types.ts
function isValidAbiArray(value) {
return Array.isArray(value) && value.every(isValidAbiItem);
}
function isValidAbiItem(item) {
if (typeof item !== "object" || item === null) {
return false;
}
const abiItem = item;
if (typeof abiItem.type !== "string") {
return false;
}
const validTypes = ["function", "event", "constructor", "error", "fallback", "receive"];
if (!validTypes.includes(abiItem.type)) {
return false;
}
if ((abiItem.type === "function" || abiItem.type === "event") && typeof abiItem.name !== "string") {
return false;
}
if ((abiItem.type === "function" || abiItem.type === "event" || abiItem.type === "constructor") && abiItem.inputs !== void 0 && !Array.isArray(abiItem.inputs)) {
return false;
}
return true;
}
// src/abi/comparison.ts
var AbiComparisonService = class {
/**
* Compares two ABIs and returns detailed difference analysis
*/
compareAbis(abi1, abi2) {
try {
const validation1 = this.validateAbi(abi1);
const validation2 = this.validateAbi(abi2);
if (!validation1.valid || !validation2.valid) {
return {
identical: false,
differences: [],
severity: "breaking",
summary: "One or both ABIs are invalid and cannot be compared"
};
}
const normalized1 = this.normalizeAbi(validation1.normalizedAbi);
const normalized2 = this.normalizeAbi(validation2.normalizedAbi);
const hash1 = (0, import_contracts_ui_builder_utils.simpleHash)(JSON.stringify(normalized1));
const hash2 = (0, import_contracts_ui_builder_utils.simpleHash)(JSON.stringify(normalized2));
if (hash1 === hash2) {
return {
identical: true,
differences: [],
severity: "none",
summary: "ABIs are identical"
};
}
const differences = this.findDifferences(normalized1, normalized2);
const severity = this.calculateSeverity(differences);
return {
identical: false,
differences,
severity,
summary: this.generateSummary(differences)
};
} catch (error) {
import_contracts_ui_builder_utils.logger.error("ABI comparison failed:", error.message);
return {
identical: false,
differences: [],
severity: "breaking",
summary: `Comparison failed: ${error.message}`
};
}
}
/**
* Validates ABI structure and format
*/
validateAbi(abiString) {
const errors = [];
const warnings = [];
try {
const abi = JSON.parse(abiString);
if (!Array.isArray(abi)) {
errors.push("ABI must be an array");
return { valid: false, errors, warnings };
}
if (abi.length === 0) {
errors.push(
"ABI array cannot be empty - contract must have at least one function, event, or constructor"
);
return { valid: false, errors, warnings };
}
for (let i = 0; i < abi.length; i++) {
const item = abi[i];
if (!item.type) {
errors.push(`Item ${i}: Missing 'type' field`);
continue;
}
if (!["function", "event", "constructor", "error", "fallback", "receive"].includes(item.type)) {
errors.push(`Item ${i}: Invalid type '${item.type}'`);
}
if (item.type === "function" && !item.name) {
errors.push(`Item ${i}: Function missing 'name' field`);
}
if ((item.type === "function" || item.type === "event") && !Array.isArray(item.inputs)) {
errors.push(`Item ${i}: Missing or invalid 'inputs' array`);
}
if (item.type === "function" && !Array.isArray(item.outputs)) {
warnings.push(`Item ${i}: Function missing 'outputs' array`);
}
}
if (errors.length === 0 && !isValidAbiArray(abi)) {
errors.push("ABI does not conform to expected format");
}
return {
valid: errors.length === 0,
errors,
warnings,
normalizedAbi: errors.length === 0 ? abi : void 0
};
} catch (parseError) {
errors.push(`Invalid JSON: ${parseError.message}`);
return { valid: false, errors, warnings };
}
}
/**
* Creates deterministic hash of ABI for quick comparison
*/
hashAbi(abiString) {
try {
const validation = this.validateAbi(abiString);
if (!validation.valid || !validation.normalizedAbi) {
throw new Error("Cannot hash invalid ABI");
}
const normalized = this.normalizeAbi(validation.normalizedAbi);
const normalizedString = JSON.stringify(normalized);
return (0, import_contracts_ui_builder_utils.simpleHash)(normalizedString);
} catch (error) {
import_contracts_ui_builder_utils.logger.error("ABI hashing failed:", error.message);
throw new Error(`Failed to hash ABI: ${error.message}`);
}
}
/**
* Normalizes ABI for consistent comparison
*/
normalizeAbi(abi) {
return abi.map((item) => {
const normalized = { ...item };
if (normalized.inputs) {
normalized.inputs = [...normalized.inputs].sort(
(a, b) => (a.name || "").localeCompare(b.name || "")
);
}
if (normalized.outputs) {
normalized.outputs = [...normalized.outputs].sort(
(a, b) => (a.name || "").localeCompare(b.name || "")
);
}
return normalized;
}).sort((a, b) => {
const typeOrder = {
constructor: 0,
fallback: 1,
receive: 2,
function: 3,
event: 4,
error: 5
};
const aOrder = typeOrder[a.type] ?? 99;
const bOrder = typeOrder[b.type] ?? 99;
if (aOrder !== bOrder) return aOrder - bOrder;
const aName = a.name || "";
const bName = b.name || "";
return aName.localeCompare(bName);
});
}
/**
* Finds detailed differences between two normalized ABIs
*/
findDifferences(abi1, abi2) {
const differences = [];
const map1 = this.createAbiMap(abi1);
const map2 = this.createAbiMap(abi2);
for (const [key, item] of map1) {
if (!map2.has(key)) {
differences.push({
type: "removed",
section: item.type,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
name: item.name || item.type,
details: `${item.type} was removed`,
impact: this.calculateImpact(item.type, "removed"),
oldSignature: this.generateSignature(item)
});
}
}
for (const [key, item] of map2) {
if (!map1.has(key)) {
differences.push({
type: "added",
section: item.type,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
name: item.name || item.type,
details: `${item.type} was added`,
impact: this.calculateImpact(item.type, "added"),
newSignature: this.generateSignature(item)
});
}
}
for (const [key, item1] of map1) {
const item2 = map2.get(key);
if (item2 && !this.itemsEqual(item1, item2)) {
differences.push({
type: "modified",
section: item1.type,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
name: item1.name || item1.type,
details: `${item1.type} signature changed`,
impact: this.calculateImpact(item1.type, "modified"),
oldSignature: this.generateSignature(item1),
newSignature: this.generateSignature(item2)
});
}
}
return differences;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
createAbiMap(abi) {
const map = /* @__PURE__ */ new Map();
for (const item of abi) {
const key = this.generateItemKey(item);
map.set(key, item);
}
return map;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
generateItemKey(item) {
if (item.type === "constructor" || item.type === "fallback" || item.type === "receive") {
return item.type;
}
const name = item.name || "";
const inputs = item.inputs?.map((input) => input.type).join(",") || "";
return `${item.type}:${name}(${inputs})`;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
generateSignature(item) {
if (item.type === "constructor") {
const inputs = (
// eslint-disable-next-line @typescript-eslint/no-explicit-any
item.inputs?.map((input) => `${input.type} ${input.name || ""}`).join(", ") || ""
);
return `constructor(${inputs})`;
}
if (item.type === "fallback" || item.type === "receive") {
return item.type + "()";
}
if (item.type === "function") {
const inputs = (
// eslint-disable-next-line @typescript-eslint/no-explicit-any
item.inputs?.map((input) => `${input.type} ${input.name || ""}`).join(", ") || ""
);
const outputs = item.outputs?.map((output) => output.type).join(", ") || "";
const mutability = item.stateMutability ? ` ${item.stateMutability}` : "";
return `function ${item.name}(${inputs})${mutability}${outputs ? ` returns (${outputs})` : ""}`;
}
if (item.type === "event") {
const inputs = item.inputs?.map((input) => {
const indexed = input.indexed ? " indexed" : "";
return `${input.type}${indexed} ${input.name || ""}`;
}).join(", ") || "";
return `event ${item.name}(${inputs})`;
}
return JSON.stringify(item);
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
itemsEqual(item1, item2) {
return JSON.stringify(item1) === JSON.stringify(item2);
}
calculateImpact(type, changeType) {
if (type === "constructor" || type === "fallback" || type === "receive") {
return changeType === "modified" ? "high" : "medium";
}
if (type === "function") {
if (changeType === "removed") return "high";
if (changeType === "modified") return "medium";
if (changeType === "added") return "low";
}
if (type === "event") {
return "low";
}
if (type === "error") {
return "low";
}
return "medium";
}
calculateSeverity(differences) {
if (differences.length === 0) return "none";
const hasHighImpact = differences.some((d) => d.impact === "high");
const hasMediumImpact = differences.some((d) => d.impact === "medium");
const hasRemovedFunctions = differences.some(
(d) => d.type === "removed" && d.section === "function"
);
if (hasRemovedFunctions || hasHighImpact) return "breaking";
if (hasMediumImpact) return "major";
return "minor";
}
generateSummary(differences) {
const counts = {
added: differences.filter((d) => d.type === "added").length,
removed: differences.filter((d) => d.type === "removed").length,
modified: differences.filter((d) => d.type === "modified").length
};
const parts = [];
if (counts.added > 0) parts.push(`${counts.added} added`);
if (counts.removed > 0) parts.push(`${counts.removed} removed`);
if (counts.modified > 0) parts.push(`${counts.modified} modified`);
const summary = parts.join(", ");
return `${summary}`;
}
};
var abiComparisonService = new AbiComparisonService();
// src/wallet/components/EvmWalletUiRoot.tsx
var import_react_query = require("@tanstack/react-query");
var import_wagmi = require("wagmi");
var import_react7 = require("react");
var import_contracts_ui_builder_utils14 = require("@openzeppelin/contracts-ui-builder-utils");
// src/wallet/context/wagmi-context.tsx
var import_react = require("react");
var WagmiProviderInitializedContext = (0, import_react.createContext)(false);
// src/wallet/evmUiKitManager.ts
var import_contracts_ui_builder_utils13 = require("@openzeppelin/contracts-ui-builder-utils");
// src/wallet/utils/walletImplementationManager.ts
var import_contracts_ui_builder_utils11 = require("@openzeppelin/contracts-ui-builder-utils");
// src/wallet/implementation/wagmi-implementation.ts
var import_connectors = require("@wagmi/connectors");
var import_core2 = require("@wagmi/core");
var import_viem = require("viem");
var import_contracts_ui_builder_utils10 = require("@openzeppelin/contracts-ui-builder-utils");
// src/networks/mainnet.ts
var import_chains = require("viem/chains");
var ethereumMainnet = {
id: "ethereum-mainnet",
exportConstName: "ethereumMainnet",
name: "Ethereum",
ecosystem: "evm",
network: "ethereum",
type: "mainnet",
isTestnet: false,
chainId: 1,
rpcUrl: import_chains.mainnet.rpcUrls.default.http[0],
explorerUrl: "https://etherscan.io",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "ethereum",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains.mainnet
};
var arbitrumMainnet = {
id: "arbitrum-mainnet",
exportConstName: "arbitrumMainnet",
name: "Arbitrum One",
ecosystem: "evm",
network: "arbitrum",
type: "mainnet",
isTestnet: false,
chainId: 42161,
rpcUrl: import_chains.arbitrum.rpcUrls.default.http[0],
explorerUrl: "https://arbiscan.io",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "arbitrum",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains.arbitrum
};
var polygonMainnet = {
id: "polygon-mainnet",
exportConstName: "polygonMainnet",
name: "Polygon",
ecosystem: "evm",
network: "polygon",
type: "mainnet",
isTestnet: false,
chainId: 137,
rpcUrl: import_chains.polygon.rpcUrls.default.http[0],
explorerUrl: "https://polygonscan.com",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "polygon",
nativeCurrency: {
name: "MATIC",
symbol: "MATIC",
decimals: 18
},
viemChain: import_chains.polygon
};
var polygonZkEvmMainnet = {
id: "polygon-zkevm-mainnet",
exportConstName: "polygonZkEvmMainnet",
name: "Polygon zkEVM",
ecosystem: "evm",
network: "polygon-zkevm",
type: "mainnet",
isTestnet: false,
chainId: 1101,
rpcUrl: import_chains.polygonZkEvm.rpcUrls.default.http[0],
explorerUrl: "https://zkevm.polygonscan.com",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "polygon",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains.polygonZkEvm
};
var baseMainnet = {
id: "base-mainnet",
exportConstName: "baseMainnet",
name: "Base",
ecosystem: "evm",
network: "base",
type: "mainnet",
isTestnet: false,
chainId: 8453,
rpcUrl: import_chains.base.rpcUrls.default.http[0],
explorerUrl: "https://basescan.org",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "base",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains.base
};
var bscMainnet = {
id: "bsc-mainnet",
exportConstName: "bscMainnet",
name: "BNB Smart Chain",
ecosystem: "evm",
network: "bsc",
type: "mainnet",
isTestnet: false,
chainId: 56,
rpcUrl: import_chains.bsc.rpcUrls.default.http[0],
explorerUrl: "https://bscscan.com",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "bsc",
nativeCurrency: {
name: "BNB",
symbol: "BNB",
decimals: 18
},
viemChain: import_chains.bsc
};
var optimismMainnet = {
id: "optimism-mainnet",
exportConstName: "optimismMainnet",
name: "OP Mainnet",
ecosystem: "evm",
network: "optimism",
type: "mainnet",
isTestnet: false,
chainId: 10,
rpcUrl: import_chains.optimism.rpcUrls.default.http[0],
explorerUrl: "https://optimistic.etherscan.io",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "optimism",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains.optimism
};
var avalancheMainnet = {
id: "avalanche-mainnet",
exportConstName: "avalancheMainnet",
name: "Avalanche C-Chain",
ecosystem: "evm",
network: "avalanche",
type: "mainnet",
isTestnet: false,
chainId: 43114,
rpcUrl: import_chains.avalanche.rpcUrls.default.http[0],
explorerUrl: "https://snowscan.xyz",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "avalanche",
nativeCurrency: {
name: "Avalanche",
symbol: "AVAX",
decimals: 18
},
viemChain: import_chains.avalanche
};
var zkSyncEraMainnet = {
id: "zksync-era-mainnet",
exportConstName: "zkSyncEraMainnet",
name: "ZkSync Era",
ecosystem: "evm",
network: "zksync-era",
type: "mainnet",
isTestnet: false,
chainId: 324,
rpcUrl: import_chains.zksync.rpcUrls.default.http[0],
explorerUrl: "https://explorer.zksync.io",
apiUrl: "https://block-explorer-api.mainnet.zksync.io/api",
primaryExplorerApiIdentifier: "zksync-era-mainnet",
supportsEtherscanV2: false,
icon: "zksync",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains.zksync
};
var scrollMainnet = {
id: "scroll-mainnet",
exportConstName: "scrollMainnet",
name: "Scroll",
ecosystem: "evm",
network: "scroll",
type: "mainnet",
isTestnet: false,
chainId: 534352,
rpcUrl: import_chains.scroll.rpcUrls.default.http[0],
explorerUrl: "https://scrollscan.com",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "scroll",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains.scroll
};
var lineaMainnet = {
id: "linea-mainnet",
exportConstName: "lineaMainnet",
name: "Linea",
ecosystem: "evm",
network: "linea",
type: "mainnet",
isTestnet: false,
chainId: 59144,
rpcUrl: import_chains.linea.rpcUrls.default.http[0],
explorerUrl: "https://lineascan.build",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "linea",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains.linea
};
// src/networks/testnet.ts
var import_chains2 = require("viem/chains");
var ethereumSepolia = {
id: "ethereum-sepolia",
exportConstName: "ethereumSepolia",
name: "Sepolia",
ecosystem: "evm",
network: "ethereum",
type: "testnet",
isTestnet: true,
chainId: 11155111,
rpcUrl: import_chains2.sepolia.rpcUrls.default.http[0],
explorerUrl: "https://sepolia.etherscan.io",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "ethereum",
nativeCurrency: {
name: "Sepolia Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains2.sepolia
};
var arbitrumSepolia = {
id: "arbitrum-sepolia",
exportConstName: "arbitrumSepolia",
name: "Arbitrum Sepolia",
ecosystem: "evm",
network: "arbitrum",
type: "testnet",
isTestnet: true,
chainId: 421614,
rpcUrl: import_chains2.arbitrumSepolia.rpcUrls.default.http[0],
explorerUrl: "https://sepolia.arbiscan.io",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "arbitrum",
nativeCurrency: {
name: "Arbitrum Sepolia Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains2.arbitrumSepolia
};
var polygonAmoy = {
id: "polygon-amoy",
exportConstName: "polygonAmoy",
name: "Polygon Amoy",
ecosystem: "evm",
network: "polygon",
type: "testnet",
isTestnet: true,
chainId: 80002,
rpcUrl: import_chains2.polygonAmoy.rpcUrls.default.http[0],
explorerUrl: "https://amoy.polygonscan.com",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "polygon",
nativeCurrency: {
name: "MATIC",
symbol: "MATIC",
decimals: 18
},
viemChain: import_chains2.polygonAmoy
};
var polygonZkEvmCardona = {
id: "polygon-zkevm-cardona",
exportConstName: "polygonZkEvmCardona",
name: "Polygon zkEVM Cardona",
ecosystem: "evm",
network: "polygon-zkevm",
type: "testnet",
isTestnet: true,
chainId: 2442,
rpcUrl: import_chains2.polygonZkEvmCardona.rpcUrls.default.http[0],
explorerUrl: "https://cardona-zkevm.polygonscan.com",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "polygon",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains2.polygonZkEvmCardona
};
var baseSepolia = {
id: "base-sepolia",
exportConstName: "baseSepolia",
name: "Base Sepolia",
ecosystem: "evm",
network: "base",
type: "testnet",
isTestnet: true,
chainId: 84532,
rpcUrl: import_chains2.baseSepolia.rpcUrls.default.http[0],
explorerUrl: "https://sepolia.basescan.org",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "base",
nativeCurrency: {
name: "Sepolia Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains2.baseSepolia
};
var bscTestnet = {
id: "bsc-testnet",
exportConstName: "bscTestnet",
name: "BSC Testnet",
ecosystem: "evm",
network: "bsc",
type: "testnet",
isTestnet: true,
chainId: 97,
rpcUrl: import_chains2.bscTestnet.rpcUrls.default.http[0],
explorerUrl: "https://testnet.bscscan.com",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "bsc",
nativeCurrency: {
name: "BNB",
symbol: "BNB",
decimals: 18
},
viemChain: import_chains2.bscTestnet
};
var optimismSepolia = {
id: "optimism-sepolia",
exportConstName: "optimismSepolia",
name: "OP Sepolia",
ecosystem: "evm",
network: "optimism",
type: "testnet",
isTestnet: true,
chainId: 11155420,
rpcUrl: import_chains2.optimismSepolia.rpcUrls.default.http[0],
explorerUrl: "https://sepolia-optimism.etherscan.io",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "optimism",
nativeCurrency: {
name: "Sepolia Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains2.optimismSepolia
};
var avalancheFuji = {
id: "avalanche-fuji",
exportConstName: "avalancheFuji",
name: "Avalanche Fuji C-Chain",
ecosystem: "evm",
network: "avalanche",
type: "testnet",
isTestnet: true,
chainId: 43113,
rpcUrl: import_chains2.avalancheFuji.rpcUrls.default.http[0],
explorerUrl: "https://testnet.snowscan.xyz",
apiUrl: "https://api.etherscan.io/v2/api",
// Using Etherscan V2 unified API
primaryExplorerApiIdentifier: "etherscan-v2",
// Unified identifier for V2 API
supportsEtherscanV2: true,
requiresExplorerApiKey: true,
icon: "avalanche",
nativeCurrency: {
name: "Avalanche",
symbol: "AVAX",
decimals: 18
},
viemChain: import_chains2.avalancheFuji
};
var zksyncSepoliaTestnet = {
id: "zksync-era-sepolia",
exportConstName: "zksyncSepoliaTestnet",
name: "ZkSync Era Sepolia",
ecosystem: "evm",
network: "zksync-era",
type: "testnet",
isTestnet: true,
chainId: 300,
rpcUrl: import_chains2.zksyncSepoliaTestnet.rpcUrls.default.http[0],
explorerUrl: "https://sepolia.explorer.zksync.io",
apiUrl: "https://block-explorer-api.sepolia.zksync.dev/api",
primaryExplorerApiIdentifier: "zksync-era-sepolia",
supportsEtherscanV2: false,
icon: "zksync",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains2.zksyncSepoliaTestnet
};
var scrollSepolia = {
id: "scroll-sepolia",
exportConstName: "scrollSepolia",
name: "Scroll Sepolia",
ecosystem: "evm",
network: "scroll",
type: "testnet",
isTestnet: true,
chainId: 534351,
rpcUrl: import_chains2.scrollSepolia.rpcUrls.default.http[0],
explorerUrl: "https://sepolia.scrollscan.dev",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "scroll",
nativeCurrency: {
name: "Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains2.scrollSepolia
};
var lineaSepolia = {
id: "linea-sepolia",
exportConstName: "lineaSepolia",
name: "Linea Sepolia",
ecosystem: "evm",
network: "linea",
type: "testnet",
isTestnet: true,
chainId: 59141,
rpcUrl: import_chains2.lineaSepolia.rpcUrls.default.http[0],
explorerUrl: "https://sepolia.lineascan.build",
apiUrl: "https://api.etherscan.io/v2/api",
primaryExplorerApiIdentifier: "etherscan-v2",
supportsEtherscanV2: true,
icon: "linea",
nativeCurrency: {
name: "Linea Ether",
symbol: "ETH",
decimals: 18
},
viemChain: import_chains2.lineaSepolia
};
// src/networks/index.ts
var evmMainnetNetworks = [
ethereumMainnet,
arbitrumMainnet,
baseMainnet,
polygonMainnet,
polygonZkEvmMainnet,
bscMainnet,
optimismMainnet,
avalancheMainnet,
lineaMainnet,
scrollMainnet,
zkSyncEraMainnet
// Other mainnet networks...
];
var evmTestnetNetworks = [
ethereumSepolia,
arbitrumSepolia,
baseSepolia,
polygonAmoy,
polygonZkEvmCardona,
bscTestnet,
optimismSepolia,
avalancheFuji,
lineaSepolia,
scrollSepolia,
zksyncSepoliaTestnet
// Other testnet networks...
];
var evmNetworks = [...evmMainnetNetworks, ...evmTestnetNetworks];
// src/wallet/rainbowkit/components.tsx
var import_lucide_react4 = require("lucide-react");
var import_react6 = require("react");
var import_contracts_ui_builder_ui5 = require("@openzeppelin/contracts-ui-builder-ui");
var import_contracts_ui_builder_utils7 = require("@openzeppelin/contracts-ui-builder-utils");
// src/wallet/components/connect/ConnectButton.tsx
var import_lucide_react = require("lucide-react");
var import_react5 = require("react");
var import_contracts_ui_builder_react_core2 = require("@openzeppelin/contracts-ui-builder-react-core");
var import_contracts_ui_builder_ui2 = require("@openzeppelin/contracts-ui-builder-ui");
var import_contracts_ui_builder_utils4 = require("@openzeppelin/contracts-ui-builder-utils");
// src/wallet/utils/SafeWagmiComponent.tsx
var import_react3 = require("react");
var import_contracts_ui_builder_utils2 = require("@openzeppelin/contracts-ui-builder-utils");
// src/wallet/hooks/useIsWagmiProviderInitialized.ts
var import_react2 = require("react");
var useIsWagmiProviderInitialized = () => {
return (0, import_react2.useContext)(WagmiProviderInitializedContext);
};
// src/wallet/utils/SafeWagmiComponent.tsx
var import_jsx_runtime = require("react/jsx-runtime");
var SafeWagmiComponent = ({
children,
fallback = null
}) => {
const isProviderInitialized = useIsWagmiProviderInitialized();
const [hasError, setHasError] = (0, import_react3.useState)(false);
(0, import_react3.useEffect)(() => {
if (isProviderInitialized) {
setHasError(false);
}
}, [isProviderInitialized]);
(0, import_react3.useEffect)(() => {
const handleError = (event) => {
if (event.error?.message?.includes("useConfig") || event.error?.message?.includes("WagmiProvider")) {
import_contracts_ui_builder_utils2.logger.debug(
"SafeWagmiComponent",
"Caught wagmi error via window error event:",
event.error
);
setHasError(true);
event.preventDefault();
}
};
window.addEventListener("error", handleError);
return () => {
window.removeEventListener("error", handleError);
};
}, []);
if (!isProviderInitialized || hasError) {
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: fallback });
}
try {
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
} catch (error) {
if (error instanceof Error && (error.message.includes("useConfig") || error.message.includes("WagmiProvider"))) {
import_contracts_ui_builder_utils2.logger.debug("SafeWagmiComponent", "Caught wagmi error:", error);
setHasError(true);
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: fallback });
}
throw error;
}
};
// src/wallet/components/connect/ConnectorDialog.tsx
var import_react4 = require("react");
var import_contracts_ui_builder_react_core = require("@openzeppelin/contracts-ui-builder-react-core");
var import_contracts_ui_builder_ui = require("@openzeppelin/contracts-ui-builder-ui");
// src/wallet/hooks/useUiKitConfig.ts
var import_contracts_ui_builder_utils3 = require("@openzeppelin/contracts-ui-builder-utils");
var defaultConfig = {
kitName: "custom",
// Default to using our custom implementation for EVM
kitConfig: {
showInjectedConnector: false
// Default to hiding the injected connector
}
};
var uiKitConfig = { ...defaultConfig };
function loadInitialConfigFromAppService() {
import_contracts_ui_builder_utils3.logger.debug("useUiKitConfig", "Attempting to load initial config from AppConfigService...");
const configObj = import_contracts_ui_builder_utils3.appConfigService.getTypedNestedConfig("walletui", "config");
if (configObj && configObj.kitName) {
import_contracts_ui_builder_utils3.logger.info(
"useUiKitConfig",
`Loaded initial config from AppConfigService: kitName=${configObj.kitName}`,
configObj.kitConfig
);
return {
kitName: configObj.kitName,
kitConfig: { ...defaultConfig.kitConfig, ...configObj.kitConfig || {} }
};
}
import_contracts_ui_builder_utils3.logger.debug(
"useUiKitConfig",
"No initial config found in AppConfigService, using module default."
);
return { ...defaultConfig };
}
function isConfigEnabled(key) {
return Boolean(uiKitConfig.kitConfig?.[key]);
}
function useUiKitConfig() {
return uiKitConfig;
}
// src/wallet/components/connect/ConnectorDialog.tsx
var import_jsx_runtime2 = require("react/jsx-runtime");
var ConnectorDialog = ({ open, onOpenChange }) => {
const unavailableContent = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.DialogContent, { className: "sm:max-w-[425px]", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_contracts_ui_builder_ui.DialogHeader, { children: [
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.DialogTitle, { children: "Wallet Connection Unavailable" }),
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.DialogDescription, { children: "The wallet connection system is not properly initialized." })
] }) }) });
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SafeWagmiComponent, { fallback: unavailableContent, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ConnectorDialogContent, { open, onOpenChange }) });
};
var ConnectorDialogContent = ({ open, onOpenChange }) => {
const {
connect: connect2,
connectors,
error: connectError,
isConnecting,
pendingConnector
} = (0, import_contracts_ui_builder_react_core.useDerivedConnectStatus)();
const { isConnected } = (0, import_contracts_ui_builder_react_core.useDerivedAccountStatus)();
const [connectingId, setConnectingId] = (0, import_react4.useState)(null);
const fullConfig = useUiKitConfig();
const showInjectedConnector = isConfigEnabled("showInjectedConnector");
(0, import_react4.useEffect)(() => {
}, [fullConfig, showInjectedConnector, isConnecting, pendingConnector]);
(0, import_react4.useEffect)(() => {
if (isConnected && connectingId) {
onOpenChange(false);
setConnectingId(null);
}
}, [isConnected, connectingId, onOpenChange]);
if (!connect2) {
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_contracts_ui_builder_ui.DialogContent, { className: "sm:max-w-[425px]", children: [
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.DialogTitle, { children: "Error" }) }),
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { children: "Wallet connection function is not available." })
] }) });
}
const handleConnectorSelect = (selectedConnector) => {
setConnectingId(selectedConnector.id);
connect2({ connector: selectedConnector });
};
const filteredConnectors = connectors.filter((connector) => {
const isInjected = connector.id === "injected";
return !(isInjected && !showInjectedConnector);
});
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_contracts_ui_builder_ui.DialogContent, { className: "sm:max-w-[425px]", children: [
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_contracts_ui_builder_ui.DialogHeader, { children: [
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.DialogTitle, { children: "Connect Wallet" }),
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_contracts_ui_builder_ui.DialogDescription, { children: "Select a wallet provider to connect with this application." })
] }),
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "grid gap-4 py-4", children: filteredConnectors.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-center text-muted-foreground", children: "No wallet connectors available." }) : filteredConnectors.map((connector) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
import_contracts_ui_builder_ui.Button,
{
onClick: () => handleConnectorSelect(connector),
disabled: isConnecting && connectingId === connector.id,
variant: "outline",
className: "flex justify-between items-center w-full py-6",
children: [
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: connector.name }),
isConnecting && connectingId === connector.id && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "ml-2 text-xs", children: "Connecting..." })
]
},
connector.id
)) }),
connectError && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-red-500 mt-1", children: connectError.message || "Error connecting wallet" })
] }) });
};
// src/wallet/components/connect/ConnectButton.tsx
var import_jsx_runtime3 = require("react/jsx-runtime");
var CustomConnectButton = ({
className,
hideWhenConnected = true
}) => {
const [dialogOpen, setDialogOpen] = (0, import_react5.useState)(false);
const unavailableButton = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: (0, import_contracts_ui_builder_utils4.cn)("flex items-center", className), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_contracts_ui_builder_ui2.Button, { disabled: true, variant: "outline", size: "sm", className: "h-8 px-2 text-xs", children: [
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Wallet, { className: "size-3.5 mr-1" }),
"Wallet Unavailable"
] }) });
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SafeWagmiComponent, { fallback: unavailableButton, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
ConnectButtonContent,
{
className,
dialogOpen,
setDialogOpen,
hideWhenConnected
}
) });
};
var ConnectButtonContent = ({ className, dialogOpen, setDialogOpen, hideWhenConnected }) => {
const { isConnected } = (0, import_contracts_ui_builder_react_core2.useDerivedAccountStatus)();
const { isConnecting: isHookConnecting, error: connectError } = (0, import_contracts_ui_builder_react_core2.useDerivedConnectStatus)();
const [isManuallyInitiated, setIsManuallyInitiated] = (0, import_react5.useState)(false);
(0, import_react5.useEffect)(() => {
if (isConnected && hideWhenConnected) {
setDialogOpen(false);
setIsManuallyInitiated(false);
}
}, [isConnected, hideWhenConnected, setDialogOpen]);
(0, import_react5.useEffect)(() => {
if (!dialogOpen) {
setIsManuallyInitiated(false);
}
}, [dialogOpen]);
(0, import_react5.useEffect)(() => {
if (isHookConnecting) {
setIsManuallyInitiated(false);
}
}, [isHookConnecting]);
const handleConnectClick = () => {
if (!isConnected) {
setIsManuallyInitiated(true);
setDialogOpen(true);
}
};
if (isConnected && hideWhenConnected) {
return null;
}
const showButtonLoading = isHookConnecting || isManuallyInitiated;
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: (0, import_contracts_ui_builder_utils4.cn)("flex items-center", className), children: [
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
import_contracts_ui_builder_ui2.Button,
{
onClick: handleConnectClick,
disabled: showButtonLoading || isConnected,
variant: "outline",
size: "sm",
className: "h-8 px-2 text-xs",
title: isConnected ? "Connected" : connectError?.message || "Connect Wallet",
children: [
showButtonLoading ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Loader2, { className: "size-3.5 animate-spin mr-1" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react.Wallet, { className: "size-3.5 mr-1" }),
showButtonLoading ? "Connecting..." : "Connect Wallet"
]
}
),
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
ConnectorDialog,
{
open: dialogOpen,
onOpenChange: (open) => {
setDialogOpen(open);
if (!open) {
setIsManuallyInitiated(false);
}
}
}
)
] });
};
// src/wallet/components/account/AccountDisplay.tsx
var import_lucide_react2 = require("lucide-react");
var import_contracts_ui_builder_react_core3 = require("@openzeppelin/contracts-ui-builder-react-core");
var import_contracts_ui_builder_ui3 = require("@openzeppelin/contracts-ui-builder-ui");
var import_contracts_ui_builder_utils5 = require("@openzeppelin/contracts-ui-builder-utils");
var import_jsx_runtime4 = require("react/jsx-runtime");
var CustomAccountDisplay = ({ className }) => {
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SafeWagmiComponent, { fallback: null, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AccountDisplayContent, { className }) });
};
var AccountDisplayContent = ({ className }) => {
const { isConnected, address, chainId } = (0, import_contracts_ui_builder_react_core3.useDerivedAccountStatus)();
const { disconnect: disconnect2 } = (0, import_contracts_ui_builder_react_core3.useDerivedDisconnect)();
if (!isConnected || !address || !disconnect2) {
return null;
}
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: (0, import_contracts_ui_builder_utils5.cn)("flex items-center gap-2", className), children: [
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex flex-col", children: [
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-xs font-medium", children: (0, import_contracts_ui_builder_utils5.truncateMiddle)(address, 4, 4) }),
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "text-[9px] text-muted-foreground -mt-0.5", children: chainId ? `Chain ID: ${chainId}` : "Chain ID: N/A" })
] }),
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
import_contracts_ui_builder_ui3.Button,
{
onClick: () => disconnect2(),
variant: "ghost",
size: "icon",
className: "size-6 p-0",
title: "Disconnect wallet",
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react2.LogOut, { className: "size-3.5" })
}
)
] });
};
// src/wallet/components/network/NetworkSwitcher.tsx
var import_lucide_react3 = require("lucide-react");
var import_contracts_ui_builder_react_core4 = require("@openzeppelin/contracts-ui-builder-react-core");
var import_contracts_ui_builder_ui4 = require("@openzeppelin/contracts-ui-builder-ui");
var import_contracts_ui_builder_utils6 = require("@openzeppelin/contracts-ui-builder-utils");
var import_jsx_runtime5 = require("react/jsx-runtime");
var CustomNetworkSwitcher = ({ className }) => {
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SafeWagmiComponent, { fallback: null, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(NetworkSwitcherContent, { className }) });
};
var NetworkSwitcherContent = ({ className }) => {
const { isConnected } = (0, import_contracts_ui_builder_react_core4.useDerivedAccountStatus)();
const { currentChainId, availableChains: unknownChains } = (0, import_contracts_ui_builder_react_core4.useDerivedChainInfo)();
const { switchChain: switchChain2, isSwitching: isPending, error } = (0, import_contracts_ui_builder_react_core4.useDerivedSwitchChainStatus)();
const typedAvailableChains = unknownChains;
if (!isConnected || !switchChain2 || typedAvailableChains.length === 0) {
return null;
}
const handleNetworkChange = (chainId) => {
if (chainId !== currentChainId) {
switchChain2({ chainId });
}
};
const currentChain = typedAvailableChains.find((chain) => chain.id === currentChainId);
const currentChainName = currentChain?.name || "Network";
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: (0, import_contracts_ui_builder_utils6.cn)("flex items-center", className), children: [
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
import_contracts_ui_builder_ui4.Select,
{
value: currentChainId?.toString() ?? "",
onValueChange: (value) => handleNetworkChange(Number(value)),
disabled: isPending || typedAvailableChains.length === 0,
children: [
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_contracts_ui_builder_ui4.SelectTrigger, { className: "h-8 text-xs px-2 min-w-[90px] max-w-[120px]", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_contracts_ui_builder_ui4.SelectValue, { placeholder: "Network", children: currentChainName }) }),
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
import_contracts_ui_builder_ui4.SelectContent,
{
position: "popper",
sideOffset: 5,
align: "start",
className: "w-auto min-w-[160px] max-h-[300px]",
children: typedAvailableChains.map((chain) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_contracts_ui_builder_ui4.SelectItem, { value: chain.id.toString(), className: "text-xs py-1.5", children: chain.name }, chain.id))
}
)
]
}
),
isPending && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-xs text-muted-foreground ml-2", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.Loader2, { className: "h-3 w-3 animate-spin" }) }),
error && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-xs text-red-500 ml-2", children: "!" })
] });
};
// src/wallet/rainbowkit/types.ts
function isRainbowKitCustomizations(obj) {
return typeof obj === "object" && obj !== null && "connectButton" in obj;
}
function extractRainbowKitCustomizations(kitConfig) {
if (!kitConfig || !kitConfig.customizations) {
return void 0;
}
const customizations = kitConfig.customizations;
return isRainbowKit