UNPKG

@openzeppelin/contracts-ui-builder-adapter-evm

Version:
1,353 lines (1,327 loc) 221 kB
"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