{"version":3,"file":"index-1c96ce10.mjs","sources":["../node_modules/viem/_esm/errors/version.js","../node_modules/viem/_esm/errors/base.js","../node_modules/viem/_esm/errors/encoding.js","../node_modules/viem/_esm/errors/data.js","../node_modules/viem/_esm/utils/data/pad.js","../node_modules/viem/_esm/utils/data/isHex.js","../node_modules/viem/_esm/utils/data/size.js","../node_modules/viem/_esm/utils/data/trim.js","../node_modules/viem/_esm/utils/encoding/toBytes.js","../node_modules/viem/_esm/utils/encoding/fromHex.js","../node_modules/viem/_esm/utils/encoding/toHex.js","../node_modules/viem/_esm/utils/abi/formatAbiItem.js","../node_modules/viem/_esm/errors/abi.js","../node_modules/viem/_esm/utils/data/concat.js","../node_modules/viem/_esm/errors/address.js","../node_modules/viem/_esm/utils/lru.js","../node_modules/viem/node_modules/@noble/hashes/esm/_u64.js","../node_modules/viem/node_modules/@noble/hashes/esm/crypto.js","../node_modules/viem/node_modules/@noble/hashes/esm/utils.js","../node_modules/viem/node_modules/@noble/hashes/esm/sha3.js","../node_modules/viem/_esm/utils/hash/keccak256.js","../node_modules/viem/_esm/utils/address/getAddress.js","../node_modules/viem/_esm/utils/address/isAddress.js","../node_modules/viem/_esm/utils/data/slice.js","../node_modules/viem/_esm/utils/regex.js","../node_modules/viem/_esm/utils/abi/encodeAbiParameters.js","../node_modules/viem/_esm/utils/abi/encodeDeployData.js","../node_modules/viem/_esm/accounts/utils/parseAccount.js","../node_modules/viem/_esm/errors/account.js","../node_modules/viem/_esm/accounts/utils/publicKeyToAddress.js","../node_modules/viem/_esm/utils/signature/recoverPublicKey.js","../node_modules/viem/_esm/utils/signature/recoverAddress.js","../node_modules/viem/_esm/errors/cursor.js","../node_modules/viem/_esm/utils/cursor.js","../node_modules/viem/_esm/utils/encoding/toRlp.js","../node_modules/viem/_esm/utils/authorization/hashAuthorization.js","../node_modules/viem/_esm/utils/authorization/recoverAuthorizationAddress.js","../node_modules/viem/_esm/errors/chain.js","../node_modules/viem/_esm/utils/chain/assertCurrentChain.js","../node_modules/viem/_esm/constants/unit.js","../node_modules/viem/_esm/utils/unit/formatUnits.js","../node_modules/viem/_esm/utils/unit/formatGwei.js","../node_modules/viem/_esm/errors/node.js","../node_modules/viem/_esm/utils/unit/formatEther.js","../node_modules/viem/_esm/errors/transaction.js","../node_modules/viem/_esm/utils/stringify.js","../node_modules/viem/_esm/errors/utils.js","../node_modules/viem/_esm/errors/request.js","../node_modules/viem/_esm/errors/rpc.js","../node_modules/viem/_esm/utils/errors/getNodeError.js","../node_modules/viem/_esm/utils/errors/getTransactionError.js","../node_modules/viem/_esm/utils/formatters/extract.js","../node_modules/viem/_esm/utils/formatters/formatter.js","../node_modules/viem/_esm/utils/formatters/transactionRequest.js","../node_modules/viem/_esm/utils/getAction.js","../node_modules/viem/_esm/constants/number.js","../node_modules/viem/_esm/utils/transaction/assertRequest.js","../node_modules/viem/_esm/actions/public/getChainId.js","../node_modules/viem/_esm/errors/fee.js","../node_modules/viem/_esm/errors/block.js","../node_modules/viem/_esm/utils/formatters/transaction.js","../node_modules/viem/_esm/utils/formatters/block.js","../node_modules/viem/_esm/actions/public/getBlock.js","../node_modules/viem/_esm/actions/public/getGasPrice.js","../node_modules/viem/_esm/actions/public/estimateMaxPriorityFeePerGas.js","../node_modules/viem/_esm/actions/public/estimateFeesPerGas.js","../node_modules/viem/_esm/errors/estimateGas.js","../node_modules/viem/_esm/utils/errors/getEstimateGasError.js","../node_modules/viem/_esm/errors/stateOverride.js","../node_modules/viem/_esm/utils/stateOverride.js","../node_modules/viem/_esm/actions/public/getBalance.js","../node_modules/viem/_esm/actions/public/estimateGas.js","../node_modules/viem/_esm/actions/public/getTransactionCount.js","../node_modules/viem/_esm/utils/blob/blobsToCommitments.js","../node_modules/viem/_esm/utils/blob/blobsToProofs.js","../node_modules/viem/node_modules/@noble/hashes/esm/_md.js","../node_modules/viem/node_modules/@noble/hashes/esm/sha2.js","../node_modules/viem/node_modules/@noble/hashes/esm/sha256.js","../node_modules/viem/_esm/utils/hash/sha256.js","../node_modules/viem/_esm/utils/blob/commitmentToVersionedHash.js","../node_modules/viem/_esm/utils/blob/commitmentsToVersionedHashes.js","../node_modules/viem/_esm/constants/blob.js","../node_modules/viem/_esm/constants/kzg.js","../node_modules/viem/_esm/errors/blob.js","../node_modules/viem/_esm/utils/blob/toBlobs.js","../node_modules/viem/_esm/utils/blob/toBlobSidecars.js","../node_modules/viem/_esm/utils/transaction/getTransactionType.js","../node_modules/viem/_esm/actions/wallet/prepareTransactionRequest.js","../node_modules/viem/_esm/actions/wallet/sendRawTransaction.js","../node_modules/viem/_esm/actions/wallet/sendTransaction.js","../node_modules/viem/_esm/constants/abis.js","../node_modules/viem/_esm/utils/encoding/fromBytes.js","../node_modules/viem/_esm/utils/abi/decodeAbiParameters.js","../node_modules/viem/_esm/utils/hash/hashSignature.js","../node_modules/viem/node_modules/abitype/dist/esm/version.js","../node_modules/viem/node_modules/abitype/dist/esm/errors.js","../node_modules/viem/node_modules/abitype/dist/esm/regex.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/formatAbiParameter.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/formatAbiParameters.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/formatAbiItem.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/runtime/signatures.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/errors/abiItem.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/errors/abiParameter.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/errors/signature.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/errors/struct.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/errors/splitParameters.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/runtime/cache.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/runtime/utils.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/runtime/structs.js","../node_modules/viem/node_modules/abitype/dist/esm/human-readable/parseAbi.js","../node_modules/viem/_esm/utils/hash/normalizeSignature.js","../node_modules/viem/_esm/utils/hash/toSignature.js","../node_modules/viem/_esm/utils/hash/toSignatureHash.js","../node_modules/viem/_esm/utils/hash/toEventSelector.js","../node_modules/viem/_esm/utils/hash/toFunctionSelector.js","../node_modules/viem/_esm/utils/abi/getAbiItem.js","../node_modules/viem/_esm/utils/abi/decodeFunctionResult.js","../node_modules/viem/_esm/utils/abi/prepareEncodeFunctionData.js","../node_modules/viem/_esm/utils/abi/encodeFunctionData.js","../node_modules/viem/_esm/utils/chain/getChainContractAddress.js","../node_modules/viem/_esm/constants/solidity.js","../node_modules/viem/_esm/utils/abi/decodeErrorResult.js","../node_modules/viem/_esm/utils/abi/formatAbiItemWithArgs.js","../node_modules/viem/_esm/errors/contract.js","../node_modules/viem/_esm/utils/ens/errors.js","../node_modules/viem/_esm/utils/abi/decodeFunctionData.js","../node_modules/viem/_esm/utils/abi/encodeErrorResult.js","../node_modules/viem/_esm/utils/abi/encodeFunctionResult.js","../node_modules/viem/_esm/utils/ens/localBatchGatewayRequest.js","../node_modules/viem/_esm/utils/ens/encodedLabelToLabelhash.js","../node_modules/viem/_esm/utils/ens/namehash.js","../node_modules/viem/_esm/utils/ens/encodeLabelhash.js","../node_modules/viem/_esm/utils/ens/labelhash.js","../node_modules/viem/_esm/utils/ens/packetToBytes.js","../node_modules/viem/_esm/utils/errors/getContractError.js","../node_modules/ox/_esm/core/version.js","../node_modules/ox/_esm/core/internal/errors.js","../node_modules/ox/_esm/core/Errors.js","../node_modules/ox/_esm/core/Json.js","../node_modules/ox/_esm/core/internal/hex.js","../node_modules/ox/_esm/core/Hex.js","../node_modules/ox/_esm/core/Withdrawal.js","../node_modules/ox/_esm/core/BlockOverrides.js","../node_modules/viem/_esm/constants/contract.js","../node_modules/viem/_esm/constants/contracts.js","../node_modules/viem/_esm/utils/errors/getCallError.js","../node_modules/viem/_esm/utils/promise/withResolvers.js","../node_modules/viem/_esm/utils/promise/createBatchScheduler.js","../node_modules/viem/_esm/actions/public/call.js","../node_modules/viem/_esm/actions/public/readContract.js","../node_modules/viem/_esm/errors/ens.js","../node_modules/viem/_esm/utils/ens/avatar/utils.js","../node_modules/viem/_esm/utils/ens/avatar/parseAvatarRecord.js","../node_modules/viem/_esm/actions/ens/getEnsText.js","../node_modules/viem/_esm/actions/ens/getEnsAvatar.js","../node_modules/viem/_esm/actions/ens/getEnsName.js","../node_modules/viem/_esm/utils/formatters/log.js","../node_modules/viem/_esm/utils/formatters/transactionReceipt.js","../node_modules/viem/_esm/actions/public/multicall.js","../node_modules/viem/_esm/utils/promise/withDedupe.js","../node_modules/viem/_esm/utils/wait.js","../node_modules/viem/_esm/utils/promise/withRetry.js","../node_modules/viem/_esm/utils/buildRequest.js","../node_modules/viem/_esm/utils/chain/defineChain.js","../node_modules/viem/_esm/utils/promise/withTimeout.js","../node_modules/viem/_esm/utils/rpc/id.js","../node_modules/viem/_esm/utils/rpc/http.js","../node_modules/viem/_esm/errors/typedData.js","../node_modules/viem/_esm/utils/typedData.js","../node_modules/viem/_esm/utils/transaction/assertTransaction.js","../node_modules/viem/_esm/utils/transaction/serializeAccessList.js","../node_modules/viem/_esm/utils/transaction/serializeTransaction.js","../node_modules/viem/_esm/utils/authorization/serializeAuthorizationList.js","../node_modules/viem/_esm/actions/wallet/signMessage.js","../node_modules/viem/_esm/actions/wallet/signTypedData.js","../node_modules/@wagmi/core/dist/esm/utils/getAction.js","../node_modules/@wagmi/core/dist/esm/version.js","../node_modules/@wagmi/core/dist/esm/utils/getVersion.js","../node_modules/@wagmi/core/dist/esm/errors/base.js","../node_modules/@wagmi/core/dist/esm/errors/config.js","../node_modules/@wagmi/core/dist/esm/actions/connect.js","../node_modules/viem/_esm/utils/uid.js","../node_modules/viem/_esm/clients/createClient.js","../node_modules/viem/_esm/clients/transports/createTransport.js","../node_modules/viem/_esm/clients/transports/custom.js","../node_modules/viem/_esm/errors/transport.js","../node_modules/viem/_esm/clients/transports/http.js","../node_modules/@wagmi/core/dist/esm/actions/getConnectorClient.js","../node_modules/@wagmi/core/dist/esm/actions/disconnect.js","../node_modules/@wagmi/core/dist/esm/utils/getUnit.js","../node_modules/@wagmi/core/dist/esm/actions/getAccount.js","../node_modules/@wagmi/core/dist/esm/actions/multicall.js","../node_modules/@wagmi/core/dist/esm/actions/readContract.js","../node_modules/@wagmi/core/dist/esm/actions/readContracts.js","../node_modules/@wagmi/core/dist/esm/actions/getBalance.js","../node_modules/@wagmi/core/dist/esm/actions/getChainId.js","../node_modules/@wagmi/core/dist/esm/utils/deepEqual.js","../node_modules/@wagmi/core/dist/esm/actions/getChains.js","../node_modules/@wagmi/core/dist/esm/actions/getConnections.js","../node_modules/@wagmi/core/dist/esm/actions/getConnectors.js","../node_modules/@wagmi/core/dist/esm/actions/getEnsAvatar.js","../node_modules/@wagmi/core/dist/esm/actions/getEnsName.js","../node_modules/@wagmi/core/dist/esm/actions/reconnect.js","../node_modules/@wagmi/core/dist/esm/actions/sendTransaction.js","../node_modules/@wagmi/core/dist/esm/actions/signMessage.js","../node_modules/@wagmi/core/dist/esm/actions/signTypedData.js","../node_modules/@wagmi/core/dist/esm/errors/connector.js","../node_modules/@wagmi/core/dist/esm/actions/switchChain.js","../node_modules/@wagmi/core/dist/esm/actions/watchAccount.js","../node_modules/@wagmi/core/dist/esm/actions/watchChainId.js","../node_modules/@wagmi/core/dist/esm/actions/watchConnections.js","../node_modules/@wagmi/core/dist/esm/actions/watchConnectors.js","../node_modules/@wagmi/core/dist/esm/connectors/createConnector.js","../node_modules/@wagmi/core/dist/esm/connectors/injected.js","../node_modules/mipd/dist/esm/utils.js","../node_modules/mipd/dist/esm/store.js","../node_modules/@wagmi/core/node_modules/zustand/esm/middleware.mjs","../node_modules/@wagmi/core/node_modules/zustand/esm/vanilla.mjs","../node_modules/eventemitter3/index.js","../node_modules/@wagmi/core/dist/esm/createEmitter.js","../node_modules/@wagmi/core/dist/esm/utils/deserialize.js","../node_modules/@wagmi/core/dist/esm/utils/serialize.js","../node_modules/@wagmi/core/dist/esm/createStorage.js","../node_modules/@wagmi/core/dist/esm/utils/uid.js","../node_modules/@wagmi/core/dist/esm/createConfig.js","../node_modules/@wagmi/core/dist/esm/hydrate.js","../node_modules/@wagmi/core/dist/esm/utils/extractRpcUrls.js","../node_modules/wagmi/dist/esm/hydrate.js","../node_modules/wagmi/dist/esm/context.js","../node_modules/wagmi/dist/esm/version.js","../node_modules/wagmi/dist/esm/utils/getVersion.js","../node_modules/wagmi/dist/esm/errors/base.js","../node_modules/wagmi/dist/esm/errors/context.js","../node_modules/wagmi/dist/esm/hooks/useConfig.js","../node_modules/@wagmi/core/dist/esm/actions/watchChains.js","../node_modules/wagmi/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../node_modules/wagmi/node_modules/use-sync-external-store/shim/index.js","../node_modules/wagmi/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js","../node_modules/wagmi/node_modules/use-sync-external-store/shim/with-selector.js","../node_modules/wagmi/dist/esm/hooks/useSyncExternalStoreWithTracked.js","../node_modules/wagmi/dist/esm/hooks/useAccount.js","../node_modules/@tanstack/query-core/build/modern/subscribable.js","../node_modules/@tanstack/query-core/build/modern/utils.js","../node_modules/@tanstack/query-core/build/modern/focusManager.js","../node_modules/@tanstack/query-core/build/modern/onlineManager.js","../node_modules/@tanstack/query-core/build/modern/thenable.js","../node_modules/@tanstack/query-core/build/modern/retryer.js","../node_modules/@tanstack/query-core/build/modern/notifyManager.js","../node_modules/@tanstack/query-core/build/modern/removable.js","../node_modules/@tanstack/query-core/build/modern/query.js","../node_modules/@tanstack/query-core/build/modern/queryCache.js","../node_modules/@tanstack/query-core/build/modern/mutation.js","../node_modules/@tanstack/query-core/build/modern/mutationCache.js","../node_modules/@tanstack/query-core/build/modern/infiniteQueryBehavior.js","../node_modules/@tanstack/query-core/build/modern/queryClient.js","../node_modules/@tanstack/query-core/build/modern/queryObserver.js","../node_modules/@tanstack/query-core/build/modern/mutationObserver.js","../node_modules/@wagmi/core/dist/esm/query/utils.js","../node_modules/@wagmi/core/dist/esm/query/connect.js","../node_modules/@wagmi/core/dist/esm/query/disconnect.js","../node_modules/@wagmi/core/dist/esm/query/getBalance.js","../node_modules/@wagmi/core/dist/esm/query/getEnsAvatar.js","../node_modules/@wagmi/core/dist/esm/query/getEnsName.js","../node_modules/@wagmi/core/dist/esm/query/sendTransaction.js","../node_modules/@wagmi/core/dist/esm/query/signMessage.js","../node_modules/@wagmi/core/dist/esm/query/signTypedData.js","../node_modules/@wagmi/core/dist/esm/query/switchChain.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js","../node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../node_modules/@tanstack/react-query/build/modern/errorBoundaryUtils.js","../node_modules/@tanstack/react-query/build/modern/suspense.js","../node_modules/@tanstack/react-query/build/modern/useBaseQuery.js","../node_modules/@tanstack/react-query/build/modern/useQuery.js","../node_modules/@tanstack/react-query/build/modern/useMutation.js","../node_modules/wagmi/dist/esm/utils/query.js","../node_modules/wagmi/dist/esm/hooks/useChainId.js","../node_modules/wagmi/dist/esm/hooks/useBalance.js","../node_modules/wagmi/dist/esm/hooks/useChains.js","../node_modules/wagmi/dist/esm/hooks/useConnectors.js","../node_modules/wagmi/dist/esm/hooks/useConnect.js","../node_modules/wagmi/dist/esm/hooks/useConnections.js","../node_modules/wagmi/dist/esm/hooks/useDisconnect.js","../node_modules/wagmi/dist/esm/hooks/useEnsAvatar.js","../node_modules/wagmi/dist/esm/hooks/useEnsName.js","../node_modules/wagmi/dist/esm/hooks/useSendTransaction.js","../node_modules/wagmi/dist/esm/hooks/useSignMessage.js","../node_modules/wagmi/dist/esm/hooks/useSignTypedData.js","../node_modules/wagmi/dist/esm/hooks/useSwitchChain.js","../node_modules/viem/_esm/op-stack/contracts.js","../node_modules/viem/_esm/op-stack/formatters.js","../node_modules/viem/_esm/op-stack/serializers.js","../node_modules/viem/_esm/op-stack/chainConfig.js","../node_modules/viem/_esm/chains/definitions/arbitrum.js","../node_modules/viem/_esm/chains/definitions/avalanche.js","../node_modules/viem/_esm/chains/definitions/base.js","../node_modules/viem/_esm/chains/definitions/bsc.js","../node_modules/viem/_esm/chains/definitions/cronos.js","../node_modules/viem/_esm/chains/definitions/fantom.js","../node_modules/viem/_esm/chains/definitions/gnosis.js","../node_modules/viem/_esm/chains/definitions/mainnet.js","../node_modules/viem/_esm/chains/definitions/optimism.js","../node_modules/viem/_esm/chains/definitions/polygon.js","../node_modules/@wagmi/connectors/dist/esm/coinbaseWallet.js","../node_modules/@wagmi/connectors/dist/esm/metaMask.js","../node_modules/@wagmi/connectors/dist/esm/walletConnect.js","../node_modules/@coinley/wallet-connect-core/dist/config.js","../node_modules/@coinley/wallet-connect-core/dist/provider.js","../node_modules/@coinley/wallet-connect-core/dist/hooks.js","../node_modules/@coinley/wallet-connect-core/dist/components/ConnectButton.js","../node_modules/@coinley/wallet-connect-core/dist/components/WalletModal.js","../src/services/walletCoreService.js","../node_modules/vite-plugin-node-polyfills/shims/process/dist/index.js","../src/services/coinleyConnectClient.js","../src/services/walletService.js","../src/services/api.js","../src/context/ThemeContext.jsx","../src/context/CoinleyContext.jsx","../node_modules/qrcode.react/lib/esm/index.js","../src/components/QRCode.jsx","../src/components/PaymentStatus.jsx","../src/components/icons.jsx","../src/components/PaymentMethods.jsx","../src/assets/Logomark.png","../src/components/CoinleyModal.jsx","../src/components/CoinleyCheckout.jsx","../src/index.js"],"sourcesContent":["export const version = '2.33.2';\n//# sourceMappingURL=version.js.map","import { version } from './version.js';\nlet errorConfig = {\n    getDocsUrl: ({ docsBaseUrl, docsPath = '', docsSlug, }) => docsPath\n        ? `${docsBaseUrl ?? 'https://viem.sh'}${docsPath}${docsSlug ? `#${docsSlug}` : ''}`\n        : undefined,\n    version: `viem@${version}`,\n};\nexport function setErrorConfig(config) {\n    errorConfig = config;\n}\nexport class BaseError extends Error {\n    constructor(shortMessage, args = {}) {\n        const details = (() => {\n            if (args.cause instanceof BaseError)\n                return args.cause.details;\n            if (args.cause?.message)\n                return args.cause.message;\n            return args.details;\n        })();\n        const docsPath = (() => {\n            if (args.cause instanceof BaseError)\n                return args.cause.docsPath || args.docsPath;\n            return args.docsPath;\n        })();\n        const docsUrl = errorConfig.getDocsUrl?.({ ...args, docsPath });\n        const message = [\n            shortMessage || 'An error occurred.',\n            '',\n            ...(args.metaMessages ? [...args.metaMessages, ''] : []),\n            ...(docsUrl ? [`Docs: ${docsUrl}`] : []),\n            ...(details ? [`Details: ${details}`] : []),\n            ...(errorConfig.version ? [`Version: ${errorConfig.version}`] : []),\n        ].join('\\n');\n        super(message, args.cause ? { cause: args.cause } : undefined);\n        Object.defineProperty(this, \"details\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"docsPath\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"metaMessages\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"shortMessage\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"version\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'BaseError'\n        });\n        this.details = details;\n        this.docsPath = docsPath;\n        this.metaMessages = args.metaMessages;\n        this.name = args.name ?? this.name;\n        this.shortMessage = shortMessage;\n        this.version = version;\n    }\n    walk(fn) {\n        return walk(this, fn);\n    }\n}\nfunction walk(err, fn) {\n    if (fn?.(err))\n        return err;\n    if (err &&\n        typeof err === 'object' &&\n        'cause' in err &&\n        err.cause !== undefined)\n        return walk(err.cause, fn);\n    return fn ? null : err;\n}\n//# sourceMappingURL=base.js.map","import { BaseError } from './base.js';\nexport class IntegerOutOfRangeError extends BaseError {\n    constructor({ max, min, signed, size, value, }) {\n        super(`Number \"${value}\" is not in safe ${size ? `${size * 8}-bit ${signed ? 'signed' : 'unsigned'} ` : ''}integer range ${max ? `(${min} to ${max})` : `(above ${min})`}`, { name: 'IntegerOutOfRangeError' });\n    }\n}\nexport class InvalidBytesBooleanError extends BaseError {\n    constructor(bytes) {\n        super(`Bytes value \"${bytes}\" is not a valid boolean. The bytes array must contain a single byte of either a 0 or 1 value.`, {\n            name: 'InvalidBytesBooleanError',\n        });\n    }\n}\nexport class InvalidHexBooleanError extends BaseError {\n    constructor(hex) {\n        super(`Hex value \"${hex}\" is not a valid boolean. The hex value must be \"0x0\" (false) or \"0x1\" (true).`, { name: 'InvalidHexBooleanError' });\n    }\n}\nexport class InvalidHexValueError extends BaseError {\n    constructor(value) {\n        super(`Hex value \"${value}\" is an odd length (${value.length}). It must be an even length.`, { name: 'InvalidHexValueError' });\n    }\n}\nexport class SizeOverflowError extends BaseError {\n    constructor({ givenSize, maxSize }) {\n        super(`Size cannot exceed ${maxSize} bytes. Given size: ${givenSize} bytes.`, { name: 'SizeOverflowError' });\n    }\n}\n//# sourceMappingURL=encoding.js.map","import { BaseError } from './base.js';\nexport class SliceOffsetOutOfBoundsError extends BaseError {\n    constructor({ offset, position, size, }) {\n        super(`Slice ${position === 'start' ? 'starting' : 'ending'} at offset \"${offset}\" is out-of-bounds (size: ${size}).`, { name: 'SliceOffsetOutOfBoundsError' });\n    }\n}\nexport class SizeExceedsPaddingSizeError extends BaseError {\n    constructor({ size, targetSize, type, }) {\n        super(`${type.charAt(0).toUpperCase()}${type\n            .slice(1)\n            .toLowerCase()} size (${size}) exceeds padding size (${targetSize}).`, { name: 'SizeExceedsPaddingSizeError' });\n    }\n}\nexport class InvalidBytesLengthError extends BaseError {\n    constructor({ size, targetSize, type, }) {\n        super(`${type.charAt(0).toUpperCase()}${type\n            .slice(1)\n            .toLowerCase()} is expected to be ${targetSize} ${type} long, but is ${size} ${type} long.`, { name: 'InvalidBytesLengthError' });\n    }\n}\n//# sourceMappingURL=data.js.map","import { SizeExceedsPaddingSizeError, } from '../../errors/data.js';\nexport function pad(hexOrBytes, { dir, size = 32 } = {}) {\n    if (typeof hexOrBytes === 'string')\n        return padHex(hexOrBytes, { dir, size });\n    return padBytes(hexOrBytes, { dir, size });\n}\nexport function padHex(hex_, { dir, size = 32 } = {}) {\n    if (size === null)\n        return hex_;\n    const hex = hex_.replace('0x', '');\n    if (hex.length > size * 2)\n        throw new SizeExceedsPaddingSizeError({\n            size: Math.ceil(hex.length / 2),\n            targetSize: size,\n            type: 'hex',\n        });\n    return `0x${hex[dir === 'right' ? 'padEnd' : 'padStart'](size * 2, '0')}`;\n}\nexport function padBytes(bytes, { dir, size = 32 } = {}) {\n    if (size === null)\n        return bytes;\n    if (bytes.length > size)\n        throw new SizeExceedsPaddingSizeError({\n            size: bytes.length,\n            targetSize: size,\n            type: 'bytes',\n        });\n    const paddedBytes = new Uint8Array(size);\n    for (let i = 0; i < size; i++) {\n        const padEnd = dir === 'right';\n        paddedBytes[padEnd ? i : size - i - 1] =\n            bytes[padEnd ? i : bytes.length - i - 1];\n    }\n    return paddedBytes;\n}\n//# sourceMappingURL=pad.js.map","export function isHex(value, { strict = true } = {}) {\n    if (!value)\n        return false;\n    if (typeof value !== 'string')\n        return false;\n    return strict ? /^0x[0-9a-fA-F]*$/.test(value) : value.startsWith('0x');\n}\n//# sourceMappingURL=isHex.js.map","import { isHex } from './isHex.js';\n/**\n * @description Retrieves the size of the value (in bytes).\n *\n * @param value The value (hex or byte array) to retrieve the size of.\n * @returns The size of the value (in bytes).\n */\nexport function size(value) {\n    if (isHex(value, { strict: false }))\n        return Math.ceil((value.length - 2) / 2);\n    return value.length;\n}\n//# sourceMappingURL=size.js.map","export function trim(hexOrBytes, { dir = 'left' } = {}) {\n    let data = typeof hexOrBytes === 'string' ? hexOrBytes.replace('0x', '') : hexOrBytes;\n    let sliceLength = 0;\n    for (let i = 0; i < data.length - 1; i++) {\n        if (data[dir === 'left' ? i : data.length - i - 1].toString() === '0')\n            sliceLength++;\n        else\n            break;\n    }\n    data =\n        dir === 'left'\n            ? data.slice(sliceLength)\n            : data.slice(0, data.length - sliceLength);\n    if (typeof hexOrBytes === 'string') {\n        if (data.length === 1 && dir === 'right')\n            data = `${data}0`;\n        return `0x${data.length % 2 === 1 ? `0${data}` : data}`;\n    }\n    return data;\n}\n//# sourceMappingURL=trim.js.map","import { BaseError } from '../../errors/base.js';\nimport { isHex } from '../data/isHex.js';\nimport { pad } from '../data/pad.js';\nimport { assertSize } from './fromHex.js';\nimport { numberToHex, } from './toHex.js';\nconst encoder = /*#__PURE__*/ new TextEncoder();\n/**\n * Encodes a UTF-8 string, hex value, bigint, number or boolean to a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes\n * - Example: https://viem.sh/docs/utilities/toBytes#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes('Hello world')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { toBytes } from 'viem'\n * const data = toBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function toBytes(value, opts = {}) {\n    if (typeof value === 'number' || typeof value === 'bigint')\n        return numberToBytes(value, opts);\n    if (typeof value === 'boolean')\n        return boolToBytes(value, opts);\n    if (isHex(value))\n        return hexToBytes(value, opts);\n    return stringToBytes(value, opts);\n}\n/**\n * Encodes a boolean into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#booltobytes\n *\n * @param value Boolean value to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true)\n * // Uint8Array([1])\n *\n * @example\n * import { boolToBytes } from 'viem'\n * const data = boolToBytes(true, { size: 32 })\n * // Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])\n */\nexport function boolToBytes(value, opts = {}) {\n    const bytes = new Uint8Array(1);\n    bytes[0] = Number(value);\n    if (typeof opts.size === 'number') {\n        assertSize(bytes, { size: opts.size });\n        return pad(bytes, { size: opts.size });\n    }\n    return bytes;\n}\n// We use very optimized technique to convert hex string to byte array\nconst charCodeMap = {\n    zero: 48,\n    nine: 57,\n    A: 65,\n    F: 70,\n    a: 97,\n    f: 102,\n};\nfunction charCodeToBase16(char) {\n    if (char >= charCodeMap.zero && char <= charCodeMap.nine)\n        return char - charCodeMap.zero;\n    if (char >= charCodeMap.A && char <= charCodeMap.F)\n        return char - (charCodeMap.A - 10);\n    if (char >= charCodeMap.a && char <= charCodeMap.f)\n        return char - (charCodeMap.a - 10);\n    return undefined;\n}\n/**\n * Encodes a hex string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#hextobytes\n *\n * @param hex Hex string to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n *\n * @example\n * import { hexToBytes } from 'viem'\n * const data = hexToBytes('0x48656c6c6f20776f726c6421', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function hexToBytes(hex_, opts = {}) {\n    let hex = hex_;\n    if (opts.size) {\n        assertSize(hex, { size: opts.size });\n        hex = pad(hex, { dir: 'right', size: opts.size });\n    }\n    let hexString = hex.slice(2);\n    if (hexString.length % 2)\n        hexString = `0${hexString}`;\n    const length = hexString.length / 2;\n    const bytes = new Uint8Array(length);\n    for (let index = 0, j = 0; index < length; index++) {\n        const nibbleLeft = charCodeToBase16(hexString.charCodeAt(j++));\n        const nibbleRight = charCodeToBase16(hexString.charCodeAt(j++));\n        if (nibbleLeft === undefined || nibbleRight === undefined) {\n            throw new BaseError(`Invalid byte sequence (\"${hexString[j - 2]}${hexString[j - 1]}\" in \"${hexString}\").`);\n        }\n        bytes[index] = nibbleLeft * 16 + nibbleRight;\n    }\n    return bytes;\n}\n/**\n * Encodes a number into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#numbertobytes\n *\n * @param value Number to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420)\n * // Uint8Array([1, 164])\n *\n * @example\n * import { numberToBytes } from 'viem'\n * const data = numberToBytes(420, { size: 4 })\n * // Uint8Array([0, 0, 1, 164])\n */\nexport function numberToBytes(value, opts) {\n    const hex = numberToHex(value, opts);\n    return hexToBytes(hex);\n}\n/**\n * Encodes a UTF-8 string into a byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/toBytes#stringtobytes\n *\n * @param value String to encode.\n * @param opts Options.\n * @returns Byte array value.\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!')\n * // Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33])\n *\n * @example\n * import { stringToBytes } from 'viem'\n * const data = stringToBytes('Hello world!', { size: 32 })\n * // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n */\nexport function stringToBytes(value, opts = {}) {\n    const bytes = encoder.encode(value);\n    if (typeof opts.size === 'number') {\n        assertSize(bytes, { size: opts.size });\n        return pad(bytes, { dir: 'right', size: opts.size });\n    }\n    return bytes;\n}\n//# sourceMappingURL=toBytes.js.map","import { InvalidHexBooleanError, SizeOverflowError, } from '../../errors/encoding.js';\nimport { size as size_ } from '../data/size.js';\nimport { trim } from '../data/trim.js';\nimport { hexToBytes } from './toBytes.js';\nexport function assertSize(hexOrBytes, { size }) {\n    if (size_(hexOrBytes) > size)\n        throw new SizeOverflowError({\n            givenSize: size_(hexOrBytes),\n            maxSize: size,\n        });\n}\n/**\n * Decodes a hex string into a string, number, bigint, boolean, or byte array.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex\n * - Example: https://viem.sh/docs/utilities/fromHex#usage\n *\n * @param hex Hex string to decode.\n * @param toOrOpts Type to convert to or options.\n * @returns Decoded value.\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x1a4', 'number')\n * // 420\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c6421', 'string')\n * // 'Hello world'\n *\n * @example\n * import { fromHex } from 'viem'\n * const data = fromHex('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n *   size: 32,\n *   to: 'string'\n * })\n * // 'Hello world'\n */\nexport function fromHex(hex, toOrOpts) {\n    const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts;\n    const to = opts.to;\n    if (to === 'number')\n        return hexToNumber(hex, opts);\n    if (to === 'bigint')\n        return hexToBigInt(hex, opts);\n    if (to === 'string')\n        return hexToString(hex, opts);\n    if (to === 'boolean')\n        return hexToBool(hex, opts);\n    return hexToBytes(hex, opts);\n}\n/**\n * Decodes a hex value into a bigint.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobigint\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns BigInt value.\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x1a4', { signed: true })\n * // 420n\n *\n * @example\n * import { hexToBigInt } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420n\n */\nexport function hexToBigInt(hex, opts = {}) {\n    const { signed } = opts;\n    if (opts.size)\n        assertSize(hex, { size: opts.size });\n    const value = BigInt(hex);\n    if (!signed)\n        return value;\n    const size = (hex.length - 2) / 2;\n    const max = (1n << (BigInt(size) * 8n - 1n)) - 1n;\n    if (value <= max)\n        return value;\n    return value - BigInt(`0x${'f'.padStart(size * 2, 'f')}`) - 1n;\n}\n/**\n * Decodes a hex value into a boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextobool\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Boolean value.\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x01')\n * // true\n *\n * @example\n * import { hexToBool } from 'viem'\n * const data = hexToBool('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })\n * // true\n */\nexport function hexToBool(hex_, opts = {}) {\n    let hex = hex_;\n    if (opts.size) {\n        assertSize(hex, { size: opts.size });\n        hex = trim(hex);\n    }\n    if (trim(hex) === '0x00')\n        return false;\n    if (trim(hex) === '0x01')\n        return true;\n    throw new InvalidHexBooleanError(hex);\n}\n/**\n * Decodes a hex string into a number.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextonumber\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns Number value.\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToNumber('0x1a4')\n * // 420\n *\n * @example\n * import { hexToNumber } from 'viem'\n * const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // 420\n */\nexport function hexToNumber(hex, opts = {}) {\n    return Number(hexToBigInt(hex, opts));\n}\n/**\n * Decodes a hex value into a UTF-8 string.\n *\n * - Docs: https://viem.sh/docs/utilities/fromHex#hextostring\n *\n * @param hex Hex value to decode.\n * @param opts Options.\n * @returns String value.\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c6421')\n * // 'Hello world!'\n *\n * @example\n * import { hexToString } from 'viem'\n * const data = hexToString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n *  size: 32,\n * })\n * // 'Hello world'\n */\nexport function hexToString(hex, opts = {}) {\n    let bytes = hexToBytes(hex);\n    if (opts.size) {\n        assertSize(bytes, { size: opts.size });\n        bytes = trim(bytes, { dir: 'right' });\n    }\n    return new TextDecoder().decode(bytes);\n}\n//# sourceMappingURL=fromHex.js.map","import { IntegerOutOfRangeError, } from '../../errors/encoding.js';\nimport { pad } from '../data/pad.js';\nimport { assertSize } from './fromHex.js';\nconst hexes = /*#__PURE__*/ Array.from({ length: 256 }, (_v, i) => i.toString(16).padStart(2, '0'));\n/**\n * Encodes a string, number, bigint, or ByteArray into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex\n * - Example: https://viem.sh/docs/utilities/toHex#usage\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world')\n * // '0x48656c6c6f20776f726c6421'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex(420)\n * // '0x1a4'\n *\n * @example\n * import { toHex } from 'viem'\n * const data = toHex('Hello world', { size: 32 })\n * // '0x48656c6c6f20776f726c64210000000000000000000000000000000000000000'\n */\nexport function toHex(value, opts = {}) {\n    if (typeof value === 'number' || typeof value === 'bigint')\n        return numberToHex(value, opts);\n    if (typeof value === 'string') {\n        return stringToHex(value, opts);\n    }\n    if (typeof value === 'boolean')\n        return boolToHex(value, opts);\n    return bytesToHex(value, opts);\n}\n/**\n * Encodes a boolean into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#booltohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true)\n * // '0x1'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(false)\n * // '0x0'\n *\n * @example\n * import { boolToHex } from 'viem'\n * const data = boolToHex(true, { size: 32 })\n * // '0x0000000000000000000000000000000000000000000000000000000000000001'\n */\nexport function boolToHex(value, opts = {}) {\n    const hex = `0x${Number(value)}`;\n    if (typeof opts.size === 'number') {\n        assertSize(hex, { size: opts.size });\n        return pad(hex, { size: opts.size });\n    }\n    return hex;\n}\n/**\n * Encodes a bytes array into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#bytestohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { bytesToHex } from 'viem'\n * const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]), { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function bytesToHex(value, opts = {}) {\n    let string = '';\n    for (let i = 0; i < value.length; i++) {\n        string += hexes[value[i]];\n    }\n    const hex = `0x${string}`;\n    if (typeof opts.size === 'number') {\n        assertSize(hex, { size: opts.size });\n        return pad(hex, { dir: 'right', size: opts.size });\n    }\n    return hex;\n}\n/**\n * Encodes a number or bigint into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#numbertohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420)\n * // '0x1a4'\n *\n * @example\n * import { numberToHex } from 'viem'\n * const data = numberToHex(420, { size: 32 })\n * // '0x00000000000000000000000000000000000000000000000000000000000001a4'\n */\nexport function numberToHex(value_, opts = {}) {\n    const { signed, size } = opts;\n    const value = BigInt(value_);\n    let maxValue;\n    if (size) {\n        if (signed)\n            maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n;\n        else\n            maxValue = 2n ** (BigInt(size) * 8n) - 1n;\n    }\n    else if (typeof value_ === 'number') {\n        maxValue = BigInt(Number.MAX_SAFE_INTEGER);\n    }\n    const minValue = typeof maxValue === 'bigint' && signed ? -maxValue - 1n : 0;\n    if ((maxValue && value > maxValue) || value < minValue) {\n        const suffix = typeof value_ === 'bigint' ? 'n' : '';\n        throw new IntegerOutOfRangeError({\n            max: maxValue ? `${maxValue}${suffix}` : undefined,\n            min: `${minValue}${suffix}`,\n            signed,\n            size,\n            value: `${value_}${suffix}`,\n        });\n    }\n    const hex = `0x${(signed && value < 0 ? (1n << BigInt(size * 8)) + BigInt(value) : value).toString(16)}`;\n    if (size)\n        return pad(hex, { size });\n    return hex;\n}\nconst encoder = /*#__PURE__*/ new TextEncoder();\n/**\n * Encodes a UTF-8 string into a hex string\n *\n * - Docs: https://viem.sh/docs/utilities/toHex#stringtohex\n *\n * @param value Value to encode.\n * @param opts Options.\n * @returns Hex value.\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!')\n * // '0x48656c6c6f20576f726c6421'\n *\n * @example\n * import { stringToHex } from 'viem'\n * const data = stringToHex('Hello World!', { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n */\nexport function stringToHex(value_, opts = {}) {\n    const value = encoder.encode(value_);\n    return bytesToHex(value, opts);\n}\n//# sourceMappingURL=toHex.js.map","import { InvalidDefinitionTypeError, } from '../../errors/abi.js';\nexport function formatAbiItem(abiItem, { includeName = false } = {}) {\n    if (abiItem.type !== 'function' &&\n        abiItem.type !== 'event' &&\n        abiItem.type !== 'error')\n        throw new InvalidDefinitionTypeError(abiItem.type);\n    return `${abiItem.name}(${formatAbiParams(abiItem.inputs, { includeName })})`;\n}\nexport function formatAbiParams(params, { includeName = false } = {}) {\n    if (!params)\n        return '';\n    return params\n        .map((param) => formatAbiParam(param, { includeName }))\n        .join(includeName ? ', ' : ',');\n}\nfunction formatAbiParam(param, { includeName }) {\n    if (param.type.startsWith('tuple')) {\n        return `(${formatAbiParams(param.components, { includeName })})${param.type.slice('tuple'.length)}`;\n    }\n    return param.type + (includeName && param.name ? ` ${param.name}` : '');\n}\n//# sourceMappingURL=formatAbiItem.js.map","import { formatAbiItem, formatAbiParams } from '../utils/abi/formatAbiItem.js';\nimport { size } from '../utils/data/size.js';\nimport { BaseError } from './base.js';\nexport class AbiConstructorNotFoundError extends BaseError {\n    constructor({ docsPath }) {\n        super([\n            'A constructor was not found on the ABI.',\n            'Make sure you are using the correct ABI and that the constructor exists on it.',\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiConstructorNotFoundError',\n        });\n    }\n}\nexport class AbiConstructorParamsNotFoundError extends BaseError {\n    constructor({ docsPath }) {\n        super([\n            'Constructor arguments were provided (`args`), but a constructor parameters (`inputs`) were not found on the ABI.',\n            'Make sure you are using the correct ABI, and that the `inputs` attribute on the constructor exists.',\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiConstructorParamsNotFoundError',\n        });\n    }\n}\nexport class AbiDecodingDataSizeInvalidError extends BaseError {\n    constructor({ data, size }) {\n        super([\n            `Data size of ${size} bytes is invalid.`,\n            'Size must be in increments of 32 bytes (size % 32 === 0).',\n        ].join('\\n'), {\n            metaMessages: [`Data: ${data} (${size} bytes)`],\n            name: 'AbiDecodingDataSizeInvalidError',\n        });\n    }\n}\nexport class AbiDecodingDataSizeTooSmallError extends BaseError {\n    constructor({ data, params, size, }) {\n        super([`Data size of ${size} bytes is too small for given parameters.`].join('\\n'), {\n            metaMessages: [\n                `Params: (${formatAbiParams(params, { includeName: true })})`,\n                `Data:   ${data} (${size} bytes)`,\n            ],\n            name: 'AbiDecodingDataSizeTooSmallError',\n        });\n        Object.defineProperty(this, \"data\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"params\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"size\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.data = data;\n        this.params = params;\n        this.size = size;\n    }\n}\nexport class AbiDecodingZeroDataError extends BaseError {\n    constructor() {\n        super('Cannot decode zero data (\"0x\") with ABI parameters.', {\n            name: 'AbiDecodingZeroDataError',\n        });\n    }\n}\nexport class AbiEncodingArrayLengthMismatchError extends BaseError {\n    constructor({ expectedLength, givenLength, type, }) {\n        super([\n            `ABI encoding array length mismatch for type ${type}.`,\n            `Expected length: ${expectedLength}`,\n            `Given length: ${givenLength}`,\n        ].join('\\n'), { name: 'AbiEncodingArrayLengthMismatchError' });\n    }\n}\nexport class AbiEncodingBytesSizeMismatchError extends BaseError {\n    constructor({ expectedSize, value }) {\n        super(`Size of bytes \"${value}\" (bytes${size(value)}) does not match expected size (bytes${expectedSize}).`, { name: 'AbiEncodingBytesSizeMismatchError' });\n    }\n}\nexport class AbiEncodingLengthMismatchError extends BaseError {\n    constructor({ expectedLength, givenLength, }) {\n        super([\n            'ABI encoding params/values length mismatch.',\n            `Expected length (params): ${expectedLength}`,\n            `Given length (values): ${givenLength}`,\n        ].join('\\n'), { name: 'AbiEncodingLengthMismatchError' });\n    }\n}\nexport class AbiErrorInputsNotFoundError extends BaseError {\n    constructor(errorName, { docsPath }) {\n        super([\n            `Arguments (\\`args\\`) were provided to \"${errorName}\", but \"${errorName}\" on the ABI does not contain any parameters (\\`inputs\\`).`,\n            'Cannot encode error result without knowing what the parameter types are.',\n            'Make sure you are using the correct ABI and that the inputs exist on it.',\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiErrorInputsNotFoundError',\n        });\n    }\n}\nexport class AbiErrorNotFoundError extends BaseError {\n    constructor(errorName, { docsPath } = {}) {\n        super([\n            `Error ${errorName ? `\"${errorName}\" ` : ''}not found on ABI.`,\n            'Make sure you are using the correct ABI and that the error exists on it.',\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiErrorNotFoundError',\n        });\n    }\n}\nexport class AbiErrorSignatureNotFoundError extends BaseError {\n    constructor(signature, { docsPath }) {\n        super([\n            `Encoded error signature \"${signature}\" not found on ABI.`,\n            'Make sure you are using the correct ABI and that the error exists on it.',\n            `You can look up the decoded signature here: https://openchain.xyz/signatures?query=${signature}.`,\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiErrorSignatureNotFoundError',\n        });\n        Object.defineProperty(this, \"signature\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.signature = signature;\n    }\n}\nexport class AbiEventSignatureEmptyTopicsError extends BaseError {\n    constructor({ docsPath }) {\n        super('Cannot extract event signature from empty topics.', {\n            docsPath,\n            name: 'AbiEventSignatureEmptyTopicsError',\n        });\n    }\n}\nexport class AbiEventSignatureNotFoundError extends BaseError {\n    constructor(signature, { docsPath }) {\n        super([\n            `Encoded event signature \"${signature}\" not found on ABI.`,\n            'Make sure you are using the correct ABI and that the event exists on it.',\n            `You can look up the signature here: https://openchain.xyz/signatures?query=${signature}.`,\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiEventSignatureNotFoundError',\n        });\n    }\n}\nexport class AbiEventNotFoundError extends BaseError {\n    constructor(eventName, { docsPath } = {}) {\n        super([\n            `Event ${eventName ? `\"${eventName}\" ` : ''}not found on ABI.`,\n            'Make sure you are using the correct ABI and that the event exists on it.',\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiEventNotFoundError',\n        });\n    }\n}\nexport class AbiFunctionNotFoundError extends BaseError {\n    constructor(functionName, { docsPath } = {}) {\n        super([\n            `Function ${functionName ? `\"${functionName}\" ` : ''}not found on ABI.`,\n            'Make sure you are using the correct ABI and that the function exists on it.',\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiFunctionNotFoundError',\n        });\n    }\n}\nexport class AbiFunctionOutputsNotFoundError extends BaseError {\n    constructor(functionName, { docsPath }) {\n        super([\n            `Function \"${functionName}\" does not contain any \\`outputs\\` on ABI.`,\n            'Cannot decode function result without knowing what the parameter types are.',\n            'Make sure you are using the correct ABI and that the function exists on it.',\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiFunctionOutputsNotFoundError',\n        });\n    }\n}\nexport class AbiFunctionSignatureNotFoundError extends BaseError {\n    constructor(signature, { docsPath }) {\n        super([\n            `Encoded function signature \"${signature}\" not found on ABI.`,\n            'Make sure you are using the correct ABI and that the function exists on it.',\n            `You can look up the signature here: https://openchain.xyz/signatures?query=${signature}.`,\n        ].join('\\n'), {\n            docsPath,\n            name: 'AbiFunctionSignatureNotFoundError',\n        });\n    }\n}\nexport class AbiItemAmbiguityError extends BaseError {\n    constructor(x, y) {\n        super('Found ambiguous types in overloaded ABI items.', {\n            metaMessages: [\n                `\\`${x.type}\\` in \\`${formatAbiItem(x.abiItem)}\\`, and`,\n                `\\`${y.type}\\` in \\`${formatAbiItem(y.abiItem)}\\``,\n                '',\n                'These types encode differently and cannot be distinguished at runtime.',\n                'Remove one of the ambiguous items in the ABI.',\n            ],\n            name: 'AbiItemAmbiguityError',\n        });\n    }\n}\nexport class BytesSizeMismatchError extends BaseError {\n    constructor({ expectedSize, givenSize, }) {\n        super(`Expected bytes${expectedSize}, got bytes${givenSize}.`, {\n            name: 'BytesSizeMismatchError',\n        });\n    }\n}\nexport class DecodeLogDataMismatch extends BaseError {\n    constructor({ abiItem, data, params, size, }) {\n        super([\n            `Data size of ${size} bytes is too small for non-indexed event parameters.`,\n        ].join('\\n'), {\n            metaMessages: [\n                `Params: (${formatAbiParams(params, { includeName: true })})`,\n                `Data:   ${data} (${size} bytes)`,\n            ],\n            name: 'DecodeLogDataMismatch',\n        });\n        Object.defineProperty(this, \"abiItem\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"data\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"params\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"size\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.abiItem = abiItem;\n        this.data = data;\n        this.params = params;\n        this.size = size;\n    }\n}\nexport class DecodeLogTopicsMismatch extends BaseError {\n    constructor({ abiItem, param, }) {\n        super([\n            `Expected a topic for indexed event parameter${param.name ? ` \"${param.name}\"` : ''} on event \"${formatAbiItem(abiItem, { includeName: true })}\".`,\n        ].join('\\n'), { name: 'DecodeLogTopicsMismatch' });\n        Object.defineProperty(this, \"abiItem\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.abiItem = abiItem;\n    }\n}\nexport class InvalidAbiEncodingTypeError extends BaseError {\n    constructor(type, { docsPath }) {\n        super([\n            `Type \"${type}\" is not a valid encoding type.`,\n            'Please provide a valid ABI type.',\n        ].join('\\n'), { docsPath, name: 'InvalidAbiEncodingType' });\n    }\n}\nexport class InvalidAbiDecodingTypeError extends BaseError {\n    constructor(type, { docsPath }) {\n        super([\n            `Type \"${type}\" is not a valid decoding type.`,\n            'Please provide a valid ABI type.',\n        ].join('\\n'), { docsPath, name: 'InvalidAbiDecodingType' });\n    }\n}\nexport class InvalidArrayError extends BaseError {\n    constructor(value) {\n        super([`Value \"${value}\" is not a valid array.`].join('\\n'), {\n            name: 'InvalidArrayError',\n        });\n    }\n}\nexport class InvalidDefinitionTypeError extends BaseError {\n    constructor(type) {\n        super([\n            `\"${type}\" is not a valid definition type.`,\n            'Valid types: \"function\", \"event\", \"error\"',\n        ].join('\\n'), { name: 'InvalidDefinitionTypeError' });\n    }\n}\nexport class UnsupportedPackedAbiType extends BaseError {\n    constructor(type) {\n        super(`Type \"${type}\" is not supported for packed encoding.`, {\n            name: 'UnsupportedPackedAbiType',\n        });\n    }\n}\n//# sourceMappingURL=abi.js.map","export function concat(values) {\n    if (typeof values[0] === 'string')\n        return concatHex(values);\n    return concatBytes(values);\n}\nexport function concatBytes(values) {\n    let length = 0;\n    for (const arr of values) {\n        length += arr.length;\n    }\n    const result = new Uint8Array(length);\n    let offset = 0;\n    for (const arr of values) {\n        result.set(arr, offset);\n        offset += arr.length;\n    }\n    return result;\n}\nexport function concatHex(values) {\n    return `0x${values.reduce((acc, x) => acc + x.replace('0x', ''), '')}`;\n}\n//# sourceMappingURL=concat.js.map","import { BaseError } from './base.js';\nexport class InvalidAddressError extends BaseError {\n    constructor({ address }) {\n        super(`Address \"${address}\" is invalid.`, {\n            metaMessages: [\n                '- Address must be a hex value of 20 bytes (40 hex characters).',\n                '- Address must match its checksum counterpart.',\n            ],\n            name: 'InvalidAddressError',\n        });\n    }\n}\n//# sourceMappingURL=address.js.map","/**\n * Map with a LRU (Least recently used) policy.\n *\n * @link https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n */\nexport class LruMap extends Map {\n    constructor(size) {\n        super();\n        Object.defineProperty(this, \"maxSize\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.maxSize = size;\n    }\n    get(key) {\n        const value = super.get(key);\n        if (super.has(key) && value !== undefined) {\n            this.delete(key);\n            super.set(key, value);\n        }\n        return value;\n    }\n    set(key, value) {\n        super.set(key, value);\n        if (this.maxSize && this.size > this.maxSize) {\n            const firstKey = this.keys().next().value;\n            if (firstKey)\n                this.delete(firstKey);\n        }\n        return this;\n    }\n}\n//# sourceMappingURL=lru.js.map","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\nfunction fromBig(n, le = false) {\n    if (le)\n        return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n    return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n    const len = lst.length;\n    let Ah = new Uint32Array(len);\n    let Al = new Uint32Array(len);\n    for (let i = 0; i < len; i++) {\n        const { h, l } = fromBig(lst[i], le);\n        [Ah[i], Al[i]] = [h, l];\n    }\n    return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n    const l = (Al >>> 0) + (Bl >>> 0);\n    return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig };\n// prettier-ignore\nconst u64 = {\n    fromBig, split, toBig,\n    shrSH, shrSL,\n    rotrSH, rotrSL, rotrBH, rotrBL,\n    rotr32H, rotr32L,\n    rotlSH, rotlSL, rotlBH, rotlBL,\n    add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","export const crypto = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n//# sourceMappingURL=crypto.js.map","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a) {\n    return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nexport function anumber(n) {\n    if (!Number.isSafeInteger(n) || n < 0)\n        throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nexport function abytes(b, ...lengths) {\n    if (!isBytes(b))\n        throw new Error('Uint8Array expected');\n    if (lengths.length > 0 && !lengths.includes(b.length))\n        throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n/** Asserts something is hash */\nexport function ahash(h) {\n    if (typeof h !== 'function' || typeof h.create !== 'function')\n        throw new Error('Hash should be wrapped by utils.createHasher');\n    anumber(h.outputLen);\n    anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance, checkFinished = true) {\n    if (instance.destroyed)\n        throw new Error('Hash instance has been destroyed');\n    if (checkFinished && instance.finished)\n        throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out, instance) {\n    abytes(out);\n    const min = instance.outputLen;\n    if (out.length < min) {\n        throw new Error('digestInto() expects output buffer of length at least ' + min);\n    }\n}\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr) {\n    return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr) {\n    return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays) {\n    for (let i = 0; i < arrays.length; i++) {\n        arrays[i].fill(0);\n    }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr) {\n    return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word, shift) {\n    return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word, shift) {\n    return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nexport function byteSwap(word) {\n    return (((word << 24) & 0xff000000) |\n        ((word << 8) & 0xff0000) |\n        ((word >>> 8) & 0xff00) |\n        ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE = isLE\n    ? (n) => n\n    : (n) => byteSwap(n);\n/** @deprecated */\nexport const byteSwapIfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr) {\n    for (let i = 0; i < arr.length; i++) {\n        arr[i] = byteSwap(arr[i]);\n    }\n    return arr;\n}\nexport const swap32IfBE = isLE\n    ? (u) => u\n    : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n    abytes(bytes);\n    // @ts-ignore\n    if (hasHexBuiltin)\n        return bytes.toHex();\n    // pre-caching improves the speed 6x\n    let hex = '';\n    for (let i = 0; i < bytes.length; i++) {\n        hex += hexes[bytes[i]];\n    }\n    return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n    if (ch >= asciis._0 && ch <= asciis._9)\n        return ch - asciis._0; // '2' => 50-48\n    if (ch >= asciis.A && ch <= asciis.F)\n        return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n    if (ch >= asciis.a && ch <= asciis.f)\n        return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n    return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n    if (typeof hex !== 'string')\n        throw new Error('hex string expected, got ' + typeof hex);\n    // @ts-ignore\n    if (hasHexBuiltin)\n        return Uint8Array.fromHex(hex);\n    const hl = hex.length;\n    const al = hl / 2;\n    if (hl % 2)\n        throw new Error('hex string expected, got unpadded hex of length ' + hl);\n    const array = new Uint8Array(al);\n    for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n        const n1 = asciiToBase16(hex.charCodeAt(hi));\n        const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n        if (n1 === undefined || n2 === undefined) {\n            const char = hex[hi] + hex[hi + 1];\n            throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n        }\n        array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n    }\n    return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async () => { };\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(iters, tick, cb) {\n    let ts = Date.now();\n    for (let i = 0; i < iters; i++) {\n        cb(i);\n        // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n        const diff = Date.now() - ts;\n        if (diff >= 0 && diff < tick)\n            continue;\n        await nextTick();\n        ts += diff;\n    }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n    if (typeof str !== 'string')\n        throw new Error('string expected');\n    return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes) {\n    return new TextDecoder().decode(bytes);\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n    if (typeof data === 'string')\n        data = utf8ToBytes(data);\n    abytes(data);\n    return data;\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data) {\n    if (typeof data === 'string')\n        data = utf8ToBytes(data);\n    abytes(data);\n    return data;\n}\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays) {\n    let sum = 0;\n    for (let i = 0; i < arrays.length; i++) {\n        const a = arrays[i];\n        abytes(a);\n        sum += a.length;\n    }\n    const res = new Uint8Array(sum);\n    for (let i = 0, pad = 0; i < arrays.length; i++) {\n        const a = arrays[i];\n        res.set(a, pad);\n        pad += a.length;\n    }\n    return res;\n}\nexport function checkOpts(defaults, opts) {\n    if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n        throw new Error('options should be object or undefined');\n    const merged = Object.assign(defaults, opts);\n    return merged;\n}\n/** For runtime check if class implements interface */\nexport class Hash {\n}\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher(hashCons) {\n    const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n    const tmp = hashCons();\n    hashC.outputLen = tmp.outputLen;\n    hashC.blockLen = tmp.blockLen;\n    hashC.create = () => hashCons();\n    return hashC;\n}\nexport function createOptHasher(hashCons) {\n    const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n    const tmp = hashCons({});\n    hashC.outputLen = tmp.outputLen;\n    hashC.blockLen = tmp.blockLen;\n    hashC.create = (opts) => hashCons(opts);\n    return hashC;\n}\nexport function createXOFer(hashCons) {\n    const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n    const tmp = hashCons({});\n    hashC.outputLen = tmp.outputLen;\n    hashC.blockLen = tmp.blockLen;\n    hashC.create = (opts) => hashCons(opts);\n    return hashC;\n}\nexport const wrapConstructor = createHasher;\nexport const wrapConstructorWithOpts = createOptHasher;\nexport const wrapXOFConstructorWithOpts = createXOFer;\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32) {\n    if (crypto && typeof crypto.getRandomValues === 'function') {\n        return crypto.getRandomValues(new Uint8Array(bytesLength));\n    }\n    // Legacy Node.js compatibility\n    if (crypto && typeof crypto.randomBytes === 'function') {\n        return Uint8Array.from(crypto.randomBytes(bytesLength));\n    }\n    throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from \"./_u64.js\";\n// prettier-ignore\nimport { abytes, aexists, anumber, aoutput, clean, createHasher, createXOFer, Hash, swap32IfBE, toBytes, u32 } from \"./utils.js\";\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI = [];\nconst SHA3_ROTL = [];\nconst _SHA3_IOTA = [];\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n    // Pi\n    [x, y] = [y, (2 * x + 3 * y) % 5];\n    SHA3_PI.push(2 * (5 * y + x));\n    // Rotational\n    SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n    // Iota\n    let t = _0n;\n    for (let j = 0; j < 7; j++) {\n        R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n        if (R & _2n)\n            t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n    }\n    _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s, rounds = 24) {\n    const B = new Uint32Array(5 * 2);\n    // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n    for (let round = 24 - rounds; round < 24; round++) {\n        // Theta θ\n        for (let x = 0; x < 10; x++)\n            B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n        for (let x = 0; x < 10; x += 2) {\n            const idx1 = (x + 8) % 10;\n            const idx0 = (x + 2) % 10;\n            const B0 = B[idx0];\n            const B1 = B[idx0 + 1];\n            const Th = rotlH(B0, B1, 1) ^ B[idx1];\n            const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n            for (let y = 0; y < 50; y += 10) {\n                s[x + y] ^= Th;\n                s[x + y + 1] ^= Tl;\n            }\n        }\n        // Rho (ρ) and Pi (π)\n        let curH = s[2];\n        let curL = s[3];\n        for (let t = 0; t < 24; t++) {\n            const shift = SHA3_ROTL[t];\n            const Th = rotlH(curH, curL, shift);\n            const Tl = rotlL(curH, curL, shift);\n            const PI = SHA3_PI[t];\n            curH = s[PI];\n            curL = s[PI + 1];\n            s[PI] = Th;\n            s[PI + 1] = Tl;\n        }\n        // Chi (χ)\n        for (let y = 0; y < 50; y += 10) {\n            for (let x = 0; x < 10; x++)\n                B[x] = s[y + x];\n            for (let x = 0; x < 10; x++)\n                s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n        }\n        // Iota (ι)\n        s[0] ^= SHA3_IOTA_H[round];\n        s[1] ^= SHA3_IOTA_L[round];\n    }\n    clean(B);\n}\n/** Keccak sponge function. */\nexport class Keccak extends Hash {\n    // NOTE: we accept arguments in bytes instead of bits here.\n    constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {\n        super();\n        this.pos = 0;\n        this.posOut = 0;\n        this.finished = false;\n        this.destroyed = false;\n        this.enableXOF = false;\n        this.blockLen = blockLen;\n        this.suffix = suffix;\n        this.outputLen = outputLen;\n        this.enableXOF = enableXOF;\n        this.rounds = rounds;\n        // Can be passed from user as dkLen\n        anumber(outputLen);\n        // 1600 = 5x5 matrix of 64bit.  1600 bits === 200 bytes\n        // 0 < blockLen < 200\n        if (!(0 < blockLen && blockLen < 200))\n            throw new Error('only keccak-f1600 function is supported');\n        this.state = new Uint8Array(200);\n        this.state32 = u32(this.state);\n    }\n    clone() {\n        return this._cloneInto();\n    }\n    keccak() {\n        swap32IfBE(this.state32);\n        keccakP(this.state32, this.rounds);\n        swap32IfBE(this.state32);\n        this.posOut = 0;\n        this.pos = 0;\n    }\n    update(data) {\n        aexists(this);\n        data = toBytes(data);\n        abytes(data);\n        const { blockLen, state } = this;\n        const len = data.length;\n        for (let pos = 0; pos < len;) {\n            const take = Math.min(blockLen - this.pos, len - pos);\n            for (let i = 0; i < take; i++)\n                state[this.pos++] ^= data[pos++];\n            if (this.pos === blockLen)\n                this.keccak();\n        }\n        return this;\n    }\n    finish() {\n        if (this.finished)\n            return;\n        this.finished = true;\n        const { state, suffix, pos, blockLen } = this;\n        // Do the padding\n        state[pos] ^= suffix;\n        if ((suffix & 0x80) !== 0 && pos === blockLen - 1)\n            this.keccak();\n        state[blockLen - 1] ^= 0x80;\n        this.keccak();\n    }\n    writeInto(out) {\n        aexists(this, false);\n        abytes(out);\n        this.finish();\n        const bufferOut = this.state;\n        const { blockLen } = this;\n        for (let pos = 0, len = out.length; pos < len;) {\n            if (this.posOut >= blockLen)\n                this.keccak();\n            const take = Math.min(blockLen - this.posOut, len - pos);\n            out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n            this.posOut += take;\n            pos += take;\n        }\n        return out;\n    }\n    xofInto(out) {\n        // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n        if (!this.enableXOF)\n            throw new Error('XOF is not possible for this instance');\n        return this.writeInto(out);\n    }\n    xof(bytes) {\n        anumber(bytes);\n        return this.xofInto(new Uint8Array(bytes));\n    }\n    digestInto(out) {\n        aoutput(out, this);\n        if (this.finished)\n            throw new Error('digest() was already called');\n        this.writeInto(out);\n        this.destroy();\n        return out;\n    }\n    digest() {\n        return this.digestInto(new Uint8Array(this.outputLen));\n    }\n    destroy() {\n        this.destroyed = true;\n        clean(this.state);\n    }\n    _cloneInto(to) {\n        const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n        to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));\n        to.state32.set(this.state32);\n        to.pos = this.pos;\n        to.posOut = this.posOut;\n        to.finished = this.finished;\n        to.rounds = rounds;\n        // Suffix can change in cSHAKE\n        to.suffix = suffix;\n        to.outputLen = outputLen;\n        to.enableXOF = enableXOF;\n        to.destroyed = this.destroyed;\n        return to;\n    }\n}\nconst gen = (suffix, blockLen, outputLen) => createHasher(() => new Keccak(blockLen, suffix, outputLen));\n/** SHA3-224 hash function. */\nexport const sha3_224 = /* @__PURE__ */ (() => gen(0x06, 144, 224 / 8))();\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256 = /* @__PURE__ */ (() => gen(0x06, 136, 256 / 8))();\n/** SHA3-384 hash function. */\nexport const sha3_384 = /* @__PURE__ */ (() => gen(0x06, 104, 384 / 8))();\n/** SHA3-512 hash function. */\nexport const sha3_512 = /* @__PURE__ */ (() => gen(0x06, 72, 512 / 8))();\n/** keccak-224 hash function. */\nexport const keccak_224 = /* @__PURE__ */ (() => gen(0x01, 144, 224 / 8))();\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256 = /* @__PURE__ */ (() => gen(0x01, 136, 256 / 8))();\n/** keccak-384 hash function. */\nexport const keccak_384 = /* @__PURE__ */ (() => gen(0x01, 104, 384 / 8))();\n/** keccak-512 hash function. */\nexport const keccak_512 = /* @__PURE__ */ (() => gen(0x01, 72, 512 / 8))();\nconst genShake = (suffix, blockLen, outputLen) => createXOFer((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true));\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128 = /* @__PURE__ */ (() => genShake(0x1f, 168, 128 / 8))();\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256 = /* @__PURE__ */ (() => genShake(0x1f, 136, 256 / 8))();\n//# sourceMappingURL=sha3.js.map","import { keccak_256 } from '@noble/hashes/sha3';\nimport { isHex } from '../data/isHex.js';\nimport { toBytes } from '../encoding/toBytes.js';\nimport { toHex } from '../encoding/toHex.js';\nexport function keccak256(value, to_) {\n    const to = to_ || 'hex';\n    const bytes = keccak_256(isHex(value, { strict: false }) ? toBytes(value) : value);\n    if (to === 'bytes')\n        return bytes;\n    return toHex(bytes);\n}\n//# sourceMappingURL=keccak256.js.map","import { InvalidAddressError } from '../../errors/address.js';\nimport { stringToBytes, } from '../encoding/toBytes.js';\nimport { keccak256 } from '../hash/keccak256.js';\nimport { LruMap } from '../lru.js';\nimport { isAddress } from './isAddress.js';\nconst checksumAddressCache = /*#__PURE__*/ new LruMap(8192);\nexport function checksumAddress(address_, \n/**\n * Warning: EIP-1191 checksum addresses are generally not backwards compatible with the\n * wider Ethereum ecosystem, meaning it will break when validated against an application/tool\n * that relies on EIP-55 checksum encoding (checksum without chainId).\n *\n * It is highly recommended to not use this feature unless you\n * know what you are doing.\n *\n * See more: https://github.com/ethereum/EIPs/issues/1121\n */\nchainId) {\n    if (checksumAddressCache.has(`${address_}.${chainId}`))\n        return checksumAddressCache.get(`${address_}.${chainId}`);\n    const hexAddress = chainId\n        ? `${chainId}${address_.toLowerCase()}`\n        : address_.substring(2).toLowerCase();\n    const hash = keccak256(stringToBytes(hexAddress), 'bytes');\n    const address = (chainId ? hexAddress.substring(`${chainId}0x`.length) : hexAddress).split('');\n    for (let i = 0; i < 40; i += 2) {\n        if (hash[i >> 1] >> 4 >= 8 && address[i]) {\n            address[i] = address[i].toUpperCase();\n        }\n        if ((hash[i >> 1] & 0x0f) >= 8 && address[i + 1]) {\n            address[i + 1] = address[i + 1].toUpperCase();\n        }\n    }\n    const result = `0x${address.join('')}`;\n    checksumAddressCache.set(`${address_}.${chainId}`, result);\n    return result;\n}\nexport function getAddress(address, \n/**\n * Warning: EIP-1191 checksum addresses are generally not backwards compatible with the\n * wider Ethereum ecosystem, meaning it will break when validated against an application/tool\n * that relies on EIP-55 checksum encoding (checksum without chainId).\n *\n * It is highly recommended to not use this feature unless you\n * know what you are doing.\n *\n * See more: https://github.com/ethereum/EIPs/issues/1121\n */\nchainId) {\n    if (!isAddress(address, { strict: false }))\n        throw new InvalidAddressError({ address });\n    return checksumAddress(address, chainId);\n}\n//# sourceMappingURL=getAddress.js.map","import { LruMap } from '../lru.js';\nimport { checksumAddress } from './getAddress.js';\nconst addressRegex = /^0x[a-fA-F0-9]{40}$/;\n/** @internal */\nexport const isAddressCache = /*#__PURE__*/ new LruMap(8192);\nexport function isAddress(address, options) {\n    const { strict = true } = options ?? {};\n    const cacheKey = `${address}.${strict}`;\n    if (isAddressCache.has(cacheKey))\n        return isAddressCache.get(cacheKey);\n    const result = (() => {\n        if (!addressRegex.test(address))\n            return false;\n        if (address.toLowerCase() === address)\n            return true;\n        if (strict)\n            return checksumAddress(address) === address;\n        return true;\n    })();\n    isAddressCache.set(cacheKey, result);\n    return result;\n}\n//# sourceMappingURL=isAddress.js.map","import { SliceOffsetOutOfBoundsError, } from '../../errors/data.js';\nimport { isHex } from './isHex.js';\nimport { size } from './size.js';\n/**\n * @description Returns a section of the hex or byte array given a start/end bytes offset.\n *\n * @param value The hex or byte array to slice.\n * @param start The start offset (in bytes).\n * @param end The end offset (in bytes).\n */\nexport function slice(value, start, end, { strict } = {}) {\n    if (isHex(value, { strict: false }))\n        return sliceHex(value, start, end, {\n            strict,\n        });\n    return sliceBytes(value, start, end, {\n        strict,\n    });\n}\nfunction assertStartOffset(value, start) {\n    if (typeof start === 'number' && start > 0 && start > size(value) - 1)\n        throw new SliceOffsetOutOfBoundsError({\n            offset: start,\n            position: 'start',\n            size: size(value),\n        });\n}\nfunction assertEndOffset(value, start, end) {\n    if (typeof start === 'number' &&\n        typeof end === 'number' &&\n        size(value) !== end - start) {\n        throw new SliceOffsetOutOfBoundsError({\n            offset: end,\n            position: 'end',\n            size: size(value),\n        });\n    }\n}\n/**\n * @description Returns a section of the byte array given a start/end bytes offset.\n *\n * @param value The byte array to slice.\n * @param start The start offset (in bytes).\n * @param end The end offset (in bytes).\n */\nexport function sliceBytes(value_, start, end, { strict } = {}) {\n    assertStartOffset(value_, start);\n    const value = value_.slice(start, end);\n    if (strict)\n        assertEndOffset(value, start, end);\n    return value;\n}\n/**\n * @description Returns a section of the hex value given a start/end bytes offset.\n *\n * @param value The hex value to slice.\n * @param start The start offset (in bytes).\n * @param end The end offset (in bytes).\n */\nexport function sliceHex(value_, start, end, { strict } = {}) {\n    assertStartOffset(value_, start);\n    const value = `0x${value_\n        .replace('0x', '')\n        .slice((start ?? 0) * 2, (end ?? value_.length) * 2)}`;\n    if (strict)\n        assertEndOffset(value, start, end);\n    return value;\n}\n//# sourceMappingURL=slice.js.map","export const arrayRegex = /^(.*)\\[([0-9]*)\\]$/;\n// `bytes<M>`: binary type of `M` bytes, `0 < M <= 32`\n// https://regexr.com/6va55\nexport const bytesRegex = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/;\n// `(u)int<M>`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n// https://regexr.com/6v8hp\nexport const integerRegex = /^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/;\n//# sourceMappingURL=regex.js.map","import { AbiEncodingArrayLengthMismatchError, AbiEncodingBytesSizeMismatchError, AbiEncodingLengthMismatchError, InvalidAbiEncodingTypeError, InvalidArrayError, } from '../../errors/abi.js';\nimport { InvalidAddressError, } from '../../errors/address.js';\nimport { BaseError } from '../../errors/base.js';\nimport { IntegerOutOfRangeError } from '../../errors/encoding.js';\nimport { isAddress } from '../address/isAddress.js';\nimport { concat } from '../data/concat.js';\nimport { padHex } from '../data/pad.js';\nimport { size } from '../data/size.js';\nimport { slice } from '../data/slice.js';\nimport { boolToHex, numberToHex, stringToHex, } from '../encoding/toHex.js';\nimport { integerRegex } from '../regex.js';\n/**\n * @description Encodes a list of primitive values into an ABI-encoded hex value.\n *\n * - Docs: https://viem.sh/docs/abi/encodeAbiParameters#encodeabiparameters\n *\n *   Generates ABI encoded data using the [ABI specification](https://docs.soliditylang.org/en/latest/abi-spec), given a set of ABI parameters (inputs/outputs) and their corresponding values.\n *\n * @param params - a set of ABI Parameters (params), that can be in the shape of the inputs or outputs attribute of an ABI Item.\n * @param values - a set of values (values) that correspond to the given params.\n * @example\n * ```typescript\n * import { encodeAbiParameters } from 'viem'\n *\n * const encodedData = encodeAbiParameters(\n *   [\n *     { name: 'x', type: 'string' },\n *     { name: 'y', type: 'uint' },\n *     { name: 'z', type: 'bool' }\n *   ],\n *   ['wagmi', 420n, true]\n * )\n * ```\n *\n * You can also pass in Human Readable parameters with the parseAbiParameters utility.\n *\n * @example\n * ```typescript\n * import { encodeAbiParameters, parseAbiParameters } from 'viem'\n *\n * const encodedData = encodeAbiParameters(\n *   parseAbiParameters('string x, uint y, bool z'),\n *   ['wagmi', 420n, true]\n * )\n * ```\n */\nexport function encodeAbiParameters(params, values) {\n    if (params.length !== values.length)\n        throw new AbiEncodingLengthMismatchError({\n            expectedLength: params.length,\n            givenLength: values.length,\n        });\n    // Prepare the parameters to determine dynamic types to encode.\n    const preparedParams = prepareParams({\n        params: params,\n        values: values,\n    });\n    const data = encodeParams(preparedParams);\n    if (data.length === 0)\n        return '0x';\n    return data;\n}\nfunction prepareParams({ params, values, }) {\n    const preparedParams = [];\n    for (let i = 0; i < params.length; i++) {\n        preparedParams.push(prepareParam({ param: params[i], value: values[i] }));\n    }\n    return preparedParams;\n}\nfunction prepareParam({ param, value, }) {\n    const arrayComponents = getArrayComponents(param.type);\n    if (arrayComponents) {\n        const [length, type] = arrayComponents;\n        return encodeArray(value, { length, param: { ...param, type } });\n    }\n    if (param.type === 'tuple') {\n        return encodeTuple(value, {\n            param: param,\n        });\n    }\n    if (param.type === 'address') {\n        return encodeAddress(value);\n    }\n    if (param.type === 'bool') {\n        return encodeBool(value);\n    }\n    if (param.type.startsWith('uint') || param.type.startsWith('int')) {\n        const signed = param.type.startsWith('int');\n        const [, , size = '256'] = integerRegex.exec(param.type) ?? [];\n        return encodeNumber(value, {\n            signed,\n            size: Number(size),\n        });\n    }\n    if (param.type.startsWith('bytes')) {\n        return encodeBytes(value, { param });\n    }\n    if (param.type === 'string') {\n        return encodeString(value);\n    }\n    throw new InvalidAbiEncodingTypeError(param.type, {\n        docsPath: '/docs/contract/encodeAbiParameters',\n    });\n}\nfunction encodeParams(preparedParams) {\n    // 1. Compute the size of the static part of the parameters.\n    let staticSize = 0;\n    for (let i = 0; i < preparedParams.length; i++) {\n        const { dynamic, encoded } = preparedParams[i];\n        if (dynamic)\n            staticSize += 32;\n        else\n            staticSize += size(encoded);\n    }\n    // 2. Split the parameters into static and dynamic parts.\n    const staticParams = [];\n    const dynamicParams = [];\n    let dynamicSize = 0;\n    for (let i = 0; i < preparedParams.length; i++) {\n        const { dynamic, encoded } = preparedParams[i];\n        if (dynamic) {\n            staticParams.push(numberToHex(staticSize + dynamicSize, { size: 32 }));\n            dynamicParams.push(encoded);\n            dynamicSize += size(encoded);\n        }\n        else {\n            staticParams.push(encoded);\n        }\n    }\n    // 3. Concatenate static and dynamic parts.\n    return concat([...staticParams, ...dynamicParams]);\n}\nfunction encodeAddress(value) {\n    if (!isAddress(value))\n        throw new InvalidAddressError({ address: value });\n    return { dynamic: false, encoded: padHex(value.toLowerCase()) };\n}\nfunction encodeArray(value, { length, param, }) {\n    const dynamic = length === null;\n    if (!Array.isArray(value))\n        throw new InvalidArrayError(value);\n    if (!dynamic && value.length !== length)\n        throw new AbiEncodingArrayLengthMismatchError({\n            expectedLength: length,\n            givenLength: value.length,\n            type: `${param.type}[${length}]`,\n        });\n    let dynamicChild = false;\n    const preparedParams = [];\n    for (let i = 0; i < value.length; i++) {\n        const preparedParam = prepareParam({ param, value: value[i] });\n        if (preparedParam.dynamic)\n            dynamicChild = true;\n        preparedParams.push(preparedParam);\n    }\n    if (dynamic || dynamicChild) {\n        const data = encodeParams(preparedParams);\n        if (dynamic) {\n            const length = numberToHex(preparedParams.length, { size: 32 });\n            return {\n                dynamic: true,\n                encoded: preparedParams.length > 0 ? concat([length, data]) : length,\n            };\n        }\n        if (dynamicChild)\n            return { dynamic: true, encoded: data };\n    }\n    return {\n        dynamic: false,\n        encoded: concat(preparedParams.map(({ encoded }) => encoded)),\n    };\n}\nfunction encodeBytes(value, { param }) {\n    const [, paramSize] = param.type.split('bytes');\n    const bytesSize = size(value);\n    if (!paramSize) {\n        let value_ = value;\n        // If the size is not divisible by 32 bytes, pad the end\n        // with empty bytes to the ceiling 32 bytes.\n        if (bytesSize % 32 !== 0)\n            value_ = padHex(value_, {\n                dir: 'right',\n                size: Math.ceil((value.length - 2) / 2 / 32) * 32,\n            });\n        return {\n            dynamic: true,\n            encoded: concat([padHex(numberToHex(bytesSize, { size: 32 })), value_]),\n        };\n    }\n    if (bytesSize !== Number.parseInt(paramSize))\n        throw new AbiEncodingBytesSizeMismatchError({\n            expectedSize: Number.parseInt(paramSize),\n            value,\n        });\n    return { dynamic: false, encoded: padHex(value, { dir: 'right' }) };\n}\nfunction encodeBool(value) {\n    if (typeof value !== 'boolean')\n        throw new BaseError(`Invalid boolean value: \"${value}\" (type: ${typeof value}). Expected: \\`true\\` or \\`false\\`.`);\n    return { dynamic: false, encoded: padHex(boolToHex(value)) };\n}\nfunction encodeNumber(value, { signed, size = 256 }) {\n    if (typeof size === 'number') {\n        const max = 2n ** (BigInt(size) - (signed ? 1n : 0n)) - 1n;\n        const min = signed ? -max - 1n : 0n;\n        if (value > max || value < min)\n            throw new IntegerOutOfRangeError({\n                max: max.toString(),\n                min: min.toString(),\n                signed,\n                size: size / 8,\n                value: value.toString(),\n            });\n    }\n    return {\n        dynamic: false,\n        encoded: numberToHex(value, {\n            size: 32,\n            signed,\n        }),\n    };\n}\nfunction encodeString(value) {\n    const hexValue = stringToHex(value);\n    const partsLength = Math.ceil(size(hexValue) / 32);\n    const parts = [];\n    for (let i = 0; i < partsLength; i++) {\n        parts.push(padHex(slice(hexValue, i * 32, (i + 1) * 32), {\n            dir: 'right',\n        }));\n    }\n    return {\n        dynamic: true,\n        encoded: concat([\n            padHex(numberToHex(size(hexValue), { size: 32 })),\n            ...parts,\n        ]),\n    };\n}\nfunction encodeTuple(value, { param }) {\n    let dynamic = false;\n    const preparedParams = [];\n    for (let i = 0; i < param.components.length; i++) {\n        const param_ = param.components[i];\n        const index = Array.isArray(value) ? i : param_.name;\n        const preparedParam = prepareParam({\n            param: param_,\n            value: value[index],\n        });\n        preparedParams.push(preparedParam);\n        if (preparedParam.dynamic)\n            dynamic = true;\n    }\n    return {\n        dynamic,\n        encoded: dynamic\n            ? encodeParams(preparedParams)\n            : concat(preparedParams.map(({ encoded }) => encoded)),\n    };\n}\nexport function getArrayComponents(type) {\n    const matches = type.match(/^(.*)\\[(\\d+)?\\]$/);\n    return matches\n        ? // Return `null` if the array is dynamic.\n            [matches[2] ? Number(matches[2]) : null, matches[1]]\n        : undefined;\n}\n//# sourceMappingURL=encodeAbiParameters.js.map","import { AbiConstructorNotFoundError, AbiConstructorParamsNotFoundError, } from '../../errors/abi.js';\nimport { concatHex } from '../data/concat.js';\nimport { encodeAbiParameters, } from './encodeAbiParameters.js';\nconst docsPath = '/docs/contract/encodeDeployData';\nexport function encodeDeployData(parameters) {\n    const { abi, args, bytecode } = parameters;\n    if (!args || args.length === 0)\n        return bytecode;\n    const description = abi.find((x) => 'type' in x && x.type === 'constructor');\n    if (!description)\n        throw new AbiConstructorNotFoundError({ docsPath });\n    if (!('inputs' in description))\n        throw new AbiConstructorParamsNotFoundError({ docsPath });\n    if (!description.inputs || description.inputs.length === 0)\n        throw new AbiConstructorParamsNotFoundError({ docsPath });\n    const data = encodeAbiParameters(description.inputs, args);\n    return concatHex([bytecode, data]);\n}\n//# sourceMappingURL=encodeDeployData.js.map","export function parseAccount(account) {\n    if (typeof account === 'string')\n        return { address: account, type: 'json-rpc' };\n    return account;\n}\n//# sourceMappingURL=parseAccount.js.map","import { BaseError } from './base.js';\nexport class AccountNotFoundError extends BaseError {\n    constructor({ docsPath } = {}) {\n        super([\n            'Could not find an Account to execute with this Action.',\n            'Please provide an Account with the `account` argument on the Action, or by supplying an `account` to the Client.',\n        ].join('\\n'), {\n            docsPath,\n            docsSlug: 'account',\n            name: 'AccountNotFoundError',\n        });\n    }\n}\nexport class AccountTypeNotSupportedError extends BaseError {\n    constructor({ docsPath, metaMessages, type, }) {\n        super(`Account type \"${type}\" is not supported.`, {\n            docsPath,\n            metaMessages,\n            name: 'AccountTypeNotSupportedError',\n        });\n    }\n}\n//# sourceMappingURL=account.js.map","import { checksumAddress, } from '../../utils/address/getAddress.js';\nimport { keccak256, } from '../../utils/hash/keccak256.js';\n/**\n * @description Converts an ECDSA public key to an address.\n *\n * @param publicKey The public key to convert.\n *\n * @returns The address.\n */\nexport function publicKeyToAddress(publicKey) {\n    const address = keccak256(`0x${publicKey.substring(4)}`).substring(26);\n    return checksumAddress(`0x${address}`);\n}\n//# sourceMappingURL=publicKeyToAddress.js.map","import { isHex } from '../data/isHex.js';\nimport { size } from '../data/size.js';\nimport { hexToBigInt, hexToNumber, } from '../encoding/fromHex.js';\nimport { toHex } from '../encoding/toHex.js';\nexport async function recoverPublicKey({ hash, signature, }) {\n    const hashHex = isHex(hash) ? hash : toHex(hash);\n    const { secp256k1 } = await import('@noble/curves/secp256k1');\n    const signature_ = (() => {\n        // typeof signature: `Signature`\n        if (typeof signature === 'object' && 'r' in signature && 's' in signature) {\n            const { r, s, v, yParity } = signature;\n            const yParityOrV = Number(yParity ?? v);\n            const recoveryBit = toRecoveryBit(yParityOrV);\n            return new secp256k1.Signature(hexToBigInt(r), hexToBigInt(s)).addRecoveryBit(recoveryBit);\n        }\n        // typeof signature: `Hex | ByteArray`\n        const signatureHex = isHex(signature) ? signature : toHex(signature);\n        if (size(signatureHex) !== 65)\n            throw new Error('invalid signature length');\n        const yParityOrV = hexToNumber(`0x${signatureHex.slice(130)}`);\n        const recoveryBit = toRecoveryBit(yParityOrV);\n        return secp256k1.Signature.fromCompact(signatureHex.substring(2, 130)).addRecoveryBit(recoveryBit);\n    })();\n    const publicKey = signature_\n        .recoverPublicKey(hashHex.substring(2))\n        .toHex(false);\n    return `0x${publicKey}`;\n}\nfunction toRecoveryBit(yParityOrV) {\n    if (yParityOrV === 0 || yParityOrV === 1)\n        return yParityOrV;\n    if (yParityOrV === 27)\n        return 0;\n    if (yParityOrV === 28)\n        return 1;\n    throw new Error('Invalid yParityOrV value');\n}\n//# sourceMappingURL=recoverPublicKey.js.map","import { publicKeyToAddress } from '../../accounts/utils/publicKeyToAddress.js';\nimport { recoverPublicKey } from './recoverPublicKey.js';\nexport async function recoverAddress({ hash, signature, }) {\n    return publicKeyToAddress(await recoverPublicKey({ hash, signature }));\n}\n//# sourceMappingURL=recoverAddress.js.map","import { BaseError } from './base.js';\nexport class NegativeOffsetError extends BaseError {\n    constructor({ offset }) {\n        super(`Offset \\`${offset}\\` cannot be negative.`, {\n            name: 'NegativeOffsetError',\n        });\n    }\n}\nexport class PositionOutOfBoundsError extends BaseError {\n    constructor({ length, position }) {\n        super(`Position \\`${position}\\` is out of bounds (\\`0 < position < ${length}\\`).`, { name: 'PositionOutOfBoundsError' });\n    }\n}\nexport class RecursiveReadLimitExceededError extends BaseError {\n    constructor({ count, limit }) {\n        super(`Recursive read limit of \\`${limit}\\` exceeded (recursive read count: \\`${count}\\`).`, { name: 'RecursiveReadLimitExceededError' });\n    }\n}\n//# sourceMappingURL=cursor.js.map","import { NegativeOffsetError, PositionOutOfBoundsError, RecursiveReadLimitExceededError, } from '../errors/cursor.js';\nconst staticCursor = {\n    bytes: new Uint8Array(),\n    dataView: new DataView(new ArrayBuffer(0)),\n    position: 0,\n    positionReadCount: new Map(),\n    recursiveReadCount: 0,\n    recursiveReadLimit: Number.POSITIVE_INFINITY,\n    assertReadLimit() {\n        if (this.recursiveReadCount >= this.recursiveReadLimit)\n            throw new RecursiveReadLimitExceededError({\n                count: this.recursiveReadCount + 1,\n                limit: this.recursiveReadLimit,\n            });\n    },\n    assertPosition(position) {\n        if (position < 0 || position > this.bytes.length - 1)\n            throw new PositionOutOfBoundsError({\n                length: this.bytes.length,\n                position,\n            });\n    },\n    decrementPosition(offset) {\n        if (offset < 0)\n            throw new NegativeOffsetError({ offset });\n        const position = this.position - offset;\n        this.assertPosition(position);\n        this.position = position;\n    },\n    getReadCount(position) {\n        return this.positionReadCount.get(position || this.position) || 0;\n    },\n    incrementPosition(offset) {\n        if (offset < 0)\n            throw new NegativeOffsetError({ offset });\n        const position = this.position + offset;\n        this.assertPosition(position);\n        this.position = position;\n    },\n    inspectByte(position_) {\n        const position = position_ ?? this.position;\n        this.assertPosition(position);\n        return this.bytes[position];\n    },\n    inspectBytes(length, position_) {\n        const position = position_ ?? this.position;\n        this.assertPosition(position + length - 1);\n        return this.bytes.subarray(position, position + length);\n    },\n    inspectUint8(position_) {\n        const position = position_ ?? this.position;\n        this.assertPosition(position);\n        return this.bytes[position];\n    },\n    inspectUint16(position_) {\n        const position = position_ ?? this.position;\n        this.assertPosition(position + 1);\n        return this.dataView.getUint16(position);\n    },\n    inspectUint24(position_) {\n        const position = position_ ?? this.position;\n        this.assertPosition(position + 2);\n        return ((this.dataView.getUint16(position) << 8) +\n            this.dataView.getUint8(position + 2));\n    },\n    inspectUint32(position_) {\n        const position = position_ ?? this.position;\n        this.assertPosition(position + 3);\n        return this.dataView.getUint32(position);\n    },\n    pushByte(byte) {\n        this.assertPosition(this.position);\n        this.bytes[this.position] = byte;\n        this.position++;\n    },\n    pushBytes(bytes) {\n        this.assertPosition(this.position + bytes.length - 1);\n        this.bytes.set(bytes, this.position);\n        this.position += bytes.length;\n    },\n    pushUint8(value) {\n        this.assertPosition(this.position);\n        this.bytes[this.position] = value;\n        this.position++;\n    },\n    pushUint16(value) {\n        this.assertPosition(this.position + 1);\n        this.dataView.setUint16(this.position, value);\n        this.position += 2;\n    },\n    pushUint24(value) {\n        this.assertPosition(this.position + 2);\n        this.dataView.setUint16(this.position, value >> 8);\n        this.dataView.setUint8(this.position + 2, value & ~4294967040);\n        this.position += 3;\n    },\n    pushUint32(value) {\n        this.assertPosition(this.position + 3);\n        this.dataView.setUint32(this.position, value);\n        this.position += 4;\n    },\n    readByte() {\n        this.assertReadLimit();\n        this._touch();\n        const value = this.inspectByte();\n        this.position++;\n        return value;\n    },\n    readBytes(length, size) {\n        this.assertReadLimit();\n        this._touch();\n        const value = this.inspectBytes(length);\n        this.position += size ?? length;\n        return value;\n    },\n    readUint8() {\n        this.assertReadLimit();\n        this._touch();\n        const value = this.inspectUint8();\n        this.position += 1;\n        return value;\n    },\n    readUint16() {\n        this.assertReadLimit();\n        this._touch();\n        const value = this.inspectUint16();\n        this.position += 2;\n        return value;\n    },\n    readUint24() {\n        this.assertReadLimit();\n        this._touch();\n        const value = this.inspectUint24();\n        this.position += 3;\n        return value;\n    },\n    readUint32() {\n        this.assertReadLimit();\n        this._touch();\n        const value = this.inspectUint32();\n        this.position += 4;\n        return value;\n    },\n    get remaining() {\n        return this.bytes.length - this.position;\n    },\n    setPosition(position) {\n        const oldPosition = this.position;\n        this.assertPosition(position);\n        this.position = position;\n        return () => (this.position = oldPosition);\n    },\n    _touch() {\n        if (this.recursiveReadLimit === Number.POSITIVE_INFINITY)\n            return;\n        const count = this.getReadCount();\n        this.positionReadCount.set(this.position, count + 1);\n        if (count > 0)\n            this.recursiveReadCount++;\n    },\n};\nexport function createCursor(bytes, { recursiveReadLimit = 8_192 } = {}) {\n    const cursor = Object.create(staticCursor);\n    cursor.bytes = bytes;\n    cursor.dataView = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n    cursor.positionReadCount = new Map();\n    cursor.recursiveReadLimit = recursiveReadLimit;\n    return cursor;\n}\n//# sourceMappingURL=cursor.js.map","import { BaseError } from '../../errors/base.js';\nimport { createCursor, } from '../cursor.js';\nimport { hexToBytes } from './toBytes.js';\nimport { bytesToHex } from './toHex.js';\nexport function toRlp(bytes, to = 'hex') {\n    const encodable = getEncodable(bytes);\n    const cursor = createCursor(new Uint8Array(encodable.length));\n    encodable.encode(cursor);\n    if (to === 'hex')\n        return bytesToHex(cursor.bytes);\n    return cursor.bytes;\n}\nexport function bytesToRlp(bytes, to = 'bytes') {\n    return toRlp(bytes, to);\n}\nexport function hexToRlp(hex, to = 'hex') {\n    return toRlp(hex, to);\n}\nfunction getEncodable(bytes) {\n    if (Array.isArray(bytes))\n        return getEncodableList(bytes.map((x) => getEncodable(x)));\n    return getEncodableBytes(bytes);\n}\nfunction getEncodableList(list) {\n    const bodyLength = list.reduce((acc, x) => acc + x.length, 0);\n    const sizeOfBodyLength = getSizeOfLength(bodyLength);\n    const length = (() => {\n        if (bodyLength <= 55)\n            return 1 + bodyLength;\n        return 1 + sizeOfBodyLength + bodyLength;\n    })();\n    return {\n        length,\n        encode(cursor) {\n            if (bodyLength <= 55) {\n                cursor.pushByte(0xc0 + bodyLength);\n            }\n            else {\n                cursor.pushByte(0xc0 + 55 + sizeOfBodyLength);\n                if (sizeOfBodyLength === 1)\n                    cursor.pushUint8(bodyLength);\n                else if (sizeOfBodyLength === 2)\n                    cursor.pushUint16(bodyLength);\n                else if (sizeOfBodyLength === 3)\n                    cursor.pushUint24(bodyLength);\n                else\n                    cursor.pushUint32(bodyLength);\n            }\n            for (const { encode } of list) {\n                encode(cursor);\n            }\n        },\n    };\n}\nfunction getEncodableBytes(bytesOrHex) {\n    const bytes = typeof bytesOrHex === 'string' ? hexToBytes(bytesOrHex) : bytesOrHex;\n    const sizeOfBytesLength = getSizeOfLength(bytes.length);\n    const length = (() => {\n        if (bytes.length === 1 && bytes[0] < 0x80)\n            return 1;\n        if (bytes.length <= 55)\n            return 1 + bytes.length;\n        return 1 + sizeOfBytesLength + bytes.length;\n    })();\n    return {\n        length,\n        encode(cursor) {\n            if (bytes.length === 1 && bytes[0] < 0x80) {\n                cursor.pushBytes(bytes);\n            }\n            else if (bytes.length <= 55) {\n                cursor.pushByte(0x80 + bytes.length);\n                cursor.pushBytes(bytes);\n            }\n            else {\n                cursor.pushByte(0x80 + 55 + sizeOfBytesLength);\n                if (sizeOfBytesLength === 1)\n                    cursor.pushUint8(bytes.length);\n                else if (sizeOfBytesLength === 2)\n                    cursor.pushUint16(bytes.length);\n                else if (sizeOfBytesLength === 3)\n                    cursor.pushUint24(bytes.length);\n                else\n                    cursor.pushUint32(bytes.length);\n                cursor.pushBytes(bytes);\n            }\n        },\n    };\n}\nfunction getSizeOfLength(length) {\n    if (length < 2 ** 8)\n        return 1;\n    if (length < 2 ** 16)\n        return 2;\n    if (length < 2 ** 24)\n        return 3;\n    if (length < 2 ** 32)\n        return 4;\n    throw new BaseError('Length is too large.');\n}\n//# sourceMappingURL=toRlp.js.map","import { concatHex } from '../data/concat.js';\nimport { hexToBytes } from '../encoding/toBytes.js';\nimport { numberToHex } from '../encoding/toHex.js';\nimport { toRlp } from '../encoding/toRlp.js';\nimport { keccak256 } from '../hash/keccak256.js';\n/**\n * Computes an Authorization hash in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n */\nexport function hashAuthorization(parameters) {\n    const { chainId, nonce, to } = parameters;\n    const address = parameters.contractAddress ?? parameters.address;\n    const hash = keccak256(concatHex([\n        '0x05',\n        toRlp([\n            chainId ? numberToHex(chainId) : '0x',\n            address,\n            nonce ? numberToHex(nonce) : '0x',\n        ]),\n    ]));\n    if (to === 'bytes')\n        return hexToBytes(hash);\n    return hash;\n}\n//# sourceMappingURL=hashAuthorization.js.map","import { recoverAddress, } from '../signature/recoverAddress.js';\nimport { hashAuthorization, } from './hashAuthorization.js';\nexport async function recoverAuthorizationAddress(parameters) {\n    const { authorization, signature } = parameters;\n    return recoverAddress({\n        hash: hashAuthorization(authorization),\n        signature: (signature ?? authorization),\n    });\n}\n//# sourceMappingURL=recoverAuthorizationAddress.js.map","import { BaseError } from './base.js';\nexport class ChainDoesNotSupportContract extends BaseError {\n    constructor({ blockNumber, chain, contract, }) {\n        super(`Chain \"${chain.name}\" does not support contract \"${contract.name}\".`, {\n            metaMessages: [\n                'This could be due to any of the following:',\n                ...(blockNumber &&\n                    contract.blockCreated &&\n                    contract.blockCreated > blockNumber\n                    ? [\n                        `- The contract \"${contract.name}\" was not deployed until block ${contract.blockCreated} (current block ${blockNumber}).`,\n                    ]\n                    : [\n                        `- The chain does not have the contract \"${contract.name}\" configured.`,\n                    ]),\n            ],\n            name: 'ChainDoesNotSupportContract',\n        });\n    }\n}\nexport class ChainMismatchError extends BaseError {\n    constructor({ chain, currentChainId, }) {\n        super(`The current chain of the wallet (id: ${currentChainId}) does not match the target chain for the transaction (id: ${chain.id} – ${chain.name}).`, {\n            metaMessages: [\n                `Current Chain ID:  ${currentChainId}`,\n                `Expected Chain ID: ${chain.id} – ${chain.name}`,\n            ],\n            name: 'ChainMismatchError',\n        });\n    }\n}\nexport class ChainNotFoundError extends BaseError {\n    constructor() {\n        super([\n            'No chain was provided to the request.',\n            'Please provide a chain with the `chain` argument on the Action, or by supplying a `chain` to WalletClient.',\n        ].join('\\n'), {\n            name: 'ChainNotFoundError',\n        });\n    }\n}\nexport class ClientChainNotConfiguredError extends BaseError {\n    constructor() {\n        super('No chain was provided to the Client.', {\n            name: 'ClientChainNotConfiguredError',\n        });\n    }\n}\nexport class InvalidChainIdError extends BaseError {\n    constructor({ chainId }) {\n        super(typeof chainId === 'number'\n            ? `Chain ID \"${chainId}\" is invalid.`\n            : 'Chain ID is invalid.', { name: 'InvalidChainIdError' });\n    }\n}\n//# sourceMappingURL=chain.js.map","import { ChainMismatchError, ChainNotFoundError, } from '../../errors/chain.js';\nexport function assertCurrentChain({ chain, currentChainId, }) {\n    if (!chain)\n        throw new ChainNotFoundError();\n    if (currentChainId !== chain.id)\n        throw new ChainMismatchError({ chain, currentChainId });\n}\n//# sourceMappingURL=assertCurrentChain.js.map","export const etherUnits = {\n    gwei: 9,\n    wei: 18,\n};\nexport const gweiUnits = {\n    ether: -9,\n    wei: 9,\n};\nexport const weiUnits = {\n    ether: -18,\n    gwei: -9,\n};\n//# sourceMappingURL=unit.js.map","/**\n *  Divides a number by a given exponent of base 10 (10exponent), and formats it into a string representation of the number..\n *\n * - Docs: https://viem.sh/docs/utilities/formatUnits\n *\n * @example\n * import { formatUnits } from 'viem'\n *\n * formatUnits(420000000000n, 9)\n * // '420'\n */\nexport function formatUnits(value, decimals) {\n    let display = value.toString();\n    const negative = display.startsWith('-');\n    if (negative)\n        display = display.slice(1);\n    display = display.padStart(decimals, '0');\n    let [integer, fraction] = [\n        display.slice(0, display.length - decimals),\n        display.slice(display.length - decimals),\n    ];\n    fraction = fraction.replace(/(0+)$/, '');\n    return `${negative ? '-' : ''}${integer || '0'}${fraction ? `.${fraction}` : ''}`;\n}\n//# sourceMappingURL=formatUnits.js.map","import { gweiUnits } from '../../constants/unit.js';\nimport { formatUnits } from './formatUnits.js';\n/**\n * Converts numerical wei to a string representation of gwei.\n *\n * - Docs: https://viem.sh/docs/utilities/formatGwei\n *\n * @example\n * import { formatGwei } from 'viem'\n *\n * formatGwei(1000000000n)\n * // '1'\n */\nexport function formatGwei(wei, unit = 'wei') {\n    return formatUnits(wei, gweiUnits[unit]);\n}\n//# sourceMappingURL=formatGwei.js.map","import { formatGwei } from '../utils/unit/formatGwei.js';\nimport { BaseError } from './base.js';\nexport class ExecutionRevertedError extends BaseError {\n    constructor({ cause, message, } = {}) {\n        const reason = message\n            ?.replace('execution reverted: ', '')\n            ?.replace('execution reverted', '');\n        super(`Execution reverted ${reason ? `with reason: ${reason}` : 'for an unknown reason'}.`, {\n            cause,\n            name: 'ExecutionRevertedError',\n        });\n    }\n}\nObject.defineProperty(ExecutionRevertedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 3\n});\nObject.defineProperty(ExecutionRevertedError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /execution reverted/\n});\nexport class FeeCapTooHighError extends BaseError {\n    constructor({ cause, maxFeePerGas, } = {}) {\n        super(`The fee cap (\\`maxFeePerGas\\`${maxFeePerGas ? ` = ${formatGwei(maxFeePerGas)} gwei` : ''}) cannot be higher than the maximum allowed value (2^256-1).`, {\n            cause,\n            name: 'FeeCapTooHighError',\n        });\n    }\n}\nObject.defineProperty(FeeCapTooHighError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /max fee per gas higher than 2\\^256-1|fee cap higher than 2\\^256-1/\n});\nexport class FeeCapTooLowError extends BaseError {\n    constructor({ cause, maxFeePerGas, } = {}) {\n        super(`The fee cap (\\`maxFeePerGas\\`${maxFeePerGas ? ` = ${formatGwei(maxFeePerGas)}` : ''} gwei) cannot be lower than the block base fee.`, {\n            cause,\n            name: 'FeeCapTooLowError',\n        });\n    }\n}\nObject.defineProperty(FeeCapTooLowError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /max fee per gas less than block base fee|fee cap less than block base fee|transaction is outdated/\n});\nexport class NonceTooHighError extends BaseError {\n    constructor({ cause, nonce, } = {}) {\n        super(`Nonce provided for the transaction ${nonce ? `(${nonce}) ` : ''}is higher than the next one expected.`, { cause, name: 'NonceTooHighError' });\n    }\n}\nObject.defineProperty(NonceTooHighError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /nonce too high/\n});\nexport class NonceTooLowError extends BaseError {\n    constructor({ cause, nonce, } = {}) {\n        super([\n            `Nonce provided for the transaction ${nonce ? `(${nonce}) ` : ''}is lower than the current nonce of the account.`,\n            'Try increasing the nonce or find the latest nonce with `getTransactionCount`.',\n        ].join('\\n'), { cause, name: 'NonceTooLowError' });\n    }\n}\nObject.defineProperty(NonceTooLowError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /nonce too low|transaction already imported|already known/\n});\nexport class NonceMaxValueError extends BaseError {\n    constructor({ cause, nonce, } = {}) {\n        super(`Nonce provided for the transaction ${nonce ? `(${nonce}) ` : ''}exceeds the maximum allowed nonce.`, { cause, name: 'NonceMaxValueError' });\n    }\n}\nObject.defineProperty(NonceMaxValueError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /nonce has max value/\n});\nexport class InsufficientFundsError extends BaseError {\n    constructor({ cause } = {}) {\n        super([\n            'The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.',\n        ].join('\\n'), {\n            cause,\n            metaMessages: [\n                'This error could arise when the account does not have enough funds to:',\n                ' - pay for the total gas fee,',\n                ' - pay for the value to send.',\n                ' ',\n                'The cost of the transaction is calculated as `gas * gas fee + value`, where:',\n                ' - `gas` is the amount of gas needed for transaction to execute,',\n                ' - `gas fee` is the gas fee,',\n                ' - `value` is the amount of ether to send to the recipient.',\n            ],\n            name: 'InsufficientFundsError',\n        });\n    }\n}\nObject.defineProperty(InsufficientFundsError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /insufficient funds|exceeds transaction sender account balance/\n});\nexport class IntrinsicGasTooHighError extends BaseError {\n    constructor({ cause, gas, } = {}) {\n        super(`The amount of gas ${gas ? `(${gas}) ` : ''}provided for the transaction exceeds the limit allowed for the block.`, {\n            cause,\n            name: 'IntrinsicGasTooHighError',\n        });\n    }\n}\nObject.defineProperty(IntrinsicGasTooHighError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /intrinsic gas too high|gas limit reached/\n});\nexport class IntrinsicGasTooLowError extends BaseError {\n    constructor({ cause, gas, } = {}) {\n        super(`The amount of gas ${gas ? `(${gas}) ` : ''}provided for the transaction is too low.`, {\n            cause,\n            name: 'IntrinsicGasTooLowError',\n        });\n    }\n}\nObject.defineProperty(IntrinsicGasTooLowError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /intrinsic gas too low/\n});\nexport class TransactionTypeNotSupportedError extends BaseError {\n    constructor({ cause }) {\n        super('The transaction type is not supported for this chain.', {\n            cause,\n            name: 'TransactionTypeNotSupportedError',\n        });\n    }\n}\nObject.defineProperty(TransactionTypeNotSupportedError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /transaction type not valid/\n});\nexport class TipAboveFeeCapError extends BaseError {\n    constructor({ cause, maxPriorityFeePerGas, maxFeePerGas, } = {}) {\n        super([\n            `The provided tip (\\`maxPriorityFeePerGas\\`${maxPriorityFeePerGas\n                ? ` = ${formatGwei(maxPriorityFeePerGas)} gwei`\n                : ''}) cannot be higher than the fee cap (\\`maxFeePerGas\\`${maxFeePerGas ? ` = ${formatGwei(maxFeePerGas)} gwei` : ''}).`,\n        ].join('\\n'), {\n            cause,\n            name: 'TipAboveFeeCapError',\n        });\n    }\n}\nObject.defineProperty(TipAboveFeeCapError, \"nodeMessage\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: /max priority fee per gas higher than max fee per gas|tip higher than fee cap/\n});\nexport class UnknownNodeError extends BaseError {\n    constructor({ cause }) {\n        super(`An error occurred while executing: ${cause?.shortMessage}`, {\n            cause,\n            name: 'UnknownNodeError',\n        });\n    }\n}\n//# sourceMappingURL=node.js.map","import { etherUnits } from '../../constants/unit.js';\nimport { formatUnits } from './formatUnits.js';\n/**\n * Converts numerical wei to a string representation of ether.\n *\n * - Docs: https://viem.sh/docs/utilities/formatEther\n *\n * @example\n * import { formatEther } from 'viem'\n *\n * formatEther(1000000000000000000n)\n * // '1'\n */\nexport function formatEther(wei, unit = 'wei') {\n    return formatUnits(wei, etherUnits[unit]);\n}\n//# sourceMappingURL=formatEther.js.map","import { formatEther } from '../utils/unit/formatEther.js';\nimport { formatGwei } from '../utils/unit/formatGwei.js';\nimport { BaseError } from './base.js';\nexport function prettyPrint(args) {\n    const entries = Object.entries(args)\n        .map(([key, value]) => {\n        if (value === undefined || value === false)\n            return null;\n        return [key, value];\n    })\n        .filter(Boolean);\n    const maxLength = entries.reduce((acc, [key]) => Math.max(acc, key.length), 0);\n    return entries\n        .map(([key, value]) => `  ${`${key}:`.padEnd(maxLength + 1)}  ${value}`)\n        .join('\\n');\n}\nexport class FeeConflictError extends BaseError {\n    constructor() {\n        super([\n            'Cannot specify both a `gasPrice` and a `maxFeePerGas`/`maxPriorityFeePerGas`.',\n            'Use `maxFeePerGas`/`maxPriorityFeePerGas` for EIP-1559 compatible networks, and `gasPrice` for others.',\n        ].join('\\n'), { name: 'FeeConflictError' });\n    }\n}\nexport class InvalidLegacyVError extends BaseError {\n    constructor({ v }) {\n        super(`Invalid \\`v\\` value \"${v}\". Expected 27 or 28.`, {\n            name: 'InvalidLegacyVError',\n        });\n    }\n}\nexport class InvalidSerializableTransactionError extends BaseError {\n    constructor({ transaction }) {\n        super('Cannot infer a transaction type from provided transaction.', {\n            metaMessages: [\n                'Provided Transaction:',\n                '{',\n                prettyPrint(transaction),\n                '}',\n                '',\n                'To infer the type, either provide:',\n                '- a `type` to the Transaction, or',\n                '- an EIP-1559 Transaction with `maxFeePerGas`, or',\n                '- an EIP-2930 Transaction with `gasPrice` & `accessList`, or',\n                '- an EIP-4844 Transaction with `blobs`, `blobVersionedHashes`, `sidecars`, or',\n                '- an EIP-7702 Transaction with `authorizationList`, or',\n                '- a Legacy Transaction with `gasPrice`',\n            ],\n            name: 'InvalidSerializableTransactionError',\n        });\n    }\n}\nexport class InvalidSerializedTransactionTypeError extends BaseError {\n    constructor({ serializedType }) {\n        super(`Serialized transaction type \"${serializedType}\" is invalid.`, {\n            name: 'InvalidSerializedTransactionType',\n        });\n        Object.defineProperty(this, \"serializedType\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.serializedType = serializedType;\n    }\n}\nexport class InvalidSerializedTransactionError extends BaseError {\n    constructor({ attributes, serializedTransaction, type, }) {\n        const missing = Object.entries(attributes)\n            .map(([key, value]) => (typeof value === 'undefined' ? key : undefined))\n            .filter(Boolean);\n        super(`Invalid serialized transaction of type \"${type}\" was provided.`, {\n            metaMessages: [\n                `Serialized Transaction: \"${serializedTransaction}\"`,\n                missing.length > 0 ? `Missing Attributes: ${missing.join(', ')}` : '',\n            ].filter(Boolean),\n            name: 'InvalidSerializedTransactionError',\n        });\n        Object.defineProperty(this, \"serializedTransaction\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"type\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.serializedTransaction = serializedTransaction;\n        this.type = type;\n    }\n}\nexport class InvalidStorageKeySizeError extends BaseError {\n    constructor({ storageKey }) {\n        super(`Size for storage key \"${storageKey}\" is invalid. Expected 32 bytes. Got ${Math.floor((storageKey.length - 2) / 2)} bytes.`, { name: 'InvalidStorageKeySizeError' });\n    }\n}\nexport class TransactionExecutionError extends BaseError {\n    constructor(cause, { account, docsPath, chain, data, gas, gasPrice, maxFeePerGas, maxPriorityFeePerGas, nonce, to, value, }) {\n        const prettyArgs = prettyPrint({\n            chain: chain && `${chain?.name} (id: ${chain?.id})`,\n            from: account?.address,\n            to,\n            value: typeof value !== 'undefined' &&\n                `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n            data,\n            gas,\n            gasPrice: typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n            maxFeePerGas: typeof maxFeePerGas !== 'undefined' &&\n                `${formatGwei(maxFeePerGas)} gwei`,\n            maxPriorityFeePerGas: typeof maxPriorityFeePerGas !== 'undefined' &&\n                `${formatGwei(maxPriorityFeePerGas)} gwei`,\n            nonce,\n        });\n        super(cause.shortMessage, {\n            cause,\n            docsPath,\n            metaMessages: [\n                ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n                'Request Arguments:',\n                prettyArgs,\n            ].filter(Boolean),\n            name: 'TransactionExecutionError',\n        });\n        Object.defineProperty(this, \"cause\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.cause = cause;\n    }\n}\nexport class TransactionNotFoundError extends BaseError {\n    constructor({ blockHash, blockNumber, blockTag, hash, index, }) {\n        let identifier = 'Transaction';\n        if (blockTag && index !== undefined)\n            identifier = `Transaction at block time \"${blockTag}\" at index \"${index}\"`;\n        if (blockHash && index !== undefined)\n            identifier = `Transaction at block hash \"${blockHash}\" at index \"${index}\"`;\n        if (blockNumber && index !== undefined)\n            identifier = `Transaction at block number \"${blockNumber}\" at index \"${index}\"`;\n        if (hash)\n            identifier = `Transaction with hash \"${hash}\"`;\n        super(`${identifier} could not be found.`, {\n            name: 'TransactionNotFoundError',\n        });\n    }\n}\nexport class TransactionReceiptNotFoundError extends BaseError {\n    constructor({ hash }) {\n        super(`Transaction receipt with hash \"${hash}\" could not be found. The Transaction may not be processed on a block yet.`, {\n            name: 'TransactionReceiptNotFoundError',\n        });\n    }\n}\nexport class WaitForTransactionReceiptTimeoutError extends BaseError {\n    constructor({ hash }) {\n        super(`Timed out while waiting for transaction with hash \"${hash}\" to be confirmed.`, { name: 'WaitForTransactionReceiptTimeoutError' });\n    }\n}\n//# sourceMappingURL=transaction.js.map","export const stringify = (value, replacer, space) => JSON.stringify(value, (key, value_) => {\n    const value = typeof value_ === 'bigint' ? value_.toString() : value_;\n    return typeof replacer === 'function' ? replacer(key, value) : value;\n}, space);\n//# sourceMappingURL=stringify.js.map","export const getContractAddress = (address) => address;\nexport const getUrl = (url) => url;\n//# sourceMappingURL=utils.js.map","import { stringify } from '../utils/stringify.js';\nimport { BaseError } from './base.js';\nimport { getUrl } from './utils.js';\nexport class HttpRequestError extends BaseError {\n    constructor({ body, cause, details, headers, status, url, }) {\n        super('HTTP request failed.', {\n            cause,\n            details,\n            metaMessages: [\n                status && `Status: ${status}`,\n                `URL: ${getUrl(url)}`,\n                body && `Request body: ${stringify(body)}`,\n            ].filter(Boolean),\n            name: 'HttpRequestError',\n        });\n        Object.defineProperty(this, \"body\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"headers\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"status\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"url\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.body = body;\n        this.headers = headers;\n        this.status = status;\n        this.url = url;\n    }\n}\nexport class WebSocketRequestError extends BaseError {\n    constructor({ body, cause, details, url, }) {\n        super('WebSocket request failed.', {\n            cause,\n            details,\n            metaMessages: [\n                `URL: ${getUrl(url)}`,\n                body && `Request body: ${stringify(body)}`,\n            ].filter(Boolean),\n            name: 'WebSocketRequestError',\n        });\n    }\n}\nexport class RpcRequestError extends BaseError {\n    constructor({ body, error, url, }) {\n        super('RPC Request failed.', {\n            cause: error,\n            details: error.message,\n            metaMessages: [`URL: ${getUrl(url)}`, `Request body: ${stringify(body)}`],\n            name: 'RpcRequestError',\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"data\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.code = error.code;\n        this.data = error.data;\n    }\n}\nexport class SocketClosedError extends BaseError {\n    constructor({ url, } = {}) {\n        super('The socket has been closed.', {\n            metaMessages: [url && `URL: ${getUrl(url)}`].filter(Boolean),\n            name: 'SocketClosedError',\n        });\n    }\n}\nexport class TimeoutError extends BaseError {\n    constructor({ body, url, }) {\n        super('The request took too long to respond.', {\n            details: 'The request timed out.',\n            metaMessages: [`URL: ${getUrl(url)}`, `Request body: ${stringify(body)}`],\n            name: 'TimeoutError',\n        });\n    }\n}\n//# sourceMappingURL=request.js.map","import { BaseError } from './base.js';\nimport { RpcRequestError } from './request.js';\nconst unknownErrorCode = -1;\nexport class RpcError extends BaseError {\n    constructor(cause, { code, docsPath, metaMessages, name, shortMessage, }) {\n        super(shortMessage, {\n            cause,\n            docsPath,\n            metaMessages: metaMessages || cause?.metaMessages,\n            name: name || 'RpcError',\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.name = name || cause.name;\n        this.code = (cause instanceof RpcRequestError ? cause.code : (code ?? unknownErrorCode));\n    }\n}\nexport class ProviderRpcError extends RpcError {\n    constructor(cause, options) {\n        super(cause, options);\n        Object.defineProperty(this, \"data\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.data = options.data;\n    }\n}\nexport class ParseRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: ParseRpcError.code,\n            name: 'ParseRpcError',\n            shortMessage: 'Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text.',\n        });\n    }\n}\nObject.defineProperty(ParseRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32700\n});\nexport class InvalidRequestRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: InvalidRequestRpcError.code,\n            name: 'InvalidRequestRpcError',\n            shortMessage: 'JSON is not a valid request object.',\n        });\n    }\n}\nObject.defineProperty(InvalidRequestRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32600\n});\nexport class MethodNotFoundRpcError extends RpcError {\n    constructor(cause, { method } = {}) {\n        super(cause, {\n            code: MethodNotFoundRpcError.code,\n            name: 'MethodNotFoundRpcError',\n            shortMessage: `The method${method ? ` \"${method}\"` : ''} does not exist / is not available.`,\n        });\n    }\n}\nObject.defineProperty(MethodNotFoundRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32601\n});\nexport class InvalidParamsRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: InvalidParamsRpcError.code,\n            name: 'InvalidParamsRpcError',\n            shortMessage: [\n                'Invalid parameters were provided to the RPC method.',\n                'Double check you have provided the correct parameters.',\n            ].join('\\n'),\n        });\n    }\n}\nObject.defineProperty(InvalidParamsRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32602\n});\nexport class InternalRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: InternalRpcError.code,\n            name: 'InternalRpcError',\n            shortMessage: 'An internal error was received.',\n        });\n    }\n}\nObject.defineProperty(InternalRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32603\n});\nexport class InvalidInputRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: InvalidInputRpcError.code,\n            name: 'InvalidInputRpcError',\n            shortMessage: [\n                'Missing or invalid parameters.',\n                'Double check you have provided the correct parameters.',\n            ].join('\\n'),\n        });\n    }\n}\nObject.defineProperty(InvalidInputRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32000\n});\nexport class ResourceNotFoundRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: ResourceNotFoundRpcError.code,\n            name: 'ResourceNotFoundRpcError',\n            shortMessage: 'Requested resource not found.',\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ResourceNotFoundRpcError'\n        });\n    }\n}\nObject.defineProperty(ResourceNotFoundRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32001\n});\nexport class ResourceUnavailableRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: ResourceUnavailableRpcError.code,\n            name: 'ResourceUnavailableRpcError',\n            shortMessage: 'Requested resource not available.',\n        });\n    }\n}\nObject.defineProperty(ResourceUnavailableRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32002\n});\nexport class TransactionRejectedRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: TransactionRejectedRpcError.code,\n            name: 'TransactionRejectedRpcError',\n            shortMessage: 'Transaction creation failed.',\n        });\n    }\n}\nObject.defineProperty(TransactionRejectedRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32003\n});\nexport class MethodNotSupportedRpcError extends RpcError {\n    constructor(cause, { method } = {}) {\n        super(cause, {\n            code: MethodNotSupportedRpcError.code,\n            name: 'MethodNotSupportedRpcError',\n            shortMessage: `Method${method ? ` \"${method}\"` : ''} is not supported.`,\n        });\n    }\n}\nObject.defineProperty(MethodNotSupportedRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32004\n});\nexport class LimitExceededRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: LimitExceededRpcError.code,\n            name: 'LimitExceededRpcError',\n            shortMessage: 'Request exceeds defined limit.',\n        });\n    }\n}\nObject.defineProperty(LimitExceededRpcError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32005\n});\nexport class JsonRpcVersionUnsupportedError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            code: JsonRpcVersionUnsupportedError.code,\n            name: 'JsonRpcVersionUnsupportedError',\n            shortMessage: 'Version of JSON-RPC protocol is not supported.',\n        });\n    }\n}\nObject.defineProperty(JsonRpcVersionUnsupportedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32006\n});\nexport class UserRejectedRequestError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: UserRejectedRequestError.code,\n            name: 'UserRejectedRequestError',\n            shortMessage: 'User rejected the request.',\n        });\n    }\n}\nObject.defineProperty(UserRejectedRequestError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4001\n});\nexport class UnauthorizedProviderError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: UnauthorizedProviderError.code,\n            name: 'UnauthorizedProviderError',\n            shortMessage: 'The requested method and/or account has not been authorized by the user.',\n        });\n    }\n}\nObject.defineProperty(UnauthorizedProviderError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4100\n});\nexport class UnsupportedProviderMethodError extends ProviderRpcError {\n    constructor(cause, { method } = {}) {\n        super(cause, {\n            code: UnsupportedProviderMethodError.code,\n            name: 'UnsupportedProviderMethodError',\n            shortMessage: `The Provider does not support the requested method${method ? ` \" ${method}\"` : ''}.`,\n        });\n    }\n}\nObject.defineProperty(UnsupportedProviderMethodError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4200\n});\nexport class ProviderDisconnectedError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: ProviderDisconnectedError.code,\n            name: 'ProviderDisconnectedError',\n            shortMessage: 'The Provider is disconnected from all chains.',\n        });\n    }\n}\nObject.defineProperty(ProviderDisconnectedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4900\n});\nexport class ChainDisconnectedError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: ChainDisconnectedError.code,\n            name: 'ChainDisconnectedError',\n            shortMessage: 'The Provider is not connected to the requested chain.',\n        });\n    }\n}\nObject.defineProperty(ChainDisconnectedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4901\n});\nexport class SwitchChainError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: SwitchChainError.code,\n            name: 'SwitchChainError',\n            shortMessage: 'An error occurred when attempting to switch chain.',\n        });\n    }\n}\nObject.defineProperty(SwitchChainError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4902\n});\nexport class UnsupportedNonOptionalCapabilityError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: UnsupportedNonOptionalCapabilityError.code,\n            name: 'UnsupportedNonOptionalCapabilityError',\n            shortMessage: 'This Wallet does not support a capability that was not marked as optional.',\n        });\n    }\n}\nObject.defineProperty(UnsupportedNonOptionalCapabilityError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 5700\n});\nexport class UnsupportedChainIdError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: UnsupportedChainIdError.code,\n            name: 'UnsupportedChainIdError',\n            shortMessage: 'This Wallet does not support the requested chain ID.',\n        });\n    }\n}\nObject.defineProperty(UnsupportedChainIdError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 5710\n});\nexport class DuplicateIdError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: DuplicateIdError.code,\n            name: 'DuplicateIdError',\n            shortMessage: 'There is already a bundle submitted with this ID.',\n        });\n    }\n}\nObject.defineProperty(DuplicateIdError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 5720\n});\nexport class UnknownBundleIdError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: UnknownBundleIdError.code,\n            name: 'UnknownBundleIdError',\n            shortMessage: 'This bundle id is unknown / has not been submitted',\n        });\n    }\n}\nObject.defineProperty(UnknownBundleIdError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 5730\n});\nexport class BundleTooLargeError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: BundleTooLargeError.code,\n            name: 'BundleTooLargeError',\n            shortMessage: 'The call bundle is too large for the Wallet to process.',\n        });\n    }\n}\nObject.defineProperty(BundleTooLargeError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 5740\n});\nexport class AtomicReadyWalletRejectedUpgradeError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: AtomicReadyWalletRejectedUpgradeError.code,\n            name: 'AtomicReadyWalletRejectedUpgradeError',\n            shortMessage: 'The Wallet can support atomicity after an upgrade, but the user rejected the upgrade.',\n        });\n    }\n}\nObject.defineProperty(AtomicReadyWalletRejectedUpgradeError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 5750\n});\nexport class AtomicityNotSupportedError extends ProviderRpcError {\n    constructor(cause) {\n        super(cause, {\n            code: AtomicityNotSupportedError.code,\n            name: 'AtomicityNotSupportedError',\n            shortMessage: 'The wallet does not support atomic execution but the request requires it.',\n        });\n    }\n}\nObject.defineProperty(AtomicityNotSupportedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 5760\n});\nexport class UnknownRpcError extends RpcError {\n    constructor(cause) {\n        super(cause, {\n            name: 'UnknownRpcError',\n            shortMessage: 'An unknown RPC error occurred.',\n        });\n    }\n}\n//# sourceMappingURL=rpc.js.map","import { BaseError } from '../../errors/base.js';\nimport { ExecutionRevertedError, FeeCapTooHighError, FeeCapTooLowError, InsufficientFundsError, IntrinsicGasTooHighError, IntrinsicGasTooLowError, NonceMaxValueError, NonceTooHighError, NonceTooLowError, TipAboveFeeCapError, TransactionTypeNotSupportedError, UnknownNodeError, } from '../../errors/node.js';\nimport { RpcRequestError } from '../../errors/request.js';\nimport { InvalidInputRpcError, TransactionRejectedRpcError, } from '../../errors/rpc.js';\nexport function containsNodeError(err) {\n    return (err instanceof TransactionRejectedRpcError ||\n        err instanceof InvalidInputRpcError ||\n        (err instanceof RpcRequestError && err.code === ExecutionRevertedError.code));\n}\nexport function getNodeError(err, args) {\n    const message = (err.details || '').toLowerCase();\n    const executionRevertedError = err instanceof BaseError\n        ? err.walk((e) => e?.code ===\n            ExecutionRevertedError.code)\n        : err;\n    if (executionRevertedError instanceof BaseError)\n        return new ExecutionRevertedError({\n            cause: err,\n            message: executionRevertedError.details,\n        });\n    if (ExecutionRevertedError.nodeMessage.test(message))\n        return new ExecutionRevertedError({\n            cause: err,\n            message: err.details,\n        });\n    if (FeeCapTooHighError.nodeMessage.test(message))\n        return new FeeCapTooHighError({\n            cause: err,\n            maxFeePerGas: args?.maxFeePerGas,\n        });\n    if (FeeCapTooLowError.nodeMessage.test(message))\n        return new FeeCapTooLowError({\n            cause: err,\n            maxFeePerGas: args?.maxFeePerGas,\n        });\n    if (NonceTooHighError.nodeMessage.test(message))\n        return new NonceTooHighError({ cause: err, nonce: args?.nonce });\n    if (NonceTooLowError.nodeMessage.test(message))\n        return new NonceTooLowError({ cause: err, nonce: args?.nonce });\n    if (NonceMaxValueError.nodeMessage.test(message))\n        return new NonceMaxValueError({ cause: err, nonce: args?.nonce });\n    if (InsufficientFundsError.nodeMessage.test(message))\n        return new InsufficientFundsError({ cause: err });\n    if (IntrinsicGasTooHighError.nodeMessage.test(message))\n        return new IntrinsicGasTooHighError({ cause: err, gas: args?.gas });\n    if (IntrinsicGasTooLowError.nodeMessage.test(message))\n        return new IntrinsicGasTooLowError({ cause: err, gas: args?.gas });\n    if (TransactionTypeNotSupportedError.nodeMessage.test(message))\n        return new TransactionTypeNotSupportedError({ cause: err });\n    if (TipAboveFeeCapError.nodeMessage.test(message))\n        return new TipAboveFeeCapError({\n            cause: err,\n            maxFeePerGas: args?.maxFeePerGas,\n            maxPriorityFeePerGas: args?.maxPriorityFeePerGas,\n        });\n    return new UnknownNodeError({\n        cause: err,\n    });\n}\n//# sourceMappingURL=getNodeError.js.map","import { UnknownNodeError } from '../../errors/node.js';\nimport { TransactionExecutionError, } from '../../errors/transaction.js';\nimport { getNodeError, } from './getNodeError.js';\nexport function getTransactionError(err, { docsPath, ...args }) {\n    const cause = (() => {\n        const cause = getNodeError(err, args);\n        if (cause instanceof UnknownNodeError)\n            return err;\n        return cause;\n    })();\n    return new TransactionExecutionError(cause, {\n        docsPath,\n        ...args,\n    });\n}\n//# sourceMappingURL=getTransactionError.js.map","/**\n * @description Picks out the keys from `value` that exist in the formatter..\n */\nexport function extract(value_, { format }) {\n    if (!format)\n        return {};\n    const value = {};\n    function extract_(formatted) {\n        const keys = Object.keys(formatted);\n        for (const key of keys) {\n            if (key in value_)\n                value[key] = value_[key];\n            if (formatted[key] &&\n                typeof formatted[key] === 'object' &&\n                !Array.isArray(formatted[key]))\n                extract_(formatted[key]);\n        }\n    }\n    const formatted = format(value_ || {});\n    extract_(formatted);\n    return value;\n}\n//# sourceMappingURL=extract.js.map","export function defineFormatter(type, format) {\n    return ({ exclude, format: overrides, }) => {\n        return {\n            exclude,\n            format: (args) => {\n                const formatted = format(args);\n                if (exclude) {\n                    for (const key of exclude) {\n                        delete formatted[key];\n                    }\n                }\n                return {\n                    ...formatted,\n                    ...overrides(args),\n                };\n            },\n            type,\n        };\n    };\n}\n//# sourceMappingURL=formatter.js.map","import { bytesToHex, numberToHex } from '../encoding/toHex.js';\nimport { defineFormatter } from './formatter.js';\nexport const rpcTransactionType = {\n    legacy: '0x0',\n    eip2930: '0x1',\n    eip1559: '0x2',\n    eip4844: '0x3',\n    eip7702: '0x4',\n};\nexport function formatTransactionRequest(request) {\n    const rpcRequest = {};\n    if (typeof request.authorizationList !== 'undefined')\n        rpcRequest.authorizationList = formatAuthorizationList(request.authorizationList);\n    if (typeof request.accessList !== 'undefined')\n        rpcRequest.accessList = request.accessList;\n    if (typeof request.blobVersionedHashes !== 'undefined')\n        rpcRequest.blobVersionedHashes = request.blobVersionedHashes;\n    if (typeof request.blobs !== 'undefined') {\n        if (typeof request.blobs[0] !== 'string')\n            rpcRequest.blobs = request.blobs.map((x) => bytesToHex(x));\n        else\n            rpcRequest.blobs = request.blobs;\n    }\n    if (typeof request.data !== 'undefined')\n        rpcRequest.data = request.data;\n    if (typeof request.from !== 'undefined')\n        rpcRequest.from = request.from;\n    if (typeof request.gas !== 'undefined')\n        rpcRequest.gas = numberToHex(request.gas);\n    if (typeof request.gasPrice !== 'undefined')\n        rpcRequest.gasPrice = numberToHex(request.gasPrice);\n    if (typeof request.maxFeePerBlobGas !== 'undefined')\n        rpcRequest.maxFeePerBlobGas = numberToHex(request.maxFeePerBlobGas);\n    if (typeof request.maxFeePerGas !== 'undefined')\n        rpcRequest.maxFeePerGas = numberToHex(request.maxFeePerGas);\n    if (typeof request.maxPriorityFeePerGas !== 'undefined')\n        rpcRequest.maxPriorityFeePerGas = numberToHex(request.maxPriorityFeePerGas);\n    if (typeof request.nonce !== 'undefined')\n        rpcRequest.nonce = numberToHex(request.nonce);\n    if (typeof request.to !== 'undefined')\n        rpcRequest.to = request.to;\n    if (typeof request.type !== 'undefined')\n        rpcRequest.type = rpcTransactionType[request.type];\n    if (typeof request.value !== 'undefined')\n        rpcRequest.value = numberToHex(request.value);\n    return rpcRequest;\n}\nexport const defineTransactionRequest = /*#__PURE__*/ defineFormatter('transactionRequest', formatTransactionRequest);\n//////////////////////////////////////////////////////////////////////////////\nfunction formatAuthorizationList(authorizationList) {\n    return authorizationList.map((authorization) => ({\n        address: authorization.address,\n        r: authorization.r\n            ? numberToHex(BigInt(authorization.r))\n            : authorization.r,\n        s: authorization.s\n            ? numberToHex(BigInt(authorization.s))\n            : authorization.s,\n        chainId: numberToHex(authorization.chainId),\n        nonce: numberToHex(authorization.nonce),\n        ...(typeof authorization.yParity !== 'undefined'\n            ? { yParity: numberToHex(authorization.yParity) }\n            : {}),\n        ...(typeof authorization.v !== 'undefined' &&\n            typeof authorization.yParity === 'undefined'\n            ? { v: numberToHex(authorization.v) }\n            : {}),\n    }));\n}\n//# sourceMappingURL=transactionRequest.js.map","/**\n * Retrieves and returns an action from the client (if exists), and falls\n * back to the tree-shakable action.\n *\n * Useful for extracting overridden actions from a client (ie. if a consumer\n * wants to override the `sendTransaction` implementation).\n */\nexport function getAction(client, actionFn, \n// Some minifiers drop `Function.prototype.name`, or replace it with short letters,\n// meaning that `actionFn.name` will not always work. For that case, the consumer\n// needs to pass the name explicitly.\nname) {\n    const action_implicit = client[actionFn.name];\n    if (typeof action_implicit === 'function')\n        return action_implicit;\n    const action_explicit = client[name];\n    if (typeof action_explicit === 'function')\n        return action_explicit;\n    return (params) => actionFn(client, params);\n}\n//# sourceMappingURL=getAction.js.map","export const maxInt8 = 2n ** (8n - 1n) - 1n;\nexport const maxInt16 = 2n ** (16n - 1n) - 1n;\nexport const maxInt24 = 2n ** (24n - 1n) - 1n;\nexport const maxInt32 = 2n ** (32n - 1n) - 1n;\nexport const maxInt40 = 2n ** (40n - 1n) - 1n;\nexport const maxInt48 = 2n ** (48n - 1n) - 1n;\nexport const maxInt56 = 2n ** (56n - 1n) - 1n;\nexport const maxInt64 = 2n ** (64n - 1n) - 1n;\nexport const maxInt72 = 2n ** (72n - 1n) - 1n;\nexport const maxInt80 = 2n ** (80n - 1n) - 1n;\nexport const maxInt88 = 2n ** (88n - 1n) - 1n;\nexport const maxInt96 = 2n ** (96n - 1n) - 1n;\nexport const maxInt104 = 2n ** (104n - 1n) - 1n;\nexport const maxInt112 = 2n ** (112n - 1n) - 1n;\nexport const maxInt120 = 2n ** (120n - 1n) - 1n;\nexport const maxInt128 = 2n ** (128n - 1n) - 1n;\nexport const maxInt136 = 2n ** (136n - 1n) - 1n;\nexport const maxInt144 = 2n ** (144n - 1n) - 1n;\nexport const maxInt152 = 2n ** (152n - 1n) - 1n;\nexport const maxInt160 = 2n ** (160n - 1n) - 1n;\nexport const maxInt168 = 2n ** (168n - 1n) - 1n;\nexport const maxInt176 = 2n ** (176n - 1n) - 1n;\nexport const maxInt184 = 2n ** (184n - 1n) - 1n;\nexport const maxInt192 = 2n ** (192n - 1n) - 1n;\nexport const maxInt200 = 2n ** (200n - 1n) - 1n;\nexport const maxInt208 = 2n ** (208n - 1n) - 1n;\nexport const maxInt216 = 2n ** (216n - 1n) - 1n;\nexport const maxInt224 = 2n ** (224n - 1n) - 1n;\nexport const maxInt232 = 2n ** (232n - 1n) - 1n;\nexport const maxInt240 = 2n ** (240n - 1n) - 1n;\nexport const maxInt248 = 2n ** (248n - 1n) - 1n;\nexport const maxInt256 = 2n ** (256n - 1n) - 1n;\nexport const minInt8 = -(2n ** (8n - 1n));\nexport const minInt16 = -(2n ** (16n - 1n));\nexport const minInt24 = -(2n ** (24n - 1n));\nexport const minInt32 = -(2n ** (32n - 1n));\nexport const minInt40 = -(2n ** (40n - 1n));\nexport const minInt48 = -(2n ** (48n - 1n));\nexport const minInt56 = -(2n ** (56n - 1n));\nexport const minInt64 = -(2n ** (64n - 1n));\nexport const minInt72 = -(2n ** (72n - 1n));\nexport const minInt80 = -(2n ** (80n - 1n));\nexport const minInt88 = -(2n ** (88n - 1n));\nexport const minInt96 = -(2n ** (96n - 1n));\nexport const minInt104 = -(2n ** (104n - 1n));\nexport const minInt112 = -(2n ** (112n - 1n));\nexport const minInt120 = -(2n ** (120n - 1n));\nexport const minInt128 = -(2n ** (128n - 1n));\nexport const minInt136 = -(2n ** (136n - 1n));\nexport const minInt144 = -(2n ** (144n - 1n));\nexport const minInt152 = -(2n ** (152n - 1n));\nexport const minInt160 = -(2n ** (160n - 1n));\nexport const minInt168 = -(2n ** (168n - 1n));\nexport const minInt176 = -(2n ** (176n - 1n));\nexport const minInt184 = -(2n ** (184n - 1n));\nexport const minInt192 = -(2n ** (192n - 1n));\nexport const minInt200 = -(2n ** (200n - 1n));\nexport const minInt208 = -(2n ** (208n - 1n));\nexport const minInt216 = -(2n ** (216n - 1n));\nexport const minInt224 = -(2n ** (224n - 1n));\nexport const minInt232 = -(2n ** (232n - 1n));\nexport const minInt240 = -(2n ** (240n - 1n));\nexport const minInt248 = -(2n ** (248n - 1n));\nexport const minInt256 = -(2n ** (256n - 1n));\nexport const maxUint8 = 2n ** 8n - 1n;\nexport const maxUint16 = 2n ** 16n - 1n;\nexport const maxUint24 = 2n ** 24n - 1n;\nexport const maxUint32 = 2n ** 32n - 1n;\nexport const maxUint40 = 2n ** 40n - 1n;\nexport const maxUint48 = 2n ** 48n - 1n;\nexport const maxUint56 = 2n ** 56n - 1n;\nexport const maxUint64 = 2n ** 64n - 1n;\nexport const maxUint72 = 2n ** 72n - 1n;\nexport const maxUint80 = 2n ** 80n - 1n;\nexport const maxUint88 = 2n ** 88n - 1n;\nexport const maxUint96 = 2n ** 96n - 1n;\nexport const maxUint104 = 2n ** 104n - 1n;\nexport const maxUint112 = 2n ** 112n - 1n;\nexport const maxUint120 = 2n ** 120n - 1n;\nexport const maxUint128 = 2n ** 128n - 1n;\nexport const maxUint136 = 2n ** 136n - 1n;\nexport const maxUint144 = 2n ** 144n - 1n;\nexport const maxUint152 = 2n ** 152n - 1n;\nexport const maxUint160 = 2n ** 160n - 1n;\nexport const maxUint168 = 2n ** 168n - 1n;\nexport const maxUint176 = 2n ** 176n - 1n;\nexport const maxUint184 = 2n ** 184n - 1n;\nexport const maxUint192 = 2n ** 192n - 1n;\nexport const maxUint200 = 2n ** 200n - 1n;\nexport const maxUint208 = 2n ** 208n - 1n;\nexport const maxUint216 = 2n ** 216n - 1n;\nexport const maxUint224 = 2n ** 224n - 1n;\nexport const maxUint232 = 2n ** 232n - 1n;\nexport const maxUint240 = 2n ** 240n - 1n;\nexport const maxUint248 = 2n ** 248n - 1n;\nexport const maxUint256 = 2n ** 256n - 1n;\n//# sourceMappingURL=number.js.map","import { parseAccount, } from '../../accounts/utils/parseAccount.js';\nimport { maxUint256 } from '../../constants/number.js';\nimport { InvalidAddressError, } from '../../errors/address.js';\nimport { FeeCapTooHighError, TipAboveFeeCapError, } from '../../errors/node.js';\nimport { FeeConflictError, } from '../../errors/transaction.js';\nimport { isAddress } from '../address/isAddress.js';\nexport function assertRequest(args) {\n    const { account: account_, gasPrice, maxFeePerGas, maxPriorityFeePerGas, to, } = args;\n    const account = account_ ? parseAccount(account_) : undefined;\n    if (account && !isAddress(account.address))\n        throw new InvalidAddressError({ address: account.address });\n    if (to && !isAddress(to))\n        throw new InvalidAddressError({ address: to });\n    if (typeof gasPrice !== 'undefined' &&\n        (typeof maxFeePerGas !== 'undefined' ||\n            typeof maxPriorityFeePerGas !== 'undefined'))\n        throw new FeeConflictError();\n    if (maxFeePerGas && maxFeePerGas > maxUint256)\n        throw new FeeCapTooHighError({ maxFeePerGas });\n    if (maxPriorityFeePerGas &&\n        maxFeePerGas &&\n        maxPriorityFeePerGas > maxFeePerGas)\n        throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas });\n}\n//# sourceMappingURL=assertRequest.js.map","import { hexToNumber, } from '../../utils/encoding/fromHex.js';\n/**\n * Returns the chain ID associated with the current network.\n *\n * - Docs: https://viem.sh/docs/actions/public/getChainId\n * - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid)\n *\n * @param client - Client to use\n * @returns The current chain ID. {@link GetChainIdReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getChainId } from 'viem/public'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const chainId = await getChainId(client)\n * // 1\n */\nexport async function getChainId(client) {\n    const chainIdHex = await client.request({\n        method: 'eth_chainId',\n    }, { dedupe: true });\n    return hexToNumber(chainIdHex);\n}\n//# sourceMappingURL=getChainId.js.map","import { formatGwei } from '../utils/unit/formatGwei.js';\nimport { BaseError } from './base.js';\nexport class BaseFeeScalarError extends BaseError {\n    constructor() {\n        super('`baseFeeMultiplier` must be greater than 1.', {\n            name: 'BaseFeeScalarError',\n        });\n    }\n}\nexport class Eip1559FeesNotSupportedError extends BaseError {\n    constructor() {\n        super('Chain does not support EIP-1559 fees.', {\n            name: 'Eip1559FeesNotSupportedError',\n        });\n    }\n}\nexport class MaxFeePerGasTooLowError extends BaseError {\n    constructor({ maxPriorityFeePerGas }) {\n        super(`\\`maxFeePerGas\\` cannot be less than the \\`maxPriorityFeePerGas\\` (${formatGwei(maxPriorityFeePerGas)} gwei).`, { name: 'MaxFeePerGasTooLowError' });\n    }\n}\n//# sourceMappingURL=fee.js.map","import { BaseError } from './base.js';\nexport class BlockNotFoundError extends BaseError {\n    constructor({ blockHash, blockNumber, }) {\n        let identifier = 'Block';\n        if (blockHash)\n            identifier = `Block at hash \"${blockHash}\"`;\n        if (blockNumber)\n            identifier = `Block at number \"${blockNumber}\"`;\n        super(`${identifier} could not be found.`, { name: 'BlockNotFoundError' });\n    }\n}\n//# sourceMappingURL=block.js.map","import { hexToNumber } from '../encoding/fromHex.js';\nimport { defineFormatter } from './formatter.js';\nexport const transactionType = {\n    '0x0': 'legacy',\n    '0x1': 'eip2930',\n    '0x2': 'eip1559',\n    '0x3': 'eip4844',\n    '0x4': 'eip7702',\n};\nexport function formatTransaction(transaction) {\n    const transaction_ = {\n        ...transaction,\n        blockHash: transaction.blockHash ? transaction.blockHash : null,\n        blockNumber: transaction.blockNumber\n            ? BigInt(transaction.blockNumber)\n            : null,\n        chainId: transaction.chainId ? hexToNumber(transaction.chainId) : undefined,\n        gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n        gasPrice: transaction.gasPrice ? BigInt(transaction.gasPrice) : undefined,\n        maxFeePerBlobGas: transaction.maxFeePerBlobGas\n            ? BigInt(transaction.maxFeePerBlobGas)\n            : undefined,\n        maxFeePerGas: transaction.maxFeePerGas\n            ? BigInt(transaction.maxFeePerGas)\n            : undefined,\n        maxPriorityFeePerGas: transaction.maxPriorityFeePerGas\n            ? BigInt(transaction.maxPriorityFeePerGas)\n            : undefined,\n        nonce: transaction.nonce ? hexToNumber(transaction.nonce) : undefined,\n        to: transaction.to ? transaction.to : null,\n        transactionIndex: transaction.transactionIndex\n            ? Number(transaction.transactionIndex)\n            : null,\n        type: transaction.type\n            ? transactionType[transaction.type]\n            : undefined,\n        typeHex: transaction.type ? transaction.type : undefined,\n        value: transaction.value ? BigInt(transaction.value) : undefined,\n        v: transaction.v ? BigInt(transaction.v) : undefined,\n    };\n    if (transaction.authorizationList)\n        transaction_.authorizationList = formatAuthorizationList(transaction.authorizationList);\n    transaction_.yParity = (() => {\n        // If `yParity` is provided, we will use it.\n        if (transaction.yParity)\n            return Number(transaction.yParity);\n        // If no `yParity` provided, try derive from `v`.\n        if (typeof transaction_.v === 'bigint') {\n            if (transaction_.v === 0n || transaction_.v === 27n)\n                return 0;\n            if (transaction_.v === 1n || transaction_.v === 28n)\n                return 1;\n            if (transaction_.v >= 35n)\n                return transaction_.v % 2n === 0n ? 1 : 0;\n        }\n        return undefined;\n    })();\n    if (transaction_.type === 'legacy') {\n        delete transaction_.accessList;\n        delete transaction_.maxFeePerBlobGas;\n        delete transaction_.maxFeePerGas;\n        delete transaction_.maxPriorityFeePerGas;\n        delete transaction_.yParity;\n    }\n    if (transaction_.type === 'eip2930') {\n        delete transaction_.maxFeePerBlobGas;\n        delete transaction_.maxFeePerGas;\n        delete transaction_.maxPriorityFeePerGas;\n    }\n    if (transaction_.type === 'eip1559') {\n        delete transaction_.maxFeePerBlobGas;\n    }\n    return transaction_;\n}\nexport const defineTransaction = /*#__PURE__*/ defineFormatter('transaction', formatTransaction);\n//////////////////////////////////////////////////////////////////////////////\nfunction formatAuthorizationList(authorizationList) {\n    return authorizationList.map((authorization) => ({\n        address: authorization.address,\n        chainId: Number(authorization.chainId),\n        nonce: Number(authorization.nonce),\n        r: authorization.r,\n        s: authorization.s,\n        yParity: Number(authorization.yParity),\n    }));\n}\n//# sourceMappingURL=transaction.js.map","import { defineFormatter } from './formatter.js';\nimport { formatTransaction } from './transaction.js';\nexport function formatBlock(block) {\n    const transactions = (block.transactions ?? []).map((transaction) => {\n        if (typeof transaction === 'string')\n            return transaction;\n        return formatTransaction(transaction);\n    });\n    return {\n        ...block,\n        baseFeePerGas: block.baseFeePerGas ? BigInt(block.baseFeePerGas) : null,\n        blobGasUsed: block.blobGasUsed ? BigInt(block.blobGasUsed) : undefined,\n        difficulty: block.difficulty ? BigInt(block.difficulty) : undefined,\n        excessBlobGas: block.excessBlobGas\n            ? BigInt(block.excessBlobGas)\n            : undefined,\n        gasLimit: block.gasLimit ? BigInt(block.gasLimit) : undefined,\n        gasUsed: block.gasUsed ? BigInt(block.gasUsed) : undefined,\n        hash: block.hash ? block.hash : null,\n        logsBloom: block.logsBloom ? block.logsBloom : null,\n        nonce: block.nonce ? block.nonce : null,\n        number: block.number ? BigInt(block.number) : null,\n        size: block.size ? BigInt(block.size) : undefined,\n        timestamp: block.timestamp ? BigInt(block.timestamp) : undefined,\n        transactions,\n        totalDifficulty: block.totalDifficulty\n            ? BigInt(block.totalDifficulty)\n            : null,\n    };\n}\nexport const defineBlock = /*#__PURE__*/ defineFormatter('block', formatBlock);\n//# sourceMappingURL=block.js.map","import { BlockNotFoundError, } from '../../errors/block.js';\nimport { numberToHex, } from '../../utils/encoding/toHex.js';\nimport { formatBlock, } from '../../utils/formatters/block.js';\n/**\n * Returns information about a block at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlock\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods:\n *   - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`.\n *   - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`.\n *\n * @param client - Client to use\n * @param parameters - {@link GetBlockParameters}\n * @returns Information about the block. {@link GetBlockReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlock } from 'viem/public'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const block = await getBlock(client)\n */\nexport async function getBlock(client, { blockHash, blockNumber, blockTag = client.experimental_blockTag ?? 'latest', includeTransactions: includeTransactions_, } = {}) {\n    const includeTransactions = includeTransactions_ ?? false;\n    const blockNumberHex = blockNumber !== undefined ? numberToHex(blockNumber) : undefined;\n    let block = null;\n    if (blockHash) {\n        block = await client.request({\n            method: 'eth_getBlockByHash',\n            params: [blockHash, includeTransactions],\n        }, { dedupe: true });\n    }\n    else {\n        block = await client.request({\n            method: 'eth_getBlockByNumber',\n            params: [blockNumberHex || blockTag, includeTransactions],\n        }, { dedupe: Boolean(blockNumberHex) });\n    }\n    if (!block)\n        throw new BlockNotFoundError({ blockHash, blockNumber });\n    const format = client.chain?.formatters?.block?.format || formatBlock;\n    return format(block);\n}\n//# sourceMappingURL=getBlock.js.map","/**\n * Returns the current price of gas (in wei).\n *\n * - Docs: https://viem.sh/docs/actions/public/getGasPrice\n * - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice)\n *\n * @param client - Client to use\n * @returns The gas price (in wei). {@link GetGasPriceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getGasPrice } from 'viem/public'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const gasPrice = await getGasPrice(client)\n */\nexport async function getGasPrice(client) {\n    const gasPrice = await client.request({\n        method: 'eth_gasPrice',\n    });\n    return BigInt(gasPrice);\n}\n//# sourceMappingURL=getGasPrice.js.map","import { Eip1559FeesNotSupportedError, } from '../../errors/fee.js';\nimport { hexToBigInt, } from '../../utils/encoding/fromHex.js';\nimport { getAction } from '../../utils/getAction.js';\nimport { getBlock } from './getBlock.js';\nimport { getGasPrice } from './getGasPrice.js';\n/**\n * Returns an estimate for the max priority fee per gas (in wei) for a\n * transaction to be likely included in the next block.\n * Defaults to [`chain.fees.defaultPriorityFee`](/docs/clients/chains#fees-defaultpriorityfee) if set.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas\n *\n * @param client - Client to use\n * @returns An estimate (in wei) for the max priority fee per gas. {@link EstimateMaxPriorityFeePerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateMaxPriorityFeePerGas } from 'viem/actions'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const maxPriorityFeePerGas = await estimateMaxPriorityFeePerGas(client)\n * // 10000000n\n */\nexport async function estimateMaxPriorityFeePerGas(client, args) {\n    return internal_estimateMaxPriorityFeePerGas(client, args);\n}\nexport async function internal_estimateMaxPriorityFeePerGas(client, args) {\n    const { block: block_, chain = client.chain, request } = args || {};\n    try {\n        const maxPriorityFeePerGas = chain?.fees?.maxPriorityFeePerGas ?? chain?.fees?.defaultPriorityFee;\n        if (typeof maxPriorityFeePerGas === 'function') {\n            const block = block_ || (await getAction(client, getBlock, 'getBlock')({}));\n            const maxPriorityFeePerGas_ = await maxPriorityFeePerGas({\n                block,\n                client,\n                request,\n            });\n            if (maxPriorityFeePerGas_ === null)\n                throw new Error();\n            return maxPriorityFeePerGas_;\n        }\n        if (typeof maxPriorityFeePerGas !== 'undefined')\n            return maxPriorityFeePerGas;\n        const maxPriorityFeePerGasHex = await client.request({\n            method: 'eth_maxPriorityFeePerGas',\n        });\n        return hexToBigInt(maxPriorityFeePerGasHex);\n    }\n    catch {\n        // If the RPC Provider does not support `eth_maxPriorityFeePerGas`\n        // fall back to calculating it manually via `gasPrice - baseFeePerGas`.\n        // See: https://github.com/ethereum/pm/issues/328#:~:text=eth_maxPriorityFeePerGas%20after%20London%20will%20effectively%20return%20eth_gasPrice%20%2D%20baseFee\n        const [block, gasPrice] = await Promise.all([\n            block_\n                ? Promise.resolve(block_)\n                : getAction(client, getBlock, 'getBlock')({}),\n            getAction(client, getGasPrice, 'getGasPrice')({}),\n        ]);\n        if (typeof block.baseFeePerGas !== 'bigint')\n            throw new Eip1559FeesNotSupportedError();\n        const maxPriorityFeePerGas = gasPrice - block.baseFeePerGas;\n        if (maxPriorityFeePerGas < 0n)\n            return 0n;\n        return maxPriorityFeePerGas;\n    }\n}\n//# sourceMappingURL=estimateMaxPriorityFeePerGas.js.map","import { BaseFeeScalarError, Eip1559FeesNotSupportedError, } from '../../errors/fee.js';\nimport { getAction } from '../../utils/getAction.js';\nimport { internal_estimateMaxPriorityFeePerGas, } from './estimateMaxPriorityFeePerGas.js';\nimport { getBlock } from './getBlock.js';\nimport { getGasPrice } from './getGasPrice.js';\n/**\n * Returns an estimate for the fees per gas (in wei) for a\n * transaction to be likely included in the next block.\n * Defaults to [`chain.fees.estimateFeesPerGas`](/docs/clients/chains#fees-estimatefeespergas) if set.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateFeesPerGasParameters}\n * @returns An estimate (in wei) for the fees per gas. {@link EstimateFeesPerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateFeesPerGas } from 'viem/actions'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const maxPriorityFeePerGas = await estimateFeesPerGas(client)\n * // { maxFeePerGas: ..., maxPriorityFeePerGas: ... }\n */\nexport async function estimateFeesPerGas(client, args) {\n    return internal_estimateFeesPerGas(client, args);\n}\nexport async function internal_estimateFeesPerGas(client, args) {\n    const { block: block_, chain = client.chain, request, type = 'eip1559', } = args || {};\n    const baseFeeMultiplier = await (async () => {\n        if (typeof chain?.fees?.baseFeeMultiplier === 'function')\n            return chain.fees.baseFeeMultiplier({\n                block: block_,\n                client,\n                request,\n            });\n        return chain?.fees?.baseFeeMultiplier ?? 1.2;\n    })();\n    if (baseFeeMultiplier < 1)\n        throw new BaseFeeScalarError();\n    const decimals = baseFeeMultiplier.toString().split('.')[1]?.length ?? 0;\n    const denominator = 10 ** decimals;\n    const multiply = (base) => (base * BigInt(Math.ceil(baseFeeMultiplier * denominator))) /\n        BigInt(denominator);\n    const block = block_\n        ? block_\n        : await getAction(client, getBlock, 'getBlock')({});\n    if (typeof chain?.fees?.estimateFeesPerGas === 'function') {\n        const fees = (await chain.fees.estimateFeesPerGas({\n            block: block_,\n            client,\n            multiply,\n            request,\n            type,\n        }));\n        if (fees !== null)\n            return fees;\n    }\n    if (type === 'eip1559') {\n        if (typeof block.baseFeePerGas !== 'bigint')\n            throw new Eip1559FeesNotSupportedError();\n        const maxPriorityFeePerGas = typeof request?.maxPriorityFeePerGas === 'bigint'\n            ? request.maxPriorityFeePerGas\n            : await internal_estimateMaxPriorityFeePerGas(client, {\n                block: block,\n                chain,\n                request,\n            });\n        const baseFeePerGas = multiply(block.baseFeePerGas);\n        const maxFeePerGas = request?.maxFeePerGas ?? baseFeePerGas + maxPriorityFeePerGas;\n        return {\n            maxFeePerGas,\n            maxPriorityFeePerGas,\n        };\n    }\n    const gasPrice = request?.gasPrice ??\n        multiply(await getAction(client, getGasPrice, 'getGasPrice')({}));\n    return {\n        gasPrice,\n    };\n}\n//# sourceMappingURL=estimateFeesPerGas.js.map","import { formatEther } from '../utils/unit/formatEther.js';\nimport { formatGwei } from '../utils/unit/formatGwei.js';\nimport { BaseError } from './base.js';\nimport { prettyPrint } from './transaction.js';\nexport class EstimateGasExecutionError extends BaseError {\n    constructor(cause, { account, docsPath, chain, data, gas, gasPrice, maxFeePerGas, maxPriorityFeePerGas, nonce, to, value, }) {\n        const prettyArgs = prettyPrint({\n            from: account?.address,\n            to,\n            value: typeof value !== 'undefined' &&\n                `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n            data,\n            gas,\n            gasPrice: typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n            maxFeePerGas: typeof maxFeePerGas !== 'undefined' &&\n                `${formatGwei(maxFeePerGas)} gwei`,\n            maxPriorityFeePerGas: typeof maxPriorityFeePerGas !== 'undefined' &&\n                `${formatGwei(maxPriorityFeePerGas)} gwei`,\n            nonce,\n        });\n        super(cause.shortMessage, {\n            cause,\n            docsPath,\n            metaMessages: [\n                ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n                'Estimate Gas Arguments:',\n                prettyArgs,\n            ].filter(Boolean),\n            name: 'EstimateGasExecutionError',\n        });\n        Object.defineProperty(this, \"cause\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.cause = cause;\n    }\n}\n//# sourceMappingURL=estimateGas.js.map","import { EstimateGasExecutionError, } from '../../errors/estimateGas.js';\nimport { UnknownNodeError } from '../../errors/node.js';\nimport { getNodeError, } from './getNodeError.js';\nexport function getEstimateGasError(err, { docsPath, ...args }) {\n    const cause = (() => {\n        const cause = getNodeError(err, args);\n        if (cause instanceof UnknownNodeError)\n            return err;\n        return cause;\n    })();\n    return new EstimateGasExecutionError(cause, {\n        docsPath,\n        ...args,\n    });\n}\n//# sourceMappingURL=getEstimateGasError.js.map","import { BaseError } from './base.js';\nexport class AccountStateConflictError extends BaseError {\n    constructor({ address }) {\n        super(`State for account \"${address}\" is set multiple times.`, {\n            name: 'AccountStateConflictError',\n        });\n    }\n}\nexport class StateAssignmentConflictError extends BaseError {\n    constructor() {\n        super('state and stateDiff are set on the same account.', {\n            name: 'StateAssignmentConflictError',\n        });\n    }\n}\n/** @internal */\nexport function prettyStateMapping(stateMapping) {\n    return stateMapping.reduce((pretty, { slot, value }) => {\n        return `${pretty}        ${slot}: ${value}\\n`;\n    }, '');\n}\nexport function prettyStateOverride(stateOverride) {\n    return stateOverride\n        .reduce((pretty, { address, ...state }) => {\n        let val = `${pretty}    ${address}:\\n`;\n        if (state.nonce)\n            val += `      nonce: ${state.nonce}\\n`;\n        if (state.balance)\n            val += `      balance: ${state.balance}\\n`;\n        if (state.code)\n            val += `      code: ${state.code}\\n`;\n        if (state.state) {\n            val += '      state:\\n';\n            val += prettyStateMapping(state.state);\n        }\n        if (state.stateDiff) {\n            val += '      stateDiff:\\n';\n            val += prettyStateMapping(state.stateDiff);\n        }\n        return val;\n    }, '  State Override:\\n')\n        .slice(0, -1);\n}\n//# sourceMappingURL=stateOverride.js.map","import { InvalidAddressError, } from '../errors/address.js';\nimport { InvalidBytesLengthError, } from '../errors/data.js';\nimport { AccountStateConflictError, StateAssignmentConflictError, } from '../errors/stateOverride.js';\nimport { isAddress } from './address/isAddress.js';\nimport { numberToHex } from './encoding/toHex.js';\n/** @internal */\nexport function serializeStateMapping(stateMapping) {\n    if (!stateMapping || stateMapping.length === 0)\n        return undefined;\n    return stateMapping.reduce((acc, { slot, value }) => {\n        if (slot.length !== 66)\n            throw new InvalidBytesLengthError({\n                size: slot.length,\n                targetSize: 66,\n                type: 'hex',\n            });\n        if (value.length !== 66)\n            throw new InvalidBytesLengthError({\n                size: value.length,\n                targetSize: 66,\n                type: 'hex',\n            });\n        acc[slot] = value;\n        return acc;\n    }, {});\n}\n/** @internal */\nexport function serializeAccountStateOverride(parameters) {\n    const { balance, nonce, state, stateDiff, code } = parameters;\n    const rpcAccountStateOverride = {};\n    if (code !== undefined)\n        rpcAccountStateOverride.code = code;\n    if (balance !== undefined)\n        rpcAccountStateOverride.balance = numberToHex(balance);\n    if (nonce !== undefined)\n        rpcAccountStateOverride.nonce = numberToHex(nonce);\n    if (state !== undefined)\n        rpcAccountStateOverride.state = serializeStateMapping(state);\n    if (stateDiff !== undefined) {\n        if (rpcAccountStateOverride.state)\n            throw new StateAssignmentConflictError();\n        rpcAccountStateOverride.stateDiff = serializeStateMapping(stateDiff);\n    }\n    return rpcAccountStateOverride;\n}\n/** @internal */\nexport function serializeStateOverride(parameters) {\n    if (!parameters)\n        return undefined;\n    const rpcStateOverride = {};\n    for (const { address, ...accountState } of parameters) {\n        if (!isAddress(address, { strict: false }))\n            throw new InvalidAddressError({ address });\n        if (rpcStateOverride[address])\n            throw new AccountStateConflictError({ address: address });\n        rpcStateOverride[address] = serializeAccountStateOverride(accountState);\n    }\n    return rpcStateOverride;\n}\n//# sourceMappingURL=stateOverride.js.map","import { numberToHex, } from '../../utils/encoding/toHex.js';\n/**\n * Returns the balance of an address in wei.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBalance\n * - JSON-RPC Methods: [`eth_getBalance`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getbalance)\n *\n * You can convert the balance to ether units with [`formatEther`](https://viem.sh/docs/utilities/formatEther).\n *\n * ```ts\n * const balance = await getBalance(client, {\n *   address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *   blockTag: 'safe'\n * })\n * const balanceAsEther = formatEther(balance)\n * // \"6.942\"\n * ```\n *\n * @param client - Client to use\n * @param parameters - {@link GetBalanceParameters}\n * @returns The balance of the address in wei. {@link GetBalanceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBalance } from 'viem/public'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const balance = await getBalance(client, {\n *   address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n * // 10000000000000000000000n (wei)\n */\nexport async function getBalance(client, { address, blockNumber, blockTag = client.experimental_blockTag ?? 'latest', }) {\n    const blockNumberHex = typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined;\n    const balance = await client.request({\n        method: 'eth_getBalance',\n        params: [address, blockNumberHex || blockTag],\n    });\n    return BigInt(balance);\n}\n//# sourceMappingURL=getBalance.js.map","import { parseAccount, } from '../../accounts/utils/parseAccount.js';\nimport { BaseError } from '../../errors/base.js';\nimport { recoverAuthorizationAddress, } from '../../utils/authorization/recoverAuthorizationAddress.js';\nimport { numberToHex, } from '../../utils/encoding/toHex.js';\nimport { getEstimateGasError, } from '../../utils/errors/getEstimateGasError.js';\nimport { extract } from '../../utils/formatters/extract.js';\nimport { formatTransactionRequest, } from '../../utils/formatters/transactionRequest.js';\nimport { serializeStateOverride } from '../../utils/stateOverride.js';\nimport { assertRequest, } from '../../utils/transaction/assertRequest.js';\nimport { prepareTransactionRequest, } from '../wallet/prepareTransactionRequest.js';\nimport { getBalance } from './getBalance.js';\n/**\n * Estimates the gas necessary to complete a transaction without submitting it to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateGas\n * - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas)\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateGasParameters}\n * @returns The gas estimate (in gas units). {@link EstimateGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateGas } from 'viem/public'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const gasEstimate = await estimateGas(client, {\n *   account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *   to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n *   value: parseEther('1'),\n * })\n */\nexport async function estimateGas(client, args) {\n    const { account: account_ = client.account } = args;\n    const account = account_ ? parseAccount(account_) : undefined;\n    try {\n        const { accessList, authorizationList, blobs, blobVersionedHashes, blockNumber, blockTag, data, gas, gasPrice, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, nonce, value, stateOverride, ...rest } = (await prepareTransactionRequest(client, {\n            ...args,\n            parameters: \n            // Some RPC Providers do not compute versioned hashes from blobs. We will need\n            // to compute them.\n            account?.type === 'local' ? undefined : ['blobVersionedHashes'],\n        }));\n        const blockNumberHex = typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined;\n        const block = blockNumberHex || blockTag;\n        const rpcStateOverride = serializeStateOverride(stateOverride);\n        const to = await (async () => {\n            // If `to` exists on the parameters, use that.\n            if (rest.to)\n                return rest.to;\n            // If no `to` exists, and we are sending a EIP-7702 transaction, use the\n            // address of the first authorization in the list.\n            if (authorizationList && authorizationList.length > 0)\n                return await recoverAuthorizationAddress({\n                    authorization: authorizationList[0],\n                }).catch(() => {\n                    throw new BaseError('`to` is required. Could not infer from `authorizationList`');\n                });\n            // Otherwise, we are sending a deployment transaction.\n            return undefined;\n        })();\n        assertRequest(args);\n        const chainFormat = client.chain?.formatters?.transactionRequest?.format;\n        const format = chainFormat || formatTransactionRequest;\n        const request = format({\n            // Pick out extra data that might exist on the chain's transaction request type.\n            ...extract(rest, { format: chainFormat }),\n            from: account?.address,\n            accessList,\n            authorizationList,\n            blobs,\n            blobVersionedHashes,\n            data,\n            gas,\n            gasPrice,\n            maxFeePerBlobGas,\n            maxFeePerGas,\n            maxPriorityFeePerGas,\n            nonce,\n            to,\n            value,\n        });\n        function estimateGas_rpc(parameters) {\n            const { block, request, rpcStateOverride } = parameters;\n            return client.request({\n                method: 'eth_estimateGas',\n                params: rpcStateOverride\n                    ? [\n                        request,\n                        block ?? client.experimental_blockTag ?? 'latest',\n                        rpcStateOverride,\n                    ]\n                    : block\n                        ? [request, block]\n                        : [request],\n            });\n        }\n        let estimate = BigInt(await estimateGas_rpc({ block, request, rpcStateOverride }));\n        // TODO(7702): Remove this once https://github.com/ethereum/execution-apis/issues/561 is resolved.\n        //       Authorization list schema is not implemented on JSON-RPC spec yet, so we need to\n        //       manually estimate the gas.\n        if (authorizationList) {\n            const value = await getBalance(client, { address: request.from });\n            const estimates = await Promise.all(authorizationList.map(async (authorization) => {\n                const { address } = authorization;\n                const estimate = await estimateGas_rpc({\n                    block,\n                    request: {\n                        authorizationList: undefined,\n                        data,\n                        from: account?.address,\n                        to: address,\n                        value: numberToHex(value),\n                    },\n                    rpcStateOverride,\n                }).catch(() => 100000n);\n                return 2n * BigInt(estimate);\n            }));\n            estimate += estimates.reduce((acc, curr) => acc + curr, 0n);\n        }\n        return estimate;\n    }\n    catch (err) {\n        throw getEstimateGasError(err, {\n            ...args,\n            account,\n            chain: client.chain,\n        });\n    }\n}\n//# sourceMappingURL=estimateGas.js.map","import { hexToNumber, } from '../../utils/encoding/fromHex.js';\nimport { numberToHex, } from '../../utils/encoding/toHex.js';\n/**\n * Returns the number of [Transactions](https://viem.sh/docs/glossary/terms#transaction) an Account has sent.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionCount\n * - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionCountParameters}\n * @returns The number of transactions an account has sent. {@link GetTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransactionCount } from 'viem/public'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const transactionCount = await getTransactionCount(client, {\n *   address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\nexport async function getTransactionCount(client, { address, blockTag = 'latest', blockNumber }) {\n    const count = await client.request({\n        method: 'eth_getTransactionCount',\n        params: [\n            address,\n            typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : blockTag,\n        ],\n    }, {\n        dedupe: Boolean(blockNumber),\n    });\n    return hexToNumber(count);\n}\n//# sourceMappingURL=getTransactionCount.js.map","import { hexToBytes } from '../encoding/toBytes.js';\nimport { bytesToHex } from '../encoding/toHex.js';\n/**\n * Compute commitments from a list of blobs.\n *\n * @example\n * ```ts\n * import { blobsToCommitments, toBlobs } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * ```\n */\nexport function blobsToCommitments(parameters) {\n    const { kzg } = parameters;\n    const to = parameters.to ?? (typeof parameters.blobs[0] === 'string' ? 'hex' : 'bytes');\n    const blobs = (typeof parameters.blobs[0] === 'string'\n        ? parameters.blobs.map((x) => hexToBytes(x))\n        : parameters.blobs);\n    const commitments = [];\n    for (const blob of blobs)\n        commitments.push(Uint8Array.from(kzg.blobToKzgCommitment(blob)));\n    return (to === 'bytes'\n        ? commitments\n        : commitments.map((x) => bytesToHex(x)));\n}\n//# sourceMappingURL=blobsToCommitments.js.map","import { hexToBytes } from '../encoding/toBytes.js';\nimport { bytesToHex } from '../encoding/toHex.js';\n/**\n * Compute the proofs for a list of blobs and their commitments.\n *\n * @example\n * ```ts\n * import {\n *   blobsToCommitments,\n *   toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const proofs = blobsToProofs({ blobs, commitments, kzg })\n * ```\n */\nexport function blobsToProofs(parameters) {\n    const { kzg } = parameters;\n    const to = parameters.to ?? (typeof parameters.blobs[0] === 'string' ? 'hex' : 'bytes');\n    const blobs = (typeof parameters.blobs[0] === 'string'\n        ? parameters.blobs.map((x) => hexToBytes(x))\n        : parameters.blobs);\n    const commitments = (typeof parameters.commitments[0] === 'string'\n        ? parameters.commitments.map((x) => hexToBytes(x))\n        : parameters.commitments);\n    const proofs = [];\n    for (let i = 0; i < blobs.length; i++) {\n        const blob = blobs[i];\n        const commitment = commitments[i];\n        proofs.push(Uint8Array.from(kzg.computeBlobKzgProof(blob, commitment)));\n    }\n    return (to === 'bytes'\n        ? proofs\n        : proofs.map((x) => bytesToHex(x)));\n}\n//# sourceMappingURL=blobsToProofs.js.map","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { Hash, abytes, aexists, aoutput, clean, createView, toBytes } from \"./utils.js\";\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(view, byteOffset, value, isLE) {\n    if (typeof view.setBigUint64 === 'function')\n        return view.setBigUint64(byteOffset, value, isLE);\n    const _32n = BigInt(32);\n    const _u32_max = BigInt(0xffffffff);\n    const wh = Number((value >> _32n) & _u32_max);\n    const wl = Number(value & _u32_max);\n    const h = isLE ? 4 : 0;\n    const l = isLE ? 0 : 4;\n    view.setUint32(byteOffset + h, wh, isLE);\n    view.setUint32(byteOffset + l, wl, isLE);\n}\n/** Choice: a ? b : c */\nexport function Chi(a, b, c) {\n    return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a, b, c) {\n    return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport class HashMD extends Hash {\n    constructor(blockLen, outputLen, padOffset, isLE) {\n        super();\n        this.finished = false;\n        this.length = 0;\n        this.pos = 0;\n        this.destroyed = false;\n        this.blockLen = blockLen;\n        this.outputLen = outputLen;\n        this.padOffset = padOffset;\n        this.isLE = isLE;\n        this.buffer = new Uint8Array(blockLen);\n        this.view = createView(this.buffer);\n    }\n    update(data) {\n        aexists(this);\n        data = toBytes(data);\n        abytes(data);\n        const { view, buffer, blockLen } = this;\n        const len = data.length;\n        for (let pos = 0; pos < len;) {\n            const take = Math.min(blockLen - this.pos, len - pos);\n            // Fast path: we have at least one block in input, cast it to view and process\n            if (take === blockLen) {\n                const dataView = createView(data);\n                for (; blockLen <= len - pos; pos += blockLen)\n                    this.process(dataView, pos);\n                continue;\n            }\n            buffer.set(data.subarray(pos, pos + take), this.pos);\n            this.pos += take;\n            pos += take;\n            if (this.pos === blockLen) {\n                this.process(view, 0);\n                this.pos = 0;\n            }\n        }\n        this.length += data.length;\n        this.roundClean();\n        return this;\n    }\n    digestInto(out) {\n        aexists(this);\n        aoutput(out, this);\n        this.finished = true;\n        // Padding\n        // We can avoid allocation of buffer for padding completely if it\n        // was previously not allocated here. But it won't change performance.\n        const { buffer, view, blockLen, isLE } = this;\n        let { pos } = this;\n        // append the bit '1' to the message\n        buffer[pos++] = 0b10000000;\n        clean(this.buffer.subarray(pos));\n        // we have less than padOffset left in buffer, so we cannot put length in\n        // current block, need process it and pad again\n        if (this.padOffset > blockLen - pos) {\n            this.process(view, 0);\n            pos = 0;\n        }\n        // Pad until full block byte with zeros\n        for (let i = pos; i < blockLen; i++)\n            buffer[i] = 0;\n        // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n        // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n        // So we just write lowest 64 bits of that value.\n        setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n        this.process(view, 0);\n        const oview = createView(out);\n        const len = this.outputLen;\n        // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n        if (len % 4)\n            throw new Error('_sha2: outputLen should be aligned to 32bit');\n        const outLen = len / 4;\n        const state = this.get();\n        if (outLen > state.length)\n            throw new Error('_sha2: outputLen bigger than state');\n        for (let i = 0; i < outLen; i++)\n            oview.setUint32(4 * i, state[i], isLE);\n    }\n    digest() {\n        const { buffer, outputLen } = this;\n        this.digestInto(buffer);\n        const res = buffer.slice(0, outputLen);\n        this.destroy();\n        return res;\n    }\n    _cloneInto(to) {\n        to || (to = new this.constructor());\n        to.set(...this.get());\n        const { blockLen, buffer, length, finished, destroyed, pos } = this;\n        to.destroyed = destroyed;\n        to.finished = finished;\n        to.length = length;\n        to.pos = pos;\n        if (length % blockLen)\n            to.buffer.set(buffer);\n        return to;\n    }\n    clone() {\n        return this._cloneInto();\n    }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n    0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n    0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n    0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n    0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n    0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n    0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, rotr } from \"./utils.js\";\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD {\n    constructor(outputLen = 32) {\n        super(64, outputLen, 8, false);\n        // We cannot use array here since array allows indexing by variable\n        // which means optimizer/compiler cannot use registers.\n        this.A = SHA256_IV[0] | 0;\n        this.B = SHA256_IV[1] | 0;\n        this.C = SHA256_IV[2] | 0;\n        this.D = SHA256_IV[3] | 0;\n        this.E = SHA256_IV[4] | 0;\n        this.F = SHA256_IV[5] | 0;\n        this.G = SHA256_IV[6] | 0;\n        this.H = SHA256_IV[7] | 0;\n    }\n    get() {\n        const { A, B, C, D, E, F, G, H } = this;\n        return [A, B, C, D, E, F, G, H];\n    }\n    // prettier-ignore\n    set(A, B, C, D, E, F, G, H) {\n        this.A = A | 0;\n        this.B = B | 0;\n        this.C = C | 0;\n        this.D = D | 0;\n        this.E = E | 0;\n        this.F = F | 0;\n        this.G = G | 0;\n        this.H = H | 0;\n    }\n    process(view, offset) {\n        // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n        for (let i = 0; i < 16; i++, offset += 4)\n            SHA256_W[i] = view.getUint32(offset, false);\n        for (let i = 16; i < 64; i++) {\n            const W15 = SHA256_W[i - 15];\n            const W2 = SHA256_W[i - 2];\n            const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n            const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n            SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n        }\n        // Compression function main loop, 64 rounds\n        let { A, B, C, D, E, F, G, H } = this;\n        for (let i = 0; i < 64; i++) {\n            const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n            const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n            const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n            const T2 = (sigma0 + Maj(A, B, C)) | 0;\n            H = G;\n            G = F;\n            F = E;\n            E = (D + T1) | 0;\n            D = C;\n            C = B;\n            B = A;\n            A = (T1 + T2) | 0;\n        }\n        // Add the compressed chunk to the current hash value\n        A = (A + this.A) | 0;\n        B = (B + this.B) | 0;\n        C = (C + this.C) | 0;\n        D = (D + this.D) | 0;\n        E = (E + this.E) | 0;\n        F = (F + this.F) | 0;\n        G = (G + this.G) | 0;\n        H = (H + this.H) | 0;\n        this.set(A, B, C, D, E, F, G, H);\n    }\n    roundClean() {\n        clean(SHA256_W);\n    }\n    destroy() {\n        this.set(0, 0, 0, 0, 0, 0, 0, 0);\n        clean(this.buffer);\n    }\n}\nexport class SHA224 extends SHA256 {\n    constructor() {\n        super(28);\n        this.A = SHA224_IV[0] | 0;\n        this.B = SHA224_IV[1] | 0;\n        this.C = SHA224_IV[2] | 0;\n        this.D = SHA224_IV[3] | 0;\n        this.E = SHA224_IV[4] | 0;\n        this.F = SHA224_IV[5] | 0;\n        this.G = SHA224_IV[6] | 0;\n        this.H = SHA224_IV[7] | 0;\n    }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n    '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n    '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n    '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n    '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n    '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n    '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n    '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n    '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n    '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n    '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n    '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n    '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n    '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n    '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n    '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n    '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n    '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n    '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n    '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n    '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\nexport class SHA512 extends HashMD {\n    constructor(outputLen = 64) {\n        super(128, outputLen, 16, false);\n        // We cannot use array here since array allows indexing by variable\n        // which means optimizer/compiler cannot use registers.\n        // h -- high 32 bits, l -- low 32 bits\n        this.Ah = SHA512_IV[0] | 0;\n        this.Al = SHA512_IV[1] | 0;\n        this.Bh = SHA512_IV[2] | 0;\n        this.Bl = SHA512_IV[3] | 0;\n        this.Ch = SHA512_IV[4] | 0;\n        this.Cl = SHA512_IV[5] | 0;\n        this.Dh = SHA512_IV[6] | 0;\n        this.Dl = SHA512_IV[7] | 0;\n        this.Eh = SHA512_IV[8] | 0;\n        this.El = SHA512_IV[9] | 0;\n        this.Fh = SHA512_IV[10] | 0;\n        this.Fl = SHA512_IV[11] | 0;\n        this.Gh = SHA512_IV[12] | 0;\n        this.Gl = SHA512_IV[13] | 0;\n        this.Hh = SHA512_IV[14] | 0;\n        this.Hl = SHA512_IV[15] | 0;\n    }\n    // prettier-ignore\n    get() {\n        const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n        return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n    }\n    // prettier-ignore\n    set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n        this.Ah = Ah | 0;\n        this.Al = Al | 0;\n        this.Bh = Bh | 0;\n        this.Bl = Bl | 0;\n        this.Ch = Ch | 0;\n        this.Cl = Cl | 0;\n        this.Dh = Dh | 0;\n        this.Dl = Dl | 0;\n        this.Eh = Eh | 0;\n        this.El = El | 0;\n        this.Fh = Fh | 0;\n        this.Fl = Fl | 0;\n        this.Gh = Gh | 0;\n        this.Gl = Gl | 0;\n        this.Hh = Hh | 0;\n        this.Hl = Hl | 0;\n    }\n    process(view, offset) {\n        // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n        for (let i = 0; i < 16; i++, offset += 4) {\n            SHA512_W_H[i] = view.getUint32(offset);\n            SHA512_W_L[i] = view.getUint32((offset += 4));\n        }\n        for (let i = 16; i < 80; i++) {\n            // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n            const W15h = SHA512_W_H[i - 15] | 0;\n            const W15l = SHA512_W_L[i - 15] | 0;\n            const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n            const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n            // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n            const W2h = SHA512_W_H[i - 2] | 0;\n            const W2l = SHA512_W_L[i - 2] | 0;\n            const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n            const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n            // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n            const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n            const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n            SHA512_W_H[i] = SUMh | 0;\n            SHA512_W_L[i] = SUMl | 0;\n        }\n        let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n        // Compression function main loop, 80 rounds\n        for (let i = 0; i < 80; i++) {\n            // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n            const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n            const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n            //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n            const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n            const CHIl = (El & Fl) ^ (~El & Gl);\n            // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n            // prettier-ignore\n            const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n            const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n            const T1l = T1ll | 0;\n            // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n            const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n            const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n            const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n            const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n            Hh = Gh | 0;\n            Hl = Gl | 0;\n            Gh = Fh | 0;\n            Gl = Fl | 0;\n            Fh = Eh | 0;\n            Fl = El | 0;\n            ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n            Dh = Ch | 0;\n            Dl = Cl | 0;\n            Ch = Bh | 0;\n            Cl = Bl | 0;\n            Bh = Ah | 0;\n            Bl = Al | 0;\n            const All = u64.add3L(T1l, sigma0l, MAJl);\n            Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n            Al = All | 0;\n        }\n        // Add the compressed chunk to the current hash value\n        ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n        ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n        ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n        ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n        ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n        ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n        ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n        ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n        this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n    }\n    roundClean() {\n        clean(SHA512_W_H, SHA512_W_L);\n    }\n    destroy() {\n        clean(this.buffer);\n        this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n    }\n}\nexport class SHA384 extends SHA512 {\n    constructor() {\n        super(48);\n        this.Ah = SHA384_IV[0] | 0;\n        this.Al = SHA384_IV[1] | 0;\n        this.Bh = SHA384_IV[2] | 0;\n        this.Bl = SHA384_IV[3] | 0;\n        this.Ch = SHA384_IV[4] | 0;\n        this.Cl = SHA384_IV[5] | 0;\n        this.Dh = SHA384_IV[6] | 0;\n        this.Dl = SHA384_IV[7] | 0;\n        this.Eh = SHA384_IV[8] | 0;\n        this.El = SHA384_IV[9] | 0;\n        this.Fh = SHA384_IV[10] | 0;\n        this.Fl = SHA384_IV[11] | 0;\n        this.Gh = SHA384_IV[12] | 0;\n        this.Gl = SHA384_IV[13] | 0;\n        this.Hh = SHA384_IV[14] | 0;\n        this.Hl = SHA384_IV[15] | 0;\n    }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n    0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n    0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n    0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n    0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\nexport class SHA512_224 extends SHA512 {\n    constructor() {\n        super(28);\n        this.Ah = T224_IV[0] | 0;\n        this.Al = T224_IV[1] | 0;\n        this.Bh = T224_IV[2] | 0;\n        this.Bl = T224_IV[3] | 0;\n        this.Ch = T224_IV[4] | 0;\n        this.Cl = T224_IV[5] | 0;\n        this.Dh = T224_IV[6] | 0;\n        this.Dl = T224_IV[7] | 0;\n        this.Eh = T224_IV[8] | 0;\n        this.El = T224_IV[9] | 0;\n        this.Fh = T224_IV[10] | 0;\n        this.Fl = T224_IV[11] | 0;\n        this.Gh = T224_IV[12] | 0;\n        this.Gl = T224_IV[13] | 0;\n        this.Hh = T224_IV[14] | 0;\n        this.Hl = T224_IV[15] | 0;\n    }\n}\nexport class SHA512_256 extends SHA512 {\n    constructor() {\n        super(32);\n        this.Ah = T256_IV[0] | 0;\n        this.Al = T256_IV[1] | 0;\n        this.Bh = T256_IV[2] | 0;\n        this.Bl = T256_IV[3] | 0;\n        this.Ch = T256_IV[4] | 0;\n        this.Cl = T256_IV[5] | 0;\n        this.Dh = T256_IV[6] | 0;\n        this.Dl = T256_IV[7] | 0;\n        this.Eh = T256_IV[8] | 0;\n        this.El = T256_IV[9] | 0;\n        this.Fh = T256_IV[10] | 0;\n        this.Fl = T256_IV[11] | 0;\n        this.Gh = T256_IV[12] | 0;\n        this.Gl = T256_IV[13] | 0;\n        this.Hh = T256_IV[14] | 0;\n        this.Hl = T256_IV[15] | 0;\n    }\n}\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new SHA224());\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new SHA384());\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new SHA512_224());\n//# sourceMappingURL=sha2.js.map","/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nimport { SHA224 as SHA224n, sha224 as sha224n, SHA256 as SHA256n, sha256 as sha256n, } from \"./sha2.js\";\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA256 = SHA256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha256 = sha256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA224 = SHA224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha224 = sha224n;\n//# sourceMappingURL=sha256.js.map","import { sha256 as noble_sha256 } from '@noble/hashes/sha256';\nimport { isHex } from '../data/isHex.js';\nimport { toBytes } from '../encoding/toBytes.js';\nimport { toHex } from '../encoding/toHex.js';\nexport function sha256(value, to_) {\n    const to = to_ || 'hex';\n    const bytes = noble_sha256(isHex(value, { strict: false }) ? toBytes(value) : value);\n    if (to === 'bytes')\n        return bytes;\n    return toHex(bytes);\n}\n//# sourceMappingURL=sha256.js.map","import { bytesToHex } from '../encoding/toHex.js';\nimport { sha256 } from '../hash/sha256.js';\n/**\n * Transform a commitment to it's versioned hash.\n *\n * @example\n * ```ts\n * import {\n *   blobsToCommitments,\n *   commitmentToVersionedHash,\n *   toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const [commitment] = blobsToCommitments({ blobs, kzg })\n * const versionedHash = commitmentToVersionedHash({ commitment })\n * ```\n */\nexport function commitmentToVersionedHash(parameters) {\n    const { commitment, version = 1 } = parameters;\n    const to = parameters.to ?? (typeof commitment === 'string' ? 'hex' : 'bytes');\n    const versionedHash = sha256(commitment, 'bytes');\n    versionedHash.set([version], 0);\n    return (to === 'bytes' ? versionedHash : bytesToHex(versionedHash));\n}\n//# sourceMappingURL=commitmentToVersionedHash.js.map","import { commitmentToVersionedHash, } from './commitmentToVersionedHash.js';\n/**\n * Transform a list of commitments to their versioned hashes.\n *\n * @example\n * ```ts\n * import {\n *   blobsToCommitments,\n *   commitmentsToVersionedHashes,\n *   toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const versionedHashes = commitmentsToVersionedHashes({ commitments })\n * ```\n */\nexport function commitmentsToVersionedHashes(parameters) {\n    const { commitments, version } = parameters;\n    const to = parameters.to ?? (typeof commitments[0] === 'string' ? 'hex' : 'bytes');\n    const hashes = [];\n    for (const commitment of commitments) {\n        hashes.push(commitmentToVersionedHash({\n            commitment,\n            to,\n            version,\n        }));\n    }\n    return hashes;\n}\n//# sourceMappingURL=commitmentsToVersionedHashes.js.map","// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#parameters\n/** Blob limit per transaction. */\nconst blobsPerTransaction = 6;\n/** The number of bytes in a BLS scalar field element. */\nexport const bytesPerFieldElement = 32;\n/** The number of field elements in a blob. */\nexport const fieldElementsPerBlob = 4096;\n/** The number of bytes in a blob. */\nexport const bytesPerBlob = bytesPerFieldElement * fieldElementsPerBlob;\n/** Blob bytes limit per transaction. */\nexport const maxBytesPerTransaction = bytesPerBlob * blobsPerTransaction -\n    // terminator byte (0x80).\n    1 -\n    // zero byte (0x00) appended to each field element.\n    1 * fieldElementsPerBlob * blobsPerTransaction;\n//# sourceMappingURL=blob.js.map","// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#parameters\nexport const versionedHashVersionKzg = 1;\n//# sourceMappingURL=kzg.js.map","import { versionedHashVersionKzg } from '../constants/kzg.js';\nimport { BaseError } from './base.js';\nexport class BlobSizeTooLargeError extends BaseError {\n    constructor({ maxSize, size }) {\n        super('Blob size is too large.', {\n            metaMessages: [`Max: ${maxSize} bytes`, `Given: ${size} bytes`],\n            name: 'BlobSizeTooLargeError',\n        });\n    }\n}\nexport class EmptyBlobError extends BaseError {\n    constructor() {\n        super('Blob data must not be empty.', { name: 'EmptyBlobError' });\n    }\n}\nexport class InvalidVersionedHashSizeError extends BaseError {\n    constructor({ hash, size, }) {\n        super(`Versioned hash \"${hash}\" size is invalid.`, {\n            metaMessages: ['Expected: 32', `Received: ${size}`],\n            name: 'InvalidVersionedHashSizeError',\n        });\n    }\n}\nexport class InvalidVersionedHashVersionError extends BaseError {\n    constructor({ hash, version, }) {\n        super(`Versioned hash \"${hash}\" version is invalid.`, {\n            metaMessages: [\n                `Expected: ${versionedHashVersionKzg}`,\n                `Received: ${version}`,\n            ],\n            name: 'InvalidVersionedHashVersionError',\n        });\n    }\n}\n//# sourceMappingURL=blob.js.map","import { bytesPerBlob, bytesPerFieldElement, fieldElementsPerBlob, maxBytesPerTransaction, } from '../../constants/blob.js';\nimport { BlobSizeTooLargeError, EmptyBlobError, } from '../../errors/blob.js';\nimport { createCursor } from '../cursor.js';\nimport { size } from '../data/size.js';\nimport { hexToBytes } from '../encoding/toBytes.js';\nimport { bytesToHex } from '../encoding/toHex.js';\n/**\n * Transforms arbitrary data to blobs.\n *\n * @example\n * ```ts\n * import { toBlobs, stringToHex } from 'viem'\n *\n * const blobs = toBlobs({ data: stringToHex('hello world') })\n * ```\n */\nexport function toBlobs(parameters) {\n    const to = parameters.to ?? (typeof parameters.data === 'string' ? 'hex' : 'bytes');\n    const data = (typeof parameters.data === 'string'\n        ? hexToBytes(parameters.data)\n        : parameters.data);\n    const size_ = size(data);\n    if (!size_)\n        throw new EmptyBlobError();\n    if (size_ > maxBytesPerTransaction)\n        throw new BlobSizeTooLargeError({\n            maxSize: maxBytesPerTransaction,\n            size: size_,\n        });\n    const blobs = [];\n    let active = true;\n    let position = 0;\n    while (active) {\n        const blob = createCursor(new Uint8Array(bytesPerBlob));\n        let size = 0;\n        while (size < fieldElementsPerBlob) {\n            const bytes = data.slice(position, position + (bytesPerFieldElement - 1));\n            // Push a zero byte so the field element doesn't overflow the BLS modulus.\n            blob.pushByte(0x00);\n            // Push the current segment of data bytes.\n            blob.pushBytes(bytes);\n            // If we detect that the current segment of data bytes is less than 31 bytes,\n            // we can stop processing and push a terminator byte to indicate the end of the blob.\n            if (bytes.length < 31) {\n                blob.pushByte(0x80);\n                active = false;\n                break;\n            }\n            size++;\n            position += 31;\n        }\n        blobs.push(blob);\n    }\n    return (to === 'bytes'\n        ? blobs.map((x) => x.bytes)\n        : blobs.map((x) => bytesToHex(x.bytes)));\n}\n//# sourceMappingURL=toBlobs.js.map","import { blobsToCommitments, } from './blobsToCommitments.js';\nimport { blobsToProofs } from './blobsToProofs.js';\nimport { toBlobs } from './toBlobs.js';\n/**\n * Transforms arbitrary data (or blobs, commitments, & proofs) into a sidecar array.\n *\n * @example\n * ```ts\n * import { toBlobSidecars, stringToHex } from 'viem'\n *\n * const sidecars = toBlobSidecars({ data: stringToHex('hello world') })\n * ```\n *\n * @example\n * ```ts\n * import {\n *   blobsToCommitments,\n *   toBlobs,\n *   blobsToProofs,\n *   toBlobSidecars,\n *   stringToHex\n * } from 'viem'\n *\n * const blobs = toBlobs({ data: stringToHex('hello world') })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const proofs = blobsToProofs({ blobs, commitments, kzg })\n *\n * const sidecars = toBlobSidecars({ blobs, commitments, proofs })\n * ```\n */\nexport function toBlobSidecars(parameters) {\n    const { data, kzg, to } = parameters;\n    const blobs = parameters.blobs ?? toBlobs({ data: data, to });\n    const commitments = parameters.commitments ?? blobsToCommitments({ blobs, kzg: kzg, to });\n    const proofs = parameters.proofs ?? blobsToProofs({ blobs, commitments, kzg: kzg, to });\n    const sidecars = [];\n    for (let i = 0; i < blobs.length; i++)\n        sidecars.push({\n            blob: blobs[i],\n            commitment: commitments[i],\n            proof: proofs[i],\n        });\n    return sidecars;\n}\n//# sourceMappingURL=toBlobSidecars.js.map","import { InvalidSerializableTransactionError, } from '../../errors/transaction.js';\nexport function getTransactionType(transaction) {\n    if (transaction.type)\n        return transaction.type;\n    if (typeof transaction.authorizationList !== 'undefined')\n        return 'eip7702';\n    if (typeof transaction.blobs !== 'undefined' ||\n        typeof transaction.blobVersionedHashes !== 'undefined' ||\n        typeof transaction.maxFeePerBlobGas !== 'undefined' ||\n        typeof transaction.sidecars !== 'undefined')\n        return 'eip4844';\n    if (typeof transaction.maxFeePerGas !== 'undefined' ||\n        typeof transaction.maxPriorityFeePerGas !== 'undefined') {\n        return 'eip1559';\n    }\n    if (typeof transaction.gasPrice !== 'undefined') {\n        if (typeof transaction.accessList !== 'undefined')\n            return 'eip2930';\n        return 'legacy';\n    }\n    throw new InvalidSerializableTransactionError({ transaction });\n}\n//# sourceMappingURL=getTransactionType.js.map","import { parseAccount, } from '../../accounts/utils/parseAccount.js';\nimport { internal_estimateFeesPerGas, } from '../../actions/public/estimateFeesPerGas.js';\nimport { estimateGas, } from '../../actions/public/estimateGas.js';\nimport { getBlock as getBlock_, } from '../../actions/public/getBlock.js';\nimport { getTransactionCount, } from '../../actions/public/getTransactionCount.js';\nimport { Eip1559FeesNotSupportedError, MaxFeePerGasTooLowError, } from '../../errors/fee.js';\nimport { blobsToCommitments } from '../../utils/blob/blobsToCommitments.js';\nimport { blobsToProofs } from '../../utils/blob/blobsToProofs.js';\nimport { commitmentsToVersionedHashes } from '../../utils/blob/commitmentsToVersionedHashes.js';\nimport { toBlobSidecars } from '../../utils/blob/toBlobSidecars.js';\nimport { getAction } from '../../utils/getAction.js';\nimport { assertRequest, } from '../../utils/transaction/assertRequest.js';\nimport { getTransactionType, } from '../../utils/transaction/getTransactionType.js';\nimport { getChainId as getChainId_ } from '../public/getChainId.js';\nexport const defaultParameters = [\n    'blobVersionedHashes',\n    'chainId',\n    'fees',\n    'gas',\n    'nonce',\n    'type',\n];\n/** @internal */\nexport const eip1559NetworkCache = /*#__PURE__*/ new Map();\n/**\n * Prepares a transaction request for signing.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest\n *\n * @param args - {@link PrepareTransactionRequestParameters}\n * @returns The transaction request. {@link PrepareTransactionRequestReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { prepareTransactionRequest } from 'viem/actions'\n *\n * const client = createWalletClient({\n *   chain: mainnet,\n *   transport: custom(window.ethereum),\n * })\n * const request = await prepareTransactionRequest(client, {\n *   account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *   to: '0x0000000000000000000000000000000000000000',\n *   value: 1n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { prepareTransactionRequest } from 'viem/actions'\n *\n * const client = createWalletClient({\n *   account: privateKeyToAccount('0x…'),\n *   chain: mainnet,\n *   transport: custom(window.ethereum),\n * })\n * const request = await prepareTransactionRequest(client, {\n *   to: '0x0000000000000000000000000000000000000000',\n *   value: 1n,\n * })\n */\nexport async function prepareTransactionRequest(client, args) {\n    const { account: account_ = client.account, blobs, chain, gas, kzg, nonce, nonceManager, parameters = defaultParameters, type, } = args;\n    const account = account_ ? parseAccount(account_) : account_;\n    const request = { ...args, ...(account ? { from: account?.address } : {}) };\n    let block;\n    async function getBlock() {\n        if (block)\n            return block;\n        block = await getAction(client, getBlock_, 'getBlock')({ blockTag: 'latest' });\n        return block;\n    }\n    let chainId;\n    async function getChainId() {\n        if (chainId)\n            return chainId;\n        if (chain)\n            return chain.id;\n        if (typeof args.chainId !== 'undefined')\n            return args.chainId;\n        const chainId_ = await getAction(client, getChainId_, 'getChainId')({});\n        chainId = chainId_;\n        return chainId;\n    }\n    if (parameters.includes('nonce') && typeof nonce === 'undefined' && account) {\n        if (nonceManager) {\n            const chainId = await getChainId();\n            request.nonce = await nonceManager.consume({\n                address: account.address,\n                chainId,\n                client,\n            });\n        }\n        else {\n            request.nonce = await getAction(client, getTransactionCount, 'getTransactionCount')({\n                address: account.address,\n                blockTag: 'pending',\n            });\n        }\n    }\n    if ((parameters.includes('blobVersionedHashes') ||\n        parameters.includes('sidecars')) &&\n        blobs &&\n        kzg) {\n        const commitments = blobsToCommitments({ blobs, kzg });\n        if (parameters.includes('blobVersionedHashes')) {\n            const versionedHashes = commitmentsToVersionedHashes({\n                commitments,\n                to: 'hex',\n            });\n            request.blobVersionedHashes = versionedHashes;\n        }\n        if (parameters.includes('sidecars')) {\n            const proofs = blobsToProofs({ blobs, commitments, kzg });\n            const sidecars = toBlobSidecars({\n                blobs,\n                commitments,\n                proofs,\n                to: 'hex',\n            });\n            request.sidecars = sidecars;\n        }\n    }\n    if (parameters.includes('chainId'))\n        request.chainId = await getChainId();\n    if ((parameters.includes('fees') || parameters.includes('type')) &&\n        typeof type === 'undefined') {\n        try {\n            request.type = getTransactionType(request);\n        }\n        catch {\n            let isEip1559Network = eip1559NetworkCache.get(client.uid);\n            if (typeof isEip1559Network === 'undefined') {\n                const block = await getBlock();\n                isEip1559Network = typeof block?.baseFeePerGas === 'bigint';\n                eip1559NetworkCache.set(client.uid, isEip1559Network);\n            }\n            request.type = isEip1559Network ? 'eip1559' : 'legacy';\n        }\n    }\n    if (parameters.includes('fees')) {\n        // TODO(4844): derive blob base fees once https://github.com/ethereum/execution-apis/pull/486 is merged.\n        if (request.type !== 'legacy' && request.type !== 'eip2930') {\n            // EIP-1559 fees\n            if (typeof request.maxFeePerGas === 'undefined' ||\n                typeof request.maxPriorityFeePerGas === 'undefined') {\n                const block = await getBlock();\n                const { maxFeePerGas, maxPriorityFeePerGas } = await internal_estimateFeesPerGas(client, {\n                    block: block,\n                    chain,\n                    request: request,\n                });\n                if (typeof args.maxPriorityFeePerGas === 'undefined' &&\n                    args.maxFeePerGas &&\n                    args.maxFeePerGas < maxPriorityFeePerGas)\n                    throw new MaxFeePerGasTooLowError({\n                        maxPriorityFeePerGas,\n                    });\n                request.maxPriorityFeePerGas = maxPriorityFeePerGas;\n                request.maxFeePerGas = maxFeePerGas;\n            }\n        }\n        else {\n            // Legacy fees\n            if (typeof args.maxFeePerGas !== 'undefined' ||\n                typeof args.maxPriorityFeePerGas !== 'undefined')\n                throw new Eip1559FeesNotSupportedError();\n            if (typeof args.gasPrice === 'undefined') {\n                const block = await getBlock();\n                const { gasPrice: gasPrice_ } = await internal_estimateFeesPerGas(client, {\n                    block: block,\n                    chain,\n                    request: request,\n                    type: 'legacy',\n                });\n                request.gasPrice = gasPrice_;\n            }\n        }\n    }\n    if (parameters.includes('gas') && typeof gas === 'undefined')\n        request.gas = await getAction(client, estimateGas, 'estimateGas')({\n            ...request,\n            account: account\n                ? { address: account.address, type: 'json-rpc' }\n                : account,\n        });\n    assertRequest(request);\n    delete request.parameters;\n    return request;\n}\n//# sourceMappingURL=prepareTransactionRequest.js.map","/**\n * Sends a **signed** transaction to the network\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction\n * - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionParameters}\n * @returns The transaction hash. {@link SendRawTransactionReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n *   chain: mainnet,\n *   transport: custom(window.ethereum),\n * })\n *\n * const hash = await sendRawTransaction(client, {\n *   serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\nexport async function sendRawTransaction(client, { serializedTransaction }) {\n    return client.request({\n        method: 'eth_sendRawTransaction',\n        params: [serializedTransaction],\n    }, { retryCount: 0 });\n}\n//# sourceMappingURL=sendRawTransaction.js.map","import { parseAccount, } from '../../accounts/utils/parseAccount.js';\nimport { AccountNotFoundError, AccountTypeNotSupportedError, } from '../../errors/account.js';\nimport { BaseError } from '../../errors/base.js';\nimport { recoverAuthorizationAddress, } from '../../utils/authorization/recoverAuthorizationAddress.js';\nimport { assertCurrentChain, } from '../../utils/chain/assertCurrentChain.js';\nimport { getTransactionError, } from '../../utils/errors/getTransactionError.js';\nimport { extract } from '../../utils/formatters/extract.js';\nimport { formatTransactionRequest, } from '../../utils/formatters/transactionRequest.js';\nimport { getAction } from '../../utils/getAction.js';\nimport { LruMap } from '../../utils/lru.js';\nimport { assertRequest, } from '../../utils/transaction/assertRequest.js';\nimport { getChainId } from '../public/getChainId.js';\nimport { defaultParameters, prepareTransactionRequest, } from './prepareTransactionRequest.js';\nimport { sendRawTransaction, } from './sendRawTransaction.js';\nconst supportsWalletNamespace = new LruMap(128);\n/**\n * Creates, signs, and sends a new transaction to the network.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendTransaction\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_sending-transactions\n * - JSON-RPC Methods:\n *   - JSON-RPC Accounts: [`eth_sendTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendtransaction)\n *   - Local Accounts: [`eth_sendRawTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendrawtransaction)\n *\n * @param client - Client to use\n * @param parameters - {@link SendTransactionParameters}\n * @returns The [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash. {@link SendTransactionReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n *   chain: mainnet,\n *   transport: custom(window.ethereum),\n * })\n * const hash = await sendTransaction(client, {\n *   account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *   to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n *   value: 1000000000000000000n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { sendTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n *   account: privateKeyToAccount('0x…'),\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const hash = await sendTransaction(client, {\n *   to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n *   value: 1000000000000000000n,\n * })\n */\nexport async function sendTransaction(client, parameters) {\n    const { account: account_ = client.account, chain = client.chain, accessList, authorizationList, blobs, data, gas, gasPrice, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, nonce, type, value, ...rest } = parameters;\n    if (typeof account_ === 'undefined')\n        throw new AccountNotFoundError({\n            docsPath: '/docs/actions/wallet/sendTransaction',\n        });\n    const account = account_ ? parseAccount(account_) : null;\n    try {\n        assertRequest(parameters);\n        const to = await (async () => {\n            // If `to` exists on the parameters, use that.\n            if (parameters.to)\n                return parameters.to;\n            // If `to` is null, we are sending a deployment transaction.\n            if (parameters.to === null)\n                return undefined;\n            // If no `to` exists, and we are sending a EIP-7702 transaction, use the\n            // address of the first authorization in the list.\n            if (authorizationList && authorizationList.length > 0)\n                return await recoverAuthorizationAddress({\n                    authorization: authorizationList[0],\n                }).catch(() => {\n                    throw new BaseError('`to` is required. Could not infer from `authorizationList`.');\n                });\n            // Otherwise, we are sending a deployment transaction.\n            return undefined;\n        })();\n        if (account?.type === 'json-rpc' || account === null) {\n            let chainId;\n            if (chain !== null) {\n                chainId = await getAction(client, getChainId, 'getChainId')({});\n                assertCurrentChain({\n                    currentChainId: chainId,\n                    chain,\n                });\n            }\n            const chainFormat = client.chain?.formatters?.transactionRequest?.format;\n            const format = chainFormat || formatTransactionRequest;\n            const request = format({\n                // Pick out extra data that might exist on the chain's transaction request type.\n                ...extract(rest, { format: chainFormat }),\n                accessList,\n                authorizationList,\n                blobs,\n                chainId,\n                data,\n                from: account?.address,\n                gas,\n                gasPrice,\n                maxFeePerBlobGas,\n                maxFeePerGas,\n                maxPriorityFeePerGas,\n                nonce,\n                to,\n                type,\n                value,\n            });\n            const isWalletNamespaceSupported = supportsWalletNamespace.get(client.uid);\n            const method = isWalletNamespaceSupported\n                ? 'wallet_sendTransaction'\n                : 'eth_sendTransaction';\n            try {\n                return await client.request({\n                    method,\n                    params: [request],\n                }, { retryCount: 0 });\n            }\n            catch (e) {\n                if (isWalletNamespaceSupported === false)\n                    throw e;\n                const error = e;\n                // If the transport does not support the method or input, attempt to use the\n                // `wallet_sendTransaction` method.\n                if (error.name === 'InvalidInputRpcError' ||\n                    error.name === 'InvalidParamsRpcError' ||\n                    error.name === 'MethodNotFoundRpcError' ||\n                    error.name === 'MethodNotSupportedRpcError') {\n                    return await client\n                        .request({\n                        method: 'wallet_sendTransaction',\n                        params: [request],\n                    }, { retryCount: 0 })\n                        .then((hash) => {\n                        supportsWalletNamespace.set(client.uid, true);\n                        return hash;\n                    })\n                        .catch((e) => {\n                        const walletNamespaceError = e;\n                        if (walletNamespaceError.name === 'MethodNotFoundRpcError' ||\n                            walletNamespaceError.name === 'MethodNotSupportedRpcError') {\n                            supportsWalletNamespace.set(client.uid, false);\n                            throw error;\n                        }\n                        throw walletNamespaceError;\n                    });\n                }\n                throw error;\n            }\n        }\n        if (account?.type === 'local') {\n            // Prepare the request for signing (assign appropriate fees, etc.)\n            const request = await getAction(client, prepareTransactionRequest, 'prepareTransactionRequest')({\n                account,\n                accessList,\n                authorizationList,\n                blobs,\n                chain,\n                data,\n                gas,\n                gasPrice,\n                maxFeePerBlobGas,\n                maxFeePerGas,\n                maxPriorityFeePerGas,\n                nonce,\n                nonceManager: account.nonceManager,\n                parameters: [...defaultParameters, 'sidecars'],\n                type,\n                value,\n                ...rest,\n                to,\n            });\n            const serializer = chain?.serializers?.transaction;\n            const serializedTransaction = (await account.signTransaction(request, {\n                serializer,\n            }));\n            return await getAction(client, sendRawTransaction, 'sendRawTransaction')({\n                serializedTransaction,\n            });\n        }\n        if (account?.type === 'smart')\n            throw new AccountTypeNotSupportedError({\n                metaMessages: [\n                    'Consider using the `sendUserOperation` Action instead.',\n                ],\n                docsPath: '/docs/actions/bundler/sendUserOperation',\n                type: 'smart',\n            });\n        throw new AccountTypeNotSupportedError({\n            docsPath: '/docs/actions/wallet/sendTransaction',\n            type: account?.type,\n        });\n    }\n    catch (err) {\n        if (err instanceof AccountTypeNotSupportedError)\n            throw err;\n        throw getTransactionError(err, {\n            ...parameters,\n            account,\n            chain: parameters.chain || undefined,\n        });\n    }\n}\n//# sourceMappingURL=sendTransaction.js.map","/* [Multicall3](https://github.com/mds1/multicall) */\nexport const multicall3Abi = [\n    {\n        inputs: [\n            {\n                components: [\n                    {\n                        name: 'target',\n                        type: 'address',\n                    },\n                    {\n                        name: 'allowFailure',\n                        type: 'bool',\n                    },\n                    {\n                        name: 'callData',\n                        type: 'bytes',\n                    },\n                ],\n                name: 'calls',\n                type: 'tuple[]',\n            },\n        ],\n        name: 'aggregate3',\n        outputs: [\n            {\n                components: [\n                    {\n                        name: 'success',\n                        type: 'bool',\n                    },\n                    {\n                        name: 'returnData',\n                        type: 'bytes',\n                    },\n                ],\n                name: 'returnData',\n                type: 'tuple[]',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n];\nexport const batchGatewayAbi = [\n    {\n        name: 'query',\n        type: 'function',\n        stateMutability: 'view',\n        inputs: [\n            {\n                type: 'tuple[]',\n                name: 'queries',\n                components: [\n                    {\n                        type: 'address',\n                        name: 'sender',\n                    },\n                    {\n                        type: 'string[]',\n                        name: 'urls',\n                    },\n                    {\n                        type: 'bytes',\n                        name: 'data',\n                    },\n                ],\n            },\n        ],\n        outputs: [\n            {\n                type: 'bool[]',\n                name: 'failures',\n            },\n            {\n                type: 'bytes[]',\n                name: 'responses',\n            },\n        ],\n    },\n    {\n        name: 'HttpError',\n        type: 'error',\n        inputs: [\n            {\n                type: 'uint16',\n                name: 'status',\n            },\n            {\n                type: 'string',\n                name: 'message',\n            },\n        ],\n    },\n];\nconst universalResolverErrors = [\n    {\n        inputs: [],\n        name: 'ResolverNotFound',\n        type: 'error',\n    },\n    {\n        inputs: [],\n        name: 'ResolverWildcardNotSupported',\n        type: 'error',\n    },\n    {\n        inputs: [],\n        name: 'ResolverNotContract',\n        type: 'error',\n    },\n    {\n        inputs: [\n            {\n                name: 'returnData',\n                type: 'bytes',\n            },\n        ],\n        name: 'ResolverError',\n        type: 'error',\n    },\n    {\n        inputs: [\n            {\n                components: [\n                    {\n                        name: 'status',\n                        type: 'uint16',\n                    },\n                    {\n                        name: 'message',\n                        type: 'string',\n                    },\n                ],\n                name: 'errors',\n                type: 'tuple[]',\n            },\n        ],\n        name: 'HttpError',\n        type: 'error',\n    },\n];\nexport const universalResolverResolveAbi = [\n    ...universalResolverErrors,\n    {\n        name: 'resolve',\n        type: 'function',\n        stateMutability: 'view',\n        inputs: [\n            { name: 'name', type: 'bytes' },\n            { name: 'data', type: 'bytes' },\n        ],\n        outputs: [\n            { name: '', type: 'bytes' },\n            { name: 'address', type: 'address' },\n        ],\n    },\n    {\n        name: 'resolve',\n        type: 'function',\n        stateMutability: 'view',\n        inputs: [\n            { name: 'name', type: 'bytes' },\n            { name: 'data', type: 'bytes' },\n            { name: 'gateways', type: 'string[]' },\n        ],\n        outputs: [\n            { name: '', type: 'bytes' },\n            { name: 'address', type: 'address' },\n        ],\n    },\n];\nexport const universalResolverReverseAbi = [\n    ...universalResolverErrors,\n    {\n        name: 'reverse',\n        type: 'function',\n        stateMutability: 'view',\n        inputs: [{ type: 'bytes', name: 'reverseName' }],\n        outputs: [\n            { type: 'string', name: 'resolvedName' },\n            { type: 'address', name: 'resolvedAddress' },\n            { type: 'address', name: 'reverseResolver' },\n            { type: 'address', name: 'resolver' },\n        ],\n    },\n    {\n        name: 'reverse',\n        type: 'function',\n        stateMutability: 'view',\n        inputs: [\n            { type: 'bytes', name: 'reverseName' },\n            { type: 'string[]', name: 'gateways' },\n        ],\n        outputs: [\n            { type: 'string', name: 'resolvedName' },\n            { type: 'address', name: 'resolvedAddress' },\n            { type: 'address', name: 'reverseResolver' },\n            { type: 'address', name: 'resolver' },\n        ],\n    },\n];\nexport const textResolverAbi = [\n    {\n        name: 'text',\n        type: 'function',\n        stateMutability: 'view',\n        inputs: [\n            { name: 'name', type: 'bytes32' },\n            { name: 'key', type: 'string' },\n        ],\n        outputs: [{ name: '', type: 'string' }],\n    },\n];\nexport const addressResolverAbi = [\n    {\n        name: 'addr',\n        type: 'function',\n        stateMutability: 'view',\n        inputs: [{ name: 'name', type: 'bytes32' }],\n        outputs: [{ name: '', type: 'address' }],\n    },\n    {\n        name: 'addr',\n        type: 'function',\n        stateMutability: 'view',\n        inputs: [\n            { name: 'name', type: 'bytes32' },\n            { name: 'coinType', type: 'uint256' },\n        ],\n        outputs: [{ name: '', type: 'bytes' }],\n    },\n];\n// ERC-1271\n// isValidSignature(bytes32 hash, bytes signature) → bytes4 magicValue\n/** @internal */\nexport const smartAccountAbi = [\n    {\n        name: 'isValidSignature',\n        type: 'function',\n        stateMutability: 'view',\n        inputs: [\n            { name: 'hash', type: 'bytes32' },\n            { name: 'signature', type: 'bytes' },\n        ],\n        outputs: [{ name: '', type: 'bytes4' }],\n    },\n];\n// ERC-6492 - universal deployless signature validator contract\n// constructor(address _signer, bytes32 _hash, bytes _signature) → bytes4 returnValue\n// returnValue is either 0x1 (valid) or 0x0 (invalid)\nexport const universalSignatureValidatorAbi = [\n    {\n        inputs: [\n            {\n                name: '_signer',\n                type: 'address',\n            },\n            {\n                name: '_hash',\n                type: 'bytes32',\n            },\n            {\n                name: '_signature',\n                type: 'bytes',\n            },\n        ],\n        stateMutability: 'nonpayable',\n        type: 'constructor',\n    },\n    {\n        inputs: [\n            {\n                name: '_signer',\n                type: 'address',\n            },\n            {\n                name: '_hash',\n                type: 'bytes32',\n            },\n            {\n                name: '_signature',\n                type: 'bytes',\n            },\n        ],\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n        stateMutability: 'nonpayable',\n        type: 'function',\n        name: 'isValidSig',\n    },\n];\n/** [ERC-20 Token Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-20) */\nexport const erc20Abi = [\n    {\n        type: 'event',\n        name: 'Approval',\n        inputs: [\n            {\n                indexed: true,\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'spender',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                name: 'value',\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'event',\n        name: 'Transfer',\n        inputs: [\n            {\n                indexed: true,\n                name: 'from',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'to',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                name: 'value',\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'allowance',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                name: 'spender',\n                type: 'address',\n            },\n        ],\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'approve',\n        stateMutability: 'nonpayable',\n        inputs: [\n            {\n                name: 'spender',\n                type: 'address',\n            },\n            {\n                name: 'amount',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'balanceOf',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'account',\n                type: 'address',\n            },\n        ],\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'decimals',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'uint8',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'name',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'string',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'symbol',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'string',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'totalSupply',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'transfer',\n        stateMutability: 'nonpayable',\n        inputs: [\n            {\n                name: 'recipient',\n                type: 'address',\n            },\n            {\n                name: 'amount',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'transferFrom',\n        stateMutability: 'nonpayable',\n        inputs: [\n            {\n                name: 'sender',\n                type: 'address',\n            },\n            {\n                name: 'recipient',\n                type: 'address',\n            },\n            {\n                name: 'amount',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n    },\n];\n/**\n * [bytes32-flavored ERC-20](https://docs.makerdao.com/smart-contract-modules/mkr-module#4.-gotchas-potential-source-of-user-error)\n * for tokens (ie. Maker) that use bytes32 instead of string.\n */\nexport const erc20Abi_bytes32 = [\n    {\n        type: 'event',\n        name: 'Approval',\n        inputs: [\n            {\n                indexed: true,\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'spender',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                name: 'value',\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'event',\n        name: 'Transfer',\n        inputs: [\n            {\n                indexed: true,\n                name: 'from',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'to',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                name: 'value',\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'allowance',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                name: 'spender',\n                type: 'address',\n            },\n        ],\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'approve',\n        stateMutability: 'nonpayable',\n        inputs: [\n            {\n                name: 'spender',\n                type: 'address',\n            },\n            {\n                name: 'amount',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'balanceOf',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'account',\n                type: 'address',\n            },\n        ],\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'decimals',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'uint8',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'name',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'bytes32',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'symbol',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'bytes32',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'totalSupply',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'transfer',\n        stateMutability: 'nonpayable',\n        inputs: [\n            {\n                name: 'recipient',\n                type: 'address',\n            },\n            {\n                name: 'amount',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'transferFrom',\n        stateMutability: 'nonpayable',\n        inputs: [\n            {\n                name: 'sender',\n                type: 'address',\n            },\n            {\n                name: 'recipient',\n                type: 'address',\n            },\n            {\n                name: 'amount',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n    },\n];\n/** [ERC-1155 Multi Token Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-1155) */\nexport const erc1155Abi = [\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'sender',\n                type: 'address',\n            },\n            {\n                internalType: 'uint256',\n                name: 'balance',\n                type: 'uint256',\n            },\n            {\n                internalType: 'uint256',\n                name: 'needed',\n                type: 'uint256',\n            },\n            {\n                internalType: 'uint256',\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n        name: 'ERC1155InsufficientBalance',\n        type: 'error',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'approver',\n                type: 'address',\n            },\n        ],\n        name: 'ERC1155InvalidApprover',\n        type: 'error',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'uint256',\n                name: 'idsLength',\n                type: 'uint256',\n            },\n            {\n                internalType: 'uint256',\n                name: 'valuesLength',\n                type: 'uint256',\n            },\n        ],\n        name: 'ERC1155InvalidArrayLength',\n        type: 'error',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'operator',\n                type: 'address',\n            },\n        ],\n        name: 'ERC1155InvalidOperator',\n        type: 'error',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'receiver',\n                type: 'address',\n            },\n        ],\n        name: 'ERC1155InvalidReceiver',\n        type: 'error',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'sender',\n                type: 'address',\n            },\n        ],\n        name: 'ERC1155InvalidSender',\n        type: 'error',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'operator',\n                type: 'address',\n            },\n            {\n                internalType: 'address',\n                name: 'owner',\n                type: 'address',\n            },\n        ],\n        name: 'ERC1155MissingApprovalForAll',\n        type: 'error',\n    },\n    {\n        anonymous: false,\n        inputs: [\n            {\n                indexed: true,\n                internalType: 'address',\n                name: 'account',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                internalType: 'address',\n                name: 'operator',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                internalType: 'bool',\n                name: 'approved',\n                type: 'bool',\n            },\n        ],\n        name: 'ApprovalForAll',\n        type: 'event',\n    },\n    {\n        anonymous: false,\n        inputs: [\n            {\n                indexed: true,\n                internalType: 'address',\n                name: 'operator',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                internalType: 'address',\n                name: 'from',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                internalType: 'address',\n                name: 'to',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                internalType: 'uint256[]',\n                name: 'ids',\n                type: 'uint256[]',\n            },\n            {\n                indexed: false,\n                internalType: 'uint256[]',\n                name: 'values',\n                type: 'uint256[]',\n            },\n        ],\n        name: 'TransferBatch',\n        type: 'event',\n    },\n    {\n        anonymous: false,\n        inputs: [\n            {\n                indexed: true,\n                internalType: 'address',\n                name: 'operator',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                internalType: 'address',\n                name: 'from',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                internalType: 'address',\n                name: 'to',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                internalType: 'uint256',\n                name: 'id',\n                type: 'uint256',\n            },\n            {\n                indexed: false,\n                internalType: 'uint256',\n                name: 'value',\n                type: 'uint256',\n            },\n        ],\n        name: 'TransferSingle',\n        type: 'event',\n    },\n    {\n        anonymous: false,\n        inputs: [\n            {\n                indexed: false,\n                internalType: 'string',\n                name: 'value',\n                type: 'string',\n            },\n            {\n                indexed: true,\n                internalType: 'uint256',\n                name: 'id',\n                type: 'uint256',\n            },\n        ],\n        name: 'URI',\n        type: 'event',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'account',\n                type: 'address',\n            },\n            {\n                internalType: 'uint256',\n                name: 'id',\n                type: 'uint256',\n            },\n        ],\n        name: 'balanceOf',\n        outputs: [\n            {\n                internalType: 'uint256',\n                name: '',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address[]',\n                name: 'accounts',\n                type: 'address[]',\n            },\n            {\n                internalType: 'uint256[]',\n                name: 'ids',\n                type: 'uint256[]',\n            },\n        ],\n        name: 'balanceOfBatch',\n        outputs: [\n            {\n                internalType: 'uint256[]',\n                name: '',\n                type: 'uint256[]',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'account',\n                type: 'address',\n            },\n            {\n                internalType: 'address',\n                name: 'operator',\n                type: 'address',\n            },\n        ],\n        name: 'isApprovedForAll',\n        outputs: [\n            {\n                internalType: 'bool',\n                name: '',\n                type: 'bool',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'from',\n                type: 'address',\n            },\n            {\n                internalType: 'address',\n                name: 'to',\n                type: 'address',\n            },\n            {\n                internalType: 'uint256[]',\n                name: 'ids',\n                type: 'uint256[]',\n            },\n            {\n                internalType: 'uint256[]',\n                name: 'values',\n                type: 'uint256[]',\n            },\n            {\n                internalType: 'bytes',\n                name: 'data',\n                type: 'bytes',\n            },\n        ],\n        name: 'safeBatchTransferFrom',\n        outputs: [],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'from',\n                type: 'address',\n            },\n            {\n                internalType: 'address',\n                name: 'to',\n                type: 'address',\n            },\n            {\n                internalType: 'uint256',\n                name: 'id',\n                type: 'uint256',\n            },\n            {\n                internalType: 'uint256',\n                name: 'value',\n                type: 'uint256',\n            },\n            {\n                internalType: 'bytes',\n                name: 'data',\n                type: 'bytes',\n            },\n        ],\n        name: 'safeTransferFrom',\n        outputs: [],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'address',\n                name: 'operator',\n                type: 'address',\n            },\n            {\n                internalType: 'bool',\n                name: 'approved',\n                type: 'bool',\n            },\n        ],\n        name: 'setApprovalForAll',\n        outputs: [],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'bytes4',\n                name: 'interfaceId',\n                type: 'bytes4',\n            },\n        ],\n        name: 'supportsInterface',\n        outputs: [\n            {\n                internalType: 'bool',\n                name: '',\n                type: 'bool',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                internalType: 'uint256',\n                name: '',\n                type: 'uint256',\n            },\n        ],\n        name: 'uri',\n        outputs: [\n            {\n                internalType: 'string',\n                name: '',\n                type: 'string',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n];\n/** [ERC-721 Non-Fungible Token Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-721) */\nexport const erc721Abi = [\n    {\n        type: 'event',\n        name: 'Approval',\n        inputs: [\n            {\n                indexed: true,\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'spender',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'event',\n        name: 'ApprovalForAll',\n        inputs: [\n            {\n                indexed: true,\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'operator',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                name: 'approved',\n                type: 'bool',\n            },\n        ],\n    },\n    {\n        type: 'event',\n        name: 'Transfer',\n        inputs: [\n            {\n                indexed: true,\n                name: 'from',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'to',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'approve',\n        stateMutability: 'payable',\n        inputs: [\n            {\n                name: 'spender',\n                type: 'address',\n            },\n            {\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n        outputs: [],\n    },\n    {\n        type: 'function',\n        name: 'balanceOf',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'account',\n                type: 'address',\n            },\n        ],\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'getApproved',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                type: 'address',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'isApprovedForAll',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                name: 'operator',\n                type: 'address',\n            },\n        ],\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'name',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'string',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'ownerOf',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                name: 'owner',\n                type: 'address',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'safeTransferFrom',\n        stateMutability: 'payable',\n        inputs: [\n            {\n                name: 'from',\n                type: 'address',\n            },\n            {\n                name: 'to',\n                type: 'address',\n            },\n            {\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n        outputs: [],\n    },\n    {\n        type: 'function',\n        name: 'safeTransferFrom',\n        stateMutability: 'nonpayable',\n        inputs: [\n            {\n                name: 'from',\n                type: 'address',\n            },\n            {\n                name: 'to',\n                type: 'address',\n            },\n            {\n                name: 'id',\n                type: 'uint256',\n            },\n            {\n                name: 'data',\n                type: 'bytes',\n            },\n        ],\n        outputs: [],\n    },\n    {\n        type: 'function',\n        name: 'setApprovalForAll',\n        stateMutability: 'nonpayable',\n        inputs: [\n            {\n                name: 'operator',\n                type: 'address',\n            },\n            {\n                name: 'approved',\n                type: 'bool',\n            },\n        ],\n        outputs: [],\n    },\n    {\n        type: 'function',\n        name: 'symbol',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'string',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'tokenByIndex',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'index',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'tokenByIndex',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                name: 'index',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'tokenURI',\n        stateMutability: 'view',\n        inputs: [\n            {\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n        outputs: [\n            {\n                type: 'string',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'totalSupply',\n        stateMutability: 'view',\n        inputs: [],\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n    },\n    {\n        type: 'function',\n        name: 'transferFrom',\n        stateMutability: 'payable',\n        inputs: [\n            {\n                name: 'sender',\n                type: 'address',\n            },\n            {\n                name: 'recipient',\n                type: 'address',\n            },\n            {\n                name: 'tokenId',\n                type: 'uint256',\n            },\n        ],\n        outputs: [],\n    },\n];\n/** [ERC-4626 Tokenized Vaults Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626) */\nexport const erc4626Abi = [\n    {\n        anonymous: false,\n        inputs: [\n            {\n                indexed: true,\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'spender',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                name: 'value',\n                type: 'uint256',\n            },\n        ],\n        name: 'Approval',\n        type: 'event',\n    },\n    {\n        anonymous: false,\n        inputs: [\n            {\n                indexed: true,\n                name: 'sender',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'receiver',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                name: 'assets',\n                type: 'uint256',\n            },\n            {\n                indexed: false,\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        name: 'Deposit',\n        type: 'event',\n    },\n    {\n        anonymous: false,\n        inputs: [\n            {\n                indexed: true,\n                name: 'from',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'to',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                name: 'value',\n                type: 'uint256',\n            },\n        ],\n        name: 'Transfer',\n        type: 'event',\n    },\n    {\n        anonymous: false,\n        inputs: [\n            {\n                indexed: true,\n                name: 'sender',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'receiver',\n                type: 'address',\n            },\n            {\n                indexed: true,\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                indexed: false,\n                name: 'assets',\n                type: 'uint256',\n            },\n            {\n                indexed: false,\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        name: 'Withdraw',\n        type: 'event',\n    },\n    {\n        inputs: [\n            {\n                name: 'owner',\n                type: 'address',\n            },\n            {\n                name: 'spender',\n                type: 'address',\n            },\n        ],\n        name: 'allowance',\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'spender',\n                type: 'address',\n            },\n            {\n                name: 'amount',\n                type: 'uint256',\n            },\n        ],\n        name: 'approve',\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n    {\n        inputs: [],\n        name: 'asset',\n        outputs: [\n            {\n                name: 'assetTokenAddress',\n                type: 'address',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'account',\n                type: 'address',\n            },\n        ],\n        name: 'balanceOf',\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        name: 'convertToAssets',\n        outputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n        ],\n        name: 'convertToShares',\n        outputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n            {\n                name: 'receiver',\n                type: 'address',\n            },\n        ],\n        name: 'deposit',\n        outputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'caller',\n                type: 'address',\n            },\n        ],\n        name: 'maxDeposit',\n        outputs: [\n            {\n                name: 'maxAssets',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'caller',\n                type: 'address',\n            },\n        ],\n        name: 'maxMint',\n        outputs: [\n            {\n                name: 'maxShares',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'owner',\n                type: 'address',\n            },\n        ],\n        name: 'maxRedeem',\n        outputs: [\n            {\n                name: 'maxShares',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'owner',\n                type: 'address',\n            },\n        ],\n        name: 'maxWithdraw',\n        outputs: [\n            {\n                name: 'maxAssets',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n            {\n                name: 'receiver',\n                type: 'address',\n            },\n        ],\n        name: 'mint',\n        outputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n        ],\n        name: 'previewDeposit',\n        outputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        name: 'previewMint',\n        outputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        name: 'previewRedeem',\n        outputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n        ],\n        name: 'previewWithdraw',\n        outputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n            {\n                name: 'receiver',\n                type: 'address',\n            },\n            {\n                name: 'owner',\n                type: 'address',\n            },\n        ],\n        name: 'redeem',\n        outputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n    {\n        inputs: [],\n        name: 'totalAssets',\n        outputs: [\n            {\n                name: 'totalManagedAssets',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [],\n        name: 'totalSupply',\n        outputs: [\n            {\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'view',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'to',\n                type: 'address',\n            },\n            {\n                name: 'amount',\n                type: 'uint256',\n            },\n        ],\n        name: 'transfer',\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'from',\n                type: 'address',\n            },\n            {\n                name: 'to',\n                type: 'address',\n            },\n            {\n                name: 'amount',\n                type: 'uint256',\n            },\n        ],\n        name: 'transferFrom',\n        outputs: [\n            {\n                type: 'bool',\n            },\n        ],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n    {\n        inputs: [\n            {\n                name: 'assets',\n                type: 'uint256',\n            },\n            {\n                name: 'receiver',\n                type: 'address',\n            },\n            {\n                name: 'owner',\n                type: 'address',\n            },\n        ],\n        name: 'withdraw',\n        outputs: [\n            {\n                name: 'shares',\n                type: 'uint256',\n            },\n        ],\n        stateMutability: 'nonpayable',\n        type: 'function',\n    },\n];\n//# sourceMappingURL=abis.js.map","import { InvalidBytesBooleanError } from '../../errors/encoding.js';\nimport { trim } from '../data/trim.js';\nimport { assertSize, hexToBigInt, hexToNumber, } from './fromHex.js';\nimport { bytesToHex } from './toHex.js';\n/**\n * Decodes a byte array into a UTF-8 string, hex value, number, bigint or boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes\n * - Example: https://viem.sh/docs/utilities/fromBytes#usage\n *\n * @param bytes Byte array to decode.\n * @param toOrOpts Type to convert to or options.\n * @returns Decoded value.\n *\n * @example\n * import { fromBytes } from 'viem'\n * const data = fromBytes(new Uint8Array([1, 164]), 'number')\n * // 420\n *\n * @example\n * import { fromBytes } from 'viem'\n * const data = fromBytes(\n *   new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]),\n *   'string'\n * )\n * // 'Hello world'\n */\nexport function fromBytes(bytes, toOrOpts) {\n    const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts;\n    const to = opts.to;\n    if (to === 'number')\n        return bytesToNumber(bytes, opts);\n    if (to === 'bigint')\n        return bytesToBigInt(bytes, opts);\n    if (to === 'boolean')\n        return bytesToBool(bytes, opts);\n    if (to === 'string')\n        return bytesToString(bytes, opts);\n    return bytesToHex(bytes, opts);\n}\n/**\n * Decodes a byte array into a bigint.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestobigint\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns BigInt value.\n *\n * @example\n * import { bytesToBigInt } from 'viem'\n * const data = bytesToBigInt(new Uint8Array([1, 164]))\n * // 420n\n */\nexport function bytesToBigInt(bytes, opts = {}) {\n    if (typeof opts.size !== 'undefined')\n        assertSize(bytes, { size: opts.size });\n    const hex = bytesToHex(bytes, opts);\n    return hexToBigInt(hex, opts);\n}\n/**\n * Decodes a byte array into a boolean.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestobool\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns Boolean value.\n *\n * @example\n * import { bytesToBool } from 'viem'\n * const data = bytesToBool(new Uint8Array([1]))\n * // true\n */\nexport function bytesToBool(bytes_, opts = {}) {\n    let bytes = bytes_;\n    if (typeof opts.size !== 'undefined') {\n        assertSize(bytes, { size: opts.size });\n        bytes = trim(bytes);\n    }\n    if (bytes.length > 1 || bytes[0] > 1)\n        throw new InvalidBytesBooleanError(bytes);\n    return Boolean(bytes[0]);\n}\n/**\n * Decodes a byte array into a number.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestonumber\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns Number value.\n *\n * @example\n * import { bytesToNumber } from 'viem'\n * const data = bytesToNumber(new Uint8Array([1, 164]))\n * // 420\n */\nexport function bytesToNumber(bytes, opts = {}) {\n    if (typeof opts.size !== 'undefined')\n        assertSize(bytes, { size: opts.size });\n    const hex = bytesToHex(bytes, opts);\n    return hexToNumber(hex, opts);\n}\n/**\n * Decodes a byte array into a UTF-8 string.\n *\n * - Docs: https://viem.sh/docs/utilities/fromBytes#bytestostring\n *\n * @param bytes Byte array to decode.\n * @param opts Options.\n * @returns String value.\n *\n * @example\n * import { bytesToString } from 'viem'\n * const data = bytesToString(new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // 'Hello world'\n */\nexport function bytesToString(bytes_, opts = {}) {\n    let bytes = bytes_;\n    if (typeof opts.size !== 'undefined') {\n        assertSize(bytes, { size: opts.size });\n        bytes = trim(bytes, { dir: 'right' });\n    }\n    return new TextDecoder().decode(bytes);\n}\n//# sourceMappingURL=fromBytes.js.map","import { AbiDecodingDataSizeTooSmallError, AbiDecodingZeroDataError, InvalidAbiDecodingTypeError, } from '../../errors/abi.js';\nimport { checksumAddress, } from '../address/getAddress.js';\nimport { createCursor, } from '../cursor.js';\nimport { size } from '../data/size.js';\nimport { sliceBytes } from '../data/slice.js';\nimport { trim } from '../data/trim.js';\nimport { bytesToBigInt, bytesToBool, bytesToNumber, bytesToString, } from '../encoding/fromBytes.js';\nimport { hexToBytes } from '../encoding/toBytes.js';\nimport { bytesToHex } from '../encoding/toHex.js';\nimport { getArrayComponents } from './encodeAbiParameters.js';\nexport function decodeAbiParameters(params, data) {\n    const bytes = typeof data === 'string' ? hexToBytes(data) : data;\n    const cursor = createCursor(bytes);\n    if (size(bytes) === 0 && params.length > 0)\n        throw new AbiDecodingZeroDataError();\n    if (size(data) && size(data) < 32)\n        throw new AbiDecodingDataSizeTooSmallError({\n            data: typeof data === 'string' ? data : bytesToHex(data),\n            params: params,\n            size: size(data),\n        });\n    let consumed = 0;\n    const values = [];\n    for (let i = 0; i < params.length; ++i) {\n        const param = params[i];\n        cursor.setPosition(consumed);\n        const [data, consumed_] = decodeParameter(cursor, param, {\n            staticPosition: 0,\n        });\n        consumed += consumed_;\n        values.push(data);\n    }\n    return values;\n}\nfunction decodeParameter(cursor, param, { staticPosition }) {\n    const arrayComponents = getArrayComponents(param.type);\n    if (arrayComponents) {\n        const [length, type] = arrayComponents;\n        return decodeArray(cursor, { ...param, type }, { length, staticPosition });\n    }\n    if (param.type === 'tuple')\n        return decodeTuple(cursor, param, { staticPosition });\n    if (param.type === 'address')\n        return decodeAddress(cursor);\n    if (param.type === 'bool')\n        return decodeBool(cursor);\n    if (param.type.startsWith('bytes'))\n        return decodeBytes(cursor, param, { staticPosition });\n    if (param.type.startsWith('uint') || param.type.startsWith('int'))\n        return decodeNumber(cursor, param);\n    if (param.type === 'string')\n        return decodeString(cursor, { staticPosition });\n    throw new InvalidAbiDecodingTypeError(param.type, {\n        docsPath: '/docs/contract/decodeAbiParameters',\n    });\n}\n////////////////////////////////////////////////////////////////////\n// Type Decoders\nconst sizeOfLength = 32;\nconst sizeOfOffset = 32;\nfunction decodeAddress(cursor) {\n    const value = cursor.readBytes(32);\n    return [checksumAddress(bytesToHex(sliceBytes(value, -20))), 32];\n}\nfunction decodeArray(cursor, param, { length, staticPosition }) {\n    // If the length of the array is not known in advance (dynamic array),\n    // this means we will need to wonder off to the pointer and decode.\n    if (!length) {\n        // Dealing with a dynamic type, so get the offset of the array data.\n        const offset = bytesToNumber(cursor.readBytes(sizeOfOffset));\n        // Start is the static position of current slot + offset.\n        const start = staticPosition + offset;\n        const startOfData = start + sizeOfLength;\n        // Get the length of the array from the offset.\n        cursor.setPosition(start);\n        const length = bytesToNumber(cursor.readBytes(sizeOfLength));\n        // Check if the array has any dynamic children.\n        const dynamicChild = hasDynamicChild(param);\n        let consumed = 0;\n        const value = [];\n        for (let i = 0; i < length; ++i) {\n            // If any of the children is dynamic, then all elements will be offset pointer, thus size of one slot (32 bytes).\n            // Otherwise, elements will be the size of their encoding (consumed bytes).\n            cursor.setPosition(startOfData + (dynamicChild ? i * 32 : consumed));\n            const [data, consumed_] = decodeParameter(cursor, param, {\n                staticPosition: startOfData,\n            });\n            consumed += consumed_;\n            value.push(data);\n        }\n        // As we have gone wondering, restore to the original position + next slot.\n        cursor.setPosition(staticPosition + 32);\n        return [value, 32];\n    }\n    // If the length of the array is known in advance,\n    // and the length of an element deeply nested in the array is not known,\n    // we need to decode the offset of the array data.\n    if (hasDynamicChild(param)) {\n        // Dealing with dynamic types, so get the offset of the array data.\n        const offset = bytesToNumber(cursor.readBytes(sizeOfOffset));\n        // Start is the static position of current slot + offset.\n        const start = staticPosition + offset;\n        const value = [];\n        for (let i = 0; i < length; ++i) {\n            // Move cursor along to the next slot (next offset pointer).\n            cursor.setPosition(start + i * 32);\n            const [data] = decodeParameter(cursor, param, {\n                staticPosition: start,\n            });\n            value.push(data);\n        }\n        // As we have gone wondering, restore to the original position + next slot.\n        cursor.setPosition(staticPosition + 32);\n        return [value, 32];\n    }\n    // If the length of the array is known in advance and the array is deeply static,\n    // then we can just decode each element in sequence.\n    let consumed = 0;\n    const value = [];\n    for (let i = 0; i < length; ++i) {\n        const [data, consumed_] = decodeParameter(cursor, param, {\n            staticPosition: staticPosition + consumed,\n        });\n        consumed += consumed_;\n        value.push(data);\n    }\n    return [value, consumed];\n}\nfunction decodeBool(cursor) {\n    return [bytesToBool(cursor.readBytes(32), { size: 32 }), 32];\n}\nfunction decodeBytes(cursor, param, { staticPosition }) {\n    const [_, size] = param.type.split('bytes');\n    if (!size) {\n        // Dealing with dynamic types, so get the offset of the bytes data.\n        const offset = bytesToNumber(cursor.readBytes(32));\n        // Set position of the cursor to start of bytes data.\n        cursor.setPosition(staticPosition + offset);\n        const length = bytesToNumber(cursor.readBytes(32));\n        // If there is no length, we have zero data.\n        if (length === 0) {\n            // As we have gone wondering, restore to the original position + next slot.\n            cursor.setPosition(staticPosition + 32);\n            return ['0x', 32];\n        }\n        const data = cursor.readBytes(length);\n        // As we have gone wondering, restore to the original position + next slot.\n        cursor.setPosition(staticPosition + 32);\n        return [bytesToHex(data), 32];\n    }\n    const value = bytesToHex(cursor.readBytes(Number.parseInt(size), 32));\n    return [value, 32];\n}\nfunction decodeNumber(cursor, param) {\n    const signed = param.type.startsWith('int');\n    const size = Number.parseInt(param.type.split('int')[1] || '256');\n    const value = cursor.readBytes(32);\n    return [\n        size > 48\n            ? bytesToBigInt(value, { signed })\n            : bytesToNumber(value, { signed }),\n        32,\n    ];\n}\nfunction decodeTuple(cursor, param, { staticPosition }) {\n    // Tuples can have unnamed components (i.e. they are arrays), so we must\n    // determine whether the tuple is named or unnamed. In the case of a named\n    // tuple, the value will be an object where each property is the name of the\n    // component. In the case of an unnamed tuple, the value will be an array.\n    const hasUnnamedChild = param.components.length === 0 || param.components.some(({ name }) => !name);\n    // Initialize the value to an object or an array, depending on whether the\n    // tuple is named or unnamed.\n    const value = hasUnnamedChild ? [] : {};\n    let consumed = 0;\n    // If the tuple has a dynamic child, we must first decode the offset to the\n    // tuple data.\n    if (hasDynamicChild(param)) {\n        // Dealing with dynamic types, so get the offset of the tuple data.\n        const offset = bytesToNumber(cursor.readBytes(sizeOfOffset));\n        // Start is the static position of referencing slot + offset.\n        const start = staticPosition + offset;\n        for (let i = 0; i < param.components.length; ++i) {\n            const component = param.components[i];\n            cursor.setPosition(start + consumed);\n            const [data, consumed_] = decodeParameter(cursor, component, {\n                staticPosition: start,\n            });\n            consumed += consumed_;\n            value[hasUnnamedChild ? i : component?.name] = data;\n        }\n        // As we have gone wondering, restore to the original position + next slot.\n        cursor.setPosition(staticPosition + 32);\n        return [value, 32];\n    }\n    // If the tuple has static children, we can just decode each component\n    // in sequence.\n    for (let i = 0; i < param.components.length; ++i) {\n        const component = param.components[i];\n        const [data, consumed_] = decodeParameter(cursor, component, {\n            staticPosition,\n        });\n        value[hasUnnamedChild ? i : component?.name] = data;\n        consumed += consumed_;\n    }\n    return [value, consumed];\n}\nfunction decodeString(cursor, { staticPosition }) {\n    // Get offset to start of string data.\n    const offset = bytesToNumber(cursor.readBytes(32));\n    // Start is the static position of current slot + offset.\n    const start = staticPosition + offset;\n    cursor.setPosition(start);\n    const length = bytesToNumber(cursor.readBytes(32));\n    // If there is no length, we have zero data (empty string).\n    if (length === 0) {\n        cursor.setPosition(staticPosition + 32);\n        return ['', 32];\n    }\n    const data = cursor.readBytes(length, 32);\n    const value = bytesToString(trim(data));\n    // As we have gone wondering, restore to the original position + next slot.\n    cursor.setPosition(staticPosition + 32);\n    return [value, 32];\n}\nfunction hasDynamicChild(param) {\n    const { type } = param;\n    if (type === 'string')\n        return true;\n    if (type === 'bytes')\n        return true;\n    if (type.endsWith('[]'))\n        return true;\n    if (type === 'tuple')\n        return param.components?.some(hasDynamicChild);\n    const arrayComponents = getArrayComponents(param.type);\n    if (arrayComponents &&\n        hasDynamicChild({ ...param, type: arrayComponents[1] }))\n        return true;\n    return false;\n}\n//# sourceMappingURL=decodeAbiParameters.js.map","import { toBytes } from '../encoding/toBytes.js';\nimport { keccak256 } from './keccak256.js';\nconst hash = (value) => keccak256(toBytes(value));\nexport function hashSignature(sig) {\n    return hash(sig);\n}\n//# sourceMappingURL=hashSignature.js.map","export const version = '1.0.8';\n//# sourceMappingURL=version.js.map","import { version } from './version.js';\nexport class BaseError extends Error {\n    constructor(shortMessage, args = {}) {\n        const details = args.cause instanceof BaseError\n            ? args.cause.details\n            : args.cause?.message\n                ? args.cause.message\n                : args.details;\n        const docsPath = args.cause instanceof BaseError\n            ? args.cause.docsPath || args.docsPath\n            : args.docsPath;\n        const message = [\n            shortMessage || 'An error occurred.',\n            '',\n            ...(args.metaMessages ? [...args.metaMessages, ''] : []),\n            ...(docsPath ? [`Docs: https://abitype.dev${docsPath}`] : []),\n            ...(details ? [`Details: ${details}`] : []),\n            `Version: abitype@${version}`,\n        ].join('\\n');\n        super(message);\n        Object.defineProperty(this, \"details\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"docsPath\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"metaMessages\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"shortMessage\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'AbiTypeError'\n        });\n        if (args.cause)\n            this.cause = args.cause;\n        this.details = details;\n        this.docsPath = docsPath;\n        this.metaMessages = args.metaMessages;\n        this.shortMessage = shortMessage;\n    }\n}\n//# sourceMappingURL=errors.js.map","// TODO: This looks cool. Need to check the performance of `new RegExp` versus defined inline though.\n// https://twitter.com/GabrielVergnaud/status/1622906834343366657\nexport function execTyped(regex, string) {\n    const match = regex.exec(string);\n    return match?.groups;\n}\n// `bytes<M>`: binary type of `M` bytes, `0 < M <= 32`\n// https://regexr.com/6va55\nexport const bytesRegex = /^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/;\n// `(u)int<M>`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n// https://regexr.com/6v8hp\nexport const integerRegex = /^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/;\nexport const isTupleRegex = /^\\(.+?\\).*?$/;\n//# sourceMappingURL=regex.js.map","import { execTyped } from '../regex.js';\n// https://regexr.com/7f7rv\nconst tupleRegex = /^tuple(?<array>(\\[(\\d*)\\])*)$/;\n/**\n * Formats {@link AbiParameter} to human-readable ABI parameter.\n *\n * @param abiParameter - ABI parameter\n * @returns Human-readable ABI parameter\n *\n * @example\n * const result = formatAbiParameter({ type: 'address', name: 'from' })\n * //    ^? const result: 'address from'\n */\nexport function formatAbiParameter(abiParameter) {\n    let type = abiParameter.type;\n    if (tupleRegex.test(abiParameter.type) && 'components' in abiParameter) {\n        type = '(';\n        const length = abiParameter.components.length;\n        for (let i = 0; i < length; i++) {\n            const component = abiParameter.components[i];\n            type += formatAbiParameter(component);\n            if (i < length - 1)\n                type += ', ';\n        }\n        const result = execTyped(tupleRegex, abiParameter.type);\n        type += `)${result?.array ?? ''}`;\n        return formatAbiParameter({\n            ...abiParameter,\n            type,\n        });\n    }\n    // Add `indexed` to type if in `abiParameter`\n    if ('indexed' in abiParameter && abiParameter.indexed)\n        type = `${type} indexed`;\n    // Return human-readable ABI parameter\n    if (abiParameter.name)\n        return `${type} ${abiParameter.name}`;\n    return type;\n}\n//# sourceMappingURL=formatAbiParameter.js.map","import { formatAbiParameter, } from './formatAbiParameter.js';\n/**\n * Formats {@link AbiParameter}s to human-readable ABI parameters.\n *\n * @param abiParameters - ABI parameters\n * @returns Human-readable ABI parameters\n *\n * @example\n * const result = formatAbiParameters([\n *   //  ^? const result: 'address from, uint256 tokenId'\n *   { type: 'address', name: 'from' },\n *   { type: 'uint256', name: 'tokenId' },\n * ])\n */\nexport function formatAbiParameters(abiParameters) {\n    let params = '';\n    const length = abiParameters.length;\n    for (let i = 0; i < length; i++) {\n        const abiParameter = abiParameters[i];\n        params += formatAbiParameter(abiParameter);\n        if (i !== length - 1)\n            params += ', ';\n    }\n    return params;\n}\n//# sourceMappingURL=formatAbiParameters.js.map","import { formatAbiParameters, } from './formatAbiParameters.js';\n/**\n * Formats ABI item (e.g. error, event, function) into human-readable ABI item\n *\n * @param abiItem - ABI item\n * @returns Human-readable ABI item\n */\nexport function formatAbiItem(abiItem) {\n    if (abiItem.type === 'function')\n        return `function ${abiItem.name}(${formatAbiParameters(abiItem.inputs)})${abiItem.stateMutability && abiItem.stateMutability !== 'nonpayable'\n            ? ` ${abiItem.stateMutability}`\n            : ''}${abiItem.outputs?.length\n            ? ` returns (${formatAbiParameters(abiItem.outputs)})`\n            : ''}`;\n    if (abiItem.type === 'event')\n        return `event ${abiItem.name}(${formatAbiParameters(abiItem.inputs)})`;\n    if (abiItem.type === 'error')\n        return `error ${abiItem.name}(${formatAbiParameters(abiItem.inputs)})`;\n    if (abiItem.type === 'constructor')\n        return `constructor(${formatAbiParameters(abiItem.inputs)})${abiItem.stateMutability === 'payable' ? ' payable' : ''}`;\n    if (abiItem.type === 'fallback')\n        return `fallback() external${abiItem.stateMutability === 'payable' ? ' payable' : ''}`;\n    return 'receive() external payable';\n}\n//# sourceMappingURL=formatAbiItem.js.map","import { execTyped } from '../../regex.js';\n// https://regexr.com/7gmok\nconst errorSignatureRegex = /^error (?<name>[a-zA-Z$_][a-zA-Z0-9$_]*)\\((?<parameters>.*?)\\)$/;\nexport function isErrorSignature(signature) {\n    return errorSignatureRegex.test(signature);\n}\nexport function execErrorSignature(signature) {\n    return execTyped(errorSignatureRegex, signature);\n}\n// https://regexr.com/7gmoq\nconst eventSignatureRegex = /^event (?<name>[a-zA-Z$_][a-zA-Z0-9$_]*)\\((?<parameters>.*?)\\)$/;\nexport function isEventSignature(signature) {\n    return eventSignatureRegex.test(signature);\n}\nexport function execEventSignature(signature) {\n    return execTyped(eventSignatureRegex, signature);\n}\n// https://regexr.com/7gmot\nconst functionSignatureRegex = /^function (?<name>[a-zA-Z$_][a-zA-Z0-9$_]*)\\((?<parameters>.*?)\\)(?: (?<scope>external|public{1}))?(?: (?<stateMutability>pure|view|nonpayable|payable{1}))?(?: returns\\s?\\((?<returns>.*?)\\))?$/;\nexport function isFunctionSignature(signature) {\n    return functionSignatureRegex.test(signature);\n}\nexport function execFunctionSignature(signature) {\n    return execTyped(functionSignatureRegex, signature);\n}\n// https://regexr.com/7gmp3\nconst structSignatureRegex = /^struct (?<name>[a-zA-Z$_][a-zA-Z0-9$_]*) \\{(?<properties>.*?)\\}$/;\nexport function isStructSignature(signature) {\n    return structSignatureRegex.test(signature);\n}\nexport function execStructSignature(signature) {\n    return execTyped(structSignatureRegex, signature);\n}\n// https://regexr.com/78u01\nconst constructorSignatureRegex = /^constructor\\((?<parameters>.*?)\\)(?:\\s(?<stateMutability>payable{1}))?$/;\nexport function isConstructorSignature(signature) {\n    return constructorSignatureRegex.test(signature);\n}\nexport function execConstructorSignature(signature) {\n    return execTyped(constructorSignatureRegex, signature);\n}\n// https://regexr.com/7srtn\nconst fallbackSignatureRegex = /^fallback\\(\\) external(?:\\s(?<stateMutability>payable{1}))?$/;\nexport function isFallbackSignature(signature) {\n    return fallbackSignatureRegex.test(signature);\n}\nexport function execFallbackSignature(signature) {\n    return execTyped(fallbackSignatureRegex, signature);\n}\n// https://regexr.com/78u1k\nconst receiveSignatureRegex = /^receive\\(\\) external payable$/;\nexport function isReceiveSignature(signature) {\n    return receiveSignatureRegex.test(signature);\n}\nexport const modifiers = new Set([\n    'memory',\n    'indexed',\n    'storage',\n    'calldata',\n]);\nexport const eventModifiers = new Set(['indexed']);\nexport const functionModifiers = new Set([\n    'calldata',\n    'memory',\n    'storage',\n]);\n//# sourceMappingURL=signatures.js.map","import { BaseError } from '../../errors.js';\nexport class InvalidAbiItemError extends BaseError {\n    constructor({ signature }) {\n        super('Failed to parse ABI item.', {\n            details: `parseAbiItem(${JSON.stringify(signature, null, 2)})`,\n            docsPath: '/api/human#parseabiitem-1',\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidAbiItemError'\n        });\n    }\n}\nexport class UnknownTypeError extends BaseError {\n    constructor({ type }) {\n        super('Unknown type.', {\n            metaMessages: [\n                `Type \"${type}\" is not a valid ABI type. Perhaps you forgot to include a struct signature?`,\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'UnknownTypeError'\n        });\n    }\n}\nexport class UnknownSolidityTypeError extends BaseError {\n    constructor({ type }) {\n        super('Unknown type.', {\n            metaMessages: [`Type \"${type}\" is not a valid ABI type.`],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'UnknownSolidityTypeError'\n        });\n    }\n}\n//# sourceMappingURL=abiItem.js.map","import { BaseError } from '../../errors.js';\nexport class InvalidAbiParameterError extends BaseError {\n    constructor({ param }) {\n        super('Failed to parse ABI parameter.', {\n            details: `parseAbiParameter(${JSON.stringify(param, null, 2)})`,\n            docsPath: '/api/human#parseabiparameter-1',\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidAbiParameterError'\n        });\n    }\n}\nexport class InvalidAbiParametersError extends BaseError {\n    constructor({ params }) {\n        super('Failed to parse ABI parameters.', {\n            details: `parseAbiParameters(${JSON.stringify(params, null, 2)})`,\n            docsPath: '/api/human#parseabiparameters-1',\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidAbiParametersError'\n        });\n    }\n}\nexport class InvalidParameterError extends BaseError {\n    constructor({ param }) {\n        super('Invalid ABI parameter.', {\n            details: param,\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidParameterError'\n        });\n    }\n}\nexport class SolidityProtectedKeywordError extends BaseError {\n    constructor({ param, name }) {\n        super('Invalid ABI parameter.', {\n            details: param,\n            metaMessages: [\n                `\"${name}\" is a protected Solidity keyword. More info: https://docs.soliditylang.org/en/latest/cheatsheet.html`,\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'SolidityProtectedKeywordError'\n        });\n    }\n}\nexport class InvalidModifierError extends BaseError {\n    constructor({ param, type, modifier, }) {\n        super('Invalid ABI parameter.', {\n            details: param,\n            metaMessages: [\n                `Modifier \"${modifier}\" not allowed${type ? ` in \"${type}\" type` : ''}.`,\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidModifierError'\n        });\n    }\n}\nexport class InvalidFunctionModifierError extends BaseError {\n    constructor({ param, type, modifier, }) {\n        super('Invalid ABI parameter.', {\n            details: param,\n            metaMessages: [\n                `Modifier \"${modifier}\" not allowed${type ? ` in \"${type}\" type` : ''}.`,\n                `Data location can only be specified for array, struct, or mapping types, but \"${modifier}\" was given.`,\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidFunctionModifierError'\n        });\n    }\n}\nexport class InvalidAbiTypeParameterError extends BaseError {\n    constructor({ abiParameter, }) {\n        super('Invalid ABI parameter.', {\n            details: JSON.stringify(abiParameter, null, 2),\n            metaMessages: ['ABI parameter type is invalid.'],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidAbiTypeParameterError'\n        });\n    }\n}\n//# sourceMappingURL=abiParameter.js.map","import { BaseError } from '../../errors.js';\nexport class InvalidSignatureError extends BaseError {\n    constructor({ signature, type, }) {\n        super(`Invalid ${type} signature.`, {\n            details: signature,\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidSignatureError'\n        });\n    }\n}\nexport class UnknownSignatureError extends BaseError {\n    constructor({ signature }) {\n        super('Unknown signature.', {\n            details: signature,\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'UnknownSignatureError'\n        });\n    }\n}\nexport class InvalidStructSignatureError extends BaseError {\n    constructor({ signature }) {\n        super('Invalid struct signature.', {\n            details: signature,\n            metaMessages: ['No properties exist.'],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidStructSignatureError'\n        });\n    }\n}\n//# sourceMappingURL=signature.js.map","import { BaseError } from '../../errors.js';\nexport class CircularReferenceError extends BaseError {\n    constructor({ type }) {\n        super('Circular reference detected.', {\n            metaMessages: [`Struct \"${type}\" is a circular reference.`],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'CircularReferenceError'\n        });\n    }\n}\n//# sourceMappingURL=struct.js.map","import { BaseError } from '../../errors.js';\nexport class InvalidParenthesisError extends BaseError {\n    constructor({ current, depth }) {\n        super('Unbalanced parentheses.', {\n            metaMessages: [\n                `\"${current.trim()}\" has too many ${depth > 0 ? 'opening' : 'closing'} parentheses.`,\n            ],\n            details: `Depth \"${depth}\"`,\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'InvalidParenthesisError'\n        });\n    }\n}\n//# sourceMappingURL=splitParameters.js.map","/**\n * Gets {@link parameterCache} cache key namespaced by {@link type}. This prevents parameters from being accessible to types that don't allow them (e.g. `string indexed foo` not allowed outside of `type: 'event'`).\n * @param param ABI parameter string\n * @param type ABI parameter type\n * @returns Cache key for {@link parameterCache}\n */\nexport function getParameterCacheKey(param, type, structs) {\n    let structKey = '';\n    if (structs)\n        for (const struct of Object.entries(structs)) {\n            if (!struct)\n                continue;\n            let propertyKey = '';\n            for (const property of struct[1]) {\n                propertyKey += `[${property.type}${property.name ? `:${property.name}` : ''}]`;\n            }\n            structKey += `(${struct[0]}{${propertyKey}})`;\n        }\n    if (type)\n        return `${type}:${param}${structKey}`;\n    return param;\n}\n/**\n * Basic cache seeded with common ABI parameter strings.\n *\n * **Note: When seeding more parameters, make sure you benchmark performance. The current number is the ideal balance between performance and having an already existing cache.**\n */\nexport const parameterCache = new Map([\n    // Unnamed\n    ['address', { type: 'address' }],\n    ['bool', { type: 'bool' }],\n    ['bytes', { type: 'bytes' }],\n    ['bytes32', { type: 'bytes32' }],\n    ['int', { type: 'int256' }],\n    ['int256', { type: 'int256' }],\n    ['string', { type: 'string' }],\n    ['uint', { type: 'uint256' }],\n    ['uint8', { type: 'uint8' }],\n    ['uint16', { type: 'uint16' }],\n    ['uint24', { type: 'uint24' }],\n    ['uint32', { type: 'uint32' }],\n    ['uint64', { type: 'uint64' }],\n    ['uint96', { type: 'uint96' }],\n    ['uint112', { type: 'uint112' }],\n    ['uint160', { type: 'uint160' }],\n    ['uint192', { type: 'uint192' }],\n    ['uint256', { type: 'uint256' }],\n    // Named\n    ['address owner', { type: 'address', name: 'owner' }],\n    ['address to', { type: 'address', name: 'to' }],\n    ['bool approved', { type: 'bool', name: 'approved' }],\n    ['bytes _data', { type: 'bytes', name: '_data' }],\n    ['bytes data', { type: 'bytes', name: 'data' }],\n    ['bytes signature', { type: 'bytes', name: 'signature' }],\n    ['bytes32 hash', { type: 'bytes32', name: 'hash' }],\n    ['bytes32 r', { type: 'bytes32', name: 'r' }],\n    ['bytes32 root', { type: 'bytes32', name: 'root' }],\n    ['bytes32 s', { type: 'bytes32', name: 's' }],\n    ['string name', { type: 'string', name: 'name' }],\n    ['string symbol', { type: 'string', name: 'symbol' }],\n    ['string tokenURI', { type: 'string', name: 'tokenURI' }],\n    ['uint tokenId', { type: 'uint256', name: 'tokenId' }],\n    ['uint8 v', { type: 'uint8', name: 'v' }],\n    ['uint256 balance', { type: 'uint256', name: 'balance' }],\n    ['uint256 tokenId', { type: 'uint256', name: 'tokenId' }],\n    ['uint256 value', { type: 'uint256', name: 'value' }],\n    // Indexed\n    [\n        'event:address indexed from',\n        { type: 'address', name: 'from', indexed: true },\n    ],\n    ['event:address indexed to', { type: 'address', name: 'to', indexed: true }],\n    [\n        'event:uint indexed tokenId',\n        { type: 'uint256', name: 'tokenId', indexed: true },\n    ],\n    [\n        'event:uint256 indexed tokenId',\n        { type: 'uint256', name: 'tokenId', indexed: true },\n    ],\n]);\n//# sourceMappingURL=cache.js.map","import { bytesRegex, execTyped, integerRegex, isTupleRegex, } from '../../regex.js';\nimport { UnknownSolidityTypeError } from '../errors/abiItem.js';\nimport { InvalidFunctionModifierError, InvalidModifierError, InvalidParameterError, SolidityProtectedKeywordError, } from '../errors/abiParameter.js';\nimport { InvalidSignatureError, UnknownSignatureError, } from '../errors/signature.js';\nimport { InvalidParenthesisError } from '../errors/splitParameters.js';\nimport { getParameterCacheKey, parameterCache } from './cache.js';\nimport { eventModifiers, execConstructorSignature, execErrorSignature, execEventSignature, execFallbackSignature, execFunctionSignature, functionModifiers, isConstructorSignature, isErrorSignature, isEventSignature, isFallbackSignature, isFunctionSignature, isReceiveSignature, } from './signatures.js';\nexport function parseSignature(signature, structs = {}) {\n    if (isFunctionSignature(signature))\n        return parseFunctionSignature(signature, structs);\n    if (isEventSignature(signature))\n        return parseEventSignature(signature, structs);\n    if (isErrorSignature(signature))\n        return parseErrorSignature(signature, structs);\n    if (isConstructorSignature(signature))\n        return parseConstructorSignature(signature, structs);\n    if (isFallbackSignature(signature))\n        return parseFallbackSignature(signature);\n    if (isReceiveSignature(signature))\n        return {\n            type: 'receive',\n            stateMutability: 'payable',\n        };\n    throw new UnknownSignatureError({ signature });\n}\nexport function parseFunctionSignature(signature, structs = {}) {\n    const match = execFunctionSignature(signature);\n    if (!match)\n        throw new InvalidSignatureError({ signature, type: 'function' });\n    const inputParams = splitParameters(match.parameters);\n    const inputs = [];\n    const inputLength = inputParams.length;\n    for (let i = 0; i < inputLength; i++) {\n        inputs.push(parseAbiParameter(inputParams[i], {\n            modifiers: functionModifiers,\n            structs,\n            type: 'function',\n        }));\n    }\n    const outputs = [];\n    if (match.returns) {\n        const outputParams = splitParameters(match.returns);\n        const outputLength = outputParams.length;\n        for (let i = 0; i < outputLength; i++) {\n            outputs.push(parseAbiParameter(outputParams[i], {\n                modifiers: functionModifiers,\n                structs,\n                type: 'function',\n            }));\n        }\n    }\n    return {\n        name: match.name,\n        type: 'function',\n        stateMutability: match.stateMutability ?? 'nonpayable',\n        inputs,\n        outputs,\n    };\n}\nexport function parseEventSignature(signature, structs = {}) {\n    const match = execEventSignature(signature);\n    if (!match)\n        throw new InvalidSignatureError({ signature, type: 'event' });\n    const params = splitParameters(match.parameters);\n    const abiParameters = [];\n    const length = params.length;\n    for (let i = 0; i < length; i++)\n        abiParameters.push(parseAbiParameter(params[i], {\n            modifiers: eventModifiers,\n            structs,\n            type: 'event',\n        }));\n    return { name: match.name, type: 'event', inputs: abiParameters };\n}\nexport function parseErrorSignature(signature, structs = {}) {\n    const match = execErrorSignature(signature);\n    if (!match)\n        throw new InvalidSignatureError({ signature, type: 'error' });\n    const params = splitParameters(match.parameters);\n    const abiParameters = [];\n    const length = params.length;\n    for (let i = 0; i < length; i++)\n        abiParameters.push(parseAbiParameter(params[i], { structs, type: 'error' }));\n    return { name: match.name, type: 'error', inputs: abiParameters };\n}\nexport function parseConstructorSignature(signature, structs = {}) {\n    const match = execConstructorSignature(signature);\n    if (!match)\n        throw new InvalidSignatureError({ signature, type: 'constructor' });\n    const params = splitParameters(match.parameters);\n    const abiParameters = [];\n    const length = params.length;\n    for (let i = 0; i < length; i++)\n        abiParameters.push(parseAbiParameter(params[i], { structs, type: 'constructor' }));\n    return {\n        type: 'constructor',\n        stateMutability: match.stateMutability ?? 'nonpayable',\n        inputs: abiParameters,\n    };\n}\nexport function parseFallbackSignature(signature) {\n    const match = execFallbackSignature(signature);\n    if (!match)\n        throw new InvalidSignatureError({ signature, type: 'fallback' });\n    return {\n        type: 'fallback',\n        stateMutability: match.stateMutability ?? 'nonpayable',\n    };\n}\nconst abiParameterWithoutTupleRegex = /^(?<type>[a-zA-Z$_][a-zA-Z0-9$_]*)(?<array>(?:\\[\\d*?\\])+?)?(?:\\s(?<modifier>calldata|indexed|memory|storage{1}))?(?:\\s(?<name>[a-zA-Z$_][a-zA-Z0-9$_]*))?$/;\nconst abiParameterWithTupleRegex = /^\\((?<type>.+?)\\)(?<array>(?:\\[\\d*?\\])+?)?(?:\\s(?<modifier>calldata|indexed|memory|storage{1}))?(?:\\s(?<name>[a-zA-Z$_][a-zA-Z0-9$_]*))?$/;\nconst dynamicIntegerRegex = /^u?int$/;\nexport function parseAbiParameter(param, options) {\n    // optional namespace cache by `type`\n    const parameterCacheKey = getParameterCacheKey(param, options?.type, options?.structs);\n    if (parameterCache.has(parameterCacheKey))\n        return parameterCache.get(parameterCacheKey);\n    const isTuple = isTupleRegex.test(param);\n    const match = execTyped(isTuple ? abiParameterWithTupleRegex : abiParameterWithoutTupleRegex, param);\n    if (!match)\n        throw new InvalidParameterError({ param });\n    if (match.name && isSolidityKeyword(match.name))\n        throw new SolidityProtectedKeywordError({ param, name: match.name });\n    const name = match.name ? { name: match.name } : {};\n    const indexed = match.modifier === 'indexed' ? { indexed: true } : {};\n    const structs = options?.structs ?? {};\n    let type;\n    let components = {};\n    if (isTuple) {\n        type = 'tuple';\n        const params = splitParameters(match.type);\n        const components_ = [];\n        const length = params.length;\n        for (let i = 0; i < length; i++) {\n            // remove `modifiers` from `options` to prevent from being added to tuple components\n            components_.push(parseAbiParameter(params[i], { structs }));\n        }\n        components = { components: components_ };\n    }\n    else if (match.type in structs) {\n        type = 'tuple';\n        components = { components: structs[match.type] };\n    }\n    else if (dynamicIntegerRegex.test(match.type)) {\n        type = `${match.type}256`;\n    }\n    else {\n        type = match.type;\n        if (!(options?.type === 'struct') && !isSolidityType(type))\n            throw new UnknownSolidityTypeError({ type });\n    }\n    if (match.modifier) {\n        // Check if modifier exists, but is not allowed (e.g. `indexed` in `functionModifiers`)\n        if (!options?.modifiers?.has?.(match.modifier))\n            throw new InvalidModifierError({\n                param,\n                type: options?.type,\n                modifier: match.modifier,\n            });\n        // Check if resolved `type` is valid if there is a function modifier\n        if (functionModifiers.has(match.modifier) &&\n            !isValidDataLocation(type, !!match.array))\n            throw new InvalidFunctionModifierError({\n                param,\n                type: options?.type,\n                modifier: match.modifier,\n            });\n    }\n    const abiParameter = {\n        type: `${type}${match.array ?? ''}`,\n        ...name,\n        ...indexed,\n        ...components,\n    };\n    parameterCache.set(parameterCacheKey, abiParameter);\n    return abiParameter;\n}\n// s/o latika for this\nexport function splitParameters(params, result = [], current = '', depth = 0) {\n    const length = params.trim().length;\n    // biome-ignore lint/correctness/noUnreachable: recursive\n    for (let i = 0; i < length; i++) {\n        const char = params[i];\n        const tail = params.slice(i + 1);\n        switch (char) {\n            case ',':\n                return depth === 0\n                    ? splitParameters(tail, [...result, current.trim()])\n                    : splitParameters(tail, result, `${current}${char}`, depth);\n            case '(':\n                return splitParameters(tail, result, `${current}${char}`, depth + 1);\n            case ')':\n                return splitParameters(tail, result, `${current}${char}`, depth - 1);\n            default:\n                return splitParameters(tail, result, `${current}${char}`, depth);\n        }\n    }\n    if (current === '')\n        return result;\n    if (depth !== 0)\n        throw new InvalidParenthesisError({ current, depth });\n    result.push(current.trim());\n    return result;\n}\nexport function isSolidityType(type) {\n    return (type === 'address' ||\n        type === 'bool' ||\n        type === 'function' ||\n        type === 'string' ||\n        bytesRegex.test(type) ||\n        integerRegex.test(type));\n}\nconst protectedKeywordsRegex = /^(?:after|alias|anonymous|apply|auto|byte|calldata|case|catch|constant|copyof|default|defined|error|event|external|false|final|function|immutable|implements|in|indexed|inline|internal|let|mapping|match|memory|mutable|null|of|override|partial|private|promise|public|pure|reference|relocatable|return|returns|sizeof|static|storage|struct|super|supports|switch|this|true|try|typedef|typeof|var|view|virtual)$/;\n/** @internal */\nexport function isSolidityKeyword(name) {\n    return (name === 'address' ||\n        name === 'bool' ||\n        name === 'function' ||\n        name === 'string' ||\n        name === 'tuple' ||\n        bytesRegex.test(name) ||\n        integerRegex.test(name) ||\n        protectedKeywordsRegex.test(name));\n}\n/** @internal */\nexport function isValidDataLocation(type, isArray) {\n    return isArray || type === 'bytes' || type === 'string' || type === 'tuple';\n}\n//# sourceMappingURL=utils.js.map","import { execTyped, isTupleRegex } from '../../regex.js';\nimport { UnknownTypeError } from '../errors/abiItem.js';\nimport { InvalidAbiTypeParameterError } from '../errors/abiParameter.js';\nimport { InvalidSignatureError, InvalidStructSignatureError, } from '../errors/signature.js';\nimport { CircularReferenceError } from '../errors/struct.js';\nimport { execStructSignature, isStructSignature } from './signatures.js';\nimport { isSolidityType, parseAbiParameter } from './utils.js';\nexport function parseStructs(signatures) {\n    // Create \"shallow\" version of each struct (and filter out non-structs or invalid structs)\n    const shallowStructs = {};\n    const signaturesLength = signatures.length;\n    for (let i = 0; i < signaturesLength; i++) {\n        const signature = signatures[i];\n        if (!isStructSignature(signature))\n            continue;\n        const match = execStructSignature(signature);\n        if (!match)\n            throw new InvalidSignatureError({ signature, type: 'struct' });\n        const properties = match.properties.split(';');\n        const components = [];\n        const propertiesLength = properties.length;\n        for (let k = 0; k < propertiesLength; k++) {\n            const property = properties[k];\n            const trimmed = property.trim();\n            if (!trimmed)\n                continue;\n            const abiParameter = parseAbiParameter(trimmed, {\n                type: 'struct',\n            });\n            components.push(abiParameter);\n        }\n        if (!components.length)\n            throw new InvalidStructSignatureError({ signature });\n        shallowStructs[match.name] = components;\n    }\n    // Resolve nested structs inside each parameter\n    const resolvedStructs = {};\n    const entries = Object.entries(shallowStructs);\n    const entriesLength = entries.length;\n    for (let i = 0; i < entriesLength; i++) {\n        const [name, parameters] = entries[i];\n        resolvedStructs[name] = resolveStructs(parameters, shallowStructs);\n    }\n    return resolvedStructs;\n}\nconst typeWithoutTupleRegex = /^(?<type>[a-zA-Z$_][a-zA-Z0-9$_]*)(?<array>(?:\\[\\d*?\\])+?)?$/;\nfunction resolveStructs(abiParameters, structs, ancestors = new Set()) {\n    const components = [];\n    const length = abiParameters.length;\n    for (let i = 0; i < length; i++) {\n        const abiParameter = abiParameters[i];\n        const isTuple = isTupleRegex.test(abiParameter.type);\n        if (isTuple)\n            components.push(abiParameter);\n        else {\n            const match = execTyped(typeWithoutTupleRegex, abiParameter.type);\n            if (!match?.type)\n                throw new InvalidAbiTypeParameterError({ abiParameter });\n            const { array, type } = match;\n            if (type in structs) {\n                if (ancestors.has(type))\n                    throw new CircularReferenceError({ type });\n                components.push({\n                    ...abiParameter,\n                    type: `tuple${array ?? ''}`,\n                    components: resolveStructs(structs[type] ?? [], structs, new Set([...ancestors, type])),\n                });\n            }\n            else {\n                if (isSolidityType(type))\n                    components.push(abiParameter);\n                else\n                    throw new UnknownTypeError({ type });\n            }\n        }\n    }\n    return components;\n}\n//# sourceMappingURL=structs.js.map","import { isStructSignature } from './runtime/signatures.js';\nimport { parseStructs } from './runtime/structs.js';\nimport { parseSignature } from './runtime/utils.js';\n/**\n * Parses human-readable ABI into JSON {@link Abi}\n *\n * @param signatures - Human-Readable ABI\n * @returns Parsed {@link Abi}\n *\n * @example\n * const abi = parseAbi([\n *   //  ^? const abi: readonly [{ name: \"balanceOf\"; type: \"function\"; stateMutability:...\n *   'function balanceOf(address owner) view returns (uint256)',\n *   'event Transfer(address indexed from, address indexed to, uint256 amount)',\n * ])\n */\nexport function parseAbi(signatures) {\n    const structs = parseStructs(signatures);\n    const abi = [];\n    const length = signatures.length;\n    for (let i = 0; i < length; i++) {\n        const signature = signatures[i];\n        if (isStructSignature(signature))\n            continue;\n        abi.push(parseSignature(signature, structs));\n    }\n    return abi;\n}\n//# sourceMappingURL=parseAbi.js.map","import { BaseError } from '../../errors/base.js';\nexport function normalizeSignature(signature) {\n    let active = true;\n    let current = '';\n    let level = 0;\n    let result = '';\n    let valid = false;\n    for (let i = 0; i < signature.length; i++) {\n        const char = signature[i];\n        // If the character is a separator, we want to reactivate.\n        if (['(', ')', ','].includes(char))\n            active = true;\n        // If the character is a \"level\" token, we want to increment/decrement.\n        if (char === '(')\n            level++;\n        if (char === ')')\n            level--;\n        // If we aren't active, we don't want to mutate the result.\n        if (!active)\n            continue;\n        // If level === 0, we are at the definition level.\n        if (level === 0) {\n            if (char === ' ' && ['event', 'function', ''].includes(result))\n                result = '';\n            else {\n                result += char;\n                // If we are at the end of the definition, we must be finished.\n                if (char === ')') {\n                    valid = true;\n                    break;\n                }\n            }\n            continue;\n        }\n        // Ignore spaces\n        if (char === ' ') {\n            // If the previous character is a separator, and the current section isn't empty, we want to deactivate.\n            if (signature[i - 1] !== ',' && current !== ',' && current !== ',(') {\n                current = '';\n                active = false;\n            }\n            continue;\n        }\n        result += char;\n        current += char;\n    }\n    if (!valid)\n        throw new BaseError('Unable to normalize signature.');\n    return result;\n}\n//# sourceMappingURL=normalizeSignature.js.map","import { formatAbiItem } from 'abitype';\nimport { normalizeSignature, } from './normalizeSignature.js';\n/**\n * Returns the signature for a given function or event definition.\n *\n * @example\n * const signature = toSignature('function ownerOf(uint256 tokenId)')\n * // 'ownerOf(uint256)'\n *\n * @example\n * const signature_3 = toSignature({\n *   name: 'ownerOf',\n *   type: 'function',\n *   inputs: [{ name: 'tokenId', type: 'uint256' }],\n *   outputs: [],\n *   stateMutability: 'view',\n * })\n * // 'ownerOf(uint256)'\n */\nexport const toSignature = (def) => {\n    const def_ = (() => {\n        if (typeof def === 'string')\n            return def;\n        return formatAbiItem(def);\n    })();\n    return normalizeSignature(def_);\n};\n//# sourceMappingURL=toSignature.js.map","import { hashSignature } from './hashSignature.js';\nimport { toSignature } from './toSignature.js';\n/**\n * Returns the hash (of the function/event signature) for a given event or function definition.\n */\nexport function toSignatureHash(fn) {\n    return hashSignature(toSignature(fn));\n}\n//# sourceMappingURL=toSignatureHash.js.map","import { toSignatureHash, } from './toSignatureHash.js';\n/**\n * Returns the event selector for a given event definition.\n *\n * @example\n * const selector = toEventSelector('Transfer(address indexed from, address indexed to, uint256 amount)')\n * // 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n */\nexport const toEventSelector = toSignatureHash;\n//# sourceMappingURL=toEventSelector.js.map","import { slice } from '../data/slice.js';\nimport { toSignatureHash, } from './toSignatureHash.js';\n/**\n * Returns the function selector for a given function definition.\n *\n * @example\n * const selector = toFunctionSelector('function ownerOf(uint256 tokenId)')\n * // 0x6352211e\n */\nexport const toFunctionSelector = (fn) => slice(toSignatureHash(fn), 0, 4);\n//# sourceMappingURL=toFunctionSelector.js.map","import { AbiItemAmbiguityError, } from '../../errors/abi.js';\nimport { isHex } from '../../utils/data/isHex.js';\nimport { isAddress } from '../address/isAddress.js';\nimport { toEventSelector } from '../hash/toEventSelector.js';\nimport { toFunctionSelector, } from '../hash/toFunctionSelector.js';\nexport function getAbiItem(parameters) {\n    const { abi, args = [], name } = parameters;\n    const isSelector = isHex(name, { strict: false });\n    const abiItems = abi.filter((abiItem) => {\n        if (isSelector) {\n            if (abiItem.type === 'function')\n                return toFunctionSelector(abiItem) === name;\n            if (abiItem.type === 'event')\n                return toEventSelector(abiItem) === name;\n            return false;\n        }\n        return 'name' in abiItem && abiItem.name === name;\n    });\n    if (abiItems.length === 0)\n        return undefined;\n    if (abiItems.length === 1)\n        return abiItems[0];\n    let matchedAbiItem = undefined;\n    for (const abiItem of abiItems) {\n        if (!('inputs' in abiItem))\n            continue;\n        if (!args || args.length === 0) {\n            if (!abiItem.inputs || abiItem.inputs.length === 0)\n                return abiItem;\n            continue;\n        }\n        if (!abiItem.inputs)\n            continue;\n        if (abiItem.inputs.length === 0)\n            continue;\n        if (abiItem.inputs.length !== args.length)\n            continue;\n        const matched = args.every((arg, index) => {\n            const abiParameter = 'inputs' in abiItem && abiItem.inputs[index];\n            if (!abiParameter)\n                return false;\n            return isArgOfType(arg, abiParameter);\n        });\n        if (matched) {\n            // Check for ambiguity against already matched parameters (e.g. `address` vs `bytes20`).\n            if (matchedAbiItem &&\n                'inputs' in matchedAbiItem &&\n                matchedAbiItem.inputs) {\n                const ambiguousTypes = getAmbiguousTypes(abiItem.inputs, matchedAbiItem.inputs, args);\n                if (ambiguousTypes)\n                    throw new AbiItemAmbiguityError({\n                        abiItem,\n                        type: ambiguousTypes[0],\n                    }, {\n                        abiItem: matchedAbiItem,\n                        type: ambiguousTypes[1],\n                    });\n            }\n            matchedAbiItem = abiItem;\n        }\n    }\n    if (matchedAbiItem)\n        return matchedAbiItem;\n    return abiItems[0];\n}\n/** @internal */\nexport function isArgOfType(arg, abiParameter) {\n    const argType = typeof arg;\n    const abiParameterType = abiParameter.type;\n    switch (abiParameterType) {\n        case 'address':\n            return isAddress(arg, { strict: false });\n        case 'bool':\n            return argType === 'boolean';\n        case 'function':\n            return argType === 'string';\n        case 'string':\n            return argType === 'string';\n        default: {\n            if (abiParameterType === 'tuple' && 'components' in abiParameter)\n                return Object.values(abiParameter.components).every((component, index) => {\n                    return isArgOfType(Object.values(arg)[index], component);\n                });\n            // `(u)int<M>`: (un)signed integer type of `M` bits, `0 < M <= 256`, `M % 8 == 0`\n            // https://regexr.com/6v8hp\n            if (/^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(abiParameterType))\n                return argType === 'number' || argType === 'bigint';\n            // `bytes<M>`: binary type of `M` bytes, `0 < M <= 32`\n            // https://regexr.com/6va55\n            if (/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(abiParameterType))\n                return argType === 'string' || arg instanceof Uint8Array;\n            // fixed-length (`<type>[M]`) and dynamic (`<type>[]`) arrays\n            // https://regexr.com/6va6i\n            if (/[a-z]+[1-9]{0,3}(\\[[0-9]{0,}\\])+$/.test(abiParameterType)) {\n                return (Array.isArray(arg) &&\n                    arg.every((x) => isArgOfType(x, {\n                        ...abiParameter,\n                        // Pop off `[]` or `[M]` from end of type\n                        type: abiParameterType.replace(/(\\[[0-9]{0,}\\])$/, ''),\n                    })));\n            }\n            return false;\n        }\n    }\n}\n/** @internal */\nexport function getAmbiguousTypes(sourceParameters, targetParameters, args) {\n    for (const parameterIndex in sourceParameters) {\n        const sourceParameter = sourceParameters[parameterIndex];\n        const targetParameter = targetParameters[parameterIndex];\n        if (sourceParameter.type === 'tuple' &&\n            targetParameter.type === 'tuple' &&\n            'components' in sourceParameter &&\n            'components' in targetParameter)\n            return getAmbiguousTypes(sourceParameter.components, targetParameter.components, args[parameterIndex]);\n        const types = [sourceParameter.type, targetParameter.type];\n        const ambiguous = (() => {\n            if (types.includes('address') && types.includes('bytes20'))\n                return true;\n            if (types.includes('address') && types.includes('string'))\n                return isAddress(args[parameterIndex], { strict: false });\n            if (types.includes('address') && types.includes('bytes'))\n                return isAddress(args[parameterIndex], { strict: false });\n            return false;\n        })();\n        if (ambiguous)\n            return types;\n    }\n    return;\n}\n//# sourceMappingURL=getAbiItem.js.map","import { AbiFunctionNotFoundError, AbiFunctionOutputsNotFoundError, } from '../../errors/abi.js';\nimport { decodeAbiParameters, } from './decodeAbiParameters.js';\nimport { getAbiItem } from './getAbiItem.js';\nconst docsPath = '/docs/contract/decodeFunctionResult';\nexport function decodeFunctionResult(parameters) {\n    const { abi, args, functionName, data } = parameters;\n    let abiItem = abi[0];\n    if (functionName) {\n        const item = getAbiItem({ abi, args, name: functionName });\n        if (!item)\n            throw new AbiFunctionNotFoundError(functionName, { docsPath });\n        abiItem = item;\n    }\n    if (abiItem.type !== 'function')\n        throw new AbiFunctionNotFoundError(undefined, { docsPath });\n    if (!abiItem.outputs)\n        throw new AbiFunctionOutputsNotFoundError(abiItem.name, { docsPath });\n    const values = decodeAbiParameters(abiItem.outputs, data);\n    if (values && values.length > 1)\n        return values;\n    if (values && values.length === 1)\n        return values[0];\n    return undefined;\n}\n//# sourceMappingURL=decodeFunctionResult.js.map","import { AbiFunctionNotFoundError, } from '../../errors/abi.js';\nimport { toFunctionSelector, } from '../hash/toFunctionSelector.js';\nimport { formatAbiItem } from './formatAbiItem.js';\nimport { getAbiItem } from './getAbiItem.js';\nconst docsPath = '/docs/contract/encodeFunctionData';\nexport function prepareEncodeFunctionData(parameters) {\n    const { abi, args, functionName } = parameters;\n    let abiItem = abi[0];\n    if (functionName) {\n        const item = getAbiItem({\n            abi,\n            args,\n            name: functionName,\n        });\n        if (!item)\n            throw new AbiFunctionNotFoundError(functionName, { docsPath });\n        abiItem = item;\n    }\n    if (abiItem.type !== 'function')\n        throw new AbiFunctionNotFoundError(undefined, { docsPath });\n    return {\n        abi: [abiItem],\n        functionName: toFunctionSelector(formatAbiItem(abiItem)),\n    };\n}\n//# sourceMappingURL=prepareEncodeFunctionData.js.map","import { concatHex } from '../data/concat.js';\nimport { encodeAbiParameters, } from './encodeAbiParameters.js';\nimport { prepareEncodeFunctionData } from './prepareEncodeFunctionData.js';\nexport function encodeFunctionData(parameters) {\n    const { args } = parameters;\n    const { abi, functionName } = (() => {\n        if (parameters.abi.length === 1 &&\n            parameters.functionName?.startsWith('0x'))\n            return parameters;\n        return prepareEncodeFunctionData(parameters);\n    })();\n    const abiItem = abi[0];\n    const signature = functionName;\n    const data = 'inputs' in abiItem && abiItem.inputs\n        ? encodeAbiParameters(abiItem.inputs, args ?? [])\n        : undefined;\n    return concatHex([signature, data ?? '0x']);\n}\n//# sourceMappingURL=encodeFunctionData.js.map","import { ChainDoesNotSupportContract, } from '../../errors/chain.js';\nexport function getChainContractAddress({ blockNumber, chain, contract: name, }) {\n    const contract = chain?.contracts?.[name];\n    if (!contract)\n        throw new ChainDoesNotSupportContract({\n            chain,\n            contract: { name },\n        });\n    if (blockNumber &&\n        contract.blockCreated &&\n        contract.blockCreated > blockNumber)\n        throw new ChainDoesNotSupportContract({\n            blockNumber,\n            chain,\n            contract: {\n                name,\n                blockCreated: contract.blockCreated,\n            },\n        });\n    return contract.address;\n}\n//# sourceMappingURL=getChainContractAddress.js.map","// https://docs.soliditylang.org/en/v0.8.16/control-structures.html#panic-via-assert-and-error-via-require\nexport const panicReasons = {\n    1: 'An `assert` condition failed.',\n    17: 'Arithmetic operation resulted in underflow or overflow.',\n    18: 'Division or modulo by zero (e.g. `5 / 0` or `23 % 0`).',\n    33: 'Attempted to convert to an invalid type.',\n    34: 'Attempted to access a storage byte array that is incorrectly encoded.',\n    49: 'Performed `.pop()` on an empty array',\n    50: 'Array index is out of bounds.',\n    65: 'Allocated too much memory or created an array which is too large.',\n    81: 'Attempted to call a zero-initialized variable of internal function type.',\n};\nexport const solidityError = {\n    inputs: [\n        {\n            name: 'message',\n            type: 'string',\n        },\n    ],\n    name: 'Error',\n    type: 'error',\n};\nexport const solidityPanic = {\n    inputs: [\n        {\n            name: 'reason',\n            type: 'uint256',\n        },\n    ],\n    name: 'Panic',\n    type: 'error',\n};\n//# sourceMappingURL=solidity.js.map","import { solidityError, solidityPanic } from '../../constants/solidity.js';\nimport { AbiDecodingZeroDataError, AbiErrorSignatureNotFoundError, } from '../../errors/abi.js';\nimport { slice } from '../data/slice.js';\nimport { toFunctionSelector, } from '../hash/toFunctionSelector.js';\nimport { decodeAbiParameters, } from './decodeAbiParameters.js';\nimport { formatAbiItem } from './formatAbiItem.js';\nexport function decodeErrorResult(parameters) {\n    const { abi, data } = parameters;\n    const signature = slice(data, 0, 4);\n    if (signature === '0x')\n        throw new AbiDecodingZeroDataError();\n    const abi_ = [...(abi || []), solidityError, solidityPanic];\n    const abiItem = abi_.find((x) => x.type === 'error' && signature === toFunctionSelector(formatAbiItem(x)));\n    if (!abiItem)\n        throw new AbiErrorSignatureNotFoundError(signature, {\n            docsPath: '/docs/contract/decodeErrorResult',\n        });\n    return {\n        abiItem,\n        args: 'inputs' in abiItem && abiItem.inputs && abiItem.inputs.length > 0\n            ? decodeAbiParameters(abiItem.inputs, slice(data, 4))\n            : undefined,\n        errorName: abiItem.name,\n    };\n}\n//# sourceMappingURL=decodeErrorResult.js.map","import { stringify } from '../stringify.js';\nexport function formatAbiItemWithArgs({ abiItem, args, includeFunctionName = true, includeName = false, }) {\n    if (!('name' in abiItem))\n        return;\n    if (!('inputs' in abiItem))\n        return;\n    if (!abiItem.inputs)\n        return;\n    return `${includeFunctionName ? abiItem.name : ''}(${abiItem.inputs\n        .map((input, i) => `${includeName && input.name ? `${input.name}: ` : ''}${typeof args[i] === 'object' ? stringify(args[i]) : args[i]}`)\n        .join(', ')})`;\n}\n//# sourceMappingURL=formatAbiItemWithArgs.js.map","import { parseAccount } from '../accounts/utils/parseAccount.js';\nimport { panicReasons } from '../constants/solidity.js';\nimport { decodeErrorResult, } from '../utils/abi/decodeErrorResult.js';\nimport { formatAbiItem } from '../utils/abi/formatAbiItem.js';\nimport { formatAbiItemWithArgs } from '../utils/abi/formatAbiItemWithArgs.js';\nimport { getAbiItem } from '../utils/abi/getAbiItem.js';\nimport { formatEther } from '../utils/unit/formatEther.js';\nimport { formatGwei } from '../utils/unit/formatGwei.js';\nimport { AbiErrorSignatureNotFoundError } from './abi.js';\nimport { BaseError } from './base.js';\nimport { prettyStateOverride } from './stateOverride.js';\nimport { prettyPrint } from './transaction.js';\nimport { getContractAddress } from './utils.js';\nexport class CallExecutionError extends BaseError {\n    constructor(cause, { account: account_, docsPath, chain, data, gas, gasPrice, maxFeePerGas, maxPriorityFeePerGas, nonce, to, value, stateOverride, }) {\n        const account = account_ ? parseAccount(account_) : undefined;\n        let prettyArgs = prettyPrint({\n            from: account?.address,\n            to,\n            value: typeof value !== 'undefined' &&\n                `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n            data,\n            gas,\n            gasPrice: typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n            maxFeePerGas: typeof maxFeePerGas !== 'undefined' &&\n                `${formatGwei(maxFeePerGas)} gwei`,\n            maxPriorityFeePerGas: typeof maxPriorityFeePerGas !== 'undefined' &&\n                `${formatGwei(maxPriorityFeePerGas)} gwei`,\n            nonce,\n        });\n        if (stateOverride) {\n            prettyArgs += `\\n${prettyStateOverride(stateOverride)}`;\n        }\n        super(cause.shortMessage, {\n            cause,\n            docsPath,\n            metaMessages: [\n                ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n                'Raw Call Arguments:',\n                prettyArgs,\n            ].filter(Boolean),\n            name: 'CallExecutionError',\n        });\n        Object.defineProperty(this, \"cause\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.cause = cause;\n    }\n}\nexport class ContractFunctionExecutionError extends BaseError {\n    constructor(cause, { abi, args, contractAddress, docsPath, functionName, sender, }) {\n        const abiItem = getAbiItem({ abi, args, name: functionName });\n        const formattedArgs = abiItem\n            ? formatAbiItemWithArgs({\n                abiItem,\n                args,\n                includeFunctionName: false,\n                includeName: false,\n            })\n            : undefined;\n        const functionWithParams = abiItem\n            ? formatAbiItem(abiItem, { includeName: true })\n            : undefined;\n        const prettyArgs = prettyPrint({\n            address: contractAddress && getContractAddress(contractAddress),\n            function: functionWithParams,\n            args: formattedArgs &&\n                formattedArgs !== '()' &&\n                `${[...Array(functionName?.length ?? 0).keys()]\n                    .map(() => ' ')\n                    .join('')}${formattedArgs}`,\n            sender,\n        });\n        super(cause.shortMessage ||\n            `An unknown error occurred while executing the contract function \"${functionName}\".`, {\n            cause,\n            docsPath,\n            metaMessages: [\n                ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n                prettyArgs && 'Contract Call:',\n                prettyArgs,\n            ].filter(Boolean),\n            name: 'ContractFunctionExecutionError',\n        });\n        Object.defineProperty(this, \"abi\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"args\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"cause\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"contractAddress\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"formattedArgs\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"functionName\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"sender\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.abi = abi;\n        this.args = args;\n        this.cause = cause;\n        this.contractAddress = contractAddress;\n        this.functionName = functionName;\n        this.sender = sender;\n    }\n}\nexport class ContractFunctionRevertedError extends BaseError {\n    constructor({ abi, data, functionName, message, }) {\n        let cause;\n        let decodedData = undefined;\n        let metaMessages;\n        let reason;\n        if (data && data !== '0x') {\n            try {\n                decodedData = decodeErrorResult({ abi, data });\n                const { abiItem, errorName, args: errorArgs } = decodedData;\n                if (errorName === 'Error') {\n                    reason = errorArgs[0];\n                }\n                else if (errorName === 'Panic') {\n                    const [firstArg] = errorArgs;\n                    reason = panicReasons[firstArg];\n                }\n                else {\n                    const errorWithParams = abiItem\n                        ? formatAbiItem(abiItem, { includeName: true })\n                        : undefined;\n                    const formattedArgs = abiItem && errorArgs\n                        ? formatAbiItemWithArgs({\n                            abiItem,\n                            args: errorArgs,\n                            includeFunctionName: false,\n                            includeName: false,\n                        })\n                        : undefined;\n                    metaMessages = [\n                        errorWithParams ? `Error: ${errorWithParams}` : '',\n                        formattedArgs && formattedArgs !== '()'\n                            ? `       ${[...Array(errorName?.length ?? 0).keys()]\n                                .map(() => ' ')\n                                .join('')}${formattedArgs}`\n                            : '',\n                    ];\n                }\n            }\n            catch (err) {\n                cause = err;\n            }\n        }\n        else if (message)\n            reason = message;\n        let signature;\n        if (cause instanceof AbiErrorSignatureNotFoundError) {\n            signature = cause.signature;\n            metaMessages = [\n                `Unable to decode signature \"${signature}\" as it was not found on the provided ABI.`,\n                'Make sure you are using the correct ABI and that the error exists on it.',\n                `You can look up the decoded signature here: https://openchain.xyz/signatures?query=${signature}.`,\n            ];\n        }\n        super((reason && reason !== 'execution reverted') || signature\n            ? [\n                `The contract function \"${functionName}\" reverted with the following ${signature ? 'signature' : 'reason'}:`,\n                reason || signature,\n            ].join('\\n')\n            : `The contract function \"${functionName}\" reverted.`, {\n            cause,\n            metaMessages,\n            name: 'ContractFunctionRevertedError',\n        });\n        Object.defineProperty(this, \"data\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"raw\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"reason\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"signature\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.data = decodedData;\n        this.raw = data;\n        this.reason = reason;\n        this.signature = signature;\n    }\n}\nexport class ContractFunctionZeroDataError extends BaseError {\n    constructor({ functionName }) {\n        super(`The contract function \"${functionName}\" returned no data (\"0x\").`, {\n            metaMessages: [\n                'This could be due to any of the following:',\n                `  - The contract does not have the function \"${functionName}\",`,\n                '  - The parameters passed to the contract function may be invalid, or',\n                '  - The address is not a contract.',\n            ],\n            name: 'ContractFunctionZeroDataError',\n        });\n    }\n}\nexport class CounterfactualDeploymentFailedError extends BaseError {\n    constructor({ factory }) {\n        super(`Deployment for counterfactual contract call failed${factory ? ` for factory \"${factory}\".` : ''}`, {\n            metaMessages: [\n                'Please ensure:',\n                '- The `factory` is a valid contract deployment factory (ie. Create2 Factory, ERC-4337 Factory, etc).',\n                '- The `factoryData` is a valid encoded function call for contract deployment function on the factory.',\n            ],\n            name: 'CounterfactualDeploymentFailedError',\n        });\n    }\n}\nexport class RawContractError extends BaseError {\n    constructor({ data, message, }) {\n        super(message || '', { name: 'RawContractError' });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 3\n        });\n        Object.defineProperty(this, \"data\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.data = data;\n    }\n}\n//# sourceMappingURL=contract.js.map","import { panicReasons } from '../../constants/solidity.js';\nimport { BaseError } from '../../errors/base.js';\nimport { ContractFunctionRevertedError } from '../../errors/contract.js';\n/*\n * @description Checks if error is a valid null result UniversalResolver error\n */\nexport function isNullUniversalResolverError(err, callType) {\n    if (!(err instanceof BaseError))\n        return false;\n    const cause = err.walk((e) => e instanceof ContractFunctionRevertedError);\n    if (!(cause instanceof ContractFunctionRevertedError))\n        return false;\n    if (cause.data?.errorName === 'ResolverNotFound')\n        return true;\n    if (cause.data?.errorName === 'ResolverWildcardNotSupported')\n        return true;\n    if (cause.data?.errorName === 'ResolverNotContract')\n        return true;\n    if (cause.data?.errorName === 'ResolverError')\n        return true;\n    if (cause.data?.errorName === 'HttpError')\n        return true;\n    // Backwards compatibility for older UniversalResolver contracts\n    if (cause.reason?.includes('Wildcard on non-extended resolvers is not supported'))\n        return true;\n    // No primary name set for address.\n    if (callType === 'reverse' && cause.reason === panicReasons[50])\n        return true;\n    return false;\n}\n//# sourceMappingURL=errors.js.map","import { AbiFunctionSignatureNotFoundError } from '../../errors/abi.js';\nimport { slice } from '../data/slice.js';\nimport { toFunctionSelector, } from '../hash/toFunctionSelector.js';\nimport { decodeAbiParameters, } from './decodeAbiParameters.js';\nimport { formatAbiItem } from './formatAbiItem.js';\nexport function decodeFunctionData(parameters) {\n    const { abi, data } = parameters;\n    const signature = slice(data, 0, 4);\n    const description = abi.find((x) => x.type === 'function' &&\n        signature === toFunctionSelector(formatAbiItem(x)));\n    if (!description)\n        throw new AbiFunctionSignatureNotFoundError(signature, {\n            docsPath: '/docs/contract/decodeFunctionData',\n        });\n    return {\n        functionName: description.name,\n        args: ('inputs' in description &&\n            description.inputs &&\n            description.inputs.length > 0\n            ? decodeAbiParameters(description.inputs, slice(data, 4))\n            : undefined),\n    };\n}\n//# sourceMappingURL=decodeFunctionData.js.map","import { AbiErrorInputsNotFoundError, AbiErrorNotFoundError, } from '../../errors/abi.js';\nimport { concatHex } from '../data/concat.js';\nimport { toFunctionSelector, } from '../hash/toFunctionSelector.js';\nimport { encodeAbiParameters, } from './encodeAbiParameters.js';\nimport { formatAbiItem } from './formatAbiItem.js';\nimport { getAbiItem } from './getAbiItem.js';\nconst docsPath = '/docs/contract/encodeErrorResult';\nexport function encodeErrorResult(parameters) {\n    const { abi, errorName, args } = parameters;\n    let abiItem = abi[0];\n    if (errorName) {\n        const item = getAbiItem({ abi, args, name: errorName });\n        if (!item)\n            throw new AbiErrorNotFoundError(errorName, { docsPath });\n        abiItem = item;\n    }\n    if (abiItem.type !== 'error')\n        throw new AbiErrorNotFoundError(undefined, { docsPath });\n    const definition = formatAbiItem(abiItem);\n    const signature = toFunctionSelector(definition);\n    let data = '0x';\n    if (args && args.length > 0) {\n        if (!abiItem.inputs)\n            throw new AbiErrorInputsNotFoundError(abiItem.name, { docsPath });\n        data = encodeAbiParameters(abiItem.inputs, args);\n    }\n    return concatHex([signature, data]);\n}\n//# sourceMappingURL=encodeErrorResult.js.map","import { AbiFunctionNotFoundError, AbiFunctionOutputsNotFoundError, InvalidArrayError, } from '../../errors/abi.js';\nimport { encodeAbiParameters, } from './encodeAbiParameters.js';\nimport { getAbiItem } from './getAbiItem.js';\nconst docsPath = '/docs/contract/encodeFunctionResult';\nexport function encodeFunctionResult(parameters) {\n    const { abi, functionName, result } = parameters;\n    let abiItem = abi[0];\n    if (functionName) {\n        const item = getAbiItem({ abi, name: functionName });\n        if (!item)\n            throw new AbiFunctionNotFoundError(functionName, { docsPath });\n        abiItem = item;\n    }\n    if (abiItem.type !== 'function')\n        throw new AbiFunctionNotFoundError(undefined, { docsPath });\n    if (!abiItem.outputs)\n        throw new AbiFunctionOutputsNotFoundError(abiItem.name, { docsPath });\n    const values = (() => {\n        if (abiItem.outputs.length === 0)\n            return [];\n        if (abiItem.outputs.length === 1)\n            return [result];\n        if (Array.isArray(result))\n            return result;\n        throw new InvalidArrayError(result);\n    })();\n    return encodeAbiParameters(abiItem.outputs, values);\n}\n//# sourceMappingURL=encodeFunctionResult.js.map","import { batchGatewayAbi } from '../../constants/abis.js';\nimport { solidityError } from '../../constants/solidity.js';\nimport { decodeFunctionData } from '../abi/decodeFunctionData.js';\nimport { encodeErrorResult } from '../abi/encodeErrorResult.js';\nimport { encodeFunctionResult } from '../abi/encodeFunctionResult.js';\nexport const localBatchGatewayUrl = 'x-batch-gateway:true';\nexport async function localBatchGatewayRequest(parameters) {\n    const { data, ccipRequest } = parameters;\n    const { args: [queries], } = decodeFunctionData({ abi: batchGatewayAbi, data });\n    const failures = [];\n    const responses = [];\n    await Promise.all(queries.map(async (query, i) => {\n        try {\n            responses[i] = query.urls.includes(localBatchGatewayUrl)\n                ? await localBatchGatewayRequest({ data: query.data, ccipRequest })\n                : await ccipRequest(query);\n            failures[i] = false;\n        }\n        catch (err) {\n            failures[i] = true;\n            responses[i] = encodeError(err);\n        }\n    }));\n    return encodeFunctionResult({\n        abi: batchGatewayAbi,\n        functionName: 'query',\n        result: [failures, responses],\n    });\n}\nfunction encodeError(error) {\n    if (error.name === 'HttpRequestError' && error.status)\n        return encodeErrorResult({\n            abi: batchGatewayAbi,\n            errorName: 'HttpError',\n            args: [error.status, error.shortMessage],\n        });\n    return encodeErrorResult({\n        abi: [solidityError],\n        errorName: 'Error',\n        args: ['shortMessage' in error ? error.shortMessage : error.message],\n    });\n}\n//# sourceMappingURL=localBatchGatewayRequest.js.map","import { isHex } from '../data/isHex.js';\nexport function encodedLabelToLabelhash(label) {\n    if (label.length !== 66)\n        return null;\n    if (label.indexOf('[') !== 0)\n        return null;\n    if (label.indexOf(']') !== 65)\n        return null;\n    const hash = `0x${label.slice(1, 65)}`;\n    if (!isHex(hash))\n        return null;\n    return hash;\n}\n//# sourceMappingURL=encodedLabelToLabelhash.js.map","import { concat } from '../data/concat.js';\nimport { stringToBytes, toBytes, } from '../encoding/toBytes.js';\nimport { bytesToHex } from '../encoding/toHex.js';\nimport { keccak256 } from '../hash/keccak256.js';\nimport { encodedLabelToLabelhash, } from './encodedLabelToLabelhash.js';\n/**\n * @description Hashes ENS name\n *\n * - Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `namehash`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @example\n * namehash('wevm.eth')\n * '0x08c85f2f4059e930c45a6aeff9dcd3bd95dc3c5c1cddef6a0626b31152248560'\n *\n * @link https://eips.ethereum.org/EIPS/eip-137\n */\nexport function namehash(name) {\n    let result = new Uint8Array(32).fill(0);\n    if (!name)\n        return bytesToHex(result);\n    const labels = name.split('.');\n    // Iterate in reverse order building up hash\n    for (let i = labels.length - 1; i >= 0; i -= 1) {\n        const hashFromEncodedLabel = encodedLabelToLabelhash(labels[i]);\n        const hashed = hashFromEncodedLabel\n            ? toBytes(hashFromEncodedLabel)\n            : keccak256(stringToBytes(labels[i]), 'bytes');\n        result = keccak256(concat([result, hashed]), 'bytes');\n    }\n    return bytesToHex(result);\n}\n//# sourceMappingURL=namehash.js.map","export function encodeLabelhash(hash) {\n    return `[${hash.slice(2)}]`;\n}\n//# sourceMappingURL=encodeLabelhash.js.map","import { stringToBytes, } from '../encoding/toBytes.js';\nimport { bytesToHex } from '../encoding/toHex.js';\nimport { keccak256 } from '../hash/keccak256.js';\nimport { encodedLabelToLabelhash, } from './encodedLabelToLabelhash.js';\n/**\n * @description Hashes ENS label\n *\n * - Since ENS labels prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS labels](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `labelhash`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @example\n * labelhash('eth')\n * '0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0'\n */\nexport function labelhash(label) {\n    const result = new Uint8Array(32).fill(0);\n    if (!label)\n        return bytesToHex(result);\n    return encodedLabelToLabelhash(label) || keccak256(stringToBytes(label));\n}\n//# sourceMappingURL=labelhash.js.map","import { stringToBytes, } from '../encoding/toBytes.js';\nimport { encodeLabelhash, } from './encodeLabelhash.js';\nimport { labelhash } from './labelhash.js';\n/*\n * @description Encodes a DNS packet into a ByteArray containing a UDP payload.\n *\n * @example\n * packetToBytes('awkweb.eth')\n * '0x0661776b7765620365746800'\n *\n * @see https://docs.ens.domains/resolution/names#dns\n *\n */\nexport function packetToBytes(packet) {\n    // strip leading and trailing `.`\n    const value = packet.replace(/^\\.|\\.$/gm, '');\n    if (value.length === 0)\n        return new Uint8Array(1);\n    const bytes = new Uint8Array(stringToBytes(value).byteLength + 2);\n    let offset = 0;\n    const list = value.split('.');\n    for (let i = 0; i < list.length; i++) {\n        let encoded = stringToBytes(list[i]);\n        // if the length is > 255, make the encoded label value a labelhash\n        // this is compatible with the universal resolver\n        if (encoded.byteLength > 255)\n            encoded = stringToBytes(encodeLabelhash(labelhash(list[i])));\n        bytes[offset] = encoded.length;\n        bytes.set(encoded, offset + 1);\n        offset += encoded.length + 1;\n    }\n    if (bytes.byteLength !== offset + 1)\n        return bytes.slice(0, offset + 1);\n    return bytes;\n}\n//# sourceMappingURL=packetToBytes.js.map","import { AbiDecodingZeroDataError } from '../../errors/abi.js';\nimport { BaseError } from '../../errors/base.js';\nimport { ContractFunctionExecutionError, ContractFunctionRevertedError, ContractFunctionZeroDataError, RawContractError, } from '../../errors/contract.js';\nimport { RpcRequestError } from '../../errors/request.js';\nimport { InternalRpcError } from '../../errors/rpc.js';\nconst EXECUTION_REVERTED_ERROR_CODE = 3;\nexport function getContractError(err, { abi, address, args, docsPath, functionName, sender, }) {\n    const error = (err instanceof RawContractError\n        ? err\n        : err instanceof BaseError\n            ? err.walk((err) => 'data' in err) || err.walk()\n            : {});\n    const { code, data, details, message, shortMessage } = error;\n    const cause = (() => {\n        if (err instanceof AbiDecodingZeroDataError)\n            return new ContractFunctionZeroDataError({ functionName });\n        if ([EXECUTION_REVERTED_ERROR_CODE, InternalRpcError.code].includes(code) &&\n            (data || details || message || shortMessage)) {\n            return new ContractFunctionRevertedError({\n                abi,\n                data: typeof data === 'object' ? data.data : data,\n                functionName,\n                message: error instanceof RpcRequestError\n                    ? details\n                    : (shortMessage ?? message),\n            });\n        }\n        return err;\n    })();\n    return new ContractFunctionExecutionError(cause, {\n        abi,\n        args,\n        contractAddress: address,\n        docsPath,\n        functionName,\n        sender,\n    });\n}\n//# sourceMappingURL=getContractError.js.map","/** @internal */\nexport const version = '0.1.1';\n//# sourceMappingURL=version.js.map","import { version } from '../version.js';\n/** @internal */\nexport function getUrl(url) {\n    return url;\n}\n/** @internal */\nexport function getVersion() {\n    return version;\n}\n/** @internal */\nexport function prettyPrint(args) {\n    if (!args)\n        return '';\n    const entries = Object.entries(args)\n        .map(([key, value]) => {\n        if (value === undefined || value === false)\n            return null;\n        return [key, value];\n    })\n        .filter(Boolean);\n    const maxLength = entries.reduce((acc, [key]) => Math.max(acc, key.length), 0);\n    return entries\n        .map(([key, value]) => `  ${`${key}:`.padEnd(maxLength + 1)}  ${value}`)\n        .join('\\n');\n}\n//# sourceMappingURL=errors.js.map","import { getVersion } from './internal/errors.js';\n/**\n * Base error class inherited by all errors thrown by ox.\n *\n * @example\n * ```ts\n * import { Errors } from 'ox'\n * throw new Errors.BaseError('An error occurred')\n * ```\n */\nexport class BaseError extends Error {\n    constructor(shortMessage, options = {}) {\n        const details = (() => {\n            if (options.cause instanceof BaseError) {\n                if (options.cause.details)\n                    return options.cause.details;\n                if (options.cause.shortMessage)\n                    return options.cause.shortMessage;\n            }\n            if (options.cause &&\n                'details' in options.cause &&\n                typeof options.cause.details === 'string')\n                return options.cause.details;\n            if (options.cause?.message)\n                return options.cause.message;\n            return options.details;\n        })();\n        const docsPath = (() => {\n            if (options.cause instanceof BaseError)\n                return options.cause.docsPath || options.docsPath;\n            return options.docsPath;\n        })();\n        const docsBaseUrl = 'https://oxlib.sh';\n        const docs = `${docsBaseUrl}${docsPath ?? ''}`;\n        const message = [\n            shortMessage || 'An error occurred.',\n            ...(options.metaMessages ? ['', ...options.metaMessages] : []),\n            ...(details || docsPath\n                ? [\n                    '',\n                    details ? `Details: ${details}` : undefined,\n                    docsPath ? `See: ${docs}` : undefined,\n                ]\n                : []),\n        ]\n            .filter((x) => typeof x === 'string')\n            .join('\\n');\n        super(message, options.cause ? { cause: options.cause } : undefined);\n        Object.defineProperty(this, \"details\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"docs\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"docsPath\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"shortMessage\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"cause\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'BaseError'\n        });\n        Object.defineProperty(this, \"version\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: `ox@${getVersion()}`\n        });\n        this.cause = options.cause;\n        this.details = details;\n        this.docs = docs;\n        this.docsPath = docsPath;\n        this.shortMessage = shortMessage;\n    }\n    walk(fn) {\n        return walk(this, fn);\n    }\n}\n/** @internal */\nfunction walk(err, fn) {\n    if (fn?.(err))\n        return err;\n    if (err && typeof err === 'object' && 'cause' in err && err.cause)\n        return walk(err.cause, fn);\n    return fn ? null : err;\n}\n//# sourceMappingURL=Errors.js.map","const bigIntSuffix = '#__bigint';\n/**\n * Parses a JSON string, with support for `bigint`.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.parse('{\"foo\":\"bar\",\"baz\":\"69420694206942069420694206942069420694206942069420#__bigint\"}')\n * // @log: {\n * // @log:   foo: 'bar',\n * // @log:   baz: 69420694206942069420694206942069420694206942069420n\n * // @log: }\n * ```\n *\n * @param string - The value to parse.\n * @param reviver - A function that transforms the results.\n * @returns The parsed value.\n */\nexport function parse(string, reviver) {\n    return JSON.parse(string, (key, value_) => {\n        const value = value_;\n        if (typeof value === 'string' && value.endsWith(bigIntSuffix))\n            return BigInt(value.slice(0, -bigIntSuffix.length));\n        return typeof reviver === 'function' ? reviver(key, value) : value;\n    });\n}\n/**\n * Stringifies a value to its JSON representation, with support for `bigint`.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.stringify({\n *   foo: 'bar',\n *   baz: 69420694206942069420694206942069420694206942069420n,\n * })\n * // @log: '{\"foo\":\"bar\",\"baz\":\"69420694206942069420694206942069420694206942069420#__bigint\"}'\n * ```\n *\n * @param value - The value to stringify.\n * @param replacer - A function that transforms the results. It is passed the key and value of the property, and must return the value to be used in the JSON string. If this function returns `undefined`, the property is not included in the resulting JSON string.\n * @param space - A string or number that determines the indentation of the JSON string. If it is a number, it indicates the number of spaces to use as indentation; if it is a string (e.g. `'\\t'`), it uses the string as the indentation character.\n * @returns The JSON string.\n */\nexport function stringify(value, replacer, space) {\n    return JSON.stringify(value, (key, value) => {\n        if (typeof replacer === 'function')\n            return replacer(key, value);\n        if (typeof value === 'bigint')\n            return value.toString() + bigIntSuffix;\n        return value;\n    }, space);\n}\n//# sourceMappingURL=Json.js.map","import * as Hex from '../Hex.js';\n/** @internal */\nexport function assertSize(hex, size_) {\n    if (Hex.size(hex) > size_)\n        throw new Hex.SizeOverflowError({\n            givenSize: Hex.size(hex),\n            maxSize: size_,\n        });\n}\n/** @internal */\nexport function assertStartOffset(value, start) {\n    if (typeof start === 'number' && start > 0 && start > Hex.size(value) - 1)\n        throw new Hex.SliceOffsetOutOfBoundsError({\n            offset: start,\n            position: 'start',\n            size: Hex.size(value),\n        });\n}\n/** @internal */\nexport function assertEndOffset(value, start, end) {\n    if (typeof start === 'number' &&\n        typeof end === 'number' &&\n        Hex.size(value) !== end - start) {\n        throw new Hex.SliceOffsetOutOfBoundsError({\n            offset: end,\n            position: 'end',\n            size: Hex.size(value),\n        });\n    }\n}\n/** @internal */\nexport function pad(hex_, options = {}) {\n    const { dir, size = 32 } = options;\n    if (size === 0)\n        return hex_;\n    const hex = hex_.replace('0x', '');\n    if (hex.length > size * 2)\n        throw new Hex.SizeExceedsPaddingSizeError({\n            size: Math.ceil(hex.length / 2),\n            targetSize: size,\n            type: 'Hex',\n        });\n    return `0x${hex[dir === 'right' ? 'padEnd' : 'padStart'](size * 2, '0')}`;\n}\n/** @internal */\nexport function trim(value, options = {}) {\n    const { dir = 'left' } = options;\n    let data = value.replace('0x', '');\n    let sliceLength = 0;\n    for (let i = 0; i < data.length - 1; i++) {\n        if (data[dir === 'left' ? i : data.length - i - 1].toString() === '0')\n            sliceLength++;\n        else\n            break;\n    }\n    data =\n        dir === 'left'\n            ? data.slice(sliceLength)\n            : data.slice(0, data.length - sliceLength);\n    if (data === '0')\n        return '0x';\n    if (dir === 'right' && data.length % 2 === 1)\n        return `0x${data}0`;\n    return `0x${data}`;\n}\n//# sourceMappingURL=hex.js.map","import { equalBytes } from '@noble/curves/abstract/utils';\nimport * as Bytes from './Bytes.js';\nimport * as Errors from './Errors.js';\nimport * as Json from './Json.js';\nimport * as internal_bytes from './internal/bytes.js';\nimport * as internal from './internal/hex.js';\nconst encoder = /*#__PURE__*/ new TextEncoder();\nconst hexes = /*#__PURE__*/ Array.from({ length: 256 }, (_v, i) => i.toString(16).padStart(2, '0'));\n/**\n * Asserts if the given value is {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert('abc')\n * // @error: InvalidHexValueTypeError:\n * // @error: Value `\"abc\"` of type `string` is an invalid hex type.\n * // @error: Hex types must be represented as `\"0x\\${string}\"`.\n * ```\n *\n * @param value - The value to assert.\n * @param options - Options.\n */\nexport function assert(value, options = {}) {\n    const { strict = false } = options;\n    if (!value)\n        throw new InvalidHexTypeError(value);\n    if (typeof value !== 'string')\n        throw new InvalidHexTypeError(value);\n    if (strict) {\n        if (!/^0x[0-9a-fA-F]*$/.test(value))\n            throw new InvalidHexValueError(value);\n    }\n    if (!value.startsWith('0x'))\n        throw new InvalidHexValueError(value);\n}\n/**\n * Concatenates two or more {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.concat('0x123', '0x456')\n * // @log: '0x123456'\n * ```\n *\n * @param values - The {@link ox#Hex.Hex} values to concatenate.\n * @returns The concatenated {@link ox#Hex.Hex} value.\n */\nexport function concat(...values) {\n    return `0x${values.reduce((acc, x) => acc + x.replace('0x', ''), '')}`;\n}\n/**\n * Instantiates a {@link ox#Hex.Hex} value from a hex string or {@link ox#Bytes.Bytes} value.\n *\n * :::tip\n *\n * To instantiate from a **Boolean**, **String**, or **Number**, use one of the following:\n *\n * - `Hex.fromBoolean`\n *\n * - `Hex.fromString`\n *\n * - `Hex.fromNumber`\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.from('0x48656c6c6f20576f726c6421')\n * // @log: '0x48656c6c6f20576f726c6421'\n *\n * Hex.from(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value to encode.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function from(value) {\n    if (value instanceof Uint8Array)\n        return fromBytes(value);\n    if (Array.isArray(value))\n        return fromBytes(new Uint8Array(value));\n    return value;\n}\n/**\n * Encodes a boolean into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromBoolean(true)\n * // @log: '0x1'\n *\n * Hex.fromBoolean(false)\n * // @log: '0x0'\n *\n * Hex.fromBoolean(true, { size: 32 })\n * // @log: '0x0000000000000000000000000000000000000000000000000000000000000001'\n * ```\n *\n * @param value - The boolean value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromBoolean(value, options = {}) {\n    const hex = `0x${Number(value)}`;\n    if (typeof options.size === 'number') {\n        internal.assertSize(hex, options.size);\n        return padLeft(hex, options.size);\n    }\n    return hex;\n}\n/**\n * Encodes a {@link ox#Bytes.Bytes} value into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.fromBytes(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromBytes(value, options = {}) {\n    let string = '';\n    for (let i = 0; i < value.length; i++)\n        string += hexes[value[i]];\n    const hex = `0x${string}`;\n    if (typeof options.size === 'number') {\n        internal.assertSize(hex, options.size);\n        return padRight(hex, options.size);\n    }\n    return hex;\n}\n/**\n * Encodes a number or bigint into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromNumber(420)\n * // @log: '0x1a4'\n *\n * Hex.fromNumber(420, { size: 32 })\n * // @log: '0x00000000000000000000000000000000000000000000000000000000000001a4'\n * ```\n *\n * @param value - The number or bigint value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromNumber(value, options = {}) {\n    const { signed, size } = options;\n    const value_ = BigInt(value);\n    let maxValue;\n    if (size) {\n        if (signed)\n            maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n;\n        else\n            maxValue = 2n ** (BigInt(size) * 8n) - 1n;\n    }\n    else if (typeof value === 'number') {\n        maxValue = BigInt(Number.MAX_SAFE_INTEGER);\n    }\n    const minValue = typeof maxValue === 'bigint' && signed ? -maxValue - 1n : 0;\n    if ((maxValue && value_ > maxValue) || value_ < minValue) {\n        const suffix = typeof value === 'bigint' ? 'n' : '';\n        throw new IntegerOutOfRangeError({\n            max: maxValue ? `${maxValue}${suffix}` : undefined,\n            min: `${minValue}${suffix}`,\n            signed,\n            size,\n            value: `${value}${suffix}`,\n        });\n    }\n    const stringValue = (signed && value_ < 0 ? (1n << BigInt(size * 8)) + BigInt(value_) : value_).toString(16);\n    const hex = `0x${stringValue}`;\n    if (size)\n        return padLeft(hex, size);\n    return hex;\n}\n/**\n * Encodes a string into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n * Hex.fromString('Hello World!')\n * // '0x48656c6c6f20576f726c6421'\n *\n * Hex.fromString('Hello World!', { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n * ```\n *\n * @param value - The string value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nexport function fromString(value, options = {}) {\n    return fromBytes(encoder.encode(value), options);\n}\n/**\n * Checks if two {@link ox#Hex.Hex} values are equal.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.isEqual('0xdeadbeef', '0xdeadbeef')\n * // @log: true\n *\n * Hex.isEqual('0xda', '0xba')\n * // @log: false\n * ```\n *\n * @param hexA - The first {@link ox#Hex.Hex} value.\n * @param hexB - The second {@link ox#Hex.Hex} value.\n * @returns `true` if the two {@link ox#Hex.Hex} values are equal, `false` otherwise.\n */\nexport function isEqual(hexA, hexB) {\n    return equalBytes(Bytes.fromHex(hexA), Bytes.fromHex(hexB));\n}\n/**\n * Pads a {@link ox#Hex.Hex} value to the left with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.padLeft('0x1234', 4)\n * // @log: '0x00001234'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to pad.\n * @param size - The size (in bytes) of the output hex value.\n * @returns The padded {@link ox#Hex.Hex} value.\n */\nexport function padLeft(value, size) {\n    return internal.pad(value, { dir: 'left', size });\n}\n/**\n * Pads a {@link ox#Hex.Hex} value to the right with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts\n * import { Hex } from 'ox'\n *\n * Hex.padRight('0x1234', 4)\n * // @log: '0x12340000'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to pad.\n * @param size - The size (in bytes) of the output hex value.\n * @returns The padded {@link ox#Hex.Hex} value.\n */\nexport function padRight(value, size) {\n    return internal.pad(value, { dir: 'right', size });\n}\n/**\n * Generates a random {@link ox#Hex.Hex} value of the specified length.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * const hex = Hex.random(32)\n * // @log: '0x...'\n * ```\n *\n * @returns Random {@link ox#Hex.Hex} value.\n */\nexport function random(length) {\n    return fromBytes(Bytes.random(length));\n}\n/**\n * Returns a section of a {@link ox#Bytes.Bytes} value given a start/end bytes offset.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.slice('0x0123456789', 1, 4)\n * // @log: '0x234567'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to slice.\n * @param start - The start offset (in bytes).\n * @param end - The end offset (in bytes).\n * @param options - Options.\n * @returns The sliced {@link ox#Hex.Hex} value.\n */\nexport function slice(value, start, end, options = {}) {\n    const { strict } = options;\n    internal.assertStartOffset(value, start);\n    const value_ = `0x${value\n        .replace('0x', '')\n        .slice((start ?? 0) * 2, (end ?? value.length) * 2)}`;\n    if (strict)\n        internal.assertEndOffset(value_, start, end);\n    return value_;\n}\n/**\n * Retrieves the size of a {@link ox#Hex.Hex} value (in bytes).\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.size('0xdeadbeef')\n * // @log: 4\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to get the size of.\n * @returns The size of the {@link ox#Hex.Hex} value (in bytes).\n */\nexport function size(value) {\n    return Math.ceil((value.length - 2) / 2);\n}\n/**\n * Trims leading zeros from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.trimLeft('0x00000000deadbeef')\n * // @log: '0xdeadbeef'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to trim.\n * @returns The trimmed {@link ox#Hex.Hex} value.\n */\nexport function trimLeft(value) {\n    return internal.trim(value, { dir: 'left' });\n}\n/**\n * Trims trailing zeros from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.trimRight('0xdeadbeef00000000')\n * // @log: '0xdeadbeef'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to trim.\n * @returns The trimmed {@link ox#Hex.Hex} value.\n */\nexport function trimRight(value) {\n    return internal.trim(value, { dir: 'right' });\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a BigInt.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBigInt('0x1a4')\n * // @log: 420n\n *\n * Hex.toBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // @log: 420n\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded BigInt.\n */\nexport function toBigInt(hex, options = {}) {\n    const { signed } = options;\n    if (options.size)\n        internal.assertSize(hex, options.size);\n    const value = BigInt(hex);\n    if (!signed)\n        return value;\n    const size = (hex.length - 2) / 2;\n    const max_unsigned = (1n << (BigInt(size) * 8n)) - 1n;\n    const max_signed = max_unsigned >> 1n;\n    if (value <= max_signed)\n        return value;\n    return value - max_unsigned - 1n;\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBoolean('0x01')\n * // @log: true\n *\n * Hex.toBoolean('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })\n * // @log: true\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded boolean.\n */\nexport function toBoolean(hex, options = {}) {\n    if (options.size)\n        internal.assertSize(hex, options.size);\n    const hex_ = trimLeft(hex);\n    if (hex_ === '0x')\n        return false;\n    if (hex_ === '0x1')\n        return true;\n    throw new InvalidHexBooleanError(hex);\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * const data = Hex.toBytes('0x48656c6c6f20776f726c6421')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded {@link ox#Bytes.Bytes}.\n */\nexport function toBytes(hex, options = {}) {\n    return Bytes.fromHex(hex, options);\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a number.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toNumber('0x1a4')\n * // @log: 420\n *\n * Hex.toNumber('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // @log: 420\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded number.\n */\nexport function toNumber(hex, options = {}) {\n    const { signed, size } = options;\n    if (!signed && !size)\n        return Number(hex);\n    return Number(toBigInt(hex, options));\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a string.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toString('0x48656c6c6f20576f726c6421')\n * // @log: 'Hello world!'\n *\n * Hex.toString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n *  size: 32,\n * })\n * // @log: 'Hello world'\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded string.\n */\nexport function toString(hex, options = {}) {\n    const { size } = options;\n    let bytes = Bytes.fromHex(hex);\n    if (size) {\n        internal_bytes.assertSize(bytes, size);\n        bytes = Bytes.trimRight(bytes);\n    }\n    return new TextDecoder().decode(bytes);\n}\n/**\n * Checks if the given value is {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.validate('0xdeadbeef')\n * // @log: true\n *\n * Hex.validate(Bytes.from([1, 2, 3]))\n * // @log: false\n * ```\n *\n * @param value - The value to check.\n * @param options - Options.\n * @returns `true` if the value is a {@link ox#Hex.Hex}, `false` otherwise.\n */\nexport function validate(value, options = {}) {\n    const { strict = false } = options;\n    try {\n        assert(value, { strict });\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\n/**\n * Thrown when the provided integer is out of range, and cannot be represented as a hex value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromNumber(420182738912731283712937129)\n * // @error: Hex.IntegerOutOfRangeError: Number \\`4.2018273891273126e+26\\` is not in safe unsigned integer range (`0` to `9007199254740991`)\n * ```\n */\nexport class IntegerOutOfRangeError extends Errors.BaseError {\n    constructor({ max, min, signed, size, value, }) {\n        super(`Number \\`${value}\\` is not in safe${size ? ` ${size * 8}-bit` : ''}${signed ? ' signed' : ' unsigned'} integer range ${max ? `(\\`${min}\\` to \\`${max}\\`)` : `(above \\`${min}\\`)`}`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.IntegerOutOfRangeError'\n        });\n    }\n}\n/**\n * Thrown when the provided hex value cannot be represented as a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBoolean('0xa')\n * // @error: Hex.InvalidHexBooleanError: Hex value `\"0xa\"` is not a valid boolean.\n * // @error: The hex value must be `\"0x0\"` (false) or `\"0x1\"` (true).\n * ```\n */\nexport class InvalidHexBooleanError extends Errors.BaseError {\n    constructor(hex) {\n        super(`Hex value \\`\"${hex}\"\\` is not a valid boolean.`, {\n            metaMessages: [\n                'The hex value must be `\"0x0\"` (false) or `\"0x1\"` (true).',\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.InvalidHexBooleanError'\n        });\n    }\n}\n/**\n * Thrown when the provided value is not a valid hex type.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert(1)\n * // @error: Hex.InvalidHexTypeError: Value `1` of type `number` is an invalid hex type.\n * ```\n */\nexport class InvalidHexTypeError extends Errors.BaseError {\n    constructor(value) {\n        super(`Value \\`${typeof value === 'object' ? Json.stringify(value) : value}\\` of type \\`${typeof value}\\` is an invalid hex type.`, {\n            metaMessages: ['Hex types must be represented as `\"0x${string}\"`.'],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.InvalidHexTypeError'\n        });\n    }\n}\n/**\n * Thrown when the provided hex value is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert('0x0123456789abcdefg')\n * // @error: Hex.InvalidHexValueError: Value `0x0123456789abcdefg` is an invalid hex value.\n * // @error: Hex values must start with `\"0x\"` and contain only hexadecimal characters (0-9, a-f, A-F).\n * ```\n */\nexport class InvalidHexValueError extends Errors.BaseError {\n    constructor(value) {\n        super(`Value \\`${value}\\` is an invalid hex value.`, {\n            metaMessages: [\n                'Hex values must start with `\"0x\"` and contain only hexadecimal characters (0-9, a-f, A-F).',\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.InvalidHexValueError'\n        });\n    }\n}\n/**\n * Thrown when the provided hex value is an odd length.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.fromHex('0xabcde')\n * // @error: Hex.InvalidLengthError: Hex value `\"0xabcde\"` is an odd length (5 nibbles).\n * ```\n */\nexport class InvalidLengthError extends Errors.BaseError {\n    constructor(value) {\n        super(`Hex value \\`\"${value}\"\\` is an odd length (${value.length - 2} nibbles).`, {\n            metaMessages: ['It must be an even length.'],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.InvalidLengthError'\n        });\n    }\n}\n/**\n * Thrown when the size of the value exceeds the expected max size.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromString('Hello World!', { size: 8 })\n * // @error: Hex.SizeOverflowError: Size cannot exceed `8` bytes. Given size: `12` bytes.\n * ```\n */\nexport class SizeOverflowError extends Errors.BaseError {\n    constructor({ givenSize, maxSize }) {\n        super(`Size cannot exceed \\`${maxSize}\\` bytes. Given size: \\`${givenSize}\\` bytes.`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.SizeOverflowError'\n        });\n    }\n}\n/**\n * Thrown when the slice offset exceeds the bounds of the value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.slice('0x0123456789', 6)\n * // @error: Hex.SliceOffsetOutOfBoundsError: Slice starting at offset `6` is out-of-bounds (size: `5`).\n * ```\n */\nexport class SliceOffsetOutOfBoundsError extends Errors.BaseError {\n    constructor({ offset, position, size, }) {\n        super(`Slice ${position === 'start' ? 'starting' : 'ending'} at offset \\`${offset}\\` is out-of-bounds (size: \\`${size}\\`).`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.SliceOffsetOutOfBoundsError'\n        });\n    }\n}\n/**\n * Thrown when the size of the value exceeds the pad size.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.padLeft('0x1a4e12a45a21323123aaa87a897a897a898a6567a578a867a98778a667a85a875a87a6a787a65a675a6a9', 32)\n * // @error: Hex.SizeExceedsPaddingSizeError: Hex size (`43`) exceeds padding size (`32`).\n * ```\n */\nexport class SizeExceedsPaddingSizeError extends Errors.BaseError {\n    constructor({ size, targetSize, type, }) {\n        super(`${type.charAt(0).toUpperCase()}${type\n            .slice(1)\n            .toLowerCase()} size (\\`${size}\\`) exceeds padding size (\\`${targetSize}\\`).`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.SizeExceedsPaddingSizeError'\n        });\n    }\n}\n//# sourceMappingURL=Hex.js.map","import * as Hex from './Hex.js';\n/**\n * Converts a {@link ox#Withdrawal.Rpc} to an {@link ox#Withdrawal.Withdrawal}.\n *\n * @example\n * ```ts twoslash\n * import { Withdrawal } from 'ox'\n *\n * const withdrawal = Withdrawal.fromRpc({\n *   address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n *   amount: '0x620323',\n *   index: '0x0',\n *   validatorIndex: '0x1',\n * })\n * // @log: {\n * // @log:   address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * // @log:   amount: 6423331n,\n * // @log:   index: 0,\n * // @log:   validatorIndex: 1\n * // @log: }\n * ```\n *\n * @param withdrawal - The RPC withdrawal to convert.\n * @returns An instantiated {@link ox#Withdrawal.Withdrawal}.\n */\nexport function fromRpc(withdrawal) {\n    return {\n        ...withdrawal,\n        amount: BigInt(withdrawal.amount),\n        index: Number(withdrawal.index),\n        validatorIndex: Number(withdrawal.validatorIndex),\n    };\n}\n/**\n * Converts a {@link ox#Withdrawal.Withdrawal} to an {@link ox#Withdrawal.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { Withdrawal } from 'ox'\n *\n * const withdrawal = Withdrawal.toRpc({\n *   address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n *   amount: 6423331n,\n *   index: 0,\n *   validatorIndex: 1,\n * })\n * // @log: {\n * // @log:   address: '0x00000000219ab540356cBB839Cbe05303d7705Fa',\n * // @log:   amount: '0x620323',\n * // @log:   index: '0x0',\n * // @log:   validatorIndex: '0x1',\n * // @log: }\n * ```\n *\n * @param withdrawal - The Withdrawal to convert.\n * @returns An RPC Withdrawal.\n */\nexport function toRpc(withdrawal) {\n    return {\n        address: withdrawal.address,\n        amount: Hex.fromNumber(withdrawal.amount),\n        index: Hex.fromNumber(withdrawal.index),\n        validatorIndex: Hex.fromNumber(withdrawal.validatorIndex),\n    };\n}\n//# sourceMappingURL=Withdrawal.js.map","import * as Hex from './Hex.js';\nimport * as Withdrawal from './Withdrawal.js';\n/**\n * Converts an {@link ox#BlockOverrides.Rpc} to an {@link ox#BlockOverrides.BlockOverrides}.\n *\n * @example\n * ```ts twoslash\n * import { BlockOverrides } from 'ox'\n *\n * const blockOverrides = BlockOverrides.fromRpc({\n *   baseFeePerGas: '0x1',\n *   blobBaseFee: '0x2',\n *   feeRecipient: '0x0000000000000000000000000000000000000000',\n *   gasLimit: '0x4',\n *   number: '0x5',\n *   prevRandao: '0x6',\n *   time: '0x1234567890',\n *   withdrawals: [\n *     {\n *       address: '0x0000000000000000000000000000000000000000',\n *       amount: '0x1',\n *       index: '0x0',\n *       validatorIndex: '0x1',\n *     },\n *   ],\n * })\n * ```\n *\n * @param rpcBlockOverrides - The RPC block overrides to convert.\n * @returns An instantiated {@link ox#BlockOverrides.BlockOverrides}.\n */\nexport function fromRpc(rpcBlockOverrides) {\n    return {\n        ...(rpcBlockOverrides.baseFeePerGas && {\n            baseFeePerGas: BigInt(rpcBlockOverrides.baseFeePerGas),\n        }),\n        ...(rpcBlockOverrides.blobBaseFee && {\n            blobBaseFee: BigInt(rpcBlockOverrides.blobBaseFee),\n        }),\n        ...(rpcBlockOverrides.feeRecipient && {\n            feeRecipient: rpcBlockOverrides.feeRecipient,\n        }),\n        ...(rpcBlockOverrides.gasLimit && {\n            gasLimit: BigInt(rpcBlockOverrides.gasLimit),\n        }),\n        ...(rpcBlockOverrides.number && {\n            number: BigInt(rpcBlockOverrides.number),\n        }),\n        ...(rpcBlockOverrides.prevRandao && {\n            prevRandao: BigInt(rpcBlockOverrides.prevRandao),\n        }),\n        ...(rpcBlockOverrides.time && {\n            time: BigInt(rpcBlockOverrides.time),\n        }),\n        ...(rpcBlockOverrides.withdrawals && {\n            withdrawals: rpcBlockOverrides.withdrawals.map(Withdrawal.fromRpc),\n        }),\n    };\n}\n/**\n * Converts an {@link ox#BlockOverrides.BlockOverrides} to an {@link ox#BlockOverrides.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { BlockOverrides } from 'ox'\n *\n * const blockOverrides = BlockOverrides.toRpc({\n *   baseFeePerGas: 1n,\n *   blobBaseFee: 2n,\n *   feeRecipient: '0x0000000000000000000000000000000000000000',\n *   gasLimit: 4n,\n *   number: 5n,\n *   prevRandao: 6n,\n *   time: 78187493520n,\n *   withdrawals: [\n *     {\n *       address: '0x0000000000000000000000000000000000000000',\n *       amount: 1n,\n *       index: 0,\n *       validatorIndex: 1,\n *     },\n *   ],\n * })\n * ```\n *\n * @param blockOverrides - The block overrides to convert.\n * @returns An instantiated {@link ox#BlockOverrides.Rpc}.\n */\nexport function toRpc(blockOverrides) {\n    return {\n        ...(typeof blockOverrides.baseFeePerGas === 'bigint' && {\n            baseFeePerGas: Hex.fromNumber(blockOverrides.baseFeePerGas),\n        }),\n        ...(typeof blockOverrides.blobBaseFee === 'bigint' && {\n            blobBaseFee: Hex.fromNumber(blockOverrides.blobBaseFee),\n        }),\n        ...(typeof blockOverrides.feeRecipient === 'string' && {\n            feeRecipient: blockOverrides.feeRecipient,\n        }),\n        ...(typeof blockOverrides.gasLimit === 'bigint' && {\n            gasLimit: Hex.fromNumber(blockOverrides.gasLimit),\n        }),\n        ...(typeof blockOverrides.number === 'bigint' && {\n            number: Hex.fromNumber(blockOverrides.number),\n        }),\n        ...(typeof blockOverrides.prevRandao === 'bigint' && {\n            prevRandao: Hex.fromNumber(blockOverrides.prevRandao),\n        }),\n        ...(typeof blockOverrides.time === 'bigint' && {\n            time: Hex.fromNumber(blockOverrides.time),\n        }),\n        ...(blockOverrides.withdrawals && {\n            withdrawals: blockOverrides.withdrawals.map(Withdrawal.toRpc),\n        }),\n    };\n}\n//# sourceMappingURL=BlockOverrides.js.map","export const aggregate3Signature = '0x82ad56cb';\n//# sourceMappingURL=contract.js.map","export const deploylessCallViaBytecodeBytecode = '0x608060405234801561001057600080fd5b5060405161018e38038061018e83398101604081905261002f91610124565b6000808351602085016000f59050803b61004857600080fd5b6000808351602085016000855af16040513d6000823e81610067573d81fd5b3d81f35b634e487b7160e01b600052604160045260246000fd5b600082601f83011261009257600080fd5b81516001600160401b038111156100ab576100ab61006b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156100d9576100d961006b565b6040528181528382016020018510156100f157600080fd5b60005b82811015610110576020818601810151838301820152016100f4565b506000918101602001919091529392505050565b6000806040838503121561013757600080fd5b82516001600160401b0381111561014d57600080fd5b61015985828601610081565b602085015190935090506001600160401b0381111561017757600080fd5b61018385828601610081565b915050925092905056fe';\nexport const deploylessCallViaFactoryBytecode = '0x608060405234801561001057600080fd5b506040516102c03803806102c083398101604081905261002f916101e6565b836001600160a01b03163b6000036100e457600080836001600160a01b03168360405161005c9190610270565b6000604051808303816000865af19150503d8060008114610099576040519150601f19603f3d011682016040523d82523d6000602084013e61009e565b606091505b50915091508115806100b857506001600160a01b0386163b155b156100e1578060405163101bb98d60e01b81526004016100d8919061028c565b60405180910390fd5b50505b6000808451602086016000885af16040513d6000823e81610103573d81fd5b3d81f35b80516001600160a01b038116811461011e57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561015457818101518382015260200161013c565b50506000910152565b600082601f83011261016e57600080fd5b81516001600160401b0381111561018757610187610123565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101b5576101b5610123565b6040528181528382016020018510156101cd57600080fd5b6101de826020830160208701610139565b949350505050565b600080600080608085870312156101fc57600080fd5b61020585610107565b60208601519094506001600160401b0381111561022157600080fd5b61022d8782880161015d565b93505061023c60408601610107565b60608601519092506001600160401b0381111561025857600080fd5b6102648782880161015d565b91505092959194509250565b60008251610282818460208701610139565b9190910192915050565b60208152600082518060208401526102ab816040850160208701610139565b601f01601f1916919091016040019291505056fe';\nexport const universalSignatureValidatorByteCode = '0x608060405234801561001057600080fd5b5060405161069438038061069483398101604081905261002f9161051e565b600061003c848484610048565b9050806000526001601ff35b60007f64926492649264926492649264926492649264926492649264926492649264926100748361040c565b036101e7576000606080848060200190518101906100929190610577565b60405192955090935091506000906001600160a01b038516906100b69085906105dd565b6000604051808303816000865af19150503d80600081146100f3576040519150601f19603f3d011682016040523d82523d6000602084013e6100f8565b606091505b50509050876001600160a01b03163b60000361016057806101605760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90610190908b9087906004016105f9565b602060405180830381865afa1580156101ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d19190610633565b6001600160e01b03191614945050505050610405565b6001600160a01b0384163b1561027a57604051630b135d3f60e11b808252906001600160a01b03861690631626ba7e9061022790879087906004016105f9565b602060405180830381865afa158015610244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102689190610633565b6001600160e01b031916149050610405565b81516041146102df5760405162461bcd60e51b815260206004820152603a602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610157565b6102e7610425565b5060208201516040808401518451859392600091859190811061030c5761030c61065d565b016020015160f81c9050601b811480159061032b57508060ff16601c14155b1561038c5760405162461bcd60e51b815260206004820152603b602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c756500000000006064820152608401610157565b60408051600081526020810180835289905260ff83169181019190915260608101849052608081018390526001600160a01b0389169060019060a0016020604051602081039080840390855afa1580156103ea573d6000803e3d6000fd5b505050602060405103516001600160a01b0316149450505050505b9392505050565b600060208251101561041d57600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b038116811461045857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561048c578181015183820152602001610474565b50506000910152565b600082601f8301126104a657600080fd5b81516001600160401b038111156104bf576104bf61045b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104ed576104ed61045b565b60405281815283820160200185101561050557600080fd5b610516826020830160208701610471565b949350505050565b60008060006060848603121561053357600080fd5b835161053e81610443565b6020850151604086015191945092506001600160401b0381111561056157600080fd5b61056d86828701610495565b9150509250925092565b60008060006060848603121561058c57600080fd5b835161059781610443565b60208501519093506001600160401b038111156105b357600080fd5b6105bf86828701610495565b604086015190935090506001600160401b0381111561056157600080fd5b600082516105ef818460208701610471565b9190910192915050565b828152604060208201526000825180604084015261061e816060850160208701610471565b601f01601f1916919091016060019392505050565b60006020828403121561064557600080fd5b81516001600160e01b03198116811461040557600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572';\n//# sourceMappingURL=contracts.js.map","import { CallExecutionError, } from '../../errors/contract.js';\nimport { UnknownNodeError } from '../../errors/node.js';\nimport { getNodeError, } from './getNodeError.js';\nexport function getCallError(err, { docsPath, ...args }) {\n    const cause = (() => {\n        const cause = getNodeError(err, args);\n        if (cause instanceof UnknownNodeError)\n            return err;\n        return cause;\n    })();\n    return new CallExecutionError(cause, {\n        docsPath,\n        ...args,\n    });\n}\n//# sourceMappingURL=getCallError.js.map","/** @internal */\nexport function withResolvers() {\n    let resolve = () => undefined;\n    let reject = () => undefined;\n    const promise = new Promise((resolve_, reject_) => {\n        resolve = resolve_;\n        reject = reject_;\n    });\n    return { promise, resolve, reject };\n}\n//# sourceMappingURL=withResolvers.js.map","import { withResolvers } from './withResolvers.js';\nconst schedulerCache = /*#__PURE__*/ new Map();\n/** @internal */\nexport function createBatchScheduler({ fn, id, shouldSplitBatch, wait = 0, sort, }) {\n    const exec = async () => {\n        const scheduler = getScheduler();\n        flush();\n        const args = scheduler.map(({ args }) => args);\n        if (args.length === 0)\n            return;\n        fn(args)\n            .then((data) => {\n            if (sort && Array.isArray(data))\n                data.sort(sort);\n            for (let i = 0; i < scheduler.length; i++) {\n                const { resolve } = scheduler[i];\n                resolve?.([data[i], data]);\n            }\n        })\n            .catch((err) => {\n            for (let i = 0; i < scheduler.length; i++) {\n                const { reject } = scheduler[i];\n                reject?.(err);\n            }\n        });\n    };\n    const flush = () => schedulerCache.delete(id);\n    const getBatchedArgs = () => getScheduler().map(({ args }) => args);\n    const getScheduler = () => schedulerCache.get(id) || [];\n    const setScheduler = (item) => schedulerCache.set(id, [...getScheduler(), item]);\n    return {\n        flush,\n        async schedule(args) {\n            const { promise, resolve, reject } = withResolvers();\n            const split = shouldSplitBatch?.([...getBatchedArgs(), args]);\n            if (split)\n                exec();\n            const hasActiveScheduler = getScheduler().length > 0;\n            if (hasActiveScheduler) {\n                setScheduler({ args, resolve, reject });\n                return promise;\n            }\n            setScheduler({ args, resolve, reject });\n            setTimeout(exec, wait);\n            return promise;\n        },\n    };\n}\n//# sourceMappingURL=createBatchScheduler.js.map","import { parseAbi } from 'abitype';\nimport * as BlockOverrides from 'ox/BlockOverrides';\nimport { parseAccount, } from '../../accounts/utils/parseAccount.js';\nimport { multicall3Abi } from '../../constants/abis.js';\nimport { aggregate3Signature } from '../../constants/contract.js';\nimport { deploylessCallViaBytecodeBytecode, deploylessCallViaFactoryBytecode, } from '../../constants/contracts.js';\nimport { BaseError } from '../../errors/base.js';\nimport { ChainDoesNotSupportContract, ClientChainNotConfiguredError, } from '../../errors/chain.js';\nimport { CounterfactualDeploymentFailedError, RawContractError, } from '../../errors/contract.js';\nimport { decodeFunctionResult, } from '../../utils/abi/decodeFunctionResult.js';\nimport { encodeDeployData, } from '../../utils/abi/encodeDeployData.js';\nimport { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';\nimport { getChainContractAddress, } from '../../utils/chain/getChainContractAddress.js';\nimport { numberToHex, } from '../../utils/encoding/toHex.js';\nimport { getCallError, } from '../../utils/errors/getCallError.js';\nimport { extract } from '../../utils/formatters/extract.js';\nimport { formatTransactionRequest, } from '../../utils/formatters/transactionRequest.js';\nimport { createBatchScheduler, } from '../../utils/promise/createBatchScheduler.js';\nimport { serializeStateOverride, } from '../../utils/stateOverride.js';\nimport { assertRequest } from '../../utils/transaction/assertRequest.js';\n/**\n * Executes a new message call immediately without submitting a transaction to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/call\n * - JSON-RPC Methods: [`eth_call`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_call)\n *\n * @param client - Client to use\n * @param parameters - {@link CallParameters}\n * @returns The call data. {@link CallReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { call } from 'viem/public'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const data = await call(client, {\n *   account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n *   data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n *   to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * })\n */\nexport async function call(client, args) {\n    const { account: account_ = client.account, authorizationList, batch = Boolean(client.batch?.multicall), blockNumber, blockTag = client.experimental_blockTag ?? 'latest', accessList, blobs, blockOverrides, code, data: data_, factory, factoryData, gas, gasPrice, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, nonce, to, value, stateOverride, ...rest } = args;\n    const account = account_ ? parseAccount(account_) : undefined;\n    if (code && (factory || factoryData))\n        throw new BaseError('Cannot provide both `code` & `factory`/`factoryData` as parameters.');\n    if (code && to)\n        throw new BaseError('Cannot provide both `code` & `to` as parameters.');\n    // Check if the call is deployless via bytecode.\n    const deploylessCallViaBytecode = code && data_;\n    // Check if the call is deployless via a factory.\n    const deploylessCallViaFactory = factory && factoryData && to && data_;\n    const deploylessCall = deploylessCallViaBytecode || deploylessCallViaFactory;\n    const data = (() => {\n        if (deploylessCallViaBytecode)\n            return toDeploylessCallViaBytecodeData({\n                code,\n                data: data_,\n            });\n        if (deploylessCallViaFactory)\n            return toDeploylessCallViaFactoryData({\n                data: data_,\n                factory,\n                factoryData,\n                to,\n            });\n        return data_;\n    })();\n    try {\n        assertRequest(args);\n        const blockNumberHex = typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined;\n        const block = blockNumberHex || blockTag;\n        const rpcBlockOverrides = blockOverrides\n            ? BlockOverrides.toRpc(blockOverrides)\n            : undefined;\n        const rpcStateOverride = serializeStateOverride(stateOverride);\n        const chainFormat = client.chain?.formatters?.transactionRequest?.format;\n        const format = chainFormat || formatTransactionRequest;\n        const request = format({\n            // Pick out extra data that might exist on the chain's transaction request type.\n            ...extract(rest, { format: chainFormat }),\n            from: account?.address,\n            accessList,\n            authorizationList,\n            blobs,\n            data,\n            gas,\n            gasPrice,\n            maxFeePerBlobGas,\n            maxFeePerGas,\n            maxPriorityFeePerGas,\n            nonce,\n            to: deploylessCall ? undefined : to,\n            value,\n        });\n        if (batch &&\n            shouldPerformMulticall({ request }) &&\n            !rpcStateOverride &&\n            !rpcBlockOverrides) {\n            try {\n                return await scheduleMulticall(client, {\n                    ...request,\n                    blockNumber,\n                    blockTag,\n                });\n            }\n            catch (err) {\n                if (!(err instanceof ClientChainNotConfiguredError) &&\n                    !(err instanceof ChainDoesNotSupportContract))\n                    throw err;\n            }\n        }\n        const params = (() => {\n            const base = [\n                request,\n                block,\n            ];\n            if (rpcStateOverride && rpcBlockOverrides)\n                return [...base, rpcStateOverride, rpcBlockOverrides];\n            if (rpcStateOverride)\n                return [...base, rpcStateOverride];\n            if (rpcBlockOverrides)\n                return [...base, {}, rpcBlockOverrides];\n            return base;\n        })();\n        const response = await client.request({\n            method: 'eth_call',\n            params,\n        });\n        if (response === '0x')\n            return { data: undefined };\n        return { data: response };\n    }\n    catch (err) {\n        const data = getRevertErrorData(err);\n        // Check for CCIP-Read offchain lookup signature.\n        const { offchainLookup, offchainLookupSignature } = await import('../../utils/ccip.js');\n        if (client.ccipRead !== false &&\n            data?.slice(0, 10) === offchainLookupSignature &&\n            to)\n            return { data: await offchainLookup(client, { data, to }) };\n        // Check for counterfactual deployment error.\n        if (deploylessCall && data?.slice(0, 10) === '0x101bb98d')\n            throw new CounterfactualDeploymentFailedError({ factory });\n        throw getCallError(err, {\n            ...args,\n            account,\n            chain: client.chain,\n        });\n    }\n}\n// We only want to perform a scheduled multicall if:\n// - The request has calldata,\n// - The request has a target address,\n// - The target address is not already the aggregate3 signature,\n// - The request has no other properties (`nonce`, `gas`, etc cannot be sent with a multicall).\nfunction shouldPerformMulticall({ request }) {\n    const { data, to, ...request_ } = request;\n    if (!data)\n        return false;\n    if (data.startsWith(aggregate3Signature))\n        return false;\n    if (!to)\n        return false;\n    if (Object.values(request_).filter((x) => typeof x !== 'undefined').length > 0)\n        return false;\n    return true;\n}\nasync function scheduleMulticall(client, args) {\n    const { batchSize = 1024, wait = 0 } = typeof client.batch?.multicall === 'object' ? client.batch.multicall : {};\n    const { blockNumber, blockTag = client.experimental_blockTag ?? 'latest', data, multicallAddress: multicallAddress_, to, } = args;\n    let multicallAddress = multicallAddress_;\n    if (!multicallAddress) {\n        if (!client.chain)\n            throw new ClientChainNotConfiguredError();\n        multicallAddress = getChainContractAddress({\n            blockNumber,\n            chain: client.chain,\n            contract: 'multicall3',\n        });\n    }\n    const blockNumberHex = typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined;\n    const block = blockNumberHex || blockTag;\n    const { schedule } = createBatchScheduler({\n        id: `${client.uid}.${block}`,\n        wait,\n        shouldSplitBatch(args) {\n            const size = args.reduce((size, { data }) => size + (data.length - 2), 0);\n            return size > batchSize * 2;\n        },\n        fn: async (requests) => {\n            const calls = requests.map((request) => ({\n                allowFailure: true,\n                callData: request.data,\n                target: request.to,\n            }));\n            const calldata = encodeFunctionData({\n                abi: multicall3Abi,\n                args: [calls],\n                functionName: 'aggregate3',\n            });\n            const data = await client.request({\n                method: 'eth_call',\n                params: [\n                    {\n                        data: calldata,\n                        to: multicallAddress,\n                    },\n                    block,\n                ],\n            });\n            return decodeFunctionResult({\n                abi: multicall3Abi,\n                args: [calls],\n                functionName: 'aggregate3',\n                data: data || '0x',\n            });\n        },\n    });\n    const [{ returnData, success }] = await schedule({ data, to });\n    if (!success)\n        throw new RawContractError({ data: returnData });\n    if (returnData === '0x')\n        return { data: undefined };\n    return { data: returnData };\n}\nfunction toDeploylessCallViaBytecodeData(parameters) {\n    const { code, data } = parameters;\n    return encodeDeployData({\n        abi: parseAbi(['constructor(bytes, bytes)']),\n        bytecode: deploylessCallViaBytecodeBytecode,\n        args: [code, data],\n    });\n}\nfunction toDeploylessCallViaFactoryData(parameters) {\n    const { data, factory, factoryData, to } = parameters;\n    return encodeDeployData({\n        abi: parseAbi(['constructor(address, bytes, address, bytes)']),\n        bytecode: deploylessCallViaFactoryBytecode,\n        args: [to, data, factory, factoryData],\n    });\n}\n/** @internal */\nexport function getRevertErrorData(err) {\n    if (!(err instanceof BaseError))\n        return undefined;\n    const error = err.walk();\n    return typeof error?.data === 'object' ? error.data?.data : error.data;\n}\n//# sourceMappingURL=call.js.map","import { decodeFunctionResult, } from '../../utils/abi/decodeFunctionResult.js';\nimport { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';\nimport { getContractError, } from '../../utils/errors/getContractError.js';\nimport { getAction } from '../../utils/getAction.js';\nimport { call } from './call.js';\n/**\n * Calls a read-only function on a contract, and returns the response.\n *\n * - Docs: https://viem.sh/docs/contract/readContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_reading-contracts\n *\n * A \"read-only\" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param client - Client to use\n * @param parameters - {@link ReadContractParameters}\n * @returns The response from the contract. Type is inferred. {@link ReadContractReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { readContract } from 'viem/contract'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const result = await readContract(client, {\n *   address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n *   abi: parseAbi(['function balanceOf(address) view returns (uint256)']),\n *   functionName: 'balanceOf',\n *   args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // 424122n\n */\nexport async function readContract(client, parameters) {\n    const { abi, address, args, functionName, ...rest } = parameters;\n    const calldata = encodeFunctionData({\n        abi,\n        args,\n        functionName,\n    });\n    try {\n        const { data } = await getAction(client, call, 'call')({\n            ...rest,\n            data: calldata,\n            to: address,\n        });\n        return decodeFunctionResult({\n            abi,\n            args,\n            functionName,\n            data: data || '0x',\n        });\n    }\n    catch (error) {\n        throw getContractError(error, {\n            abi,\n            address,\n            args,\n            docsPath: '/docs/contract/readContract',\n            functionName,\n        });\n    }\n}\n//# sourceMappingURL=readContract.js.map","import { BaseError } from './base.js';\nexport class EnsAvatarInvalidMetadataError extends BaseError {\n    constructor({ data }) {\n        super('Unable to extract image from metadata. The metadata may be malformed or invalid.', {\n            metaMessages: [\n                '- Metadata must be a JSON object with at least an `image`, `image_url` or `image_data` property.',\n                '',\n                `Provided data: ${JSON.stringify(data)}`,\n            ],\n            name: 'EnsAvatarInvalidMetadataError',\n        });\n    }\n}\nexport class EnsAvatarInvalidNftUriError extends BaseError {\n    constructor({ reason }) {\n        super(`ENS NFT avatar URI is invalid. ${reason}`, {\n            name: 'EnsAvatarInvalidNftUriError',\n        });\n    }\n}\nexport class EnsAvatarUriResolutionError extends BaseError {\n    constructor({ uri }) {\n        super(`Unable to resolve ENS avatar URI \"${uri}\". The URI may be malformed, invalid, or does not respond with a valid image.`, { name: 'EnsAvatarUriResolutionError' });\n    }\n}\nexport class EnsAvatarUnsupportedNamespaceError extends BaseError {\n    constructor({ namespace }) {\n        super(`ENS NFT avatar namespace \"${namespace}\" is not supported. Must be \"erc721\" or \"erc1155\".`, { name: 'EnsAvatarUnsupportedNamespaceError' });\n    }\n}\n//# sourceMappingURL=ens.js.map","import { readContract, } from '../../../actions/public/readContract.js';\nimport { EnsAvatarInvalidMetadataError, EnsAvatarInvalidNftUriError, EnsAvatarUnsupportedNamespaceError, EnsAvatarUriResolutionError, } from '../../../errors/ens.js';\nconst networkRegex = /(?<protocol>https?:\\/\\/[^\\/]*|ipfs:\\/|ipns:\\/|ar:\\/)?(?<root>\\/)?(?<subpath>ipfs\\/|ipns\\/)?(?<target>[\\w\\-.]+)(?<subtarget>\\/.*)?/;\nconst ipfsHashRegex = /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,}|B[A-Z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|F[0-9A-F]{50,})(\\/(?<target>[\\w\\-.]+))?(?<subtarget>\\/.*)?$/;\nconst base64Regex = /^data:([a-zA-Z\\-/+]*);base64,([^\"].*)/;\nconst dataURIRegex = /^data:([a-zA-Z\\-/+]*)?(;[a-zA-Z0-9].*?)?(,)/;\n/** @internal */\nexport async function isImageUri(uri) {\n    try {\n        const res = await fetch(uri, { method: 'HEAD' });\n        // retrieve content type header to check if content is image\n        if (res.status === 200) {\n            const contentType = res.headers.get('content-type');\n            return contentType?.startsWith('image/');\n        }\n        return false;\n    }\n    catch (error) {\n        // if error is not cors related then fail\n        if (typeof error === 'object' && typeof error.response !== 'undefined') {\n            return false;\n        }\n        // fail in NodeJS, since the error is not cors but any other network issue\n        // biome-ignore lint/suspicious/noPrototypeBuiltins:\n        if (!globalThis.hasOwnProperty('Image'))\n            return false;\n        // in case of cors, use image api to validate if given url is an actual image\n        return new Promise((resolve) => {\n            const img = new Image();\n            img.onload = () => {\n                resolve(true);\n            };\n            img.onerror = () => {\n                resolve(false);\n            };\n            img.src = uri;\n        });\n    }\n}\n/** @internal */\nexport function getGateway(custom, defaultGateway) {\n    if (!custom)\n        return defaultGateway;\n    if (custom.endsWith('/'))\n        return custom.slice(0, -1);\n    return custom;\n}\nexport function resolveAvatarUri({ uri, gatewayUrls, }) {\n    const isEncoded = base64Regex.test(uri);\n    if (isEncoded)\n        return { uri, isOnChain: true, isEncoded };\n    const ipfsGateway = getGateway(gatewayUrls?.ipfs, 'https://ipfs.io');\n    const arweaveGateway = getGateway(gatewayUrls?.arweave, 'https://arweave.net');\n    const networkRegexMatch = uri.match(networkRegex);\n    const { protocol, subpath, target, subtarget = '', } = networkRegexMatch?.groups || {};\n    const isIPNS = protocol === 'ipns:/' || subpath === 'ipns/';\n    const isIPFS = protocol === 'ipfs:/' || subpath === 'ipfs/' || ipfsHashRegex.test(uri);\n    if (uri.startsWith('http') && !isIPNS && !isIPFS) {\n        let replacedUri = uri;\n        if (gatewayUrls?.arweave)\n            replacedUri = uri.replace(/https:\\/\\/arweave.net/g, gatewayUrls?.arweave);\n        return { uri: replacedUri, isOnChain: false, isEncoded: false };\n    }\n    if ((isIPNS || isIPFS) && target) {\n        return {\n            uri: `${ipfsGateway}/${isIPNS ? 'ipns' : 'ipfs'}/${target}${subtarget}`,\n            isOnChain: false,\n            isEncoded: false,\n        };\n    }\n    if (protocol === 'ar:/' && target) {\n        return {\n            uri: `${arweaveGateway}/${target}${subtarget || ''}`,\n            isOnChain: false,\n            isEncoded: false,\n        };\n    }\n    let parsedUri = uri.replace(dataURIRegex, '');\n    if (parsedUri.startsWith('<svg')) {\n        // if svg, base64 encode\n        parsedUri = `data:image/svg+xml;base64,${btoa(parsedUri)}`;\n    }\n    if (parsedUri.startsWith('data:') || parsedUri.startsWith('{')) {\n        return {\n            uri: parsedUri,\n            isOnChain: true,\n            isEncoded: false,\n        };\n    }\n    throw new EnsAvatarUriResolutionError({ uri });\n}\nexport function getJsonImage(data) {\n    // validation check for json data, must include one of theses properties\n    if (typeof data !== 'object' ||\n        (!('image' in data) && !('image_url' in data) && !('image_data' in data))) {\n        throw new EnsAvatarInvalidMetadataError({ data });\n    }\n    return data.image || data.image_url || data.image_data;\n}\nexport async function getMetadataAvatarUri({ gatewayUrls, uri, }) {\n    try {\n        const res = await fetch(uri).then((res) => res.json());\n        const image = await parseAvatarUri({\n            gatewayUrls,\n            uri: getJsonImage(res),\n        });\n        return image;\n    }\n    catch {\n        throw new EnsAvatarUriResolutionError({ uri });\n    }\n}\nexport async function parseAvatarUri({ gatewayUrls, uri, }) {\n    const { uri: resolvedURI, isOnChain } = resolveAvatarUri({ uri, gatewayUrls });\n    if (isOnChain)\n        return resolvedURI;\n    // check if resolvedURI is an image, if it is return the url\n    const isImage = await isImageUri(resolvedURI);\n    if (isImage)\n        return resolvedURI;\n    throw new EnsAvatarUriResolutionError({ uri });\n}\nexport function parseNftUri(uri_) {\n    let uri = uri_;\n    // parse valid nft spec (CAIP-22/CAIP-29)\n    // @see: https://github.com/ChainAgnostic/CAIPs/tree/master/CAIPs\n    if (uri.startsWith('did:nft:')) {\n        // convert DID to CAIP\n        uri = uri.replace('did:nft:', '').replace(/_/g, '/');\n    }\n    const [reference, asset_namespace, tokenID] = uri.split('/');\n    const [eip_namespace, chainID] = reference.split(':');\n    const [erc_namespace, contractAddress] = asset_namespace.split(':');\n    if (!eip_namespace || eip_namespace.toLowerCase() !== 'eip155')\n        throw new EnsAvatarInvalidNftUriError({ reason: 'Only EIP-155 supported' });\n    if (!chainID)\n        throw new EnsAvatarInvalidNftUriError({ reason: 'Chain ID not found' });\n    if (!contractAddress)\n        throw new EnsAvatarInvalidNftUriError({\n            reason: 'Contract address not found',\n        });\n    if (!tokenID)\n        throw new EnsAvatarInvalidNftUriError({ reason: 'Token ID not found' });\n    if (!erc_namespace)\n        throw new EnsAvatarInvalidNftUriError({ reason: 'ERC namespace not found' });\n    return {\n        chainID: Number.parseInt(chainID),\n        namespace: erc_namespace.toLowerCase(),\n        contractAddress: contractAddress,\n        tokenID,\n    };\n}\nexport async function getNftTokenUri(client, { nft }) {\n    if (nft.namespace === 'erc721') {\n        return readContract(client, {\n            address: nft.contractAddress,\n            abi: [\n                {\n                    name: 'tokenURI',\n                    type: 'function',\n                    stateMutability: 'view',\n                    inputs: [{ name: 'tokenId', type: 'uint256' }],\n                    outputs: [{ name: '', type: 'string' }],\n                },\n            ],\n            functionName: 'tokenURI',\n            args: [BigInt(nft.tokenID)],\n        });\n    }\n    if (nft.namespace === 'erc1155') {\n        return readContract(client, {\n            address: nft.contractAddress,\n            abi: [\n                {\n                    name: 'uri',\n                    type: 'function',\n                    stateMutability: 'view',\n                    inputs: [{ name: '_id', type: 'uint256' }],\n                    outputs: [{ name: '', type: 'string' }],\n                },\n            ],\n            functionName: 'uri',\n            args: [BigInt(nft.tokenID)],\n        });\n    }\n    throw new EnsAvatarUnsupportedNamespaceError({ namespace: nft.namespace });\n}\n//# sourceMappingURL=utils.js.map","import { getJsonImage, getMetadataAvatarUri, getNftTokenUri, parseAvatarUri, parseNftUri, resolveAvatarUri, } from './utils.js';\n/*\n * @description Parses an ENS avatar record.\n *\n * @example\n * parseAvatarRecord('eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063')\n * 'https://ipfs.io/ipfs/QmSP4nq9fnN9dAiCj42ug9Wa79rqmQerZXZch82VqpiH7U/image.gif'\n *\n * @see https://docs.ens.domains/web/avatars\n *\n */\nexport async function parseAvatarRecord(client, { gatewayUrls, record, }) {\n    if (/eip155:/i.test(record))\n        return parseNftAvatarUri(client, { gatewayUrls, record });\n    return parseAvatarUri({ uri: record, gatewayUrls });\n}\nasync function parseNftAvatarUri(client, { gatewayUrls, record, }) {\n    // parse NFT URI into properties\n    const nft = parseNftUri(record);\n    // fetch tokenURI from the NFT contract\n    const nftUri = await getNftTokenUri(client, { nft });\n    // resolve the URI from the fetched tokenURI\n    const { uri: resolvedNftUri, isOnChain, isEncoded, } = resolveAvatarUri({ uri: nftUri, gatewayUrls });\n    // if the resolved URI is on chain, return the data\n    if (isOnChain &&\n        (resolvedNftUri.includes('data:application/json;base64,') ||\n            resolvedNftUri.startsWith('{'))) {\n        const encodedJson = isEncoded\n            ? // if it is encoded, decode it\n                atob(resolvedNftUri.replace('data:application/json;base64,', ''))\n            : // if it isn't encoded assume it is a JSON string, but it could be anything (it will error if it is)\n                resolvedNftUri;\n        const decoded = JSON.parse(encodedJson);\n        return parseAvatarUri({ uri: getJsonImage(decoded), gatewayUrls });\n    }\n    let uriTokenId = nft.tokenID;\n    if (nft.namespace === 'erc1155')\n        uriTokenId = uriTokenId.replace('0x', '').padStart(64, '0');\n    return getMetadataAvatarUri({\n        gatewayUrls,\n        uri: resolvedNftUri.replace(/(?:0x)?{id}/, uriTokenId),\n    });\n}\n//# sourceMappingURL=parseAvatarRecord.js.map","import { textResolverAbi, universalResolverResolveAbi, } from '../../constants/abis.js';\nimport { decodeFunctionResult, } from '../../utils/abi/decodeFunctionResult.js';\nimport { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';\nimport { getChainContractAddress, } from '../../utils/chain/getChainContractAddress.js';\nimport { toHex } from '../../utils/encoding/toHex.js';\nimport { isNullUniversalResolverError } from '../../utils/ens/errors.js';\nimport { localBatchGatewayUrl } from '../../utils/ens/localBatchGatewayRequest.js';\nimport { namehash } from '../../utils/ens/namehash.js';\nimport { packetToBytes, } from '../../utils/ens/packetToBytes.js';\nimport { getAction } from '../../utils/getAction.js';\nimport { readContract, } from '../public/readContract.js';\n/**\n * Gets a text record for specified ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsResolver\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `resolve(bytes, bytes)` on ENS Universal Resolver Contract.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsTextParameters}\n * @returns Address for ENS resolver. {@link GetEnsTextReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsText, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const twitterRecord = await getEnsText(client, {\n *   name: normalize('wevm.eth'),\n *   key: 'com.twitter',\n * })\n * // 'wevm_dev'\n */\nexport async function getEnsText(client, parameters) {\n    const { blockNumber, blockTag, key, name, gatewayUrls, strict } = parameters;\n    const { chain } = client;\n    const universalResolverAddress = (() => {\n        if (parameters.universalResolverAddress)\n            return parameters.universalResolverAddress;\n        if (!chain)\n            throw new Error('client chain not configured. universalResolverAddress is required.');\n        return getChainContractAddress({\n            blockNumber,\n            chain,\n            contract: 'ensUniversalResolver',\n        });\n    })();\n    const tlds = chain?.ensTlds;\n    if (tlds && !tlds.some((tld) => name.endsWith(tld)))\n        return null;\n    try {\n        const readContractParameters = {\n            address: universalResolverAddress,\n            abi: universalResolverResolveAbi,\n            functionName: 'resolve',\n            args: [\n                toHex(packetToBytes(name)),\n                encodeFunctionData({\n                    abi: textResolverAbi,\n                    functionName: 'text',\n                    args: [namehash(name), key],\n                }),\n                gatewayUrls ?? [localBatchGatewayUrl],\n            ],\n            blockNumber,\n            blockTag,\n        };\n        const readContractAction = getAction(client, readContract, 'readContract');\n        const res = await readContractAction(readContractParameters);\n        if (res[0] === '0x')\n            return null;\n        const record = decodeFunctionResult({\n            abi: textResolverAbi,\n            functionName: 'text',\n            data: res[0],\n        });\n        return record === '' ? null : record;\n    }\n    catch (err) {\n        if (strict)\n            throw err;\n        if (isNullUniversalResolverError(err, 'resolve'))\n            return null;\n        throw err;\n    }\n}\n//# sourceMappingURL=getEnsText.js.map","import { parseAvatarRecord, } from '../../utils/ens/avatar/parseAvatarRecord.js';\nimport { getAction } from '../../utils/getAction.js';\nimport { getEnsText, } from './getEnsText.js';\n/**\n * Gets the avatar of an ENS name.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsAvatar\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText) with `key` set to `'avatar'`.\n *\n * Since ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use the built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsAvatarParameters}\n * @returns Avatar URI or `null` if not found. {@link GetEnsAvatarReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsAvatar, normalize } from 'viem/ens'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const ensAvatar = await getEnsAvatar(client, {\n *   name: normalize('wevm.eth'),\n * })\n * // 'https://ipfs.io/ipfs/Qma8mnp6xV3J2cRNf3mTth5C8nV11CAnceVinc3y8jSbio'\n */\nexport async function getEnsAvatar(client, { blockNumber, blockTag, assetGatewayUrls, name, gatewayUrls, strict, universalResolverAddress, }) {\n    const record = await getAction(client, getEnsText, 'getEnsText')({\n        blockNumber,\n        blockTag,\n        key: 'avatar',\n        name,\n        universalResolverAddress,\n        gatewayUrls,\n        strict,\n    });\n    if (!record)\n        return null;\n    try {\n        return await parseAvatarRecord(client, {\n            record,\n            gatewayUrls: assetGatewayUrls,\n        });\n    }\n    catch {\n        return null;\n    }\n}\n//# sourceMappingURL=getEnsAvatar.js.map","import { universalResolverReverseAbi } from '../../constants/abis.js';\nimport { getChainContractAddress, } from '../../utils/chain/getChainContractAddress.js';\nimport { toHex } from '../../utils/encoding/toHex.js';\nimport { isNullUniversalResolverError } from '../../utils/ens/errors.js';\nimport { packetToBytes, } from '../../utils/ens/packetToBytes.js';\nimport { getAction } from '../../utils/getAction.js';\nimport { readContract, } from '../public/readContract.js';\n/**\n * Gets primary name for specified address.\n *\n * - Docs: https://viem.sh/docs/ens/actions/getEnsName\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/ens\n *\n * Calls `reverse(bytes)` on ENS Universal Resolver Contract to \"reverse resolve\" the address to the primary ENS name.\n *\n * @param client - Client to use\n * @param parameters - {@link GetEnsNameParameters}\n * @returns Name or `null` if not found. {@link GetEnsNameReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getEnsName } from 'viem/ens'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const ensName = await getEnsName(client, {\n *   address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n * })\n * // 'wevm.eth'\n */\nexport async function getEnsName(client, { address, blockNumber, blockTag, gatewayUrls, strict, universalResolverAddress: universalResolverAddress_, }) {\n    let universalResolverAddress = universalResolverAddress_;\n    if (!universalResolverAddress) {\n        if (!client.chain)\n            throw new Error('client chain not configured. universalResolverAddress is required.');\n        universalResolverAddress = getChainContractAddress({\n            blockNumber,\n            chain: client.chain,\n            contract: 'ensUniversalResolver',\n        });\n    }\n    const reverseNode = `${address.toLowerCase().substring(2)}.addr.reverse`;\n    try {\n        const readContractParameters = {\n            address: universalResolverAddress,\n            abi: universalResolverReverseAbi,\n            functionName: 'reverse',\n            args: [toHex(packetToBytes(reverseNode))],\n            blockNumber,\n            blockTag,\n        };\n        const readContractAction = getAction(client, readContract, 'readContract');\n        const [name, resolvedAddress] = gatewayUrls\n            ? await readContractAction({\n                ...readContractParameters,\n                args: [...readContractParameters.args, gatewayUrls],\n            })\n            : await readContractAction(readContractParameters);\n        if (address.toLowerCase() !== resolvedAddress.toLowerCase())\n            return null;\n        return name;\n    }\n    catch (err) {\n        if (strict)\n            throw err;\n        if (isNullUniversalResolverError(err, 'reverse'))\n            return null;\n        throw err;\n    }\n}\n//# sourceMappingURL=getEnsName.js.map","export function formatLog(log, { args, eventName, } = {}) {\n    return {\n        ...log,\n        blockHash: log.blockHash ? log.blockHash : null,\n        blockNumber: log.blockNumber ? BigInt(log.blockNumber) : null,\n        logIndex: log.logIndex ? Number(log.logIndex) : null,\n        transactionHash: log.transactionHash ? log.transactionHash : null,\n        transactionIndex: log.transactionIndex\n            ? Number(log.transactionIndex)\n            : null,\n        ...(eventName ? { args, eventName } : {}),\n    };\n}\n//# sourceMappingURL=log.js.map","import { hexToNumber } from '../encoding/fromHex.js';\nimport { defineFormatter } from './formatter.js';\nimport { formatLog } from './log.js';\nimport { transactionType } from './transaction.js';\nexport const receiptStatuses = {\n    '0x0': 'reverted',\n    '0x1': 'success',\n};\nexport function formatTransactionReceipt(transactionReceipt) {\n    const receipt = {\n        ...transactionReceipt,\n        blockNumber: transactionReceipt.blockNumber\n            ? BigInt(transactionReceipt.blockNumber)\n            : null,\n        contractAddress: transactionReceipt.contractAddress\n            ? transactionReceipt.contractAddress\n            : null,\n        cumulativeGasUsed: transactionReceipt.cumulativeGasUsed\n            ? BigInt(transactionReceipt.cumulativeGasUsed)\n            : null,\n        effectiveGasPrice: transactionReceipt.effectiveGasPrice\n            ? BigInt(transactionReceipt.effectiveGasPrice)\n            : null,\n        gasUsed: transactionReceipt.gasUsed\n            ? BigInt(transactionReceipt.gasUsed)\n            : null,\n        logs: transactionReceipt.logs\n            ? transactionReceipt.logs.map((log) => formatLog(log))\n            : null,\n        to: transactionReceipt.to ? transactionReceipt.to : null,\n        transactionIndex: transactionReceipt.transactionIndex\n            ? hexToNumber(transactionReceipt.transactionIndex)\n            : null,\n        status: transactionReceipt.status\n            ? receiptStatuses[transactionReceipt.status]\n            : null,\n        type: transactionReceipt.type\n            ? transactionType[transactionReceipt.type] || transactionReceipt.type\n            : null,\n    };\n    if (transactionReceipt.blobGasPrice)\n        receipt.blobGasPrice = BigInt(transactionReceipt.blobGasPrice);\n    if (transactionReceipt.blobGasUsed)\n        receipt.blobGasUsed = BigInt(transactionReceipt.blobGasUsed);\n    return receipt;\n}\nexport const defineTransactionReceipt = /*#__PURE__*/ defineFormatter('transactionReceipt', formatTransactionReceipt);\n//# sourceMappingURL=transactionReceipt.js.map","import { multicall3Abi } from '../../constants/abis.js';\nimport { AbiDecodingZeroDataError } from '../../errors/abi.js';\nimport { BaseError } from '../../errors/base.js';\nimport { RawContractError } from '../../errors/contract.js';\nimport { decodeFunctionResult, } from '../../utils/abi/decodeFunctionResult.js';\nimport { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';\nimport { getChainContractAddress, } from '../../utils/chain/getChainContractAddress.js';\nimport { getContractError, } from '../../utils/errors/getContractError.js';\nimport { getAction } from '../../utils/getAction.js';\nimport { readContract } from './readContract.js';\n/**\n * Similar to [`readContract`](https://viem.sh/docs/contract/readContract), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall).\n *\n * - Docs: https://viem.sh/docs/contract/multicall\n *\n * @param client - Client to use\n * @param parameters - {@link MulticallParameters}\n * @returns An array of results with accompanying status. {@link MulticallReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { multicall } from 'viem/contract'\n *\n * const client = createPublicClient({\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const abi = parseAbi([\n *   'function balanceOf(address) view returns (uint256)',\n *   'function totalSupply() view returns (uint256)',\n * ])\n * const results = await multicall(client, {\n *   contracts: [\n *     {\n *       address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n *       abi,\n *       functionName: 'balanceOf',\n *       args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n *     },\n *     {\n *       address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n *       abi,\n *       functionName: 'totalSupply',\n *     },\n *   ],\n * })\n * // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }]\n */\nexport async function multicall(client, parameters) {\n    const { account, allowFailure = true, batchSize: batchSize_, blockNumber, blockTag, multicallAddress: multicallAddress_, stateOverride, } = parameters;\n    const contracts = parameters.contracts;\n    const batchSize = batchSize_ ??\n        ((typeof client.batch?.multicall === 'object' &&\n            client.batch.multicall.batchSize) ||\n            1_024);\n    let multicallAddress = multicallAddress_;\n    if (!multicallAddress) {\n        if (!client.chain)\n            throw new Error('client chain not configured. multicallAddress is required.');\n        multicallAddress = getChainContractAddress({\n            blockNumber,\n            chain: client.chain,\n            contract: 'multicall3',\n        });\n    }\n    const chunkedCalls = [[]];\n    let currentChunk = 0;\n    let currentChunkSize = 0;\n    for (let i = 0; i < contracts.length; i++) {\n        const { abi, address, args, functionName } = contracts[i];\n        try {\n            const callData = encodeFunctionData({ abi, args, functionName });\n            currentChunkSize += (callData.length - 2) / 2;\n            // Check to see if we need to create a new chunk.\n            if (\n            // Check if batching is enabled.\n            batchSize > 0 &&\n                // Check if the current size of the batch exceeds the size limit.\n                currentChunkSize > batchSize &&\n                // Check if the current chunk is not already empty.\n                chunkedCalls[currentChunk].length > 0) {\n                currentChunk++;\n                currentChunkSize = (callData.length - 2) / 2;\n                chunkedCalls[currentChunk] = [];\n            }\n            chunkedCalls[currentChunk] = [\n                ...chunkedCalls[currentChunk],\n                {\n                    allowFailure: true,\n                    callData,\n                    target: address,\n                },\n            ];\n        }\n        catch (err) {\n            const error = getContractError(err, {\n                abi,\n                address,\n                args,\n                docsPath: '/docs/contract/multicall',\n                functionName,\n                sender: account,\n            });\n            if (!allowFailure)\n                throw error;\n            chunkedCalls[currentChunk] = [\n                ...chunkedCalls[currentChunk],\n                {\n                    allowFailure: true,\n                    callData: '0x',\n                    target: address,\n                },\n            ];\n        }\n    }\n    const aggregate3Results = await Promise.allSettled(chunkedCalls.map((calls) => getAction(client, readContract, 'readContract')({\n        abi: multicall3Abi,\n        account,\n        address: multicallAddress,\n        args: [calls],\n        blockNumber,\n        blockTag,\n        functionName: 'aggregate3',\n        stateOverride,\n    })));\n    const results = [];\n    for (let i = 0; i < aggregate3Results.length; i++) {\n        const result = aggregate3Results[i];\n        // If an error occurred in a `readContract` invocation (ie. network error),\n        // then append the failure reason to each contract result.\n        if (result.status === 'rejected') {\n            if (!allowFailure)\n                throw result.reason;\n            for (let j = 0; j < chunkedCalls[i].length; j++) {\n                results.push({\n                    status: 'failure',\n                    error: result.reason,\n                    result: undefined,\n                });\n            }\n            continue;\n        }\n        // If the `readContract` call was successful, then decode the results.\n        const aggregate3Result = result.value;\n        for (let j = 0; j < aggregate3Result.length; j++) {\n            // Extract the response from `readContract`\n            const { returnData, success } = aggregate3Result[j];\n            // Extract the request call data from the original call.\n            const { callData } = chunkedCalls[i][j];\n            // Extract the contract config for this call from the `contracts` argument\n            // for decoding.\n            const { abi, address, functionName, args } = contracts[results.length];\n            try {\n                if (callData === '0x')\n                    throw new AbiDecodingZeroDataError();\n                if (!success)\n                    throw new RawContractError({ data: returnData });\n                const result = decodeFunctionResult({\n                    abi,\n                    args,\n                    data: returnData,\n                    functionName,\n                });\n                results.push(allowFailure ? { result, status: 'success' } : result);\n            }\n            catch (err) {\n                const error = getContractError(err, {\n                    abi,\n                    address,\n                    args,\n                    docsPath: '/docs/contract/multicall',\n                    functionName,\n                });\n                if (!allowFailure)\n                    throw error;\n                results.push({ error, result: undefined, status: 'failure' });\n            }\n        }\n    }\n    if (results.length !== contracts.length)\n        throw new BaseError('multicall results mismatch');\n    return results;\n}\n//# sourceMappingURL=multicall.js.map","import { LruMap } from '../lru.js';\n/** @internal */\nexport const promiseCache = /*#__PURE__*/ new LruMap(8192);\n/** Deduplicates in-flight promises. */\nexport function withDedupe(fn, { enabled = true, id }) {\n    if (!enabled || !id)\n        return fn();\n    if (promiseCache.get(id))\n        return promiseCache.get(id);\n    const promise = fn().finally(() => promiseCache.delete(id));\n    promiseCache.set(id, promise);\n    return promise;\n}\n//# sourceMappingURL=withDedupe.js.map","export async function wait(time) {\n    return new Promise((res) => setTimeout(res, time));\n}\n//# sourceMappingURL=wait.js.map","import { wait } from '../wait.js';\nexport function withRetry(fn, { delay: delay_ = 100, retryCount = 2, shouldRetry = () => true, } = {}) {\n    return new Promise((resolve, reject) => {\n        const attemptRetry = async ({ count = 0 } = {}) => {\n            const retry = async ({ error }) => {\n                const delay = typeof delay_ === 'function' ? delay_({ count, error }) : delay_;\n                if (delay)\n                    await wait(delay);\n                attemptRetry({ count: count + 1 });\n            };\n            try {\n                const data = await fn();\n                resolve(data);\n            }\n            catch (err) {\n                if (count < retryCount &&\n                    (await shouldRetry({ count, error: err })))\n                    return retry({ error: err });\n                reject(err);\n            }\n        };\n        attemptRetry();\n    });\n}\n//# sourceMappingURL=withRetry.js.map","import { BaseError } from '../errors/base.js';\nimport { HttpRequestError, } from '../errors/request.js';\nimport { AtomicReadyWalletRejectedUpgradeError, AtomicityNotSupportedError, BundleTooLargeError, ChainDisconnectedError, DuplicateIdError, InternalRpcError, InvalidInputRpcError, InvalidParamsRpcError, InvalidRequestRpcError, JsonRpcVersionUnsupportedError, LimitExceededRpcError, MethodNotFoundRpcError, MethodNotSupportedRpcError, ParseRpcError, ProviderDisconnectedError, ResourceNotFoundRpcError, ResourceUnavailableRpcError, SwitchChainError, TransactionRejectedRpcError, UnauthorizedProviderError, UnknownBundleIdError, UnknownRpcError, UnsupportedChainIdError, UnsupportedNonOptionalCapabilityError, UnsupportedProviderMethodError, UserRejectedRequestError, } from '../errors/rpc.js';\nimport { stringToHex } from './encoding/toHex.js';\nimport { withDedupe } from './promise/withDedupe.js';\nimport { withRetry } from './promise/withRetry.js';\nimport { stringify } from './stringify.js';\nexport function buildRequest(request, options = {}) {\n    return async (args, overrideOptions = {}) => {\n        const { dedupe = false, methods, retryDelay = 150, retryCount = 3, uid, } = {\n            ...options,\n            ...overrideOptions,\n        };\n        const { method } = args;\n        if (methods?.exclude?.includes(method))\n            throw new MethodNotSupportedRpcError(new Error('method not supported'), {\n                method,\n            });\n        if (methods?.include && !methods.include.includes(method))\n            throw new MethodNotSupportedRpcError(new Error('method not supported'), {\n                method,\n            });\n        const requestId = dedupe\n            ? stringToHex(`${uid}.${stringify(args)}`)\n            : undefined;\n        return withDedupe(() => withRetry(async () => {\n            try {\n                return await request(args);\n            }\n            catch (err_) {\n                const err = err_;\n                switch (err.code) {\n                    // -32700\n                    case ParseRpcError.code:\n                        throw new ParseRpcError(err);\n                    // -32600\n                    case InvalidRequestRpcError.code:\n                        throw new InvalidRequestRpcError(err);\n                    // -32601\n                    case MethodNotFoundRpcError.code:\n                        throw new MethodNotFoundRpcError(err, { method: args.method });\n                    // -32602\n                    case InvalidParamsRpcError.code:\n                        throw new InvalidParamsRpcError(err);\n                    // -32603\n                    case InternalRpcError.code:\n                        throw new InternalRpcError(err);\n                    // -32000\n                    case InvalidInputRpcError.code:\n                        throw new InvalidInputRpcError(err);\n                    // -32001\n                    case ResourceNotFoundRpcError.code:\n                        throw new ResourceNotFoundRpcError(err);\n                    // -32002\n                    case ResourceUnavailableRpcError.code:\n                        throw new ResourceUnavailableRpcError(err);\n                    // -32003\n                    case TransactionRejectedRpcError.code:\n                        throw new TransactionRejectedRpcError(err);\n                    // -32004\n                    case MethodNotSupportedRpcError.code:\n                        throw new MethodNotSupportedRpcError(err, {\n                            method: args.method,\n                        });\n                    // -32005\n                    case LimitExceededRpcError.code:\n                        throw new LimitExceededRpcError(err);\n                    // -32006\n                    case JsonRpcVersionUnsupportedError.code:\n                        throw new JsonRpcVersionUnsupportedError(err);\n                    // 4001\n                    case UserRejectedRequestError.code:\n                        throw new UserRejectedRequestError(err);\n                    // 4100\n                    case UnauthorizedProviderError.code:\n                        throw new UnauthorizedProviderError(err);\n                    // 4200\n                    case UnsupportedProviderMethodError.code:\n                        throw new UnsupportedProviderMethodError(err);\n                    // 4900\n                    case ProviderDisconnectedError.code:\n                        throw new ProviderDisconnectedError(err);\n                    // 4901\n                    case ChainDisconnectedError.code:\n                        throw new ChainDisconnectedError(err);\n                    // 4902\n                    case SwitchChainError.code:\n                        throw new SwitchChainError(err);\n                    // 5700\n                    case UnsupportedNonOptionalCapabilityError.code:\n                        throw new UnsupportedNonOptionalCapabilityError(err);\n                    // 5710\n                    case UnsupportedChainIdError.code:\n                        throw new UnsupportedChainIdError(err);\n                    // 5720\n                    case DuplicateIdError.code:\n                        throw new DuplicateIdError(err);\n                    // 5730\n                    case UnknownBundleIdError.code:\n                        throw new UnknownBundleIdError(err);\n                    // 5740\n                    case BundleTooLargeError.code:\n                        throw new BundleTooLargeError(err);\n                    // 5750\n                    case AtomicReadyWalletRejectedUpgradeError.code:\n                        throw new AtomicReadyWalletRejectedUpgradeError(err);\n                    // 5760\n                    case AtomicityNotSupportedError.code:\n                        throw new AtomicityNotSupportedError(err);\n                    // CAIP-25: User Rejected Error\n                    // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes#rejected-caip-25\n                    case 5000:\n                        throw new UserRejectedRequestError(err);\n                    default:\n                        if (err_ instanceof BaseError)\n                            throw err_;\n                        throw new UnknownRpcError(err);\n                }\n            }\n        }, {\n            delay: ({ count, error }) => {\n                // If we find a Retry-After header, let's retry after the given time.\n                if (error && error instanceof HttpRequestError) {\n                    const retryAfter = error?.headers?.get('Retry-After');\n                    if (retryAfter?.match(/\\d/))\n                        return Number.parseInt(retryAfter) * 1000;\n                }\n                // Otherwise, let's retry with an exponential backoff.\n                return ~~(1 << count) * retryDelay;\n            },\n            retryCount,\n            shouldRetry: ({ error }) => shouldRetry(error),\n        }), { enabled: dedupe, id: requestId });\n    };\n}\n/** @internal */\nexport function shouldRetry(error) {\n    if ('code' in error && typeof error.code === 'number') {\n        if (error.code === -1)\n            return true; // Unknown error\n        if (error.code === LimitExceededRpcError.code)\n            return true;\n        if (error.code === InternalRpcError.code)\n            return true;\n        return false;\n    }\n    if (error instanceof HttpRequestError && error.status) {\n        // Forbidden\n        if (error.status === 403)\n            return true;\n        // Request Timeout\n        if (error.status === 408)\n            return true;\n        // Request Entity Too Large\n        if (error.status === 413)\n            return true;\n        // Too Many Requests\n        if (error.status === 429)\n            return true;\n        // Internal Server Error\n        if (error.status === 500)\n            return true;\n        // Bad Gateway\n        if (error.status === 502)\n            return true;\n        // Service Unavailable\n        if (error.status === 503)\n            return true;\n        // Gateway Timeout\n        if (error.status === 504)\n            return true;\n        return false;\n    }\n    return true;\n}\n//# sourceMappingURL=buildRequest.js.map","export function defineChain(chain) {\n    return {\n        formatters: undefined,\n        fees: undefined,\n        serializers: undefined,\n        ...chain,\n    };\n}\n//# sourceMappingURL=defineChain.js.map","export function withTimeout(fn, { errorInstance = new Error('timed out'), timeout, signal, }) {\n    return new Promise((resolve, reject) => {\n        ;\n        (async () => {\n            let timeoutId;\n            try {\n                const controller = new AbortController();\n                if (timeout > 0) {\n                    timeoutId = setTimeout(() => {\n                        if (signal) {\n                            controller.abort();\n                        }\n                        else {\n                            reject(errorInstance);\n                        }\n                    }, timeout); // need to cast because bun globals.d.ts overrides @types/node\n                }\n                resolve(await fn({ signal: controller?.signal || null }));\n            }\n            catch (err) {\n                if (err?.name === 'AbortError')\n                    reject(errorInstance);\n                reject(err);\n            }\n            finally {\n                clearTimeout(timeoutId);\n            }\n        })();\n    });\n}\n//# sourceMappingURL=withTimeout.js.map","function createIdStore() {\n    return {\n        current: 0,\n        take() {\n            return this.current++;\n        },\n        reset() {\n            this.current = 0;\n        },\n    };\n}\nexport const idCache = /*#__PURE__*/ createIdStore();\n//# sourceMappingURL=id.js.map","import { HttpRequestError, TimeoutError, } from '../../errors/request.js';\nimport { withTimeout, } from '../promise/withTimeout.js';\nimport { stringify } from '../stringify.js';\nimport { idCache } from './id.js';\nexport function getHttpRpcClient(url, options = {}) {\n    return {\n        async request(params) {\n            const { body, onRequest = options.onRequest, onResponse = options.onResponse, timeout = options.timeout ?? 10_000, } = params;\n            const fetchOptions = {\n                ...(options.fetchOptions ?? {}),\n                ...(params.fetchOptions ?? {}),\n            };\n            const { headers, method, signal: signal_ } = fetchOptions;\n            try {\n                const response = await withTimeout(async ({ signal }) => {\n                    const init = {\n                        ...fetchOptions,\n                        body: Array.isArray(body)\n                            ? stringify(body.map((body) => ({\n                                jsonrpc: '2.0',\n                                id: body.id ?? idCache.take(),\n                                ...body,\n                            })))\n                            : stringify({\n                                jsonrpc: '2.0',\n                                id: body.id ?? idCache.take(),\n                                ...body,\n                            }),\n                        headers: {\n                            'Content-Type': 'application/json',\n                            ...headers,\n                        },\n                        method: method || 'POST',\n                        signal: signal_ || (timeout > 0 ? signal : null),\n                    };\n                    const request = new Request(url, init);\n                    const args = (await onRequest?.(request, init)) ?? { ...init, url };\n                    const response = await fetch(args.url ?? url, args);\n                    return response;\n                }, {\n                    errorInstance: new TimeoutError({ body, url }),\n                    timeout,\n                    signal: true,\n                });\n                if (onResponse)\n                    await onResponse(response);\n                let data;\n                if (response.headers.get('Content-Type')?.startsWith('application/json'))\n                    data = await response.json();\n                else {\n                    data = await response.text();\n                    try {\n                        data = JSON.parse(data || '{}');\n                    }\n                    catch (err) {\n                        if (response.ok)\n                            throw err;\n                        data = { error: data };\n                    }\n                }\n                if (!response.ok) {\n                    throw new HttpRequestError({\n                        body,\n                        details: stringify(data.error) || response.statusText,\n                        headers: response.headers,\n                        status: response.status,\n                        url,\n                    });\n                }\n                return data;\n            }\n            catch (err) {\n                if (err instanceof HttpRequestError)\n                    throw err;\n                if (err instanceof TimeoutError)\n                    throw err;\n                throw new HttpRequestError({\n                    body,\n                    cause: err,\n                    url,\n                });\n            }\n        },\n    };\n}\n//# sourceMappingURL=http.js.map","import { stringify } from '../utils/stringify.js';\nimport { BaseError } from './base.js';\nexport class InvalidDomainError extends BaseError {\n    constructor({ domain }) {\n        super(`Invalid domain \"${stringify(domain)}\".`, {\n            metaMessages: ['Must be a valid EIP-712 domain.'],\n        });\n    }\n}\nexport class InvalidPrimaryTypeError extends BaseError {\n    constructor({ primaryType, types, }) {\n        super(`Invalid primary type \\`${primaryType}\\` must be one of \\`${JSON.stringify(Object.keys(types))}\\`.`, {\n            docsPath: '/api/glossary/Errors#typeddatainvalidprimarytypeerror',\n            metaMessages: ['Check that the primary type is a key in `types`.'],\n        });\n    }\n}\nexport class InvalidStructTypeError extends BaseError {\n    constructor({ type }) {\n        super(`Struct type \"${type}\" is invalid.`, {\n            metaMessages: ['Struct type must not be a Solidity type.'],\n            name: 'InvalidStructTypeError',\n        });\n    }\n}\n//# sourceMappingURL=typedData.js.map","import { BytesSizeMismatchError } from '../errors/abi.js';\nimport { InvalidAddressError } from '../errors/address.js';\nimport { InvalidDomainError, InvalidPrimaryTypeError, InvalidStructTypeError, } from '../errors/typedData.js';\nimport { isAddress } from './address/isAddress.js';\nimport { size } from './data/size.js';\nimport { numberToHex } from './encoding/toHex.js';\nimport { bytesRegex, integerRegex } from './regex.js';\nimport { hashDomain, } from './signature/hashTypedData.js';\nimport { stringify } from './stringify.js';\nexport function serializeTypedData(parameters) {\n    const { domain: domain_, message: message_, primaryType, types, } = parameters;\n    const normalizeData = (struct, data_) => {\n        const data = { ...data_ };\n        for (const param of struct) {\n            const { name, type } = param;\n            if (type === 'address')\n                data[name] = data[name].toLowerCase();\n        }\n        return data;\n    };\n    const domain = (() => {\n        if (!types.EIP712Domain)\n            return {};\n        if (!domain_)\n            return {};\n        return normalizeData(types.EIP712Domain, domain_);\n    })();\n    const message = (() => {\n        if (primaryType === 'EIP712Domain')\n            return undefined;\n        return normalizeData(types[primaryType], message_);\n    })();\n    return stringify({ domain, message, primaryType, types });\n}\nexport function validateTypedData(parameters) {\n    const { domain, message, primaryType, types } = parameters;\n    const validateData = (struct, data) => {\n        for (const param of struct) {\n            const { name, type } = param;\n            const value = data[name];\n            const integerMatch = type.match(integerRegex);\n            if (integerMatch &&\n                (typeof value === 'number' || typeof value === 'bigint')) {\n                const [_type, base, size_] = integerMatch;\n                // If number cannot be cast to a sized hex value, it is out of range\n                // and will throw.\n                numberToHex(value, {\n                    signed: base === 'int',\n                    size: Number.parseInt(size_) / 8,\n                });\n            }\n            if (type === 'address' && typeof value === 'string' && !isAddress(value))\n                throw new InvalidAddressError({ address: value });\n            const bytesMatch = type.match(bytesRegex);\n            if (bytesMatch) {\n                const [_type, size_] = bytesMatch;\n                if (size_ && size(value) !== Number.parseInt(size_))\n                    throw new BytesSizeMismatchError({\n                        expectedSize: Number.parseInt(size_),\n                        givenSize: size(value),\n                    });\n            }\n            const struct = types[type];\n            if (struct) {\n                validateReference(type);\n                validateData(struct, value);\n            }\n        }\n    };\n    // Validate domain types.\n    if (types.EIP712Domain && domain) {\n        if (typeof domain !== 'object')\n            throw new InvalidDomainError({ domain });\n        validateData(types.EIP712Domain, domain);\n    }\n    // Validate message types.\n    if (primaryType !== 'EIP712Domain') {\n        if (types[primaryType])\n            validateData(types[primaryType], message);\n        else\n            throw new InvalidPrimaryTypeError({ primaryType, types });\n    }\n}\nexport function getTypesForEIP712Domain({ domain, }) {\n    return [\n        typeof domain?.name === 'string' && { name: 'name', type: 'string' },\n        domain?.version && { name: 'version', type: 'string' },\n        (typeof domain?.chainId === 'number' ||\n            typeof domain?.chainId === 'bigint') && {\n            name: 'chainId',\n            type: 'uint256',\n        },\n        domain?.verifyingContract && {\n            name: 'verifyingContract',\n            type: 'address',\n        },\n        domain?.salt && { name: 'salt', type: 'bytes32' },\n    ].filter(Boolean);\n}\nexport function domainSeparator({ domain }) {\n    return hashDomain({\n        domain,\n        types: {\n            EIP712Domain: getTypesForEIP712Domain({ domain }),\n        },\n    });\n}\n/** @internal */\nfunction validateReference(type) {\n    // Struct type must not be a Solidity type.\n    if (type === 'address' ||\n        type === 'bool' ||\n        type === 'string' ||\n        type.startsWith('bytes') ||\n        type.startsWith('uint') ||\n        type.startsWith('int'))\n        throw new InvalidStructTypeError({ type });\n}\n//# sourceMappingURL=typedData.js.map","import { versionedHashVersionKzg } from '../../constants/kzg.js';\nimport { maxUint256 } from '../../constants/number.js';\nimport { InvalidAddressError, } from '../../errors/address.js';\nimport { BaseError } from '../../errors/base.js';\nimport { EmptyBlobError, InvalidVersionedHashSizeError, InvalidVersionedHashVersionError, } from '../../errors/blob.js';\nimport { InvalidChainIdError, } from '../../errors/chain.js';\nimport { FeeCapTooHighError, TipAboveFeeCapError, } from '../../errors/node.js';\nimport { isAddress } from '../address/isAddress.js';\nimport { size } from '../data/size.js';\nimport { slice } from '../data/slice.js';\nimport { hexToNumber } from '../encoding/fromHex.js';\nexport function assertTransactionEIP7702(transaction) {\n    const { authorizationList } = transaction;\n    if (authorizationList) {\n        for (const authorization of authorizationList) {\n            const { chainId } = authorization;\n            const address = authorization.address;\n            if (!isAddress(address))\n                throw new InvalidAddressError({ address });\n            if (chainId < 0)\n                throw new InvalidChainIdError({ chainId });\n        }\n    }\n    assertTransactionEIP1559(transaction);\n}\nexport function assertTransactionEIP4844(transaction) {\n    const { blobVersionedHashes } = transaction;\n    if (blobVersionedHashes) {\n        if (blobVersionedHashes.length === 0)\n            throw new EmptyBlobError();\n        for (const hash of blobVersionedHashes) {\n            const size_ = size(hash);\n            const version = hexToNumber(slice(hash, 0, 1));\n            if (size_ !== 32)\n                throw new InvalidVersionedHashSizeError({ hash, size: size_ });\n            if (version !== versionedHashVersionKzg)\n                throw new InvalidVersionedHashVersionError({\n                    hash,\n                    version,\n                });\n        }\n    }\n    assertTransactionEIP1559(transaction);\n}\nexport function assertTransactionEIP1559(transaction) {\n    const { chainId, maxPriorityFeePerGas, maxFeePerGas, to } = transaction;\n    if (chainId <= 0)\n        throw new InvalidChainIdError({ chainId });\n    if (to && !isAddress(to))\n        throw new InvalidAddressError({ address: to });\n    if (maxFeePerGas && maxFeePerGas > maxUint256)\n        throw new FeeCapTooHighError({ maxFeePerGas });\n    if (maxPriorityFeePerGas &&\n        maxFeePerGas &&\n        maxPriorityFeePerGas > maxFeePerGas)\n        throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas });\n}\nexport function assertTransactionEIP2930(transaction) {\n    const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } = transaction;\n    if (chainId <= 0)\n        throw new InvalidChainIdError({ chainId });\n    if (to && !isAddress(to))\n        throw new InvalidAddressError({ address: to });\n    if (maxPriorityFeePerGas || maxFeePerGas)\n        throw new BaseError('`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid EIP-2930 Transaction attribute.');\n    if (gasPrice && gasPrice > maxUint256)\n        throw new FeeCapTooHighError({ maxFeePerGas: gasPrice });\n}\nexport function assertTransactionLegacy(transaction) {\n    const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } = transaction;\n    if (to && !isAddress(to))\n        throw new InvalidAddressError({ address: to });\n    if (typeof chainId !== 'undefined' && chainId <= 0)\n        throw new InvalidChainIdError({ chainId });\n    if (maxPriorityFeePerGas || maxFeePerGas)\n        throw new BaseError('`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid Legacy Transaction attribute.');\n    if (gasPrice && gasPrice > maxUint256)\n        throw new FeeCapTooHighError({ maxFeePerGas: gasPrice });\n}\n//# sourceMappingURL=assertTransaction.js.map","import { InvalidAddressError, } from '../../errors/address.js';\nimport { InvalidStorageKeySizeError, } from '../../errors/transaction.js';\nimport { isAddress } from '../address/isAddress.js';\n/*\n * Serialize an  EIP-2930 access list\n * @remarks\n * Use to create a transaction serializer with support for EIP-2930 access lists\n *\n * @param accessList - Array of objects of address and arrays of Storage Keys\n * @throws InvalidAddressError, InvalidStorageKeySizeError\n * @returns Array of hex strings\n */\nexport function serializeAccessList(accessList) {\n    if (!accessList || accessList.length === 0)\n        return [];\n    const serializedAccessList = [];\n    for (let i = 0; i < accessList.length; i++) {\n        const { address, storageKeys } = accessList[i];\n        for (let j = 0; j < storageKeys.length; j++) {\n            if (storageKeys[j].length - 2 !== 64) {\n                throw new InvalidStorageKeySizeError({ storageKey: storageKeys[j] });\n            }\n        }\n        if (!isAddress(address, { strict: false })) {\n            throw new InvalidAddressError({ address });\n        }\n        serializedAccessList.push([address, storageKeys]);\n    }\n    return serializedAccessList;\n}\n//# sourceMappingURL=serializeAccessList.js.map","import { InvalidLegacyVError, } from '../../errors/transaction.js';\nimport { serializeAuthorizationList, } from '../authorization/serializeAuthorizationList.js';\nimport { blobsToCommitments, } from '../blob/blobsToCommitments.js';\nimport { blobsToProofs, } from '../blob/blobsToProofs.js';\nimport { commitmentsToVersionedHashes, } from '../blob/commitmentsToVersionedHashes.js';\nimport { toBlobSidecars, } from '../blob/toBlobSidecars.js';\nimport { concatHex } from '../data/concat.js';\nimport { trim } from '../data/trim.js';\nimport { bytesToHex, numberToHex, } from '../encoding/toHex.js';\nimport { toRlp } from '../encoding/toRlp.js';\nimport { assertTransactionEIP1559, assertTransactionEIP2930, assertTransactionEIP4844, assertTransactionEIP7702, assertTransactionLegacy, } from './assertTransaction.js';\nimport { getTransactionType, } from './getTransactionType.js';\nimport { serializeAccessList, } from './serializeAccessList.js';\nexport function serializeTransaction(transaction, signature) {\n    const type = getTransactionType(transaction);\n    if (type === 'eip1559')\n        return serializeTransactionEIP1559(transaction, signature);\n    if (type === 'eip2930')\n        return serializeTransactionEIP2930(transaction, signature);\n    if (type === 'eip4844')\n        return serializeTransactionEIP4844(transaction, signature);\n    if (type === 'eip7702')\n        return serializeTransactionEIP7702(transaction, signature);\n    return serializeTransactionLegacy(transaction, signature);\n}\nfunction serializeTransactionEIP7702(transaction, signature) {\n    const { authorizationList, chainId, gas, nonce, to, value, maxFeePerGas, maxPriorityFeePerGas, accessList, data, } = transaction;\n    assertTransactionEIP7702(transaction);\n    const serializedAccessList = serializeAccessList(accessList);\n    const serializedAuthorizationList = serializeAuthorizationList(authorizationList);\n    return concatHex([\n        '0x04',\n        toRlp([\n            numberToHex(chainId),\n            nonce ? numberToHex(nonce) : '0x',\n            maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n            maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n            gas ? numberToHex(gas) : '0x',\n            to ?? '0x',\n            value ? numberToHex(value) : '0x',\n            data ?? '0x',\n            serializedAccessList,\n            serializedAuthorizationList,\n            ...toYParitySignatureArray(transaction, signature),\n        ]),\n    ]);\n}\nfunction serializeTransactionEIP4844(transaction, signature) {\n    const { chainId, gas, nonce, to, value, maxFeePerBlobGas, maxFeePerGas, maxPriorityFeePerGas, accessList, data, } = transaction;\n    assertTransactionEIP4844(transaction);\n    let blobVersionedHashes = transaction.blobVersionedHashes;\n    let sidecars = transaction.sidecars;\n    // If `blobs` are passed, we will need to compute the KZG commitments & proofs.\n    if (transaction.blobs &&\n        (typeof blobVersionedHashes === 'undefined' ||\n            typeof sidecars === 'undefined')) {\n        const blobs = (typeof transaction.blobs[0] === 'string'\n            ? transaction.blobs\n            : transaction.blobs.map((x) => bytesToHex(x)));\n        const kzg = transaction.kzg;\n        const commitments = blobsToCommitments({\n            blobs,\n            kzg,\n        });\n        if (typeof blobVersionedHashes === 'undefined')\n            blobVersionedHashes = commitmentsToVersionedHashes({\n                commitments,\n            });\n        if (typeof sidecars === 'undefined') {\n            const proofs = blobsToProofs({ blobs, commitments, kzg });\n            sidecars = toBlobSidecars({ blobs, commitments, proofs });\n        }\n    }\n    const serializedAccessList = serializeAccessList(accessList);\n    const serializedTransaction = [\n        numberToHex(chainId),\n        nonce ? numberToHex(nonce) : '0x',\n        maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n        maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n        gas ? numberToHex(gas) : '0x',\n        to ?? '0x',\n        value ? numberToHex(value) : '0x',\n        data ?? '0x',\n        serializedAccessList,\n        maxFeePerBlobGas ? numberToHex(maxFeePerBlobGas) : '0x',\n        blobVersionedHashes ?? [],\n        ...toYParitySignatureArray(transaction, signature),\n    ];\n    const blobs = [];\n    const commitments = [];\n    const proofs = [];\n    if (sidecars)\n        for (let i = 0; i < sidecars.length; i++) {\n            const { blob, commitment, proof } = sidecars[i];\n            blobs.push(blob);\n            commitments.push(commitment);\n            proofs.push(proof);\n        }\n    return concatHex([\n        '0x03',\n        sidecars\n            ? // If sidecars are enabled, envelope turns into a \"wrapper\":\n                toRlp([serializedTransaction, blobs, commitments, proofs])\n            : // If sidecars are disabled, standard envelope is used:\n                toRlp(serializedTransaction),\n    ]);\n}\nfunction serializeTransactionEIP1559(transaction, signature) {\n    const { chainId, gas, nonce, to, value, maxFeePerGas, maxPriorityFeePerGas, accessList, data, } = transaction;\n    assertTransactionEIP1559(transaction);\n    const serializedAccessList = serializeAccessList(accessList);\n    const serializedTransaction = [\n        numberToHex(chainId),\n        nonce ? numberToHex(nonce) : '0x',\n        maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n        maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n        gas ? numberToHex(gas) : '0x',\n        to ?? '0x',\n        value ? numberToHex(value) : '0x',\n        data ?? '0x',\n        serializedAccessList,\n        ...toYParitySignatureArray(transaction, signature),\n    ];\n    return concatHex([\n        '0x02',\n        toRlp(serializedTransaction),\n    ]);\n}\nfunction serializeTransactionEIP2930(transaction, signature) {\n    const { chainId, gas, data, nonce, to, value, accessList, gasPrice } = transaction;\n    assertTransactionEIP2930(transaction);\n    const serializedAccessList = serializeAccessList(accessList);\n    const serializedTransaction = [\n        numberToHex(chainId),\n        nonce ? numberToHex(nonce) : '0x',\n        gasPrice ? numberToHex(gasPrice) : '0x',\n        gas ? numberToHex(gas) : '0x',\n        to ?? '0x',\n        value ? numberToHex(value) : '0x',\n        data ?? '0x',\n        serializedAccessList,\n        ...toYParitySignatureArray(transaction, signature),\n    ];\n    return concatHex([\n        '0x01',\n        toRlp(serializedTransaction),\n    ]);\n}\nfunction serializeTransactionLegacy(transaction, signature) {\n    const { chainId = 0, gas, data, nonce, to, value, gasPrice } = transaction;\n    assertTransactionLegacy(transaction);\n    let serializedTransaction = [\n        nonce ? numberToHex(nonce) : '0x',\n        gasPrice ? numberToHex(gasPrice) : '0x',\n        gas ? numberToHex(gas) : '0x',\n        to ?? '0x',\n        value ? numberToHex(value) : '0x',\n        data ?? '0x',\n    ];\n    if (signature) {\n        const v = (() => {\n            // EIP-155 (inferred chainId)\n            if (signature.v >= 35n) {\n                const inferredChainId = (signature.v - 35n) / 2n;\n                if (inferredChainId > 0)\n                    return signature.v;\n                return 27n + (signature.v === 35n ? 0n : 1n);\n            }\n            // EIP-155 (explicit chainId)\n            if (chainId > 0)\n                return BigInt(chainId * 2) + BigInt(35n + signature.v - 27n);\n            // Pre-EIP-155 (no chainId)\n            const v = 27n + (signature.v === 27n ? 0n : 1n);\n            if (signature.v !== v)\n                throw new InvalidLegacyVError({ v: signature.v });\n            return v;\n        })();\n        const r = trim(signature.r);\n        const s = trim(signature.s);\n        serializedTransaction = [\n            ...serializedTransaction,\n            numberToHex(v),\n            r === '0x00' ? '0x' : r,\n            s === '0x00' ? '0x' : s,\n        ];\n    }\n    else if (chainId > 0) {\n        serializedTransaction = [\n            ...serializedTransaction,\n            numberToHex(chainId),\n            '0x',\n            '0x',\n        ];\n    }\n    return toRlp(serializedTransaction);\n}\nexport function toYParitySignatureArray(transaction, signature_) {\n    const signature = signature_ ?? transaction;\n    const { v, yParity } = signature;\n    if (typeof signature.r === 'undefined')\n        return [];\n    if (typeof signature.s === 'undefined')\n        return [];\n    if (typeof v === 'undefined' && typeof yParity === 'undefined')\n        return [];\n    const r = trim(signature.r);\n    const s = trim(signature.s);\n    const yParity_ = (() => {\n        if (typeof yParity === 'number')\n            return yParity ? numberToHex(1) : '0x';\n        if (v === 0n)\n            return '0x';\n        if (v === 1n)\n            return numberToHex(1);\n        return v === 27n ? '0x' : numberToHex(1);\n    })();\n    return [yParity_, r === '0x00' ? '0x' : r, s === '0x00' ? '0x' : s];\n}\n//# sourceMappingURL=serializeTransaction.js.map","import { toHex } from '../encoding/toHex.js';\nimport { toYParitySignatureArray } from '../transaction/serializeTransaction.js';\n/*\n * Serializes an EIP-7702 authorization list.\n */\nexport function serializeAuthorizationList(authorizationList) {\n    if (!authorizationList || authorizationList.length === 0)\n        return [];\n    const serializedAuthorizationList = [];\n    for (const authorization of authorizationList) {\n        const { chainId, nonce, ...signature } = authorization;\n        const contractAddress = authorization.address;\n        serializedAuthorizationList.push([\n            chainId ? toHex(chainId) : '0x',\n            contractAddress,\n            nonce ? toHex(nonce) : '0x',\n            ...toYParitySignatureArray({}, signature),\n        ]);\n    }\n    return serializedAuthorizationList;\n}\n//# sourceMappingURL=serializeAuthorizationList.js.map","import { parseAccount, } from '../../accounts/utils/parseAccount.js';\nimport { AccountNotFoundError } from '../../errors/account.js';\nimport { stringToHex, toHex, } from '../../utils/encoding/toHex.js';\n/**\n * Calculates an Ethereum-specific signature in [EIP-191 format](https://eips.ethereum.org/EIPS/eip-191): `keccak256(\"\\x19Ethereum Signed Message:\\n\" + len(message) + message))`.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/signMessage\n * - JSON-RPC Methods:\n *   - JSON-RPC Accounts: [`personal_sign`](https://docs.metamask.io/guide/signing-data#personal-sign)\n *   - Local Accounts: Signs locally. No JSON-RPC request.\n *\n * With the calculated signature, you can:\n * - use [`verifyMessage`](https://viem.sh/docs/utilities/verifyMessage) to verify the signature,\n * - use [`recoverMessageAddress`](https://viem.sh/docs/utilities/recoverMessageAddress) to recover the signing address from a signature.\n *\n * @param client - Client to use\n * @param parameters - {@link SignMessageParameters}\n * @returns The signed message. {@link SignMessageReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { signMessage } from 'viem/wallet'\n *\n * const client = createWalletClient({\n *   chain: mainnet,\n *   transport: custom(window.ethereum),\n * })\n * const signature = await signMessage(client, {\n *   account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *   message: 'hello world',\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, custom } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { signMessage } from 'viem/wallet'\n *\n * const client = createWalletClient({\n *   account: privateKeyToAccount('0x…'),\n *   chain: mainnet,\n *   transport: custom(window.ethereum),\n * })\n * const signature = await signMessage(client, {\n *   message: 'hello world',\n * })\n */\nexport async function signMessage(client, { account: account_ = client.account, message, }) {\n    if (!account_)\n        throw new AccountNotFoundError({\n            docsPath: '/docs/actions/wallet/signMessage',\n        });\n    const account = parseAccount(account_);\n    if (account.signMessage)\n        return account.signMessage({ message });\n    const message_ = (() => {\n        if (typeof message === 'string')\n            return stringToHex(message);\n        if (message.raw instanceof Uint8Array)\n            return toHex(message.raw);\n        return message.raw;\n    })();\n    return client.request({\n        method: 'personal_sign',\n        params: [message_, account.address],\n    }, { retryCount: 0 });\n}\n//# sourceMappingURL=signMessage.js.map","import { parseAccount, } from '../../accounts/utils/parseAccount.js';\nimport { AccountNotFoundError, } from '../../errors/account.js';\nimport { getTypesForEIP712Domain, serializeTypedData, validateTypedData, } from '../../utils/typedData.js';\n/**\n * Signs typed data and calculates an Ethereum-specific signature in [https://eips.ethereum.org/EIPS/eip-712](https://eips.ethereum.org/EIPS/eip-712): `sign(keccak256(\"\\x19\\x01\" ‖ domainSeparator ‖ hashStruct(message)))`\n *\n * - Docs: https://viem.sh/docs/actions/wallet/signTypedData\n * - JSON-RPC Methods:\n *   - JSON-RPC Accounts: [`eth_signTypedData_v4`](https://docs.metamask.io/guide/signing-data#signtypeddata-v4)\n *   - Local Accounts: Signs locally. No JSON-RPC request.\n *\n * @param client - Client to use\n * @param parameters - {@link SignTypedDataParameters}\n * @returns The signed data. {@link SignTypedDataReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { signTypedData } from 'viem/wallet'\n *\n * const client = createWalletClient({\n *   chain: mainnet,\n *   transport: custom(window.ethereum),\n * })\n * const signature = await signTypedData(client, {\n *   account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *   domain: {\n *     name: 'Ether Mail',\n *     version: '1',\n *     chainId: 1,\n *     verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n *   },\n *   types: {\n *     Person: [\n *       { name: 'name', type: 'string' },\n *       { name: 'wallet', type: 'address' },\n *     ],\n *     Mail: [\n *       { name: 'from', type: 'Person' },\n *       { name: 'to', type: 'Person' },\n *       { name: 'contents', type: 'string' },\n *     ],\n *   },\n *   primaryType: 'Mail',\n *   message: {\n *     from: {\n *       name: 'Cow',\n *       wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n *     },\n *     to: {\n *       name: 'Bob',\n *       wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n *     },\n *     contents: 'Hello, Bob!',\n *   },\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { signTypedData } from 'viem/wallet'\n *\n * const client = createWalletClient({\n *   account: privateKeyToAccount('0x…'),\n *   chain: mainnet,\n *   transport: http(),\n * })\n * const signature = await signTypedData(client, {\n *   domain: {\n *     name: 'Ether Mail',\n *     version: '1',\n *     chainId: 1,\n *     verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n *   },\n *   types: {\n *     Person: [\n *       { name: 'name', type: 'string' },\n *       { name: 'wallet', type: 'address' },\n *     ],\n *     Mail: [\n *       { name: 'from', type: 'Person' },\n *       { name: 'to', type: 'Person' },\n *       { name: 'contents', type: 'string' },\n *     ],\n *   },\n *   primaryType: 'Mail',\n *   message: {\n *     from: {\n *       name: 'Cow',\n *       wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n *     },\n *     to: {\n *       name: 'Bob',\n *       wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n *     },\n *     contents: 'Hello, Bob!',\n *   },\n * })\n */\nexport async function signTypedData(client, parameters) {\n    const { account: account_ = client.account, domain, message, primaryType, } = parameters;\n    if (!account_)\n        throw new AccountNotFoundError({\n            docsPath: '/docs/actions/wallet/signTypedData',\n        });\n    const account = parseAccount(account_);\n    const types = {\n        EIP712Domain: getTypesForEIP712Domain({ domain }),\n        ...parameters.types,\n    };\n    // Need to do a runtime validation check on addresses, byte ranges, integer ranges, etc\n    // as we can't statically check this with TypeScript.\n    validateTypedData({ domain, message, primaryType, types });\n    if (account.signTypedData)\n        return account.signTypedData({ domain, message, primaryType, types });\n    const typedData = serializeTypedData({ domain, message, primaryType, types });\n    return client.request({\n        method: 'eth_signTypedData_v4',\n        params: [account.address, typedData],\n    }, { retryCount: 0 });\n}\n//# sourceMappingURL=signTypedData.js.map","/**\n * Retrieves and returns an action from the client (if exists), and falls\n * back to the tree-shakable action.\n *\n * Useful for extracting overridden actions from a client (ie. if a consumer\n * wants to override the `sendTransaction` implementation).\n */\nexport function getAction(client, actionFn, \n// Some minifiers drop `Function.prototype.name`, or replace it with short letters,\n// meaning that `actionFn.name` will not always work. For that case, the consumer\n// needs to pass the name explicitly.\nname) {\n    const action_implicit = client[actionFn.name];\n    if (typeof action_implicit === 'function')\n        return action_implicit;\n    const action_explicit = client[name];\n    if (typeof action_explicit === 'function')\n        return action_explicit;\n    return (params) => actionFn(client, params);\n}\n//# sourceMappingURL=getAction.js.map","export const version = '2.18.1';\n//# sourceMappingURL=version.js.map","import { version } from '../version.js';\nexport const getVersion = () => `@wagmi/core@${version}`;\n//# sourceMappingURL=getVersion.js.map","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _BaseError_instances, _BaseError_walk;\nimport { getVersion } from '../utils/getVersion.js';\nexport class BaseError extends Error {\n    get docsBaseUrl() {\n        return 'https://wagmi.sh/core';\n    }\n    get version() {\n        return getVersion();\n    }\n    constructor(shortMessage, options = {}) {\n        super();\n        _BaseError_instances.add(this);\n        Object.defineProperty(this, \"details\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"docsPath\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"metaMessages\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"shortMessage\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'WagmiCoreError'\n        });\n        const details = options.cause instanceof BaseError\n            ? options.cause.details\n            : options.cause?.message\n                ? options.cause.message\n                : options.details;\n        const docsPath = options.cause instanceof BaseError\n            ? options.cause.docsPath || options.docsPath\n            : options.docsPath;\n        this.message = [\n            shortMessage || 'An error occurred.',\n            '',\n            ...(options.metaMessages ? [...options.metaMessages, ''] : []),\n            ...(docsPath\n                ? [\n                    `Docs: ${this.docsBaseUrl}${docsPath}.html${options.docsSlug ? `#${options.docsSlug}` : ''}`,\n                ]\n                : []),\n            ...(details ? [`Details: ${details}`] : []),\n            `Version: ${this.version}`,\n        ].join('\\n');\n        if (options.cause)\n            this.cause = options.cause;\n        this.details = details;\n        this.docsPath = docsPath;\n        this.metaMessages = options.metaMessages;\n        this.shortMessage = shortMessage;\n    }\n    walk(fn) {\n        return __classPrivateFieldGet(this, _BaseError_instances, \"m\", _BaseError_walk).call(this, this, fn);\n    }\n}\n_BaseError_instances = new WeakSet(), _BaseError_walk = function _BaseError_walk(err, fn) {\n    if (fn?.(err))\n        return err;\n    if (err.cause)\n        return __classPrivateFieldGet(this, _BaseError_instances, \"m\", _BaseError_walk).call(this, err.cause, fn);\n    return err;\n};\n//# sourceMappingURL=base.js.map","import { BaseError } from './base.js';\nexport class ChainNotConfiguredError extends BaseError {\n    constructor() {\n        super('Chain not configured.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ChainNotConfiguredError'\n        });\n    }\n}\nexport class ConnectorAlreadyConnectedError extends BaseError {\n    constructor() {\n        super('Connector already connected.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ConnectorAlreadyConnectedError'\n        });\n    }\n}\nexport class ConnectorNotConnectedError extends BaseError {\n    constructor() {\n        super('Connector not connected.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ConnectorNotConnectedError'\n        });\n    }\n}\nexport class ConnectorNotFoundError extends BaseError {\n    constructor() {\n        super('Connector not found.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ConnectorNotFoundError'\n        });\n    }\n}\nexport class ConnectorAccountNotFoundError extends BaseError {\n    constructor({ address, connector, }) {\n        super(`Account \"${address}\" not found for connector \"${connector.name}\".`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ConnectorAccountNotFoundError'\n        });\n    }\n}\nexport class ConnectorChainMismatchError extends BaseError {\n    constructor({ connectionChainId, connectorChainId, }) {\n        super(`The current chain of the connector (id: ${connectorChainId}) does not match the connection's chain (id: ${connectionChainId}).`, {\n            metaMessages: [\n                `Current Chain ID:  ${connectorChainId}`,\n                `Expected Chain ID: ${connectionChainId}`,\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ConnectorChainMismatchError'\n        });\n    }\n}\nexport class ConnectorUnavailableReconnectingError extends BaseError {\n    constructor({ connector }) {\n        super(`Connector \"${connector.name}\" unavailable while reconnecting.`, {\n            details: [\n                'During the reconnection step, the only connector methods guaranteed to be available are: `id`, `name`, `type`, `uid`.',\n                'All other methods are not guaranteed to be available until reconnection completes and connectors are fully restored.',\n                'This error commonly occurs for connectors that asynchronously inject after reconnection has already started.',\n            ].join(' '),\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ConnectorUnavailableReconnectingError'\n        });\n    }\n}\n//# sourceMappingURL=config.js.map","import { ConnectorAlreadyConnectedError, } from '../errors/config.js';\n/** https://wagmi.sh/core/api/actions/connect */\nexport async function connect(config, parameters) {\n    // \"Register\" connector if not already created\n    let connector;\n    if (typeof parameters.connector === 'function') {\n        connector = config._internal.connectors.setup(parameters.connector);\n    }\n    else\n        connector = parameters.connector;\n    // Check if connector is already connected\n    if (connector.uid === config.state.current)\n        throw new ConnectorAlreadyConnectedError();\n    try {\n        config.setState((x) => ({ ...x, status: 'connecting' }));\n        connector.emitter.emit('message', { type: 'connecting' });\n        const { connector: _, ...rest } = parameters;\n        const data = await connector.connect(rest);\n        const accounts = data.accounts;\n        connector.emitter.off('connect', config._internal.events.connect);\n        connector.emitter.on('change', config._internal.events.change);\n        connector.emitter.on('disconnect', config._internal.events.disconnect);\n        await config.storage?.setItem('recentConnectorId', connector.id);\n        config.setState((x) => ({\n            ...x,\n            connections: new Map(x.connections).set(connector.uid, {\n                accounts,\n                chainId: data.chainId,\n                connector: connector,\n            }),\n            current: connector.uid,\n            status: 'connected',\n        }));\n        return { accounts, chainId: data.chainId };\n    }\n    catch (error) {\n        config.setState((x) => ({\n            ...x,\n            // Keep existing connector connected in case of error\n            status: x.current ? 'connected' : 'disconnected',\n        }));\n        throw error;\n    }\n}\n//# sourceMappingURL=connect.js.map","const size = 256;\nlet index = size;\nlet buffer;\nexport function uid(length = 11) {\n    if (!buffer || index + length > size * 2) {\n        buffer = '';\n        index = 0;\n        for (let i = 0; i < size; i++) {\n            buffer += ((256 + Math.random() * 256) | 0).toString(16).substring(1);\n        }\n    }\n    return buffer.substring(index, index++ + length);\n}\n//# sourceMappingURL=uid.js.map","import { parseAccount, } from '../accounts/utils/parseAccount.js';\nimport { uid } from '../utils/uid.js';\nexport function createClient(parameters) {\n    const { batch, chain, ccipRead, key = 'base', name = 'Base Client', type = 'base', } = parameters;\n    const experimental_blockTag = parameters.experimental_blockTag ??\n        (typeof chain?.experimental_preconfirmationTime === 'number'\n            ? 'pending'\n            : undefined);\n    const blockTime = chain?.blockTime ?? 12_000;\n    const defaultPollingInterval = Math.min(Math.max(Math.floor(blockTime / 2), 500), 4_000);\n    const pollingInterval = parameters.pollingInterval ?? defaultPollingInterval;\n    const cacheTime = parameters.cacheTime ?? pollingInterval;\n    const account = parameters.account\n        ? parseAccount(parameters.account)\n        : undefined;\n    const { config, request, value } = parameters.transport({\n        chain,\n        pollingInterval,\n    });\n    const transport = { ...config, ...value };\n    const client = {\n        account,\n        batch,\n        cacheTime,\n        ccipRead,\n        chain,\n        key,\n        name,\n        pollingInterval,\n        request,\n        transport,\n        type,\n        uid: uid(),\n        ...(experimental_blockTag ? { experimental_blockTag } : {}),\n    };\n    function extend(base) {\n        return (extendFn) => {\n            const extended = extendFn(base);\n            for (const key in client)\n                delete extended[key];\n            const combined = { ...base, ...extended };\n            return Object.assign(combined, { extend: extend(combined) });\n        };\n    }\n    return Object.assign(client, { extend: extend(client) });\n}\n/**\n * Defines a typed JSON-RPC schema for the client.\n * Note: This is a runtime noop function.\n */\nexport function rpcSchema() {\n    return null;\n}\n//# sourceMappingURL=createClient.js.map","import { buildRequest } from '../../utils/buildRequest.js';\nimport { uid as uid_ } from '../../utils/uid.js';\n/**\n * @description Creates an transport intended to be used with a client.\n */\nexport function createTransport({ key, methods, name, request, retryCount = 3, retryDelay = 150, timeout, type, }, value) {\n    const uid = uid_();\n    return {\n        config: {\n            key,\n            methods,\n            name,\n            request,\n            retryCount,\n            retryDelay,\n            timeout,\n            type,\n        },\n        request: buildRequest(request, { methods, retryCount, retryDelay, uid }),\n        value,\n    };\n}\n//# sourceMappingURL=createTransport.js.map","import { createTransport, } from './createTransport.js';\n/**\n * @description Creates a custom transport given an EIP-1193 compliant `request` attribute.\n */\nexport function custom(provider, config = {}) {\n    const { key = 'custom', methods, name = 'Custom Provider', retryDelay, } = config;\n    return ({ retryCount: defaultRetryCount }) => createTransport({\n        key,\n        methods,\n        name,\n        request: provider.request.bind(provider),\n        retryCount: config.retryCount ?? defaultRetryCount,\n        retryDelay,\n        type: 'custom',\n    });\n}\n//# sourceMappingURL=custom.js.map","import { BaseError } from './base.js';\nexport class UrlRequiredError extends BaseError {\n    constructor() {\n        super('No URL was provided to the Transport. Please provide a valid RPC URL to the Transport.', {\n            docsPath: '/docs/clients/intro',\n            name: 'UrlRequiredError',\n        });\n    }\n}\n//# sourceMappingURL=transport.js.map","import { RpcRequestError } from '../../errors/request.js';\nimport { UrlRequiredError, } from '../../errors/transport.js';\nimport { createBatchScheduler } from '../../utils/promise/createBatchScheduler.js';\nimport { getHttpRpcClient, } from '../../utils/rpc/http.js';\nimport { createTransport, } from './createTransport.js';\n/**\n * @description Creates a HTTP transport that connects to a JSON-RPC API.\n */\nexport function http(\n/** URL of the JSON-RPC API. Defaults to the chain's public RPC URL. */\nurl, config = {}) {\n    const { batch, fetchOptions, key = 'http', methods, name = 'HTTP JSON-RPC', onFetchRequest, onFetchResponse, retryDelay, raw, } = config;\n    return ({ chain, retryCount: retryCount_, timeout: timeout_ }) => {\n        const { batchSize = 1000, wait = 0 } = typeof batch === 'object' ? batch : {};\n        const retryCount = config.retryCount ?? retryCount_;\n        const timeout = timeout_ ?? config.timeout ?? 10_000;\n        const url_ = url || chain?.rpcUrls.default.http[0];\n        if (!url_)\n            throw new UrlRequiredError();\n        const rpcClient = getHttpRpcClient(url_, {\n            fetchOptions,\n            onRequest: onFetchRequest,\n            onResponse: onFetchResponse,\n            timeout,\n        });\n        return createTransport({\n            key,\n            methods,\n            name,\n            async request({ method, params }) {\n                const body = { method, params };\n                const { schedule } = createBatchScheduler({\n                    id: url_,\n                    wait,\n                    shouldSplitBatch(requests) {\n                        return requests.length > batchSize;\n                    },\n                    fn: (body) => rpcClient.request({\n                        body,\n                    }),\n                    sort: (a, b) => a.id - b.id,\n                });\n                const fn = async (body) => batch\n                    ? schedule(body)\n                    : [\n                        await rpcClient.request({\n                            body,\n                        }),\n                    ];\n                const [{ error, result }] = await fn(body);\n                if (raw)\n                    return { error, result };\n                if (error)\n                    throw new RpcRequestError({\n                        body,\n                        error,\n                        url: url_,\n                    });\n                return result;\n            },\n            retryCount,\n            retryDelay,\n            timeout,\n            type: 'http',\n        }, {\n            fetchOptions,\n            url: url_,\n        });\n    };\n}\n//# sourceMappingURL=http.js.map","import { createClient, custom, } from 'viem';\nimport { getAddress, parseAccount } from 'viem/utils';\nimport { ConnectorAccountNotFoundError, ConnectorChainMismatchError, ConnectorNotConnectedError, ConnectorUnavailableReconnectingError, } from '../errors/config.js';\n/** https://wagmi.sh/core/api/actions/getConnectorClient */\nexport async function getConnectorClient(config, parameters = {}) {\n    // Get connection\n    let connection;\n    if (parameters.connector) {\n        const { connector } = parameters;\n        if (config.state.status === 'reconnecting' &&\n            !connector.getAccounts &&\n            !connector.getChainId)\n            throw new ConnectorUnavailableReconnectingError({ connector });\n        const [accounts, chainId] = await Promise.all([\n            connector.getAccounts().catch((e) => {\n                if (parameters.account === null)\n                    return [];\n                throw e;\n            }),\n            connector.getChainId(),\n        ]);\n        connection = {\n            accounts: accounts,\n            chainId,\n            connector,\n        };\n    }\n    else\n        connection = config.state.connections.get(config.state.current);\n    if (!connection)\n        throw new ConnectorNotConnectedError();\n    const chainId = parameters.chainId ?? connection.chainId;\n    // Check connector using same chainId as connection\n    const connectorChainId = await connection.connector.getChainId();\n    if (connectorChainId !== connection.chainId)\n        throw new ConnectorChainMismatchError({\n            connectionChainId: connection.chainId,\n            connectorChainId,\n        });\n    const connector = connection.connector;\n    if (connector.getClient)\n        return connector.getClient({ chainId });\n    // Default using `custom` transport\n    const account = parseAccount(parameters.account ?? connection.accounts[0]);\n    if (account)\n        account.address = getAddress(account.address); // TODO: Checksum address as part of `parseAccount`?\n    // If account was provided, check that it exists on the connector\n    if (parameters.account &&\n        !connection.accounts.some((x) => x.toLowerCase() === account.address.toLowerCase()))\n        throw new ConnectorAccountNotFoundError({\n            address: account.address,\n            connector,\n        });\n    const chain = config.chains.find((chain) => chain.id === chainId);\n    const provider = (await connection.connector.getProvider({ chainId }));\n    return createClient({\n        account,\n        chain,\n        name: 'Connector Client',\n        transport: (opts) => custom(provider)({ ...opts, retryCount: 0 }),\n    });\n}\n//# sourceMappingURL=getConnectorClient.js.map","/** https://wagmi.sh/core/api/actions/disconnect */\nexport async function disconnect(config, parameters = {}) {\n    let connector;\n    if (parameters.connector)\n        connector = parameters.connector;\n    else {\n        const { connections, current } = config.state;\n        const connection = connections.get(current);\n        connector = connection?.connector;\n    }\n    const connections = config.state.connections;\n    if (connector) {\n        await connector.disconnect();\n        connector.emitter.off('change', config._internal.events.change);\n        connector.emitter.off('disconnect', config._internal.events.disconnect);\n        connector.emitter.on('connect', config._internal.events.connect);\n        connections.delete(connector.uid);\n    }\n    config.setState((x) => {\n        // if no connections exist, move to disconnected state\n        if (connections.size === 0)\n            return {\n                ...x,\n                connections: new Map(),\n                current: null,\n                status: 'disconnected',\n            };\n        // switch over to another connection\n        const nextConnection = connections.values().next().value;\n        return {\n            ...x,\n            connections: new Map(connections),\n            current: nextConnection.connector.uid,\n        };\n    });\n    // Set recent connector if exists\n    {\n        const current = config.state.current;\n        if (!current)\n            return;\n        const connector = config.state.connections.get(current)?.connector;\n        if (!connector)\n            return;\n        await config.storage?.setItem('recentConnectorId', connector.id);\n    }\n}\n//# sourceMappingURL=disconnect.js.map","import { weiUnits } from 'viem';\nexport function getUnit(unit) {\n    if (typeof unit === 'number')\n        return unit;\n    if (unit === 'wei')\n        return 0;\n    return Math.abs(weiUnits[unit]);\n}\n//# sourceMappingURL=getUnit.js.map","/** https://wagmi.sh/core/api/actions/getAccount */\nexport function getAccount(config) {\n    const uid = config.state.current;\n    const connection = config.state.connections.get(uid);\n    const addresses = connection?.accounts;\n    const address = addresses?.[0];\n    const chain = config.chains.find((chain) => chain.id === connection?.chainId);\n    const status = config.state.status;\n    switch (status) {\n        case 'connected':\n            return {\n                address: address,\n                addresses: addresses,\n                chain,\n                chainId: connection?.chainId,\n                connector: connection?.connector,\n                isConnected: true,\n                isConnecting: false,\n                isDisconnected: false,\n                isReconnecting: false,\n                status,\n            };\n        case 'reconnecting':\n            return {\n                address,\n                addresses,\n                chain,\n                chainId: connection?.chainId,\n                connector: connection?.connector,\n                isConnected: !!address,\n                isConnecting: false,\n                isDisconnected: false,\n                isReconnecting: true,\n                status,\n            };\n        case 'connecting':\n            return {\n                address,\n                addresses,\n                chain,\n                chainId: connection?.chainId,\n                connector: connection?.connector,\n                isConnected: false,\n                isConnecting: true,\n                isDisconnected: false,\n                isReconnecting: false,\n                status,\n            };\n        case 'disconnected':\n            return {\n                address: undefined,\n                addresses: undefined,\n                chain: undefined,\n                chainId: undefined,\n                connector: undefined,\n                isConnected: false,\n                isConnecting: false,\n                isDisconnected: true,\n                isReconnecting: false,\n                status,\n            };\n    }\n}\n//# sourceMappingURL=getAccount.js.map","import { multicall as viem_multicall } from 'viem/actions';\nimport { getAction } from '../utils/getAction.js';\nexport async function multicall(config, parameters) {\n    const { allowFailure = true, chainId, contracts, ...rest } = parameters;\n    const client = config.getClient({ chainId });\n    const action = getAction(client, viem_multicall, 'multicall');\n    return action({\n        allowFailure,\n        contracts,\n        ...rest,\n    });\n}\n//# sourceMappingURL=multicall.js.map","import { readContract as viem_readContract, } from 'viem/actions';\nimport { getAction } from '../utils/getAction.js';\n/** https://wagmi.sh/core/api/actions/readContract */\nexport function readContract(config, parameters) {\n    const { chainId, ...rest } = parameters;\n    const client = config.getClient({ chainId });\n    const action = getAction(client, viem_readContract, 'readContract');\n    return action(rest);\n}\n//# sourceMappingURL=readContract.js.map","import { ContractFunctionExecutionError } from 'viem';\nimport { multicall } from './multicall.js';\nimport { readContract } from './readContract.js';\nexport async function readContracts(config, parameters) {\n    const { allowFailure = true, blockNumber, blockTag, ...rest } = parameters;\n    const contracts = parameters.contracts;\n    try {\n        const contractsByChainId = {};\n        for (const [index, contract] of contracts.entries()) {\n            const chainId = contract.chainId ?? config.state.chainId;\n            if (!contractsByChainId[chainId])\n                contractsByChainId[chainId] = [];\n            contractsByChainId[chainId]?.push({ contract, index });\n        }\n        const promises = () => Object.entries(contractsByChainId).map(([chainId, contracts]) => multicall(config, {\n            ...rest,\n            allowFailure,\n            blockNumber,\n            blockTag,\n            chainId: Number.parseInt(chainId),\n            contracts: contracts.map(({ contract }) => contract),\n        }));\n        const multicallResults = (await Promise.all(promises())).flat();\n        // Reorder the contract results back to the order they were\n        // provided in.\n        const resultIndexes = Object.values(contractsByChainId).flatMap((contracts) => contracts.map(({ index }) => index));\n        return multicallResults.reduce((results, result, index) => {\n            if (results)\n                results[resultIndexes[index]] = result;\n            return results;\n        }, []);\n    }\n    catch (error) {\n        if (error instanceof ContractFunctionExecutionError)\n            throw error;\n        const promises = () => contracts.map((contract) => readContract(config, { ...contract, blockNumber, blockTag }));\n        if (allowFailure)\n            return (await Promise.allSettled(promises())).map((result) => {\n                if (result.status === 'fulfilled')\n                    return { result: result.value, status: 'success' };\n                return { error: result.reason, result: undefined, status: 'failure' };\n            });\n        return (await Promise.all(promises()));\n    }\n}\n//# sourceMappingURL=readContracts.js.map","import { formatUnits, hexToString, trim } from 'viem';\nimport { getBalance as viem_getBalance, } from 'viem/actions';\nimport { getAction } from '../utils/getAction.js';\nimport { getUnit } from '../utils/getUnit.js';\nimport { readContracts } from './readContracts.js';\n/** https://wagmi.sh/core/api/actions/getBalance */\nexport async function getBalance(config, parameters) {\n    const { address, blockNumber, blockTag, chainId, token: tokenAddress, unit = 'ether', } = parameters;\n    if (tokenAddress) {\n        try {\n            return await getTokenBalance(config, {\n                balanceAddress: address,\n                chainId,\n                symbolType: 'string',\n                tokenAddress,\n            });\n        }\n        catch (error) {\n            // In the chance that there is an error upon decoding the contract result,\n            // it could be likely that the contract data is represented as bytes32 instead\n            // of a string.\n            if (error.name ===\n                'ContractFunctionExecutionError') {\n                const balance = await getTokenBalance(config, {\n                    balanceAddress: address,\n                    chainId,\n                    symbolType: 'bytes32',\n                    tokenAddress,\n                });\n                const symbol = hexToString(trim(balance.symbol, { dir: 'right' }));\n                return { ...balance, symbol };\n            }\n            throw error;\n        }\n    }\n    const client = config.getClient({ chainId });\n    const action = getAction(client, viem_getBalance, 'getBalance');\n    const value = await action(blockNumber ? { address, blockNumber } : { address, blockTag });\n    const chain = config.chains.find((x) => x.id === chainId) ?? client.chain;\n    return {\n        decimals: chain.nativeCurrency.decimals,\n        formatted: formatUnits(value, getUnit(unit)),\n        symbol: chain.nativeCurrency.symbol,\n        value,\n    };\n}\nasync function getTokenBalance(config, parameters) {\n    const { balanceAddress, chainId, symbolType, tokenAddress, unit } = parameters;\n    const contract = {\n        abi: [\n            {\n                type: 'function',\n                name: 'balanceOf',\n                stateMutability: 'view',\n                inputs: [{ type: 'address' }],\n                outputs: [{ type: 'uint256' }],\n            },\n            {\n                type: 'function',\n                name: 'decimals',\n                stateMutability: 'view',\n                inputs: [],\n                outputs: [{ type: 'uint8' }],\n            },\n            {\n                type: 'function',\n                name: 'symbol',\n                stateMutability: 'view',\n                inputs: [],\n                outputs: [{ type: symbolType }],\n            },\n        ],\n        address: tokenAddress,\n    };\n    const [value, decimals, symbol] = await readContracts(config, {\n        allowFailure: false,\n        contracts: [\n            {\n                ...contract,\n                functionName: 'balanceOf',\n                args: [balanceAddress],\n                chainId,\n            },\n            { ...contract, functionName: 'decimals', chainId },\n            { ...contract, functionName: 'symbol', chainId },\n        ],\n    });\n    const formatted = formatUnits(value ?? '0', getUnit(unit ?? decimals));\n    return { decimals, formatted, symbol, value };\n}\n//# sourceMappingURL=getBalance.js.map","/** https://wagmi.sh/core/api/actions/getChainId */\nexport function getChainId(config) {\n    return config.state.chainId;\n}\n//# sourceMappingURL=getChainId.js.map","/** Forked from https://github.com/epoberezkin/fast-deep-equal */\nexport function deepEqual(a, b) {\n    if (a === b)\n        return true;\n    if (a && b && typeof a === 'object' && typeof b === 'object') {\n        if (a.constructor !== b.constructor)\n            return false;\n        let length;\n        let i;\n        if (Array.isArray(a) && Array.isArray(b)) {\n            length = a.length;\n            if (length !== b.length)\n                return false;\n            for (i = length; i-- !== 0;)\n                if (!deepEqual(a[i], b[i]))\n                    return false;\n            return true;\n        }\n        if (a.valueOf !== Object.prototype.valueOf)\n            return a.valueOf() === b.valueOf();\n        if (a.toString !== Object.prototype.toString)\n            return a.toString() === b.toString();\n        const keys = Object.keys(a);\n        length = keys.length;\n        if (length !== Object.keys(b).length)\n            return false;\n        for (i = length; i-- !== 0;)\n            if (!Object.hasOwn(b, keys[i]))\n                return false;\n        for (i = length; i-- !== 0;) {\n            const key = keys[i];\n            if (key && !deepEqual(a[key], b[key]))\n                return false;\n        }\n        return true;\n    }\n    // true if both NaN, false otherwise\n    // biome-ignore lint/suspicious/noSelfCompare: using\n    return a !== a && b !== b;\n}\n//# sourceMappingURL=deepEqual.js.map","import { deepEqual } from '../utils/deepEqual.js';\nlet previousChains = [];\n/** https://wagmi.sh/core/api/actions/getChains */\nexport function getChains(config) {\n    const chains = config.chains;\n    if (deepEqual(previousChains, chains))\n        return previousChains;\n    previousChains = chains;\n    return chains;\n}\n//# sourceMappingURL=getChains.js.map","import { deepEqual } from '../utils/deepEqual.js';\nlet previousConnections = [];\n/** https://wagmi.sh/core/api/actions/getConnections */\nexport function getConnections(config) {\n    const connections = [...config.state.connections.values()];\n    if (config.state.status === 'reconnecting')\n        return previousConnections;\n    if (deepEqual(previousConnections, connections))\n        return previousConnections;\n    previousConnections = connections;\n    return connections;\n}\n//# sourceMappingURL=getConnections.js.map","import { deepEqual } from '../utils/deepEqual.js';\nlet previousConnectors = [];\n/** https://wagmi.sh/core/api/actions/getConnectors */\nexport function getConnectors(config) {\n    const connectors = config.connectors;\n    if (deepEqual(previousConnectors, connectors))\n        return previousConnectors;\n    previousConnectors = connectors;\n    return connectors;\n}\n//# sourceMappingURL=getConnectors.js.map","import { getEnsAvatar as viem_getEnsAvatar, } from 'viem/actions';\nimport { getAction } from '../utils/getAction.js';\n/** https://wagmi.sh/core/api/actions/getEnsAvatar */\nexport function getEnsAvatar(config, parameters) {\n    const { chainId, ...rest } = parameters;\n    const client = config.getClient({ chainId });\n    const action = getAction(client, viem_getEnsAvatar, 'getEnsAvatar');\n    return action(rest);\n}\n//# sourceMappingURL=getEnsAvatar.js.map","import { getEnsName as viem_getEnsName, } from 'viem/actions';\nimport { getAction } from '../utils/getAction.js';\n/** https://wagmi.sh/core/api/actions/getEnsName */\nexport function getEnsName(config, parameters) {\n    const { chainId, ...rest } = parameters;\n    const client = config.getClient({ chainId });\n    const action = getAction(client, viem_getEnsName, 'getEnsName');\n    return action(rest);\n}\n//# sourceMappingURL=getEnsName.js.map","let isReconnecting = false;\n/** https://wagmi.sh/core/api/actions/reconnect */\nexport async function reconnect(config, parameters = {}) {\n    // If already reconnecting, do nothing\n    if (isReconnecting)\n        return [];\n    isReconnecting = true;\n    config.setState((x) => ({\n        ...x,\n        status: x.current ? 'reconnecting' : 'connecting',\n    }));\n    const connectors = [];\n    if (parameters.connectors?.length) {\n        for (const connector_ of parameters.connectors) {\n            let connector;\n            // \"Register\" connector if not already created\n            if (typeof connector_ === 'function')\n                connector = config._internal.connectors.setup(connector_);\n            else\n                connector = connector_;\n            connectors.push(connector);\n        }\n    }\n    else\n        connectors.push(...config.connectors);\n    // Try recently-used connectors first\n    let recentConnectorId;\n    try {\n        recentConnectorId = await config.storage?.getItem('recentConnectorId');\n    }\n    catch { }\n    const scores = {};\n    for (const [, connection] of config.state.connections) {\n        scores[connection.connector.id] = 1;\n    }\n    if (recentConnectorId)\n        scores[recentConnectorId] = 0;\n    const sorted = Object.keys(scores).length > 0\n        ? // .toSorted()\n            [...connectors].sort((a, b) => (scores[a.id] ?? 10) - (scores[b.id] ?? 10))\n        : connectors;\n    // Iterate through each connector and try to connect\n    let connected = false;\n    const connections = [];\n    const providers = [];\n    for (const connector of sorted) {\n        const provider = await connector.getProvider().catch(() => undefined);\n        if (!provider)\n            continue;\n        // If we already have an instance of this connector's provider,\n        // then we have already checked it (ie. injected connectors can\n        // share the same `window.ethereum` instance, so we don't want to\n        // connect to it again).\n        if (providers.some((x) => x === provider))\n            continue;\n        const isAuthorized = await connector.isAuthorized();\n        if (!isAuthorized)\n            continue;\n        const data = await connector\n            .connect({ isReconnecting: true })\n            .catch(() => null);\n        if (!data)\n            continue;\n        connector.emitter.off('connect', config._internal.events.connect);\n        connector.emitter.on('change', config._internal.events.change);\n        connector.emitter.on('disconnect', config._internal.events.disconnect);\n        config.setState((x) => {\n            const connections = new Map(connected ? x.connections : new Map()).set(connector.uid, { accounts: data.accounts, chainId: data.chainId, connector });\n            return {\n                ...x,\n                current: connected ? x.current : connector.uid,\n                connections,\n            };\n        });\n        connections.push({\n            accounts: data.accounts,\n            chainId: data.chainId,\n            connector,\n        });\n        providers.push(provider);\n        connected = true;\n    }\n    // Prevent overwriting connected status from race condition\n    if (config.state.status === 'reconnecting' ||\n        config.state.status === 'connecting') {\n        // If connecting didn't succeed, set to disconnected\n        if (!connected)\n            config.setState((x) => ({\n                ...x,\n                connections: new Map(),\n                current: null,\n                status: 'disconnected',\n            }));\n        else\n            config.setState((x) => ({ ...x, status: 'connected' }));\n    }\n    isReconnecting = false;\n    return connections;\n}\n//# sourceMappingURL=reconnect.js.map","import { sendTransaction as viem_sendTransaction } from 'viem/actions';\nimport { getAction } from '../utils/getAction.js';\nimport { getConnectorClient, } from './getConnectorClient.js';\n/** https://wagmi.sh/core/api/actions/sendTransaction */\nexport async function sendTransaction(config, parameters) {\n    const { account, chainId, connector, ...rest } = parameters;\n    let client;\n    if (typeof account === 'object' && account?.type === 'local')\n        client = config.getClient({ chainId });\n    else\n        client = await getConnectorClient(config, {\n            account: account ?? undefined,\n            chainId,\n            connector,\n        });\n    const action = getAction(client, viem_sendTransaction, 'sendTransaction');\n    const hash = await action({\n        ...rest,\n        ...(account ? { account } : {}),\n        chain: chainId ? { id: chainId } : null,\n        gas: rest.gas ?? undefined,\n    });\n    return hash;\n}\n//# sourceMappingURL=sendTransaction.js.map","import { signMessage as viem_signMessage, } from 'viem/actions';\nimport { getAction } from '../utils/getAction.js';\nimport { getConnectorClient, } from './getConnectorClient.js';\n/** https://wagmi.sh/core/api/actions/signMessage */\nexport async function signMessage(config, parameters) {\n    const { account, connector, ...rest } = parameters;\n    let client;\n    if (typeof account === 'object' && account.type === 'local')\n        client = config.getClient();\n    else\n        client = await getConnectorClient(config, { account, connector });\n    const action = getAction(client, viem_signMessage, 'signMessage');\n    return action({\n        ...rest,\n        ...(account ? { account } : {}),\n    });\n}\n//# sourceMappingURL=signMessage.js.map","import { signTypedData as viem_signTypedData, } from 'viem/actions';\nimport { getAction } from '../utils/getAction.js';\nimport { getConnectorClient, } from './getConnectorClient.js';\n/** https://wagmi.sh/core/api/actions/signTypedData */\nexport async function signTypedData(config, parameters) {\n    const { account, connector, ...rest } = parameters;\n    let client;\n    if (typeof account === 'object' && account.type === 'local')\n        client = config.getClient();\n    else\n        client = await getConnectorClient(config, { account, connector });\n    const action = getAction(client, viem_signTypedData, 'signTypedData');\n    return action({\n        ...rest,\n        ...(account ? { account } : {}),\n    });\n}\n//# sourceMappingURL=signTypedData.js.map","import { BaseError } from './base.js';\nexport class ProviderNotFoundError extends BaseError {\n    constructor() {\n        super('Provider not found.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ProviderNotFoundError'\n        });\n    }\n}\nexport class SwitchChainNotSupportedError extends BaseError {\n    constructor({ connector }) {\n        super(`\"${connector.name}\" does not support programmatic chain switching.`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'SwitchChainNotSupportedError'\n        });\n    }\n}\n//# sourceMappingURL=connector.js.map","import { ChainNotConfiguredError, } from '../errors/config.js';\nimport { SwitchChainNotSupportedError, } from '../errors/connector.js';\n/** https://wagmi.sh/core/api/actions/switchChain */\nexport async function switchChain(config, parameters) {\n    const { addEthereumChainParameter, chainId } = parameters;\n    const connection = config.state.connections.get(parameters.connector?.uid ?? config.state.current);\n    if (connection) {\n        const connector = connection.connector;\n        if (!connector.switchChain)\n            throw new SwitchChainNotSupportedError({ connector });\n        const chain = await connector.switchChain({\n            addEthereumChainParameter,\n            chainId,\n        });\n        return chain;\n    }\n    const chain = config.chains.find((x) => x.id === chainId);\n    if (!chain)\n        throw new ChainNotConfiguredError();\n    config.setState((x) => ({ ...x, chainId }));\n    return chain;\n}\n//# sourceMappingURL=switchChain.js.map","import { deepEqual } from '../utils/deepEqual.js';\nimport { getAccount } from './getAccount.js';\n/** https://wagmi.sh/core/api/actions/watchAccount */\nexport function watchAccount(config, parameters) {\n    const { onChange } = parameters;\n    return config.subscribe(() => getAccount(config), onChange, {\n        equalityFn(a, b) {\n            const { connector: aConnector, ...aRest } = a;\n            const { connector: bConnector, ...bRest } = b;\n            return (deepEqual(aRest, bRest) &&\n                // check connector separately\n                aConnector?.id === bConnector?.id &&\n                aConnector?.uid === bConnector?.uid);\n        },\n    });\n}\n//# sourceMappingURL=watchAccount.js.map","/** https://wagmi.sh/core/api/actions/watchChainId */\nexport function watchChainId(config, parameters) {\n    const { onChange } = parameters;\n    return config.subscribe((state) => state.chainId, onChange);\n}\n//# sourceMappingURL=watchChainId.js.map","import { deepEqual } from '../utils/deepEqual.js';\nimport { getConnections, } from './getConnections.js';\n/** https://wagmi.sh/core/api/actions/watchConnections */\nexport function watchConnections(config, parameters) {\n    const { onChange } = parameters;\n    return config.subscribe(() => getConnections(config), onChange, {\n        equalityFn: deepEqual,\n    });\n}\n//# sourceMappingURL=watchConnections.js.map","/** https://wagmi.sh/core/api/actions/watchConnectors */\nexport function watchConnectors(config, parameters) {\n    const { onChange } = parameters;\n    return config._internal.connectors.subscribe((connectors, prevConnectors) => {\n        onChange(Object.values(connectors), prevConnectors);\n    });\n}\n//# sourceMappingURL=watchConnectors.js.map","export function createConnector(createConnectorFn) {\n    return createConnectorFn;\n}\n//# sourceMappingURL=createConnector.js.map","import { getAddress, numberToHex, ResourceUnavailableRpcError, SwitchChainError, UserRejectedRequestError, withRetry, withTimeout, } from 'viem';\nimport { ChainNotConfiguredError } from '../errors/config.js';\nimport { ProviderNotFoundError } from '../errors/connector.js';\nimport { createConnector } from './createConnector.js';\ninjected.type = 'injected';\nexport function injected(parameters = {}) {\n    const { shimDisconnect = true, unstable_shimAsyncInject } = parameters;\n    function getTarget() {\n        const target = parameters.target;\n        if (typeof target === 'function') {\n            const result = target();\n            if (result)\n                return result;\n        }\n        if (typeof target === 'object')\n            return target;\n        if (typeof target === 'string')\n            return {\n                ...(targetMap[target] ?? {\n                    id: target,\n                    name: `${target[0].toUpperCase()}${target.slice(1)}`,\n                    provider: `is${target[0].toUpperCase()}${target.slice(1)}`,\n                }),\n            };\n        return {\n            id: 'injected',\n            name: 'Injected',\n            provider(window) {\n                return window?.ethereum;\n            },\n        };\n    }\n    let accountsChanged;\n    let chainChanged;\n    let connect;\n    let disconnect;\n    return createConnector((config) => ({\n        get icon() {\n            return getTarget().icon;\n        },\n        get id() {\n            return getTarget().id;\n        },\n        get name() {\n            return getTarget().name;\n        },\n        /** @deprecated */\n        get supportsSimulation() {\n            return true;\n        },\n        type: injected.type,\n        async setup() {\n            const provider = await this.getProvider();\n            // Only start listening for events if `target` is set, otherwise `injected()` will also receive events\n            if (provider?.on && parameters.target) {\n                if (!connect) {\n                    connect = this.onConnect.bind(this);\n                    provider.on('connect', connect);\n                }\n                // We shouldn't need to listen for `'accountsChanged'` here since the `'connect'` event should suffice (and wallet shouldn't be connected yet).\n                // Some wallets, like MetaMask, do not implement the `'connect'` event and overload `'accountsChanged'` instead.\n                if (!accountsChanged) {\n                    accountsChanged = this.onAccountsChanged.bind(this);\n                    provider.on('accountsChanged', accountsChanged);\n                }\n            }\n        },\n        async connect({ chainId, isReconnecting } = {}) {\n            const provider = await this.getProvider();\n            if (!provider)\n                throw new ProviderNotFoundError();\n            let accounts = [];\n            if (isReconnecting)\n                accounts = await this.getAccounts().catch(() => []);\n            else if (shimDisconnect) {\n                // Attempt to show another prompt for selecting account if `shimDisconnect` flag is enabled\n                try {\n                    const permissions = await provider.request({\n                        method: 'wallet_requestPermissions',\n                        params: [{ eth_accounts: {} }],\n                    });\n                    accounts = permissions[0]?.caveats?.[0]?.value?.map((x) => getAddress(x));\n                    // `'wallet_requestPermissions'` can return a different order of accounts than `'eth_accounts'`\n                    // switch to `'eth_accounts'` ordering if more than one account is connected\n                    // https://github.com/wevm/wagmi/issues/4140\n                    if (accounts.length > 0) {\n                        const sortedAccounts = await this.getAccounts();\n                        accounts = sortedAccounts;\n                    }\n                }\n                catch (err) {\n                    const error = err;\n                    // Not all injected providers support `wallet_requestPermissions` (e.g. MetaMask iOS).\n                    // Only bubble up error if user rejects request\n                    if (error.code === UserRejectedRequestError.code)\n                        throw new UserRejectedRequestError(error);\n                    // Or prompt is already open\n                    if (error.code === ResourceUnavailableRpcError.code)\n                        throw error;\n                }\n            }\n            try {\n                if (!accounts?.length && !isReconnecting) {\n                    const requestedAccounts = await provider.request({\n                        method: 'eth_requestAccounts',\n                    });\n                    accounts = requestedAccounts.map((x) => getAddress(x));\n                }\n                // Manage EIP-1193 event listeners\n                // https://eips.ethereum.org/EIPS/eip-1193#events\n                if (connect) {\n                    provider.removeListener('connect', connect);\n                    connect = undefined;\n                }\n                if (!accountsChanged) {\n                    accountsChanged = this.onAccountsChanged.bind(this);\n                    provider.on('accountsChanged', accountsChanged);\n                }\n                if (!chainChanged) {\n                    chainChanged = this.onChainChanged.bind(this);\n                    provider.on('chainChanged', chainChanged);\n                }\n                if (!disconnect) {\n                    disconnect = this.onDisconnect.bind(this);\n                    provider.on('disconnect', disconnect);\n                }\n                // Switch to chain if provided\n                let currentChainId = await this.getChainId();\n                if (chainId && currentChainId !== chainId) {\n                    const chain = await this.switchChain({ chainId }).catch((error) => {\n                        if (error.code === UserRejectedRequestError.code)\n                            throw error;\n                        return { id: currentChainId };\n                    });\n                    currentChainId = chain?.id ?? currentChainId;\n                }\n                // Remove disconnected shim if it exists\n                if (shimDisconnect)\n                    await config.storage?.removeItem(`${this.id}.disconnected`);\n                // Add connected shim if no target exists\n                if (!parameters.target)\n                    await config.storage?.setItem('injected.connected', true);\n                return { accounts, chainId: currentChainId };\n            }\n            catch (err) {\n                const error = err;\n                if (error.code === UserRejectedRequestError.code)\n                    throw new UserRejectedRequestError(error);\n                if (error.code === ResourceUnavailableRpcError.code)\n                    throw new ResourceUnavailableRpcError(error);\n                throw error;\n            }\n        },\n        async disconnect() {\n            const provider = await this.getProvider();\n            if (!provider)\n                throw new ProviderNotFoundError();\n            // Manage EIP-1193 event listeners\n            if (chainChanged) {\n                provider.removeListener('chainChanged', chainChanged);\n                chainChanged = undefined;\n            }\n            if (disconnect) {\n                provider.removeListener('disconnect', disconnect);\n                disconnect = undefined;\n            }\n            if (!connect) {\n                connect = this.onConnect.bind(this);\n                provider.on('connect', connect);\n            }\n            // Experimental support for MetaMask disconnect\n            // https://github.com/MetaMask/metamask-improvement-proposals/blob/main/MIPs/mip-2.md\n            try {\n                // Adding timeout as not all wallets support this method and can hang\n                // https://github.com/wevm/wagmi/issues/4064\n                await withTimeout(() => \n                // TODO: Remove explicit type for viem@3\n                provider.request({\n                    // `'wallet_revokePermissions'` added in `viem@2.10.3`\n                    method: 'wallet_revokePermissions',\n                    params: [{ eth_accounts: {} }],\n                }), { timeout: 100 });\n            }\n            catch { }\n            // Add shim signalling connector is disconnected\n            if (shimDisconnect) {\n                await config.storage?.setItem(`${this.id}.disconnected`, true);\n            }\n            if (!parameters.target)\n                await config.storage?.removeItem('injected.connected');\n        },\n        async getAccounts() {\n            const provider = await this.getProvider();\n            if (!provider)\n                throw new ProviderNotFoundError();\n            const accounts = await provider.request({ method: 'eth_accounts' });\n            return accounts.map((x) => getAddress(x));\n        },\n        async getChainId() {\n            const provider = await this.getProvider();\n            if (!provider)\n                throw new ProviderNotFoundError();\n            const hexChainId = await provider.request({ method: 'eth_chainId' });\n            return Number(hexChainId);\n        },\n        async getProvider() {\n            if (typeof window === 'undefined')\n                return undefined;\n            let provider;\n            const target = getTarget();\n            if (typeof target.provider === 'function')\n                provider = target.provider(window);\n            else if (typeof target.provider === 'string')\n                provider = findProvider(window, target.provider);\n            else\n                provider = target.provider;\n            // Some wallets do not conform to EIP-1193 (e.g. Trust Wallet)\n            // https://github.com/wevm/wagmi/issues/3526#issuecomment-1912683002\n            if (provider && !provider.removeListener) {\n                // Try using `off` handler if it exists, otherwise noop\n                if ('off' in provider && typeof provider.off === 'function')\n                    provider.removeListener =\n                        provider.off;\n                else\n                    provider.removeListener = () => { };\n            }\n            return provider;\n        },\n        async isAuthorized() {\n            try {\n                const isDisconnected = shimDisconnect &&\n                    // If shim exists in storage, connector is disconnected\n                    (await config.storage?.getItem(`${this.id}.disconnected`));\n                if (isDisconnected)\n                    return false;\n                // Don't allow injected connector to connect if no target is set and it hasn't already connected\n                // (e.g. flag in storage is not set). This prevents a targetless injected connector from connecting\n                // automatically whenever there is a targeted connector configured.\n                if (!parameters.target) {\n                    const connected = await config.storage?.getItem('injected.connected');\n                    if (!connected)\n                        return false;\n                }\n                const provider = await this.getProvider();\n                if (!provider) {\n                    if (unstable_shimAsyncInject !== undefined &&\n                        unstable_shimAsyncInject !== false) {\n                        // If no provider is found, check for async injection\n                        // https://github.com/wevm/references/issues/167\n                        // https://github.com/MetaMask/detect-provider\n                        const handleEthereum = async () => {\n                            if (typeof window !== 'undefined')\n                                window.removeEventListener('ethereum#initialized', handleEthereum);\n                            const provider = await this.getProvider();\n                            return !!provider;\n                        };\n                        const timeout = typeof unstable_shimAsyncInject === 'number'\n                            ? unstable_shimAsyncInject\n                            : 1_000;\n                        const res = await Promise.race([\n                            ...(typeof window !== 'undefined'\n                                ? [\n                                    new Promise((resolve) => window.addEventListener('ethereum#initialized', () => resolve(handleEthereum()), { once: true })),\n                                ]\n                                : []),\n                            new Promise((resolve) => setTimeout(() => resolve(handleEthereum()), timeout)),\n                        ]);\n                        if (res)\n                            return true;\n                    }\n                    throw new ProviderNotFoundError();\n                }\n                // Use retry strategy as some injected wallets (e.g. MetaMask) fail to\n                // immediately resolve JSON-RPC requests on page load.\n                const accounts = await withRetry(() => this.getAccounts());\n                return !!accounts.length;\n            }\n            catch {\n                return false;\n            }\n        },\n        async switchChain({ addEthereumChainParameter, chainId }) {\n            const provider = await this.getProvider();\n            if (!provider)\n                throw new ProviderNotFoundError();\n            const chain = config.chains.find((x) => x.id === chainId);\n            if (!chain)\n                throw new SwitchChainError(new ChainNotConfiguredError());\n            const promise = new Promise((resolve) => {\n                const listener = ((data) => {\n                    if ('chainId' in data && data.chainId === chainId) {\n                        config.emitter.off('change', listener);\n                        resolve();\n                    }\n                });\n                config.emitter.on('change', listener);\n            });\n            try {\n                await Promise.all([\n                    provider\n                        .request({\n                        method: 'wallet_switchEthereumChain',\n                        params: [{ chainId: numberToHex(chainId) }],\n                    })\n                        // During `'wallet_switchEthereumChain'`, MetaMask makes a `'net_version'` RPC call to the target chain.\n                        // If this request fails, MetaMask does not emit the `'chainChanged'` event, but will still switch the chain.\n                        // To counter this behavior, we request and emit the current chain ID to confirm the chain switch either via\n                        // this callback or an externally emitted `'chainChanged'` event.\n                        // https://github.com/MetaMask/metamask-extension/issues/24247\n                        .then(async () => {\n                        const currentChainId = await this.getChainId();\n                        if (currentChainId === chainId)\n                            config.emitter.emit('change', { chainId });\n                    }),\n                    promise,\n                ]);\n                return chain;\n            }\n            catch (err) {\n                const error = err;\n                // Indicates chain is not added to provider\n                if (error.code === 4902 ||\n                    // Unwrapping for MetaMask Mobile\n                    // https://github.com/MetaMask/metamask-mobile/issues/2944#issuecomment-976988719\n                    error\n                        ?.data?.originalError?.code === 4902) {\n                    try {\n                        const { default: blockExplorer, ...blockExplorers } = chain.blockExplorers ?? {};\n                        let blockExplorerUrls;\n                        if (addEthereumChainParameter?.blockExplorerUrls)\n                            blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls;\n                        else if (blockExplorer)\n                            blockExplorerUrls = [\n                                blockExplorer.url,\n                                ...Object.values(blockExplorers).map((x) => x.url),\n                            ];\n                        let rpcUrls;\n                        if (addEthereumChainParameter?.rpcUrls?.length)\n                            rpcUrls = addEthereumChainParameter.rpcUrls;\n                        else\n                            rpcUrls = [chain.rpcUrls.default?.http[0] ?? ''];\n                        const addEthereumChain = {\n                            blockExplorerUrls,\n                            chainId: numberToHex(chainId),\n                            chainName: addEthereumChainParameter?.chainName ?? chain.name,\n                            iconUrls: addEthereumChainParameter?.iconUrls,\n                            nativeCurrency: addEthereumChainParameter?.nativeCurrency ??\n                                chain.nativeCurrency,\n                            rpcUrls,\n                        };\n                        await Promise.all([\n                            provider\n                                .request({\n                                method: 'wallet_addEthereumChain',\n                                params: [addEthereumChain],\n                            })\n                                .then(async () => {\n                                const currentChainId = await this.getChainId();\n                                if (currentChainId === chainId)\n                                    config.emitter.emit('change', { chainId });\n                                else\n                                    throw new UserRejectedRequestError(new Error('User rejected switch after adding network.'));\n                            }),\n                            promise,\n                        ]);\n                        return chain;\n                    }\n                    catch (error) {\n                        throw new UserRejectedRequestError(error);\n                    }\n                }\n                if (error.code === UserRejectedRequestError.code)\n                    throw new UserRejectedRequestError(error);\n                throw new SwitchChainError(error);\n            }\n        },\n        async onAccountsChanged(accounts) {\n            // Disconnect if there are no accounts\n            if (accounts.length === 0)\n                this.onDisconnect();\n            // Connect if emitter is listening for connect event (e.g. is disconnected and connects through wallet interface)\n            else if (config.emitter.listenerCount('connect')) {\n                const chainId = (await this.getChainId()).toString();\n                this.onConnect({ chainId });\n                // Remove disconnected shim if it exists\n                if (shimDisconnect)\n                    await config.storage?.removeItem(`${this.id}.disconnected`);\n            }\n            // Regular change event\n            else\n                config.emitter.emit('change', {\n                    accounts: accounts.map((x) => getAddress(x)),\n                });\n        },\n        onChainChanged(chain) {\n            const chainId = Number(chain);\n            config.emitter.emit('change', { chainId });\n        },\n        async onConnect(connectInfo) {\n            const accounts = await this.getAccounts();\n            if (accounts.length === 0)\n                return;\n            const chainId = Number(connectInfo.chainId);\n            config.emitter.emit('connect', { accounts, chainId });\n            // Manage EIP-1193 event listeners\n            const provider = await this.getProvider();\n            if (provider) {\n                if (connect) {\n                    provider.removeListener('connect', connect);\n                    connect = undefined;\n                }\n                if (!accountsChanged) {\n                    accountsChanged = this.onAccountsChanged.bind(this);\n                    provider.on('accountsChanged', accountsChanged);\n                }\n                if (!chainChanged) {\n                    chainChanged = this.onChainChanged.bind(this);\n                    provider.on('chainChanged', chainChanged);\n                }\n                if (!disconnect) {\n                    disconnect = this.onDisconnect.bind(this);\n                    provider.on('disconnect', disconnect);\n                }\n            }\n        },\n        async onDisconnect(error) {\n            const provider = await this.getProvider();\n            // If MetaMask emits a `code: 1013` error, wait for reconnection before disconnecting\n            // https://github.com/MetaMask/providers/pull/120\n            if (error && error.code === 1013) {\n                if (provider && !!(await this.getAccounts()).length)\n                    return;\n            }\n            // No need to remove `${this.id}.disconnected` from storage because `onDisconnect` is typically\n            // only called when the wallet is disconnected through the wallet's interface, meaning the wallet\n            // actually disconnected and we don't need to simulate it.\n            config.emitter.emit('disconnect');\n            // Manage EIP-1193 event listeners\n            if (provider) {\n                if (chainChanged) {\n                    provider.removeListener('chainChanged', chainChanged);\n                    chainChanged = undefined;\n                }\n                if (disconnect) {\n                    provider.removeListener('disconnect', disconnect);\n                    disconnect = undefined;\n                }\n                if (!connect) {\n                    connect = this.onConnect.bind(this);\n                    provider.on('connect', connect);\n                }\n            }\n        },\n    }));\n}\nconst targetMap = {\n    coinbaseWallet: {\n        id: 'coinbaseWallet',\n        name: 'Coinbase Wallet',\n        provider(window) {\n            if (window?.coinbaseWalletExtension)\n                return window.coinbaseWalletExtension;\n            return findProvider(window, 'isCoinbaseWallet');\n        },\n    },\n    metaMask: {\n        id: 'metaMask',\n        name: 'MetaMask',\n        provider(window) {\n            return findProvider(window, (provider) => {\n                if (!provider.isMetaMask)\n                    return false;\n                // Brave tries to make itself look like MetaMask\n                // Could also try RPC `web3_clientVersion` if following is unreliable\n                if (provider.isBraveWallet && !provider._events && !provider._state)\n                    return false;\n                // Other wallets that try to look like MetaMask\n                const flags = [\n                    'isApexWallet',\n                    'isAvalanche',\n                    'isBitKeep',\n                    'isBlockWallet',\n                    'isKuCoinWallet',\n                    'isMathWallet',\n                    'isOkxWallet',\n                    'isOKExWallet',\n                    'isOneInchIOSWallet',\n                    'isOneInchAndroidWallet',\n                    'isOpera',\n                    'isPhantom',\n                    'isPortal',\n                    'isRabby',\n                    'isTokenPocket',\n                    'isTokenary',\n                    'isUniswapWallet',\n                    'isZerion',\n                ];\n                for (const flag of flags)\n                    if (provider[flag])\n                        return false;\n                return true;\n            });\n        },\n    },\n    phantom: {\n        id: 'phantom',\n        name: 'Phantom',\n        provider(window) {\n            if (window?.phantom?.ethereum)\n                return window.phantom?.ethereum;\n            return findProvider(window, 'isPhantom');\n        },\n    },\n};\nfunction findProvider(window, select) {\n    function isProvider(provider) {\n        if (typeof select === 'function')\n            return select(provider);\n        if (typeof select === 'string')\n            return provider[select];\n        return true;\n    }\n    const ethereum = window.ethereum;\n    if (ethereum?.providers)\n        return ethereum.providers.find((provider) => isProvider(provider));\n    if (ethereum && isProvider(ethereum))\n        return ethereum;\n    return undefined;\n}\n//# sourceMappingURL=injected.js.map","/**\n * Announces an EIP-1193 Provider.\n */\nexport function announceProvider(detail) {\n    const event = new CustomEvent('eip6963:announceProvider', { detail: Object.freeze(detail) });\n    window.dispatchEvent(event);\n    const handler = () => window.dispatchEvent(event);\n    window.addEventListener('eip6963:requestProvider', handler);\n    return () => window.removeEventListener('eip6963:requestProvider', handler);\n}\n/**\n * Watches for EIP-1193 Providers to be announced.\n */\nexport function requestProviders(listener) {\n    if (typeof window === 'undefined')\n        return;\n    const handler = (event) => listener(event.detail);\n    window.addEventListener('eip6963:announceProvider', handler);\n    window.dispatchEvent(new CustomEvent('eip6963:requestProvider'));\n    return () => window.removeEventListener('eip6963:announceProvider', handler);\n}\n//# sourceMappingURL=utils.js.map","import { requestProviders } from './utils.js';\nexport function createStore() {\n    const listeners = new Set();\n    let providerDetails = [];\n    const request = () => requestProviders((providerDetail) => {\n        if (providerDetails.some(({ info }) => info.uuid === providerDetail.info.uuid))\n            return;\n        providerDetails = [...providerDetails, providerDetail];\n        listeners.forEach((listener) => listener(providerDetails, { added: [providerDetail] }));\n    });\n    let unwatch = request();\n    return {\n        _listeners() {\n            return listeners;\n        },\n        clear() {\n            listeners.forEach((listener) => listener([], { removed: [...providerDetails] }));\n            providerDetails = [];\n        },\n        destroy() {\n            this.clear();\n            listeners.clear();\n            unwatch?.();\n        },\n        findProvider({ rdns }) {\n            return providerDetails.find((providerDetail) => providerDetail.info.rdns === rdns);\n        },\n        getProviders() {\n            return providerDetails;\n        },\n        reset() {\n            this.clear();\n            unwatch?.();\n            unwatch = request();\n        },\n        subscribe(listener, { emitImmediately } = {}) {\n            listeners.add(listener);\n            if (emitImmediately)\n                listener(providerDetails, { added: providerDetails });\n            return () => listeners.delete(listener);\n        },\n    };\n}\n//# sourceMappingURL=store.js.map","const reduxImpl = (reducer, initial) => (set, _get, api) => {\n  api.dispatch = (action) => {\n    set((state) => reducer(state, action), false, action);\n    return action;\n  };\n  api.dispatchFromDevtools = true;\n  return { dispatch: (...a) => api.dispatch(...a), ...initial };\n};\nconst redux = reduxImpl;\n\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n  const api = trackedConnections.get(name);\n  if (!api) return {};\n  return Object.fromEntries(\n    Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n  );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n  if (store === void 0) {\n    return {\n      type: \"untracked\",\n      connection: extensionConnector.connect(options)\n    };\n  }\n  const existingConnection = trackedConnections.get(options.name);\n  if (existingConnection) {\n    return { type: \"tracked\", store, ...existingConnection };\n  }\n  const newConnection = {\n    connection: extensionConnector.connect(options),\n    stores: {}\n  };\n  trackedConnections.set(options.name, newConnection);\n  return { type: \"tracked\", store, ...newConnection };\n};\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n  const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n  let extensionConnector;\n  try {\n    extensionConnector = (enabled != null ? enabled : (import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n  } catch (e) {\n  }\n  if (!extensionConnector) {\n    return fn(set, get, api);\n  }\n  const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n  let isRecording = true;\n  api.setState = (state, replace, nameOrAction) => {\n    const r = set(state, replace);\n    if (!isRecording) return r;\n    const action = nameOrAction === void 0 ? { type: anonymousActionType || \"anonymous\" } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n    if (store === void 0) {\n      connection == null ? void 0 : connection.send(action, get());\n      return r;\n    }\n    connection == null ? void 0 : connection.send(\n      {\n        ...action,\n        type: `${store}/${action.type}`\n      },\n      {\n        ...getTrackedConnectionState(options.name),\n        [store]: api.getState()\n      }\n    );\n    return r;\n  };\n  const setStateFromDevtools = (...a) => {\n    const originalIsRecording = isRecording;\n    isRecording = false;\n    set(...a);\n    isRecording = originalIsRecording;\n  };\n  const initialState = fn(api.setState, get, api);\n  if (connectionInformation.type === \"untracked\") {\n    connection == null ? void 0 : connection.init(initialState);\n  } else {\n    connectionInformation.stores[connectionInformation.store] = api;\n    connection == null ? void 0 : connection.init(\n      Object.fromEntries(\n        Object.entries(connectionInformation.stores).map(([key, store2]) => [\n          key,\n          key === connectionInformation.store ? initialState : store2.getState()\n        ])\n      )\n    );\n  }\n  if (api.dispatchFromDevtools && typeof api.dispatch === \"function\") {\n    let didWarnAboutReservedActionType = false;\n    const originalDispatch = api.dispatch;\n    api.dispatch = (...a) => {\n      if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && a[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n        console.warn(\n          '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n        );\n        didWarnAboutReservedActionType = true;\n      }\n      originalDispatch(...a);\n    };\n  }\n  connection.subscribe((message) => {\n    var _a;\n    switch (message.type) {\n      case \"ACTION\":\n        if (typeof message.payload !== \"string\") {\n          console.error(\n            \"[zustand devtools middleware] Unsupported action format\"\n          );\n          return;\n        }\n        return parseJsonThen(\n          message.payload,\n          (action) => {\n            if (action.type === \"__setState\") {\n              if (store === void 0) {\n                setStateFromDevtools(action.state);\n                return;\n              }\n              if (Object.keys(action.state).length !== 1) {\n                console.error(\n                  `\n                    [zustand devtools middleware] Unsupported __setState action format.\n                    When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n                    and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n                    `\n                );\n              }\n              const stateFromDevtools = action.state[store];\n              if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n                return;\n              }\n              if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n                setStateFromDevtools(stateFromDevtools);\n              }\n              return;\n            }\n            if (!api.dispatchFromDevtools) return;\n            if (typeof api.dispatch !== \"function\") return;\n            api.dispatch(action);\n          }\n        );\n      case \"DISPATCH\":\n        switch (message.payload.type) {\n          case \"RESET\":\n            setStateFromDevtools(initialState);\n            if (store === void 0) {\n              return connection == null ? void 0 : connection.init(api.getState());\n            }\n            return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n          case \"COMMIT\":\n            if (store === void 0) {\n              connection == null ? void 0 : connection.init(api.getState());\n              return;\n            }\n            return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n          case \"ROLLBACK\":\n            return parseJsonThen(message.state, (state) => {\n              if (store === void 0) {\n                setStateFromDevtools(state);\n                connection == null ? void 0 : connection.init(api.getState());\n                return;\n              }\n              setStateFromDevtools(state[store]);\n              connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n            });\n          case \"JUMP_TO_STATE\":\n          case \"JUMP_TO_ACTION\":\n            return parseJsonThen(message.state, (state) => {\n              if (store === void 0) {\n                setStateFromDevtools(state);\n                return;\n              }\n              if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n                setStateFromDevtools(state[store]);\n              }\n            });\n          case \"IMPORT_STATE\": {\n            const { nextLiftedState } = message.payload;\n            const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n            if (!lastComputedState) return;\n            if (store === void 0) {\n              setStateFromDevtools(lastComputedState);\n            } else {\n              setStateFromDevtools(lastComputedState[store]);\n            }\n            connection == null ? void 0 : connection.send(\n              null,\n              // FIXME no-any\n              nextLiftedState\n            );\n            return;\n          }\n          case \"PAUSE_RECORDING\":\n            return isRecording = !isRecording;\n        }\n        return;\n    }\n  });\n  return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, f) => {\n  let parsed;\n  try {\n    parsed = JSON.parse(stringified);\n  } catch (e) {\n    console.error(\n      \"[zustand devtools middleware] Could not parse the received json\",\n      e\n    );\n  }\n  if (parsed !== void 0) f(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n  const origSubscribe = api.subscribe;\n  api.subscribe = (selector, optListener, options) => {\n    let listener = selector;\n    if (optListener) {\n      const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n      let currentSlice = selector(api.getState());\n      listener = (state) => {\n        const nextSlice = selector(state);\n        if (!equalityFn(currentSlice, nextSlice)) {\n          const previousSlice = currentSlice;\n          optListener(currentSlice = nextSlice, previousSlice);\n        }\n      };\n      if (options == null ? void 0 : options.fireImmediately) {\n        optListener(currentSlice, currentSlice);\n      }\n    }\n    return origSubscribe(listener);\n  };\n  const initialState = fn(set, get, api);\n  return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nconst combine = (initialState, create) => (...a) => Object.assign({}, initialState, create(...a));\n\nfunction createJSONStorage(getStorage, options) {\n  let storage;\n  try {\n    storage = getStorage();\n  } catch (e) {\n    return;\n  }\n  const persistStorage = {\n    getItem: (name) => {\n      var _a;\n      const parse = (str2) => {\n        if (str2 === null) {\n          return null;\n        }\n        return JSON.parse(str2, options == null ? void 0 : options.reviver);\n      };\n      const str = (_a = storage.getItem(name)) != null ? _a : null;\n      if (str instanceof Promise) {\n        return str.then(parse);\n      }\n      return parse(str);\n    },\n    setItem: (name, newValue) => storage.setItem(\n      name,\n      JSON.stringify(newValue, options == null ? void 0 : options.replacer)\n    ),\n    removeItem: (name) => storage.removeItem(name)\n  };\n  return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n  try {\n    const result = fn(input);\n    if (result instanceof Promise) {\n      return result;\n    }\n    return {\n      then(onFulfilled) {\n        return toThenable(onFulfilled)(result);\n      },\n      catch(_onRejected) {\n        return this;\n      }\n    };\n  } catch (e) {\n    return {\n      then(_onFulfilled) {\n        return this;\n      },\n      catch(onRejected) {\n        return toThenable(onRejected)(e);\n      }\n    };\n  }\n};\nconst persistImpl = (config, baseOptions) => (set, get, api) => {\n  let options = {\n    storage: createJSONStorage(() => localStorage),\n    partialize: (state) => state,\n    version: 0,\n    merge: (persistedState, currentState) => ({\n      ...currentState,\n      ...persistedState\n    }),\n    ...baseOptions\n  };\n  let hasHydrated = false;\n  const hydrationListeners = /* @__PURE__ */ new Set();\n  const finishHydrationListeners = /* @__PURE__ */ new Set();\n  let storage = options.storage;\n  if (!storage) {\n    return config(\n      (...args) => {\n        console.warn(\n          `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n        );\n        set(...args);\n      },\n      get,\n      api\n    );\n  }\n  const setItem = () => {\n    const state = options.partialize({ ...get() });\n    return storage.setItem(options.name, {\n      state,\n      version: options.version\n    });\n  };\n  const savedSetState = api.setState;\n  api.setState = (state, replace) => {\n    savedSetState(state, replace);\n    void setItem();\n  };\n  const configResult = config(\n    (...args) => {\n      set(...args);\n      void setItem();\n    },\n    get,\n    api\n  );\n  api.getInitialState = () => configResult;\n  let stateFromStorage;\n  const hydrate = () => {\n    var _a, _b;\n    if (!storage) return;\n    hasHydrated = false;\n    hydrationListeners.forEach((cb) => {\n      var _a2;\n      return cb((_a2 = get()) != null ? _a2 : configResult);\n    });\n    const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n    return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n      if (deserializedStorageValue) {\n        if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n          if (options.migrate) {\n            return [\n              true,\n              options.migrate(\n                deserializedStorageValue.state,\n                deserializedStorageValue.version\n              )\n            ];\n          }\n          console.error(\n            `State loaded from storage couldn't be migrated since no migrate function was provided`\n          );\n        } else {\n          return [false, deserializedStorageValue.state];\n        }\n      }\n      return [false, void 0];\n    }).then((migrationResult) => {\n      var _a2;\n      const [migrated, migratedState] = migrationResult;\n      stateFromStorage = options.merge(\n        migratedState,\n        (_a2 = get()) != null ? _a2 : configResult\n      );\n      set(stateFromStorage, true);\n      if (migrated) {\n        return setItem();\n      }\n    }).then(() => {\n      postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n      stateFromStorage = get();\n      hasHydrated = true;\n      finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n    }).catch((e) => {\n      postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n    });\n  };\n  api.persist = {\n    setOptions: (newOptions) => {\n      options = {\n        ...options,\n        ...newOptions\n      };\n      if (newOptions.storage) {\n        storage = newOptions.storage;\n      }\n    },\n    clearStorage: () => {\n      storage == null ? void 0 : storage.removeItem(options.name);\n    },\n    getOptions: () => options,\n    rehydrate: () => hydrate(),\n    hasHydrated: () => hasHydrated,\n    onHydrate: (cb) => {\n      hydrationListeners.add(cb);\n      return () => {\n        hydrationListeners.delete(cb);\n      };\n    },\n    onFinishHydration: (cb) => {\n      finishHydrationListeners.add(cb);\n      return () => {\n        finishHydrationListeners.delete(cb);\n      };\n    }\n  };\n  if (!options.skipHydration) {\n    hydrate();\n  }\n  return stateFromStorage || configResult;\n};\nconst persist = persistImpl;\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector };\n","const createStoreImpl = (createState) => {\n  let state;\n  const listeners = /* @__PURE__ */ new Set();\n  const setState = (partial, replace) => {\n    const nextState = typeof partial === \"function\" ? partial(state) : partial;\n    if (!Object.is(nextState, state)) {\n      const previousState = state;\n      state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n      listeners.forEach((listener) => listener(state, previousState));\n    }\n  };\n  const getState = () => state;\n  const getInitialState = () => initialState;\n  const subscribe = (listener) => {\n    listeners.add(listener);\n    return () => listeners.delete(listener);\n  };\n  const api = { setState, getState, getInitialState, subscribe };\n  const initialState = state = createState(setState, getState, api);\n  return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\n\nexport { createStore };\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","import { EventEmitter } from 'eventemitter3';\nexport class Emitter {\n    constructor(uid) {\n        Object.defineProperty(this, \"uid\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: uid\n        });\n        Object.defineProperty(this, \"_emitter\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: new EventEmitter()\n        });\n    }\n    on(eventName, fn) {\n        this._emitter.on(eventName, fn);\n    }\n    once(eventName, fn) {\n        this._emitter.once(eventName, fn);\n    }\n    off(eventName, fn) {\n        this._emitter.off(eventName, fn);\n    }\n    emit(eventName, ...params) {\n        const data = params[0];\n        this._emitter.emit(eventName, { uid: this.uid, ...data });\n    }\n    listenerCount(eventName) {\n        return this._emitter.listenerCount(eventName);\n    }\n}\nexport function createEmitter(uid) {\n    return new Emitter(uid);\n}\n//# sourceMappingURL=createEmitter.js.map","export function deserialize(value, reviver) {\n    return JSON.parse(value, (key, value_) => {\n        let value = value_;\n        if (value?.__type === 'bigint')\n            value = BigInt(value.value);\n        if (value?.__type === 'Map')\n            value = new Map(value.value);\n        return reviver?.(key, value) ?? value;\n    });\n}\n//# sourceMappingURL=deserialize.js.map","/**\n * Get the reference key for the circular value\n *\n * @param keys the keys to build the reference key from\n * @param cutoff the maximum number of keys to include\n * @returns the reference key\n */\nfunction getReferenceKey(keys, cutoff) {\n    return keys.slice(0, cutoff).join('.') || '.';\n}\n/**\n * Faster `Array.prototype.indexOf` implementation build for slicing / splicing\n *\n * @param array the array to match the value in\n * @param value the value to match\n * @returns the matching index, or -1\n */\nfunction getCutoff(array, value) {\n    const { length } = array;\n    for (let index = 0; index < length; ++index) {\n        if (array[index] === value) {\n            return index + 1;\n        }\n    }\n    return 0;\n}\n/**\n * Create a replacer method that handles circular values\n *\n * @param [replacer] a custom replacer to use for non-circular values\n * @param [circularReplacer] a custom replacer to use for circular methods\n * @returns the value to stringify\n */\nfunction createReplacer(replacer, circularReplacer) {\n    const hasReplacer = typeof replacer === 'function';\n    const hasCircularReplacer = typeof circularReplacer === 'function';\n    const cache = [];\n    const keys = [];\n    return function replace(key, value) {\n        if (typeof value === 'object') {\n            if (cache.length) {\n                const thisCutoff = getCutoff(cache, this);\n                if (thisCutoff === 0) {\n                    cache[cache.length] = this;\n                }\n                else {\n                    cache.splice(thisCutoff);\n                    keys.splice(thisCutoff);\n                }\n                keys[keys.length] = key;\n                const valueCutoff = getCutoff(cache, value);\n                if (valueCutoff !== 0) {\n                    return hasCircularReplacer\n                        ? circularReplacer.call(this, key, value, getReferenceKey(keys, valueCutoff))\n                        : `[ref=${getReferenceKey(keys, valueCutoff)}]`;\n                }\n            }\n            else {\n                cache[0] = value;\n                keys[0] = key;\n            }\n        }\n        return hasReplacer ? replacer.call(this, key, value) : value;\n    };\n}\n/**\n * Stringifier that handles circular values\n *\n * Forked from https://github.com/planttheidea/fast-stringify\n *\n * @param value to stringify\n * @param [replacer] a custom replacer function for handling standard values\n * @param [indent] the number of spaces to indent the output by\n * @param [circularReplacer] a custom replacer function for handling circular values\n * @returns the stringified output\n */\nexport function serialize(value, replacer, indent, circularReplacer) {\n    return JSON.stringify(value, createReplacer((key, value_) => {\n        let value = value_;\n        if (typeof value === 'bigint')\n            value = { __type: 'bigint', value: value_.toString() };\n        if (value instanceof Map)\n            value = { __type: 'Map', value: Array.from(value_.entries()) };\n        return replacer?.(key, value) ?? value;\n    }, circularReplacer), indent ?? undefined);\n}\n//# sourceMappingURL=serialize.js.map","import { deserialize as deserialize_ } from './utils/deserialize.js';\nimport { serialize as serialize_ } from './utils/serialize.js';\nexport function createStorage(parameters) {\n    const { deserialize = deserialize_, key: prefix = 'wagmi', serialize = serialize_, storage = noopStorage, } = parameters;\n    function unwrap(value) {\n        if (value instanceof Promise)\n            return value.then((x) => x).catch(() => null);\n        return value;\n    }\n    return {\n        ...storage,\n        key: prefix,\n        async getItem(key, defaultValue) {\n            const value = storage.getItem(`${prefix}.${key}`);\n            const unwrapped = await unwrap(value);\n            if (unwrapped)\n                return deserialize(unwrapped) ?? null;\n            return (defaultValue ?? null);\n        },\n        async setItem(key, value) {\n            const storageKey = `${prefix}.${key}`;\n            if (value === null)\n                await unwrap(storage.removeItem(storageKey));\n            else\n                await unwrap(storage.setItem(storageKey, serialize(value)));\n        },\n        async removeItem(key) {\n            await unwrap(storage.removeItem(`${prefix}.${key}`));\n        },\n    };\n}\nexport const noopStorage = {\n    getItem: () => null,\n    setItem: () => { },\n    removeItem: () => { },\n};\nexport function getDefaultStorage() {\n    const storage = (() => {\n        if (typeof window !== 'undefined' && window.localStorage)\n            return window.localStorage;\n        return noopStorage;\n    })();\n    return {\n        getItem(key) {\n            return storage.getItem(key);\n        },\n        removeItem(key) {\n            storage.removeItem(key);\n        },\n        setItem(key, value) {\n            try {\n                storage.setItem(key, value);\n                // silence errors by default (QuotaExceededError, SecurityError, etc.)\n            }\n            catch { }\n        },\n    };\n}\n//# sourceMappingURL=createStorage.js.map","const size = 256;\nlet index = size;\nlet buffer;\nexport function uid(length = 11) {\n    if (!buffer || index + length > size * 2) {\n        buffer = '';\n        index = 0;\n        for (let i = 0; i < size; i++) {\n            buffer += ((256 + Math.random() * 256) | 0).toString(16).substring(1);\n        }\n    }\n    return buffer.substring(index, index++ + length);\n}\n//# sourceMappingURL=uid.js.map","import { createStore as createMipd, } from 'mipd';\nimport { createClient, } from 'viem';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\nimport { createStore } from 'zustand/vanilla';\nimport { injected } from './connectors/injected.js';\nimport { createEmitter } from './createEmitter.js';\nimport { createStorage, getDefaultStorage, } from './createStorage.js';\nimport { ChainNotConfiguredError } from './errors/config.js';\nimport { uid } from './utils/uid.js';\nimport { version } from './version.js';\nexport function createConfig(parameters) {\n    const { multiInjectedProviderDiscovery = true, storage = createStorage({\n        storage: getDefaultStorage(),\n    }), syncConnectedChain = true, ssr = false, ...rest } = parameters;\n    /////////////////////////////////////////////////////////////////////////////////////////////////\n    // Set up connectors, clients, etc.\n    /////////////////////////////////////////////////////////////////////////////////////////////////\n    const mipd = typeof window !== 'undefined' && multiInjectedProviderDiscovery\n        ? createMipd()\n        : undefined;\n    const chains = createStore(() => rest.chains);\n    const connectors = createStore(() => {\n        const collection = [];\n        const rdnsSet = new Set();\n        for (const connectorFns of rest.connectors ?? []) {\n            const connector = setup(connectorFns);\n            collection.push(connector);\n            if (!ssr && connector.rdns) {\n                const rdnsValues = typeof connector.rdns === 'string' ? [connector.rdns] : connector.rdns;\n                for (const rdns of rdnsValues) {\n                    rdnsSet.add(rdns);\n                }\n            }\n        }\n        if (!ssr && mipd) {\n            const providers = mipd.getProviders();\n            for (const provider of providers) {\n                if (rdnsSet.has(provider.info.rdns))\n                    continue;\n                collection.push(setup(providerDetailToConnector(provider)));\n            }\n        }\n        return collection;\n    });\n    function setup(connectorFn) {\n        // Set up emitter with uid and add to connector so they are \"linked\" together.\n        const emitter = createEmitter(uid());\n        const connector = {\n            ...connectorFn({\n                emitter,\n                chains: chains.getState(),\n                storage,\n                transports: rest.transports,\n            }),\n            emitter,\n            uid: emitter.uid,\n        };\n        // Start listening for `connect` events on connector setup\n        // This allows connectors to \"connect\" themselves without user interaction (e.g. MetaMask's \"Manually connect to current site\")\n        emitter.on('connect', connect);\n        connector.setup?.();\n        return connector;\n    }\n    function providerDetailToConnector(providerDetail) {\n        const { info } = providerDetail;\n        const provider = providerDetail.provider;\n        return injected({ target: { ...info, id: info.rdns, provider } });\n    }\n    const clients = new Map();\n    function getClient(config = {}) {\n        const chainId = config.chainId ?? store.getState().chainId;\n        const chain = chains.getState().find((x) => x.id === chainId);\n        // chainId specified and not configured\n        if (config.chainId && !chain)\n            throw new ChainNotConfiguredError();\n        {\n            const client = clients.get(store.getState().chainId);\n            if (client && !chain)\n                return client;\n            if (!chain)\n                throw new ChainNotConfiguredError();\n        }\n        // If a memoized client exists for a chain id, use that.\n        {\n            const client = clients.get(chainId);\n            if (client)\n                return client;\n        }\n        let client;\n        if (rest.client)\n            client = rest.client({ chain });\n        else {\n            const chainId = chain.id;\n            const chainIds = chains.getState().map((x) => x.id);\n            // Grab all properties off `rest` and resolve for use in `createClient`\n            const properties = {};\n            const entries = Object.entries(rest);\n            for (const [key, value] of entries) {\n                if (key === 'chains' ||\n                    key === 'client' ||\n                    key === 'connectors' ||\n                    key === 'transports')\n                    continue;\n                if (typeof value === 'object') {\n                    // check if value is chainId-specific since some values can be objects\n                    // e.g. { batch: { multicall: { batchSize: 1024 } } }\n                    if (chainId in value)\n                        properties[key] = value[chainId];\n                    else {\n                        // check if value is chainId-specific, but does not have value for current chainId\n                        const hasChainSpecificValue = chainIds.some((x) => x in value);\n                        if (hasChainSpecificValue)\n                            continue;\n                        properties[key] = value;\n                    }\n                }\n                else\n                    properties[key] = value;\n            }\n            client = createClient({\n                ...properties,\n                chain,\n                batch: properties.batch ?? { multicall: true },\n                transport: (parameters) => rest.transports[chainId]({ ...parameters, connectors }),\n            });\n        }\n        clients.set(chainId, client);\n        return client;\n    }\n    /////////////////////////////////////////////////////////////////////////////////////////////////\n    // Create store\n    /////////////////////////////////////////////////////////////////////////////////////////////////\n    function getInitialState() {\n        return {\n            chainId: chains.getState()[0].id,\n            connections: new Map(),\n            current: null,\n            status: 'disconnected',\n        };\n    }\n    let currentVersion;\n    const prefix = '0.0.0-canary-';\n    if (version.startsWith(prefix))\n        currentVersion = Number.parseInt(version.replace(prefix, ''));\n    // use package major version to version store\n    else\n        currentVersion = Number.parseInt(version.split('.')[0] ?? '0');\n    const store = createStore(subscribeWithSelector(\n    // only use persist middleware if storage exists\n    storage\n        ? persist(getInitialState, {\n            migrate(persistedState, version) {\n                if (version === currentVersion)\n                    return persistedState;\n                const initialState = getInitialState();\n                const chainId = validatePersistedChainId(persistedState, initialState.chainId);\n                return { ...initialState, chainId };\n            },\n            name: 'store',\n            partialize(state) {\n                // Only persist \"critical\" store properties to preserve storage size.\n                return {\n                    connections: {\n                        __type: 'Map',\n                        value: Array.from(state.connections.entries()).map(([key, connection]) => {\n                            const { id, name, type, uid } = connection.connector;\n                            const connector = { id, name, type, uid };\n                            return [key, { ...connection, connector }];\n                        }),\n                    },\n                    chainId: state.chainId,\n                    current: state.current,\n                };\n            },\n            merge(persistedState, currentState) {\n                // `status` should not be persisted as it messes with reconnection\n                if (typeof persistedState === 'object' &&\n                    persistedState &&\n                    'status' in persistedState)\n                    delete persistedState.status;\n                // Make sure persisted `chainId` is valid\n                const chainId = validatePersistedChainId(persistedState, currentState.chainId);\n                return {\n                    ...currentState,\n                    ...persistedState,\n                    chainId,\n                };\n            },\n            skipHydration: ssr,\n            storage: storage,\n            version: currentVersion,\n        })\n        : getInitialState));\n    store.setState(getInitialState());\n    function validatePersistedChainId(persistedState, defaultChainId) {\n        return persistedState &&\n            typeof persistedState === 'object' &&\n            'chainId' in persistedState &&\n            typeof persistedState.chainId === 'number' &&\n            chains.getState().some((x) => x.id === persistedState.chainId)\n            ? persistedState.chainId\n            : defaultChainId;\n    }\n    /////////////////////////////////////////////////////////////////////////////////////////////////\n    // Subscribe to changes\n    /////////////////////////////////////////////////////////////////////////////////////////////////\n    // Update default chain when connector chain changes\n    if (syncConnectedChain)\n        store.subscribe(({ connections, current }) => current ? connections.get(current)?.chainId : undefined, (chainId) => {\n            // If chain is not configured, then don't switch over to it.\n            const isChainConfigured = chains\n                .getState()\n                .some((x) => x.id === chainId);\n            if (!isChainConfigured)\n                return;\n            return store.setState((x) => ({\n                ...x,\n                chainId: chainId ?? x.chainId,\n            }));\n        });\n    // EIP-6963 subscribe for new wallet providers\n    mipd?.subscribe((providerDetails) => {\n        const connectorIdSet = new Set();\n        const connectorRdnsSet = new Set();\n        for (const connector of connectors.getState()) {\n            connectorIdSet.add(connector.id);\n            if (connector.rdns) {\n                const rdnsValues = typeof connector.rdns === 'string' ? [connector.rdns] : connector.rdns;\n                for (const rdns of rdnsValues) {\n                    connectorRdnsSet.add(rdns);\n                }\n            }\n        }\n        const newConnectors = [];\n        for (const providerDetail of providerDetails) {\n            if (connectorRdnsSet.has(providerDetail.info.rdns))\n                continue;\n            const connector = setup(providerDetailToConnector(providerDetail));\n            if (connectorIdSet.has(connector.id))\n                continue;\n            newConnectors.push(connector);\n        }\n        if (storage && !store.persist.hasHydrated())\n            return;\n        connectors.setState((x) => [...x, ...newConnectors], true);\n    });\n    /////////////////////////////////////////////////////////////////////////////////////////////////\n    // Emitter listeners\n    /////////////////////////////////////////////////////////////////////////////////////////////////\n    function change(data) {\n        store.setState((x) => {\n            const connection = x.connections.get(data.uid);\n            if (!connection)\n                return x;\n            return {\n                ...x,\n                connections: new Map(x.connections).set(data.uid, {\n                    accounts: data.accounts ??\n                        connection.accounts,\n                    chainId: data.chainId ?? connection.chainId,\n                    connector: connection.connector,\n                }),\n            };\n        });\n    }\n    function connect(data) {\n        // Disable handling if reconnecting/connecting\n        if (store.getState().status === 'connecting' ||\n            store.getState().status === 'reconnecting')\n            return;\n        store.setState((x) => {\n            const connector = connectors.getState().find((x) => x.uid === data.uid);\n            if (!connector)\n                return x;\n            if (connector.emitter.listenerCount('connect'))\n                connector.emitter.off('connect', change);\n            if (!connector.emitter.listenerCount('change'))\n                connector.emitter.on('change', change);\n            if (!connector.emitter.listenerCount('disconnect'))\n                connector.emitter.on('disconnect', disconnect);\n            return {\n                ...x,\n                connections: new Map(x.connections).set(data.uid, {\n                    accounts: data.accounts,\n                    chainId: data.chainId,\n                    connector: connector,\n                }),\n                current: data.uid,\n                status: 'connected',\n            };\n        });\n    }\n    function disconnect(data) {\n        store.setState((x) => {\n            const connection = x.connections.get(data.uid);\n            if (connection) {\n                const connector = connection.connector;\n                if (connector.emitter.listenerCount('change'))\n                    connection.connector.emitter.off('change', change);\n                if (connector.emitter.listenerCount('disconnect'))\n                    connection.connector.emitter.off('disconnect', disconnect);\n                if (!connector.emitter.listenerCount('connect'))\n                    connection.connector.emitter.on('connect', connect);\n            }\n            x.connections.delete(data.uid);\n            if (x.connections.size === 0)\n                return {\n                    ...x,\n                    connections: new Map(),\n                    current: null,\n                    status: 'disconnected',\n                };\n            const nextConnection = x.connections.values().next().value;\n            return {\n                ...x,\n                connections: new Map(x.connections),\n                current: nextConnection.connector.uid,\n            };\n        });\n    }\n    return {\n        get chains() {\n            return chains.getState();\n        },\n        get connectors() {\n            return connectors.getState();\n        },\n        storage,\n        getClient,\n        get state() {\n            return store.getState();\n        },\n        setState(value) {\n            let newState;\n            if (typeof value === 'function')\n                newState = value(store.getState());\n            else\n                newState = value;\n            // Reset state if it got set to something not matching the base state\n            const initialState = getInitialState();\n            if (typeof newState !== 'object')\n                newState = initialState;\n            const isCorrupt = Object.keys(initialState).some((x) => !(x in newState));\n            if (isCorrupt)\n                newState = initialState;\n            store.setState(newState, true);\n        },\n        subscribe(selector, listener, options) {\n            return store.subscribe(selector, listener, options\n                ? {\n                    ...options,\n                    fireImmediately: options.emitImmediately,\n                    // Workaround cast since Zustand does not support `'exactOptionalPropertyTypes'`\n                }\n                : undefined);\n        },\n        _internal: {\n            mipd,\n            store,\n            ssr: Boolean(ssr),\n            syncConnectedChain,\n            transports: rest.transports,\n            chains: {\n                setState(value) {\n                    const nextChains = (typeof value === 'function' ? value(chains.getState()) : value);\n                    if (nextChains.length === 0)\n                        return;\n                    return chains.setState(nextChains, true);\n                },\n                subscribe(listener) {\n                    return chains.subscribe(listener);\n                },\n            },\n            connectors: {\n                providerDetailToConnector,\n                setup: setup,\n                setState(value) {\n                    return connectors.setState(typeof value === 'function' ? value(connectors.getState()) : value, true);\n                },\n                subscribe(listener) {\n                    return connectors.subscribe(listener);\n                },\n            },\n            events: { change, connect, disconnect },\n        },\n    };\n}\n//# sourceMappingURL=createConfig.js.map","import { reconnect } from './actions/reconnect.js';\nexport function hydrate(config, parameters) {\n    const { initialState, reconnectOnMount } = parameters;\n    if (initialState && !config._internal.store.persist.hasHydrated())\n        config.setState({\n            ...initialState,\n            chainId: config.chains.some((x) => x.id === initialState.chainId)\n                ? initialState.chainId\n                : config.chains[0].id,\n            connections: reconnectOnMount ? initialState.connections : new Map(),\n            status: reconnectOnMount ? 'reconnecting' : 'disconnected',\n        });\n    return {\n        async onMount() {\n            if (config._internal.ssr) {\n                await config._internal.store.persist.rehydrate();\n                if (config._internal.mipd) {\n                    config._internal.connectors.setState((connectors) => {\n                        const rdnsSet = new Set();\n                        for (const connector of connectors ?? []) {\n                            if (connector.rdns) {\n                                const rdnsValues = Array.isArray(connector.rdns)\n                                    ? connector.rdns\n                                    : [connector.rdns];\n                                for (const rdns of rdnsValues) {\n                                    rdnsSet.add(rdns);\n                                }\n                            }\n                        }\n                        const mipdConnectors = [];\n                        const providers = config._internal.mipd?.getProviders() ?? [];\n                        for (const provider of providers) {\n                            if (rdnsSet.has(provider.info.rdns))\n                                continue;\n                            const connectorFn = config._internal.connectors.providerDetailToConnector(provider);\n                            const connector = config._internal.connectors.setup(connectorFn);\n                            mipdConnectors.push(connector);\n                        }\n                        return [...connectors, ...mipdConnectors];\n                    });\n                }\n            }\n            if (reconnectOnMount)\n                reconnect(config);\n            else if (config.storage)\n                // Reset connections that may have been hydrated from storage.\n                config.setState((x) => ({\n                    ...x,\n                    connections: new Map(),\n                }));\n        },\n    };\n}\n//# sourceMappingURL=hydrate.js.map","export function extractRpcUrls(parameters) {\n    const { chain } = parameters;\n    const fallbackUrl = chain.rpcUrls.default.http[0];\n    if (!parameters.transports)\n        return [fallbackUrl];\n    const transport = parameters.transports?.[chain.id]?.({ chain });\n    const transports = transport?.value?.transports || [transport];\n    return transports.map(({ value }) => value?.url || fallbackUrl);\n}\n//# sourceMappingURL=extractRpcUrls.js.map","'use client';\nimport { hydrate } from '@wagmi/core';\nimport { useEffect, useRef } from 'react';\nexport function Hydrate(parameters) {\n    const { children, config, initialState, reconnectOnMount = true } = parameters;\n    const { onMount } = hydrate(config, {\n        initialState,\n        reconnectOnMount,\n    });\n    // Hydrate for non-SSR\n    if (!config._internal.ssr)\n        onMount();\n    // Hydrate for SSR\n    const active = useRef(true);\n    // biome-ignore lint/correctness/useExhaustiveDependencies: `queryKey` not required\n    useEffect(() => {\n        if (!active.current)\n            return;\n        if (!config._internal.ssr)\n            return;\n        onMount();\n        return () => {\n            active.current = false;\n        };\n    }, []);\n    return children;\n}\n//# sourceMappingURL=hydrate.js.map","'use client';\nimport { createContext, createElement } from 'react';\nimport { Hydrate } from './hydrate.js';\nexport const WagmiContext = createContext(undefined);\nexport function WagmiProvider(parameters) {\n    const { children, config } = parameters;\n    const props = { value: config };\n    return createElement(Hydrate, parameters, createElement(WagmiContext.Provider, props, children));\n}\n//# sourceMappingURL=context.js.map","export const version = '2.16.1';\n//# sourceMappingURL=version.js.map","import { version } from '../version.js';\nexport const getVersion = () => `wagmi@${version}`;\n//# sourceMappingURL=getVersion.js.map","import { BaseError as CoreError } from '@wagmi/core';\nimport { getVersion } from '../utils/getVersion.js';\nexport class BaseError extends CoreError {\n    constructor() {\n        super(...arguments);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'WagmiError'\n        });\n    }\n    get docsBaseUrl() {\n        return 'https://wagmi.sh/react';\n    }\n    get version() {\n        return getVersion();\n    }\n}\n//# sourceMappingURL=base.js.map","import { BaseError } from './base.js';\nexport class WagmiProviderNotFoundError extends BaseError {\n    constructor() {\n        super('`useConfig` must be used within `WagmiProvider`.', {\n            docsPath: '/api/WagmiProvider',\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'WagmiProviderNotFoundError'\n        });\n    }\n}\n//# sourceMappingURL=context.js.map","'use client';\nimport { useContext } from 'react';\nimport { WagmiContext } from '../context.js';\nimport { WagmiProviderNotFoundError } from '../errors/context.js';\n/** https://wagmi.sh/react/api/hooks/useConfig */\nexport function useConfig(parameters = {}) {\n    // biome-ignore lint/correctness/useHookAtTopLevel: false alarm\n    const config = parameters.config ?? useContext(WagmiContext);\n    if (!config)\n        throw new WagmiProviderNotFoundError();\n    return config;\n}\n//# sourceMappingURL=useConfig.js.map","/**\n * @internal\n * We don't expose this because as far as consumers know, you can't chainge (lol) `config.chains` at runtime.\n * Setting `config.chains` via `config._internal.chains.setState(...)` is an extremely advanced use case that's not worth documenting or supporting in the public API at this time.\n */\nexport function watchChains(config, parameters) {\n    const { onChange } = parameters;\n    return config._internal.chains.subscribe((chains, prevChains) => {\n        onChange(chains, prevChains);\n    });\n}\n//# sourceMappingURL=watchChains.js.map","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n  return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n  useState = React.useState,\n  useEffect = React.useEffect,\n  useLayoutEffect = React.useLayoutEffect,\n  useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n  var value = getSnapshot(),\n    _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n    inst = _useState[0].inst,\n    forceUpdate = _useState[1];\n  useLayoutEffect(\n    function () {\n      inst.value = value;\n      inst.getSnapshot = getSnapshot;\n      checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n    },\n    [subscribe, value, getSnapshot]\n  );\n  useEffect(\n    function () {\n      checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n      return subscribe(function () {\n        checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n      });\n    },\n    [subscribe]\n  );\n  useDebugValue(value);\n  return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n  var latestGetSnapshot = inst.getSnapshot;\n  inst = inst.value;\n  try {\n    var nextValue = latestGetSnapshot();\n    return !objectIs(inst, nextValue);\n  } catch (error) {\n    return !0;\n  }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n  return getSnapshot();\n}\nvar shim =\n  \"undefined\" === typeof window ||\n  \"undefined\" === typeof window.document ||\n  \"undefined\" === typeof window.document.createElement\n    ? useSyncExternalStore$1\n    : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n  void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n  module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\"),\n  shim = require(\"use-sync-external-store/shim\");\nfunction is(x, y) {\n  return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n  useSyncExternalStore = shim.useSyncExternalStore,\n  useRef = React.useRef,\n  useEffect = React.useEffect,\n  useMemo = React.useMemo,\n  useDebugValue = React.useDebugValue;\nexports.useSyncExternalStoreWithSelector = function (\n  subscribe,\n  getSnapshot,\n  getServerSnapshot,\n  selector,\n  isEqual\n) {\n  var instRef = useRef(null);\n  if (null === instRef.current) {\n    var inst = { hasValue: !1, value: null };\n    instRef.current = inst;\n  } else inst = instRef.current;\n  instRef = useMemo(\n    function () {\n      function memoizedSelector(nextSnapshot) {\n        if (!hasMemo) {\n          hasMemo = !0;\n          memoizedSnapshot = nextSnapshot;\n          nextSnapshot = selector(nextSnapshot);\n          if (void 0 !== isEqual && inst.hasValue) {\n            var currentSelection = inst.value;\n            if (isEqual(currentSelection, nextSnapshot))\n              return (memoizedSelection = currentSelection);\n          }\n          return (memoizedSelection = nextSnapshot);\n        }\n        currentSelection = memoizedSelection;\n        if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;\n        var nextSelection = selector(nextSnapshot);\n        if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n          return (memoizedSnapshot = nextSnapshot), currentSelection;\n        memoizedSnapshot = nextSnapshot;\n        return (memoizedSelection = nextSelection);\n      }\n      var hasMemo = !1,\n        memoizedSnapshot,\n        memoizedSelection,\n        maybeGetServerSnapshot =\n          void 0 === getServerSnapshot ? null : getServerSnapshot;\n      return [\n        function () {\n          return memoizedSelector(getSnapshot());\n        },\n        null === maybeGetServerSnapshot\n          ? void 0\n          : function () {\n              return memoizedSelector(maybeGetServerSnapshot());\n            }\n      ];\n    },\n    [getSnapshot, getServerSnapshot, selector, isEqual]\n  );\n  var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n  useEffect(\n    function () {\n      inst.hasValue = !0;\n      inst.value = value;\n    },\n    [value]\n  );\n  useDebugValue(value);\n  return value;\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.js');\n} else {\n  module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","'use client';\nimport { deepEqual } from '@wagmi/core/internal';\nimport { useMemo, useRef } from 'react';\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector.js';\nconst isPlainObject = (obj) => typeof obj === 'object' && !Array.isArray(obj);\nexport function useSyncExternalStoreWithTracked(subscribe, getSnapshot, getServerSnapshot = getSnapshot, isEqual = deepEqual) {\n    const trackedKeys = useRef([]);\n    const result = useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, (x) => x, (a, b) => {\n        if (isPlainObject(a) && isPlainObject(b) && trackedKeys.current.length) {\n            for (const key of trackedKeys.current) {\n                const equal = isEqual(a[key], b[key]);\n                if (!equal)\n                    return false;\n            }\n            return true;\n        }\n        return isEqual(a, b);\n    });\n    return useMemo(() => {\n        if (isPlainObject(result)) {\n            const trackedResult = { ...result };\n            let properties = {};\n            for (const [key, value] of Object.entries(trackedResult)) {\n                properties = {\n                    ...properties,\n                    [key]: {\n                        configurable: false,\n                        enumerable: true,\n                        get: () => {\n                            if (!trackedKeys.current.includes(key)) {\n                                trackedKeys.current.push(key);\n                            }\n                            return value;\n                        },\n                    },\n                };\n            }\n            Object.defineProperties(trackedResult, properties);\n            return trackedResult;\n        }\n        return result;\n    }, [result]);\n}\n//# sourceMappingURL=useSyncExternalStoreWithTracked.js.map","'use client';\nimport { getAccount, watchAccount, } from '@wagmi/core';\nimport { useConfig } from './useConfig.js';\nimport { useSyncExternalStoreWithTracked } from './useSyncExternalStoreWithTracked.js';\n/** https://wagmi.sh/react/api/hooks/useAccount */\nexport function useAccount(parameters = {}) {\n    const config = useConfig(parameters);\n    return useSyncExternalStoreWithTracked((onChange) => watchAccount(config, { onChange }), () => getAccount(config));\n}\n//# sourceMappingURL=useAccount.js.map","// src/subscribable.ts\nvar Subscribable = class {\n  constructor() {\n    this.listeners = /* @__PURE__ */ new Set();\n    this.subscribe = this.subscribe.bind(this);\n  }\n  subscribe(listener) {\n    this.listeners.add(listener);\n    this.onSubscribe();\n    return () => {\n      this.listeners.delete(listener);\n      this.onUnsubscribe();\n    };\n  }\n  hasListeners() {\n    return this.listeners.size > 0;\n  }\n  onSubscribe() {\n  }\n  onUnsubscribe() {\n  }\n};\nexport {\n  Subscribable\n};\n//# sourceMappingURL=subscribable.js.map","// src/utils.ts\nvar isServer = typeof window === \"undefined\" || \"Deno\" in globalThis;\nfunction noop() {\n}\nfunction functionalUpdate(updater, input) {\n  return typeof updater === \"function\" ? updater(input) : updater;\n}\nfunction isValidTimeout(value) {\n  return typeof value === \"number\" && value >= 0 && value !== Infinity;\n}\nfunction timeUntilStale(updatedAt, staleTime) {\n  return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nfunction resolveStaleTime(staleTime, query) {\n  return typeof staleTime === \"function\" ? staleTime(query) : staleTime;\n}\nfunction resolveEnabled(enabled, query) {\n  return typeof enabled === \"function\" ? enabled(query) : enabled;\n}\nfunction matchQuery(filters, query) {\n  const {\n    type = \"all\",\n    exact,\n    fetchStatus,\n    predicate,\n    queryKey,\n    stale\n  } = filters;\n  if (queryKey) {\n    if (exact) {\n      if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n        return false;\n      }\n    } else if (!partialMatchKey(query.queryKey, queryKey)) {\n      return false;\n    }\n  }\n  if (type !== \"all\") {\n    const isActive = query.isActive();\n    if (type === \"active\" && !isActive) {\n      return false;\n    }\n    if (type === \"inactive\" && isActive) {\n      return false;\n    }\n  }\n  if (typeof stale === \"boolean\" && query.isStale() !== stale) {\n    return false;\n  }\n  if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n    return false;\n  }\n  if (predicate && !predicate(query)) {\n    return false;\n  }\n  return true;\n}\nfunction matchMutation(filters, mutation) {\n  const { exact, status, predicate, mutationKey } = filters;\n  if (mutationKey) {\n    if (!mutation.options.mutationKey) {\n      return false;\n    }\n    if (exact) {\n      if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n        return false;\n      }\n    } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n      return false;\n    }\n  }\n  if (status && mutation.state.status !== status) {\n    return false;\n  }\n  if (predicate && !predicate(mutation)) {\n    return false;\n  }\n  return true;\n}\nfunction hashQueryKeyByOptions(queryKey, options) {\n  const hashFn = options?.queryKeyHashFn || hashKey;\n  return hashFn(queryKey);\n}\nfunction hashKey(queryKey) {\n  return JSON.stringify(\n    queryKey,\n    (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {\n      result[key] = val[key];\n      return result;\n    }, {}) : val\n  );\n}\nfunction partialMatchKey(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (typeof a !== typeof b) {\n    return false;\n  }\n  if (a && b && typeof a === \"object\" && typeof b === \"object\") {\n    return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]));\n  }\n  return false;\n}\nfunction replaceEqualDeep(a, b) {\n  if (a === b) {\n    return a;\n  }\n  const array = isPlainArray(a) && isPlainArray(b);\n  if (array || isPlainObject(a) && isPlainObject(b)) {\n    const aItems = array ? a : Object.keys(a);\n    const aSize = aItems.length;\n    const bItems = array ? b : Object.keys(b);\n    const bSize = bItems.length;\n    const copy = array ? [] : {};\n    const aItemsSet = new Set(aItems);\n    let equalItems = 0;\n    for (let i = 0; i < bSize; i++) {\n      const key = array ? i : bItems[i];\n      if ((!array && aItemsSet.has(key) || array) && a[key] === void 0 && b[key] === void 0) {\n        copy[key] = void 0;\n        equalItems++;\n      } else {\n        copy[key] = replaceEqualDeep(a[key], b[key]);\n        if (copy[key] === a[key] && a[key] !== void 0) {\n          equalItems++;\n        }\n      }\n    }\n    return aSize === bSize && equalItems === aSize ? a : copy;\n  }\n  return b;\n}\nfunction shallowEqualObjects(a, b) {\n  if (!b || Object.keys(a).length !== Object.keys(b).length) {\n    return false;\n  }\n  for (const key in a) {\n    if (a[key] !== b[key]) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction isPlainArray(value) {\n  return Array.isArray(value) && value.length === Object.keys(value).length;\n}\nfunction isPlainObject(o) {\n  if (!hasObjectPrototype(o)) {\n    return false;\n  }\n  const ctor = o.constructor;\n  if (ctor === void 0) {\n    return true;\n  }\n  const prot = ctor.prototype;\n  if (!hasObjectPrototype(prot)) {\n    return false;\n  }\n  if (!prot.hasOwnProperty(\"isPrototypeOf\")) {\n    return false;\n  }\n  if (Object.getPrototypeOf(o) !== Object.prototype) {\n    return false;\n  }\n  return true;\n}\nfunction hasObjectPrototype(o) {\n  return Object.prototype.toString.call(o) === \"[object Object]\";\n}\nfunction sleep(timeout) {\n  return new Promise((resolve) => {\n    setTimeout(resolve, timeout);\n  });\n}\nfunction replaceData(prevData, data, options) {\n  if (typeof options.structuralSharing === \"function\") {\n    return options.structuralSharing(prevData, data);\n  } else if (options.structuralSharing !== false) {\n    if (process.env.NODE_ENV !== \"production\") {\n      try {\n        return replaceEqualDeep(prevData, data);\n      } catch (error) {\n        console.error(\n          `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`\n        );\n        throw error;\n      }\n    }\n    return replaceEqualDeep(prevData, data);\n  }\n  return data;\n}\nfunction keepPreviousData(previousData) {\n  return previousData;\n}\nfunction addToEnd(items, item, max = 0) {\n  const newItems = [...items, item];\n  return max && newItems.length > max ? newItems.slice(1) : newItems;\n}\nfunction addToStart(items, item, max = 0) {\n  const newItems = [item, ...items];\n  return max && newItems.length > max ? newItems.slice(0, -1) : newItems;\n}\nvar skipToken = Symbol();\nfunction ensureQueryFn(options, fetchOptions) {\n  if (process.env.NODE_ENV !== \"production\") {\n    if (options.queryFn === skipToken) {\n      console.error(\n        `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`\n      );\n    }\n  }\n  if (!options.queryFn && fetchOptions?.initialPromise) {\n    return () => fetchOptions.initialPromise;\n  }\n  if (!options.queryFn || options.queryFn === skipToken) {\n    return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`));\n  }\n  return options.queryFn;\n}\nfunction shouldThrowError(throwOnError, params) {\n  if (typeof throwOnError === \"function\") {\n    return throwOnError(...params);\n  }\n  return !!throwOnError;\n}\nexport {\n  addToEnd,\n  addToStart,\n  ensureQueryFn,\n  functionalUpdate,\n  hashKey,\n  hashQueryKeyByOptions,\n  isPlainArray,\n  isPlainObject,\n  isServer,\n  isValidTimeout,\n  keepPreviousData,\n  matchMutation,\n  matchQuery,\n  noop,\n  partialMatchKey,\n  replaceData,\n  replaceEqualDeep,\n  resolveEnabled,\n  resolveStaleTime,\n  shallowEqualObjects,\n  shouldThrowError,\n  skipToken,\n  sleep,\n  timeUntilStale\n};\n//# sourceMappingURL=utils.js.map","// src/focusManager.ts\nimport { Subscribable } from \"./subscribable.js\";\nimport { isServer } from \"./utils.js\";\nvar FocusManager = class extends Subscribable {\n  #focused;\n  #cleanup;\n  #setup;\n  constructor() {\n    super();\n    this.#setup = (onFocus) => {\n      if (!isServer && window.addEventListener) {\n        const listener = () => onFocus();\n        window.addEventListener(\"visibilitychange\", listener, false);\n        return () => {\n          window.removeEventListener(\"visibilitychange\", listener);\n        };\n      }\n      return;\n    };\n  }\n  onSubscribe() {\n    if (!this.#cleanup) {\n      this.setEventListener(this.#setup);\n    }\n  }\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      this.#cleanup?.();\n      this.#cleanup = void 0;\n    }\n  }\n  setEventListener(setup) {\n    this.#setup = setup;\n    this.#cleanup?.();\n    this.#cleanup = setup((focused) => {\n      if (typeof focused === \"boolean\") {\n        this.setFocused(focused);\n      } else {\n        this.onFocus();\n      }\n    });\n  }\n  setFocused(focused) {\n    const changed = this.#focused !== focused;\n    if (changed) {\n      this.#focused = focused;\n      this.onFocus();\n    }\n  }\n  onFocus() {\n    const isFocused = this.isFocused();\n    this.listeners.forEach((listener) => {\n      listener(isFocused);\n    });\n  }\n  isFocused() {\n    if (typeof this.#focused === \"boolean\") {\n      return this.#focused;\n    }\n    return globalThis.document?.visibilityState !== \"hidden\";\n  }\n};\nvar focusManager = new FocusManager();\nexport {\n  FocusManager,\n  focusManager\n};\n//# sourceMappingURL=focusManager.js.map","// src/onlineManager.ts\nimport { Subscribable } from \"./subscribable.js\";\nimport { isServer } from \"./utils.js\";\nvar OnlineManager = class extends Subscribable {\n  #online = true;\n  #cleanup;\n  #setup;\n  constructor() {\n    super();\n    this.#setup = (onOnline) => {\n      if (!isServer && window.addEventListener) {\n        const onlineListener = () => onOnline(true);\n        const offlineListener = () => onOnline(false);\n        window.addEventListener(\"online\", onlineListener, false);\n        window.addEventListener(\"offline\", offlineListener, false);\n        return () => {\n          window.removeEventListener(\"online\", onlineListener);\n          window.removeEventListener(\"offline\", offlineListener);\n        };\n      }\n      return;\n    };\n  }\n  onSubscribe() {\n    if (!this.#cleanup) {\n      this.setEventListener(this.#setup);\n    }\n  }\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      this.#cleanup?.();\n      this.#cleanup = void 0;\n    }\n  }\n  setEventListener(setup) {\n    this.#setup = setup;\n    this.#cleanup?.();\n    this.#cleanup = setup(this.setOnline.bind(this));\n  }\n  setOnline(online) {\n    const changed = this.#online !== online;\n    if (changed) {\n      this.#online = online;\n      this.listeners.forEach((listener) => {\n        listener(online);\n      });\n    }\n  }\n  isOnline() {\n    return this.#online;\n  }\n};\nvar onlineManager = new OnlineManager();\nexport {\n  OnlineManager,\n  onlineManager\n};\n//# sourceMappingURL=onlineManager.js.map","// src/thenable.ts\nimport { noop } from \"./utils.js\";\nfunction pendingThenable() {\n  let resolve;\n  let reject;\n  const thenable = new Promise((_resolve, _reject) => {\n    resolve = _resolve;\n    reject = _reject;\n  });\n  thenable.status = \"pending\";\n  thenable.catch(() => {\n  });\n  function finalize(data) {\n    Object.assign(thenable, data);\n    delete thenable.resolve;\n    delete thenable.reject;\n  }\n  thenable.resolve = (value) => {\n    finalize({\n      status: \"fulfilled\",\n      value\n    });\n    resolve(value);\n  };\n  thenable.reject = (reason) => {\n    finalize({\n      status: \"rejected\",\n      reason\n    });\n    reject(reason);\n  };\n  return thenable;\n}\nfunction tryResolveSync(promise) {\n  let data;\n  promise.then((result) => {\n    data = result;\n    return result;\n  }, noop)?.catch(noop);\n  if (data !== void 0) {\n    return { data };\n  }\n  return void 0;\n}\nexport {\n  pendingThenable,\n  tryResolveSync\n};\n//# sourceMappingURL=thenable.js.map","// src/retryer.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport { isServer, sleep } from \"./utils.js\";\nfunction defaultRetryDelay(failureCount) {\n  return Math.min(1e3 * 2 ** failureCount, 3e4);\n}\nfunction canFetch(networkMode) {\n  return (networkMode ?? \"online\") === \"online\" ? onlineManager.isOnline() : true;\n}\nvar CancelledError = class extends Error {\n  constructor(options) {\n    super(\"CancelledError\");\n    this.revert = options?.revert;\n    this.silent = options?.silent;\n  }\n};\nfunction isCancelledError(value) {\n  return value instanceof CancelledError;\n}\nfunction createRetryer(config) {\n  let isRetryCancelled = false;\n  let failureCount = 0;\n  let isResolved = false;\n  let continueFn;\n  const thenable = pendingThenable();\n  const cancel = (cancelOptions) => {\n    if (!isResolved) {\n      reject(new CancelledError(cancelOptions));\n      config.abort?.();\n    }\n  };\n  const cancelRetry = () => {\n    isRetryCancelled = true;\n  };\n  const continueRetry = () => {\n    isRetryCancelled = false;\n  };\n  const canContinue = () => focusManager.isFocused() && (config.networkMode === \"always\" || onlineManager.isOnline()) && config.canRun();\n  const canStart = () => canFetch(config.networkMode) && config.canRun();\n  const resolve = (value) => {\n    if (!isResolved) {\n      isResolved = true;\n      config.onSuccess?.(value);\n      continueFn?.();\n      thenable.resolve(value);\n    }\n  };\n  const reject = (value) => {\n    if (!isResolved) {\n      isResolved = true;\n      config.onError?.(value);\n      continueFn?.();\n      thenable.reject(value);\n    }\n  };\n  const pause = () => {\n    return new Promise((continueResolve) => {\n      continueFn = (value) => {\n        if (isResolved || canContinue()) {\n          continueResolve(value);\n        }\n      };\n      config.onPause?.();\n    }).then(() => {\n      continueFn = void 0;\n      if (!isResolved) {\n        config.onContinue?.();\n      }\n    });\n  };\n  const run = () => {\n    if (isResolved) {\n      return;\n    }\n    let promiseOrValue;\n    const initialPromise = failureCount === 0 ? config.initialPromise : void 0;\n    try {\n      promiseOrValue = initialPromise ?? config.fn();\n    } catch (error) {\n      promiseOrValue = Promise.reject(error);\n    }\n    Promise.resolve(promiseOrValue).then(resolve).catch((error) => {\n      if (isResolved) {\n        return;\n      }\n      const retry = config.retry ?? (isServer ? 0 : 3);\n      const retryDelay = config.retryDelay ?? defaultRetryDelay;\n      const delay = typeof retryDelay === \"function\" ? retryDelay(failureCount, error) : retryDelay;\n      const shouldRetry = retry === true || typeof retry === \"number\" && failureCount < retry || typeof retry === \"function\" && retry(failureCount, error);\n      if (isRetryCancelled || !shouldRetry) {\n        reject(error);\n        return;\n      }\n      failureCount++;\n      config.onFail?.(failureCount, error);\n      sleep(delay).then(() => {\n        return canContinue() ? void 0 : pause();\n      }).then(() => {\n        if (isRetryCancelled) {\n          reject(error);\n        } else {\n          run();\n        }\n      });\n    });\n  };\n  return {\n    promise: thenable,\n    cancel,\n    continue: () => {\n      continueFn?.();\n      return thenable;\n    },\n    cancelRetry,\n    continueRetry,\n    canStart,\n    start: () => {\n      if (canStart()) {\n        run();\n      } else {\n        pause().then(run);\n      }\n      return thenable;\n    }\n  };\n}\nexport {\n  CancelledError,\n  canFetch,\n  createRetryer,\n  isCancelledError\n};\n//# sourceMappingURL=retryer.js.map","// src/notifyManager.ts\nvar defaultScheduler = (cb) => setTimeout(cb, 0);\nfunction createNotifyManager() {\n  let queue = [];\n  let transactions = 0;\n  let notifyFn = (callback) => {\n    callback();\n  };\n  let batchNotifyFn = (callback) => {\n    callback();\n  };\n  let scheduleFn = defaultScheduler;\n  const schedule = (callback) => {\n    if (transactions) {\n      queue.push(callback);\n    } else {\n      scheduleFn(() => {\n        notifyFn(callback);\n      });\n    }\n  };\n  const flush = () => {\n    const originalQueue = queue;\n    queue = [];\n    if (originalQueue.length) {\n      scheduleFn(() => {\n        batchNotifyFn(() => {\n          originalQueue.forEach((callback) => {\n            notifyFn(callback);\n          });\n        });\n      });\n    }\n  };\n  return {\n    batch: (callback) => {\n      let result;\n      transactions++;\n      try {\n        result = callback();\n      } finally {\n        transactions--;\n        if (!transactions) {\n          flush();\n        }\n      }\n      return result;\n    },\n    /**\n     * All calls to the wrapped function will be batched.\n     */\n    batchCalls: (callback) => {\n      return (...args) => {\n        schedule(() => {\n          callback(...args);\n        });\n      };\n    },\n    schedule,\n    /**\n     * Use this method to set a custom notify function.\n     * This can be used to for example wrap notifications with `React.act` while running tests.\n     */\n    setNotifyFunction: (fn) => {\n      notifyFn = fn;\n    },\n    /**\n     * Use this method to set a custom function to batch notifications together into a single tick.\n     * By default React Query will use the batch function provided by ReactDOM or React Native.\n     */\n    setBatchNotifyFunction: (fn) => {\n      batchNotifyFn = fn;\n    },\n    setScheduler: (fn) => {\n      scheduleFn = fn;\n    }\n  };\n}\nvar notifyManager = createNotifyManager();\nexport {\n  createNotifyManager,\n  defaultScheduler,\n  notifyManager\n};\n//# sourceMappingURL=notifyManager.js.map","// src/removable.ts\nimport { isServer, isValidTimeout } from \"./utils.js\";\nvar Removable = class {\n  #gcTimeout;\n  destroy() {\n    this.clearGcTimeout();\n  }\n  scheduleGc() {\n    this.clearGcTimeout();\n    if (isValidTimeout(this.gcTime)) {\n      this.#gcTimeout = setTimeout(() => {\n        this.optionalRemove();\n      }, this.gcTime);\n    }\n  }\n  updateGcTime(newGcTime) {\n    this.gcTime = Math.max(\n      this.gcTime || 0,\n      newGcTime ?? (isServer ? Infinity : 5 * 60 * 1e3)\n    );\n  }\n  clearGcTimeout() {\n    if (this.#gcTimeout) {\n      clearTimeout(this.#gcTimeout);\n      this.#gcTimeout = void 0;\n    }\n  }\n};\nexport {\n  Removable\n};\n//# sourceMappingURL=removable.js.map","// src/query.ts\nimport {\n  ensureQueryFn,\n  noop,\n  replaceData,\n  resolveEnabled,\n  resolveStaleTime,\n  skipToken,\n  timeUntilStale\n} from \"./utils.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { canFetch, createRetryer, isCancelledError } from \"./retryer.js\";\nimport { Removable } from \"./removable.js\";\nvar Query = class extends Removable {\n  #initialState;\n  #revertState;\n  #cache;\n  #client;\n  #retryer;\n  #defaultOptions;\n  #abortSignalConsumed;\n  constructor(config) {\n    super();\n    this.#abortSignalConsumed = false;\n    this.#defaultOptions = config.defaultOptions;\n    this.setOptions(config.options);\n    this.observers = [];\n    this.#client = config.client;\n    this.#cache = this.#client.getQueryCache();\n    this.queryKey = config.queryKey;\n    this.queryHash = config.queryHash;\n    this.#initialState = getDefaultState(this.options);\n    this.state = config.state ?? this.#initialState;\n    this.scheduleGc();\n  }\n  get meta() {\n    return this.options.meta;\n  }\n  get promise() {\n    return this.#retryer?.promise;\n  }\n  setOptions(options) {\n    this.options = { ...this.#defaultOptions, ...options };\n    this.updateGcTime(this.options.gcTime);\n  }\n  optionalRemove() {\n    if (!this.observers.length && this.state.fetchStatus === \"idle\") {\n      this.#cache.remove(this);\n    }\n  }\n  setData(newData, options) {\n    const data = replaceData(this.state.data, newData, this.options);\n    this.#dispatch({\n      data,\n      type: \"success\",\n      dataUpdatedAt: options?.updatedAt,\n      manual: options?.manual\n    });\n    return data;\n  }\n  setState(state, setStateOptions) {\n    this.#dispatch({ type: \"setState\", state, setStateOptions });\n  }\n  cancel(options) {\n    const promise = this.#retryer?.promise;\n    this.#retryer?.cancel(options);\n    return promise ? promise.then(noop).catch(noop) : Promise.resolve();\n  }\n  destroy() {\n    super.destroy();\n    this.cancel({ silent: true });\n  }\n  reset() {\n    this.destroy();\n    this.setState(this.#initialState);\n  }\n  isActive() {\n    return this.observers.some(\n      (observer) => resolveEnabled(observer.options.enabled, this) !== false\n    );\n  }\n  isDisabled() {\n    if (this.getObserversCount() > 0) {\n      return !this.isActive();\n    }\n    return this.options.queryFn === skipToken || this.state.dataUpdateCount + this.state.errorUpdateCount === 0;\n  }\n  isStatic() {\n    if (this.getObserversCount() > 0) {\n      return this.observers.some(\n        (observer) => resolveStaleTime(observer.options.staleTime, this) === \"static\"\n      );\n    }\n    return false;\n  }\n  isStale() {\n    if (this.getObserversCount() > 0) {\n      return this.observers.some(\n        (observer) => observer.getCurrentResult().isStale\n      );\n    }\n    return this.state.data === void 0 || this.state.isInvalidated;\n  }\n  isStaleByTime(staleTime = 0) {\n    if (this.state.data === void 0) {\n      return true;\n    }\n    if (staleTime === \"static\") {\n      return false;\n    }\n    if (this.state.isInvalidated) {\n      return true;\n    }\n    return !timeUntilStale(this.state.dataUpdatedAt, staleTime);\n  }\n  onFocus() {\n    const observer = this.observers.find((x) => x.shouldFetchOnWindowFocus());\n    observer?.refetch({ cancelRefetch: false });\n    this.#retryer?.continue();\n  }\n  onOnline() {\n    const observer = this.observers.find((x) => x.shouldFetchOnReconnect());\n    observer?.refetch({ cancelRefetch: false });\n    this.#retryer?.continue();\n  }\n  addObserver(observer) {\n    if (!this.observers.includes(observer)) {\n      this.observers.push(observer);\n      this.clearGcTimeout();\n      this.#cache.notify({ type: \"observerAdded\", query: this, observer });\n    }\n  }\n  removeObserver(observer) {\n    if (this.observers.includes(observer)) {\n      this.observers = this.observers.filter((x) => x !== observer);\n      if (!this.observers.length) {\n        if (this.#retryer) {\n          if (this.#abortSignalConsumed) {\n            this.#retryer.cancel({ revert: true });\n          } else {\n            this.#retryer.cancelRetry();\n          }\n        }\n        this.scheduleGc();\n      }\n      this.#cache.notify({ type: \"observerRemoved\", query: this, observer });\n    }\n  }\n  getObserversCount() {\n    return this.observers.length;\n  }\n  invalidate() {\n    if (!this.state.isInvalidated) {\n      this.#dispatch({ type: \"invalidate\" });\n    }\n  }\n  fetch(options, fetchOptions) {\n    if (this.state.fetchStatus !== \"idle\") {\n      if (this.state.data !== void 0 && fetchOptions?.cancelRefetch) {\n        this.cancel({ silent: true });\n      } else if (this.#retryer) {\n        this.#retryer.continueRetry();\n        return this.#retryer.promise;\n      }\n    }\n    if (options) {\n      this.setOptions(options);\n    }\n    if (!this.options.queryFn) {\n      const observer = this.observers.find((x) => x.options.queryFn);\n      if (observer) {\n        this.setOptions(observer.options);\n      }\n    }\n    if (process.env.NODE_ENV !== \"production\") {\n      if (!Array.isArray(this.options.queryKey)) {\n        console.error(\n          `As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`\n        );\n      }\n    }\n    const abortController = new AbortController();\n    const addSignalProperty = (object) => {\n      Object.defineProperty(object, \"signal\", {\n        enumerable: true,\n        get: () => {\n          this.#abortSignalConsumed = true;\n          return abortController.signal;\n        }\n      });\n    };\n    const fetchFn = () => {\n      const queryFn = ensureQueryFn(this.options, fetchOptions);\n      const createQueryFnContext = () => {\n        const queryFnContext2 = {\n          client: this.#client,\n          queryKey: this.queryKey,\n          meta: this.meta\n        };\n        addSignalProperty(queryFnContext2);\n        return queryFnContext2;\n      };\n      const queryFnContext = createQueryFnContext();\n      this.#abortSignalConsumed = false;\n      if (this.options.persister) {\n        return this.options.persister(\n          queryFn,\n          queryFnContext,\n          this\n        );\n      }\n      return queryFn(queryFnContext);\n    };\n    const createFetchContext = () => {\n      const context2 = {\n        fetchOptions,\n        options: this.options,\n        queryKey: this.queryKey,\n        client: this.#client,\n        state: this.state,\n        fetchFn\n      };\n      addSignalProperty(context2);\n      return context2;\n    };\n    const context = createFetchContext();\n    this.options.behavior?.onFetch(context, this);\n    this.#revertState = this.state;\n    if (this.state.fetchStatus === \"idle\" || this.state.fetchMeta !== context.fetchOptions?.meta) {\n      this.#dispatch({ type: \"fetch\", meta: context.fetchOptions?.meta });\n    }\n    const onError = (error) => {\n      if (!(isCancelledError(error) && error.silent)) {\n        this.#dispatch({\n          type: \"error\",\n          error\n        });\n      }\n      if (!isCancelledError(error)) {\n        this.#cache.config.onError?.(\n          error,\n          this\n        );\n        this.#cache.config.onSettled?.(\n          this.state.data,\n          error,\n          this\n        );\n      }\n      this.scheduleGc();\n    };\n    this.#retryer = createRetryer({\n      initialPromise: fetchOptions?.initialPromise,\n      fn: context.fetchFn,\n      abort: abortController.abort.bind(abortController),\n      onSuccess: (data) => {\n        if (data === void 0) {\n          if (process.env.NODE_ENV !== \"production\") {\n            console.error(\n              `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${this.queryHash}`\n            );\n          }\n          onError(new Error(`${this.queryHash} data is undefined`));\n          return;\n        }\n        try {\n          this.setData(data);\n        } catch (error) {\n          onError(error);\n          return;\n        }\n        this.#cache.config.onSuccess?.(data, this);\n        this.#cache.config.onSettled?.(\n          data,\n          this.state.error,\n          this\n        );\n        this.scheduleGc();\n      },\n      onError,\n      onFail: (failureCount, error) => {\n        this.#dispatch({ type: \"failed\", failureCount, error });\n      },\n      onPause: () => {\n        this.#dispatch({ type: \"pause\" });\n      },\n      onContinue: () => {\n        this.#dispatch({ type: \"continue\" });\n      },\n      retry: context.options.retry,\n      retryDelay: context.options.retryDelay,\n      networkMode: context.options.networkMode,\n      canRun: () => true\n    });\n    return this.#retryer.start();\n  }\n  #dispatch(action) {\n    const reducer = (state) => {\n      switch (action.type) {\n        case \"failed\":\n          return {\n            ...state,\n            fetchFailureCount: action.failureCount,\n            fetchFailureReason: action.error\n          };\n        case \"pause\":\n          return {\n            ...state,\n            fetchStatus: \"paused\"\n          };\n        case \"continue\":\n          return {\n            ...state,\n            fetchStatus: \"fetching\"\n          };\n        case \"fetch\":\n          return {\n            ...state,\n            ...fetchState(state.data, this.options),\n            fetchMeta: action.meta ?? null\n          };\n        case \"success\":\n          this.#revertState = void 0;\n          return {\n            ...state,\n            data: action.data,\n            dataUpdateCount: state.dataUpdateCount + 1,\n            dataUpdatedAt: action.dataUpdatedAt ?? Date.now(),\n            error: null,\n            isInvalidated: false,\n            status: \"success\",\n            ...!action.manual && {\n              fetchStatus: \"idle\",\n              fetchFailureCount: 0,\n              fetchFailureReason: null\n            }\n          };\n        case \"error\":\n          const error = action.error;\n          if (isCancelledError(error) && error.revert && this.#revertState) {\n            return { ...this.#revertState, fetchStatus: \"idle\" };\n          }\n          return {\n            ...state,\n            error,\n            errorUpdateCount: state.errorUpdateCount + 1,\n            errorUpdatedAt: Date.now(),\n            fetchFailureCount: state.fetchFailureCount + 1,\n            fetchFailureReason: error,\n            fetchStatus: \"idle\",\n            status: \"error\"\n          };\n        case \"invalidate\":\n          return {\n            ...state,\n            isInvalidated: true\n          };\n        case \"setState\":\n          return {\n            ...state,\n            ...action.state\n          };\n      }\n    };\n    this.state = reducer(this.state);\n    notifyManager.batch(() => {\n      this.observers.forEach((observer) => {\n        observer.onQueryUpdate();\n      });\n      this.#cache.notify({ query: this, type: \"updated\", action });\n    });\n  }\n};\nfunction fetchState(data, options) {\n  return {\n    fetchFailureCount: 0,\n    fetchFailureReason: null,\n    fetchStatus: canFetch(options.networkMode) ? \"fetching\" : \"paused\",\n    ...data === void 0 && {\n      error: null,\n      status: \"pending\"\n    }\n  };\n}\nfunction getDefaultState(options) {\n  const data = typeof options.initialData === \"function\" ? options.initialData() : options.initialData;\n  const hasData = data !== void 0;\n  const initialDataUpdatedAt = hasData ? typeof options.initialDataUpdatedAt === \"function\" ? options.initialDataUpdatedAt() : options.initialDataUpdatedAt : 0;\n  return {\n    data,\n    dataUpdateCount: 0,\n    dataUpdatedAt: hasData ? initialDataUpdatedAt ?? Date.now() : 0,\n    error: null,\n    errorUpdateCount: 0,\n    errorUpdatedAt: 0,\n    fetchFailureCount: 0,\n    fetchFailureReason: null,\n    fetchMeta: null,\n    isInvalidated: false,\n    status: hasData ? \"success\" : \"pending\",\n    fetchStatus: \"idle\"\n  };\n}\nexport {\n  Query,\n  fetchState\n};\n//# sourceMappingURL=query.js.map","// src/queryCache.ts\nimport { hashQueryKeyByOptions, matchQuery } from \"./utils.js\";\nimport { Query } from \"./query.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar QueryCache = class extends Subscribable {\n  constructor(config = {}) {\n    super();\n    this.config = config;\n    this.#queries = /* @__PURE__ */ new Map();\n  }\n  #queries;\n  build(client, options, state) {\n    const queryKey = options.queryKey;\n    const queryHash = options.queryHash ?? hashQueryKeyByOptions(queryKey, options);\n    let query = this.get(queryHash);\n    if (!query) {\n      query = new Query({\n        client,\n        queryKey,\n        queryHash,\n        options: client.defaultQueryOptions(options),\n        state,\n        defaultOptions: client.getQueryDefaults(queryKey)\n      });\n      this.add(query);\n    }\n    return query;\n  }\n  add(query) {\n    if (!this.#queries.has(query.queryHash)) {\n      this.#queries.set(query.queryHash, query);\n      this.notify({\n        type: \"added\",\n        query\n      });\n    }\n  }\n  remove(query) {\n    const queryInMap = this.#queries.get(query.queryHash);\n    if (queryInMap) {\n      query.destroy();\n      if (queryInMap === query) {\n        this.#queries.delete(query.queryHash);\n      }\n      this.notify({ type: \"removed\", query });\n    }\n  }\n  clear() {\n    notifyManager.batch(() => {\n      this.getAll().forEach((query) => {\n        this.remove(query);\n      });\n    });\n  }\n  get(queryHash) {\n    return this.#queries.get(queryHash);\n  }\n  getAll() {\n    return [...this.#queries.values()];\n  }\n  find(filters) {\n    const defaultedFilters = { exact: true, ...filters };\n    return this.getAll().find(\n      (query) => matchQuery(defaultedFilters, query)\n    );\n  }\n  findAll(filters = {}) {\n    const queries = this.getAll();\n    return Object.keys(filters).length > 0 ? queries.filter((query) => matchQuery(filters, query)) : queries;\n  }\n  notify(event) {\n    notifyManager.batch(() => {\n      this.listeners.forEach((listener) => {\n        listener(event);\n      });\n    });\n  }\n  onFocus() {\n    notifyManager.batch(() => {\n      this.getAll().forEach((query) => {\n        query.onFocus();\n      });\n    });\n  }\n  onOnline() {\n    notifyManager.batch(() => {\n      this.getAll().forEach((query) => {\n        query.onOnline();\n      });\n    });\n  }\n};\nexport {\n  QueryCache\n};\n//# sourceMappingURL=queryCache.js.map","// src/mutation.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Removable } from \"./removable.js\";\nimport { createRetryer } from \"./retryer.js\";\nvar Mutation = class extends Removable {\n  #observers;\n  #mutationCache;\n  #retryer;\n  constructor(config) {\n    super();\n    this.mutationId = config.mutationId;\n    this.#mutationCache = config.mutationCache;\n    this.#observers = [];\n    this.state = config.state || getDefaultState();\n    this.setOptions(config.options);\n    this.scheduleGc();\n  }\n  setOptions(options) {\n    this.options = options;\n    this.updateGcTime(this.options.gcTime);\n  }\n  get meta() {\n    return this.options.meta;\n  }\n  addObserver(observer) {\n    if (!this.#observers.includes(observer)) {\n      this.#observers.push(observer);\n      this.clearGcTimeout();\n      this.#mutationCache.notify({\n        type: \"observerAdded\",\n        mutation: this,\n        observer\n      });\n    }\n  }\n  removeObserver(observer) {\n    this.#observers = this.#observers.filter((x) => x !== observer);\n    this.scheduleGc();\n    this.#mutationCache.notify({\n      type: \"observerRemoved\",\n      mutation: this,\n      observer\n    });\n  }\n  optionalRemove() {\n    if (!this.#observers.length) {\n      if (this.state.status === \"pending\") {\n        this.scheduleGc();\n      } else {\n        this.#mutationCache.remove(this);\n      }\n    }\n  }\n  continue() {\n    return this.#retryer?.continue() ?? // continuing a mutation assumes that variables are set, mutation must have been dehydrated before\n    this.execute(this.state.variables);\n  }\n  async execute(variables) {\n    const onContinue = () => {\n      this.#dispatch({ type: \"continue\" });\n    };\n    this.#retryer = createRetryer({\n      fn: () => {\n        if (!this.options.mutationFn) {\n          return Promise.reject(new Error(\"No mutationFn found\"));\n        }\n        return this.options.mutationFn(variables);\n      },\n      onFail: (failureCount, error) => {\n        this.#dispatch({ type: \"failed\", failureCount, error });\n      },\n      onPause: () => {\n        this.#dispatch({ type: \"pause\" });\n      },\n      onContinue,\n      retry: this.options.retry ?? 0,\n      retryDelay: this.options.retryDelay,\n      networkMode: this.options.networkMode,\n      canRun: () => this.#mutationCache.canRun(this)\n    });\n    const restored = this.state.status === \"pending\";\n    const isPaused = !this.#retryer.canStart();\n    try {\n      if (restored) {\n        onContinue();\n      } else {\n        this.#dispatch({ type: \"pending\", variables, isPaused });\n        await this.#mutationCache.config.onMutate?.(\n          variables,\n          this\n        );\n        const context = await this.options.onMutate?.(variables);\n        if (context !== this.state.context) {\n          this.#dispatch({\n            type: \"pending\",\n            context,\n            variables,\n            isPaused\n          });\n        }\n      }\n      const data = await this.#retryer.start();\n      await this.#mutationCache.config.onSuccess?.(\n        data,\n        variables,\n        this.state.context,\n        this\n      );\n      await this.options.onSuccess?.(data, variables, this.state.context);\n      await this.#mutationCache.config.onSettled?.(\n        data,\n        null,\n        this.state.variables,\n        this.state.context,\n        this\n      );\n      await this.options.onSettled?.(data, null, variables, this.state.context);\n      this.#dispatch({ type: \"success\", data });\n      return data;\n    } catch (error) {\n      try {\n        await this.#mutationCache.config.onError?.(\n          error,\n          variables,\n          this.state.context,\n          this\n        );\n        await this.options.onError?.(\n          error,\n          variables,\n          this.state.context\n        );\n        await this.#mutationCache.config.onSettled?.(\n          void 0,\n          error,\n          this.state.variables,\n          this.state.context,\n          this\n        );\n        await this.options.onSettled?.(\n          void 0,\n          error,\n          variables,\n          this.state.context\n        );\n        throw error;\n      } finally {\n        this.#dispatch({ type: \"error\", error });\n      }\n    } finally {\n      this.#mutationCache.runNext(this);\n    }\n  }\n  #dispatch(action) {\n    const reducer = (state) => {\n      switch (action.type) {\n        case \"failed\":\n          return {\n            ...state,\n            failureCount: action.failureCount,\n            failureReason: action.error\n          };\n        case \"pause\":\n          return {\n            ...state,\n            isPaused: true\n          };\n        case \"continue\":\n          return {\n            ...state,\n            isPaused: false\n          };\n        case \"pending\":\n          return {\n            ...state,\n            context: action.context,\n            data: void 0,\n            failureCount: 0,\n            failureReason: null,\n            error: null,\n            isPaused: action.isPaused,\n            status: \"pending\",\n            variables: action.variables,\n            submittedAt: Date.now()\n          };\n        case \"success\":\n          return {\n            ...state,\n            data: action.data,\n            failureCount: 0,\n            failureReason: null,\n            error: null,\n            status: \"success\",\n            isPaused: false\n          };\n        case \"error\":\n          return {\n            ...state,\n            data: void 0,\n            error: action.error,\n            failureCount: state.failureCount + 1,\n            failureReason: action.error,\n            isPaused: false,\n            status: \"error\"\n          };\n      }\n    };\n    this.state = reducer(this.state);\n    notifyManager.batch(() => {\n      this.#observers.forEach((observer) => {\n        observer.onMutationUpdate(action);\n      });\n      this.#mutationCache.notify({\n        mutation: this,\n        type: \"updated\",\n        action\n      });\n    });\n  }\n};\nfunction getDefaultState() {\n  return {\n    context: void 0,\n    data: void 0,\n    error: null,\n    failureCount: 0,\n    failureReason: null,\n    isPaused: false,\n    status: \"idle\",\n    variables: void 0,\n    submittedAt: 0\n  };\n}\nexport {\n  Mutation,\n  getDefaultState\n};\n//# sourceMappingURL=mutation.js.map","// src/mutationCache.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Mutation } from \"./mutation.js\";\nimport { matchMutation, noop } from \"./utils.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar MutationCache = class extends Subscribable {\n  constructor(config = {}) {\n    super();\n    this.config = config;\n    this.#mutations = /* @__PURE__ */ new Set();\n    this.#scopes = /* @__PURE__ */ new Map();\n    this.#mutationId = 0;\n  }\n  #mutations;\n  #scopes;\n  #mutationId;\n  build(client, options, state) {\n    const mutation = new Mutation({\n      mutationCache: this,\n      mutationId: ++this.#mutationId,\n      options: client.defaultMutationOptions(options),\n      state\n    });\n    this.add(mutation);\n    return mutation;\n  }\n  add(mutation) {\n    this.#mutations.add(mutation);\n    const scope = scopeFor(mutation);\n    if (typeof scope === \"string\") {\n      const scopedMutations = this.#scopes.get(scope);\n      if (scopedMutations) {\n        scopedMutations.push(mutation);\n      } else {\n        this.#scopes.set(scope, [mutation]);\n      }\n    }\n    this.notify({ type: \"added\", mutation });\n  }\n  remove(mutation) {\n    if (this.#mutations.delete(mutation)) {\n      const scope = scopeFor(mutation);\n      if (typeof scope === \"string\") {\n        const scopedMutations = this.#scopes.get(scope);\n        if (scopedMutations) {\n          if (scopedMutations.length > 1) {\n            const index = scopedMutations.indexOf(mutation);\n            if (index !== -1) {\n              scopedMutations.splice(index, 1);\n            }\n          } else if (scopedMutations[0] === mutation) {\n            this.#scopes.delete(scope);\n          }\n        }\n      }\n    }\n    this.notify({ type: \"removed\", mutation });\n  }\n  canRun(mutation) {\n    const scope = scopeFor(mutation);\n    if (typeof scope === \"string\") {\n      const mutationsWithSameScope = this.#scopes.get(scope);\n      const firstPendingMutation = mutationsWithSameScope?.find(\n        (m) => m.state.status === \"pending\"\n      );\n      return !firstPendingMutation || firstPendingMutation === mutation;\n    } else {\n      return true;\n    }\n  }\n  runNext(mutation) {\n    const scope = scopeFor(mutation);\n    if (typeof scope === \"string\") {\n      const foundMutation = this.#scopes.get(scope)?.find((m) => m !== mutation && m.state.isPaused);\n      return foundMutation?.continue() ?? Promise.resolve();\n    } else {\n      return Promise.resolve();\n    }\n  }\n  clear() {\n    notifyManager.batch(() => {\n      this.#mutations.forEach((mutation) => {\n        this.notify({ type: \"removed\", mutation });\n      });\n      this.#mutations.clear();\n      this.#scopes.clear();\n    });\n  }\n  getAll() {\n    return Array.from(this.#mutations);\n  }\n  find(filters) {\n    const defaultedFilters = { exact: true, ...filters };\n    return this.getAll().find(\n      (mutation) => matchMutation(defaultedFilters, mutation)\n    );\n  }\n  findAll(filters = {}) {\n    return this.getAll().filter((mutation) => matchMutation(filters, mutation));\n  }\n  notify(event) {\n    notifyManager.batch(() => {\n      this.listeners.forEach((listener) => {\n        listener(event);\n      });\n    });\n  }\n  resumePausedMutations() {\n    const pausedMutations = this.getAll().filter((x) => x.state.isPaused);\n    return notifyManager.batch(\n      () => Promise.all(\n        pausedMutations.map((mutation) => mutation.continue().catch(noop))\n      )\n    );\n  }\n};\nfunction scopeFor(mutation) {\n  return mutation.options.scope?.id;\n}\nexport {\n  MutationCache\n};\n//# sourceMappingURL=mutationCache.js.map","// src/infiniteQueryBehavior.ts\nimport { addToEnd, addToStart, ensureQueryFn } from \"./utils.js\";\nfunction infiniteQueryBehavior(pages) {\n  return {\n    onFetch: (context, query) => {\n      const options = context.options;\n      const direction = context.fetchOptions?.meta?.fetchMore?.direction;\n      const oldPages = context.state.data?.pages || [];\n      const oldPageParams = context.state.data?.pageParams || [];\n      let result = { pages: [], pageParams: [] };\n      let currentPage = 0;\n      const fetchFn = async () => {\n        let cancelled = false;\n        const addSignalProperty = (object) => {\n          Object.defineProperty(object, \"signal\", {\n            enumerable: true,\n            get: () => {\n              if (context.signal.aborted) {\n                cancelled = true;\n              } else {\n                context.signal.addEventListener(\"abort\", () => {\n                  cancelled = true;\n                });\n              }\n              return context.signal;\n            }\n          });\n        };\n        const queryFn = ensureQueryFn(context.options, context.fetchOptions);\n        const fetchPage = async (data, param, previous) => {\n          if (cancelled) {\n            return Promise.reject();\n          }\n          if (param == null && data.pages.length) {\n            return Promise.resolve(data);\n          }\n          const createQueryFnContext = () => {\n            const queryFnContext2 = {\n              client: context.client,\n              queryKey: context.queryKey,\n              pageParam: param,\n              direction: previous ? \"backward\" : \"forward\",\n              meta: context.options.meta\n            };\n            addSignalProperty(queryFnContext2);\n            return queryFnContext2;\n          };\n          const queryFnContext = createQueryFnContext();\n          const page = await queryFn(queryFnContext);\n          const { maxPages } = context.options;\n          const addTo = previous ? addToStart : addToEnd;\n          return {\n            pages: addTo(data.pages, page, maxPages),\n            pageParams: addTo(data.pageParams, param, maxPages)\n          };\n        };\n        if (direction && oldPages.length) {\n          const previous = direction === \"backward\";\n          const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;\n          const oldData = {\n            pages: oldPages,\n            pageParams: oldPageParams\n          };\n          const param = pageParamFn(options, oldData);\n          result = await fetchPage(oldData, param, previous);\n        } else {\n          const remainingPages = pages ?? oldPages.length;\n          do {\n            const param = currentPage === 0 ? oldPageParams[0] ?? options.initialPageParam : getNextPageParam(options, result);\n            if (currentPage > 0 && param == null) {\n              break;\n            }\n            result = await fetchPage(result, param);\n            currentPage++;\n          } while (currentPage < remainingPages);\n        }\n        return result;\n      };\n      if (context.options.persister) {\n        context.fetchFn = () => {\n          return context.options.persister?.(\n            fetchFn,\n            {\n              client: context.client,\n              queryKey: context.queryKey,\n              meta: context.options.meta,\n              signal: context.signal\n            },\n            query\n          );\n        };\n      } else {\n        context.fetchFn = fetchFn;\n      }\n    }\n  };\n}\nfunction getNextPageParam(options, { pages, pageParams }) {\n  const lastIndex = pages.length - 1;\n  return pages.length > 0 ? options.getNextPageParam(\n    pages[lastIndex],\n    pages,\n    pageParams[lastIndex],\n    pageParams\n  ) : void 0;\n}\nfunction getPreviousPageParam(options, { pages, pageParams }) {\n  return pages.length > 0 ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) : void 0;\n}\nfunction hasNextPage(options, data) {\n  if (!data) return false;\n  return getNextPageParam(options, data) != null;\n}\nfunction hasPreviousPage(options, data) {\n  if (!data || !options.getPreviousPageParam) return false;\n  return getPreviousPageParam(options, data) != null;\n}\nexport {\n  hasNextPage,\n  hasPreviousPage,\n  infiniteQueryBehavior\n};\n//# sourceMappingURL=infiniteQueryBehavior.js.map","// src/queryClient.ts\nimport {\n  functionalUpdate,\n  hashKey,\n  hashQueryKeyByOptions,\n  noop,\n  partialMatchKey,\n  resolveStaleTime,\n  skipToken\n} from \"./utils.js\";\nimport { QueryCache } from \"./queryCache.js\";\nimport { MutationCache } from \"./mutationCache.js\";\nimport { focusManager } from \"./focusManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { infiniteQueryBehavior } from \"./infiniteQueryBehavior.js\";\nvar QueryClient = class {\n  #queryCache;\n  #mutationCache;\n  #defaultOptions;\n  #queryDefaults;\n  #mutationDefaults;\n  #mountCount;\n  #unsubscribeFocus;\n  #unsubscribeOnline;\n  constructor(config = {}) {\n    this.#queryCache = config.queryCache || new QueryCache();\n    this.#mutationCache = config.mutationCache || new MutationCache();\n    this.#defaultOptions = config.defaultOptions || {};\n    this.#queryDefaults = /* @__PURE__ */ new Map();\n    this.#mutationDefaults = /* @__PURE__ */ new Map();\n    this.#mountCount = 0;\n  }\n  mount() {\n    this.#mountCount++;\n    if (this.#mountCount !== 1) return;\n    this.#unsubscribeFocus = focusManager.subscribe(async (focused) => {\n      if (focused) {\n        await this.resumePausedMutations();\n        this.#queryCache.onFocus();\n      }\n    });\n    this.#unsubscribeOnline = onlineManager.subscribe(async (online) => {\n      if (online) {\n        await this.resumePausedMutations();\n        this.#queryCache.onOnline();\n      }\n    });\n  }\n  unmount() {\n    this.#mountCount--;\n    if (this.#mountCount !== 0) return;\n    this.#unsubscribeFocus?.();\n    this.#unsubscribeFocus = void 0;\n    this.#unsubscribeOnline?.();\n    this.#unsubscribeOnline = void 0;\n  }\n  isFetching(filters) {\n    return this.#queryCache.findAll({ ...filters, fetchStatus: \"fetching\" }).length;\n  }\n  isMutating(filters) {\n    return this.#mutationCache.findAll({ ...filters, status: \"pending\" }).length;\n  }\n  /**\n   * Imperative (non-reactive) way to retrieve data for a QueryKey.\n   * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates.\n   *\n   * Hint: Do not use this function inside a component, because it won't receive updates.\n   * Use `useQuery` to create a `QueryObserver` that subscribes to changes.\n   */\n  getQueryData(queryKey) {\n    const options = this.defaultQueryOptions({ queryKey });\n    return this.#queryCache.get(options.queryHash)?.state.data;\n  }\n  ensureQueryData(options) {\n    const defaultedOptions = this.defaultQueryOptions(options);\n    const query = this.#queryCache.build(this, defaultedOptions);\n    const cachedData = query.state.data;\n    if (cachedData === void 0) {\n      return this.fetchQuery(options);\n    }\n    if (options.revalidateIfStale && query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))) {\n      void this.prefetchQuery(defaultedOptions);\n    }\n    return Promise.resolve(cachedData);\n  }\n  getQueriesData(filters) {\n    return this.#queryCache.findAll(filters).map(({ queryKey, state }) => {\n      const data = state.data;\n      return [queryKey, data];\n    });\n  }\n  setQueryData(queryKey, updater, options) {\n    const defaultedOptions = this.defaultQueryOptions({ queryKey });\n    const query = this.#queryCache.get(\n      defaultedOptions.queryHash\n    );\n    const prevData = query?.state.data;\n    const data = functionalUpdate(updater, prevData);\n    if (data === void 0) {\n      return void 0;\n    }\n    return this.#queryCache.build(this, defaultedOptions).setData(data, { ...options, manual: true });\n  }\n  setQueriesData(filters, updater, options) {\n    return notifyManager.batch(\n      () => this.#queryCache.findAll(filters).map(({ queryKey }) => [\n        queryKey,\n        this.setQueryData(queryKey, updater, options)\n      ])\n    );\n  }\n  getQueryState(queryKey) {\n    const options = this.defaultQueryOptions({ queryKey });\n    return this.#queryCache.get(\n      options.queryHash\n    )?.state;\n  }\n  removeQueries(filters) {\n    const queryCache = this.#queryCache;\n    notifyManager.batch(() => {\n      queryCache.findAll(filters).forEach((query) => {\n        queryCache.remove(query);\n      });\n    });\n  }\n  resetQueries(filters, options) {\n    const queryCache = this.#queryCache;\n    return notifyManager.batch(() => {\n      queryCache.findAll(filters).forEach((query) => {\n        query.reset();\n      });\n      return this.refetchQueries(\n        {\n          type: \"active\",\n          ...filters\n        },\n        options\n      );\n    });\n  }\n  cancelQueries(filters, cancelOptions = {}) {\n    const defaultedCancelOptions = { revert: true, ...cancelOptions };\n    const promises = notifyManager.batch(\n      () => this.#queryCache.findAll(filters).map((query) => query.cancel(defaultedCancelOptions))\n    );\n    return Promise.all(promises).then(noop).catch(noop);\n  }\n  invalidateQueries(filters, options = {}) {\n    return notifyManager.batch(() => {\n      this.#queryCache.findAll(filters).forEach((query) => {\n        query.invalidate();\n      });\n      if (filters?.refetchType === \"none\") {\n        return Promise.resolve();\n      }\n      return this.refetchQueries(\n        {\n          ...filters,\n          type: filters?.refetchType ?? filters?.type ?? \"active\"\n        },\n        options\n      );\n    });\n  }\n  refetchQueries(filters, options = {}) {\n    const fetchOptions = {\n      ...options,\n      cancelRefetch: options.cancelRefetch ?? true\n    };\n    const promises = notifyManager.batch(\n      () => this.#queryCache.findAll(filters).filter((query) => !query.isDisabled() && !query.isStatic()).map((query) => {\n        let promise = query.fetch(void 0, fetchOptions);\n        if (!fetchOptions.throwOnError) {\n          promise = promise.catch(noop);\n        }\n        return query.state.fetchStatus === \"paused\" ? Promise.resolve() : promise;\n      })\n    );\n    return Promise.all(promises).then(noop);\n  }\n  fetchQuery(options) {\n    const defaultedOptions = this.defaultQueryOptions(options);\n    if (defaultedOptions.retry === void 0) {\n      defaultedOptions.retry = false;\n    }\n    const query = this.#queryCache.build(this, defaultedOptions);\n    return query.isStaleByTime(\n      resolveStaleTime(defaultedOptions.staleTime, query)\n    ) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data);\n  }\n  prefetchQuery(options) {\n    return this.fetchQuery(options).then(noop).catch(noop);\n  }\n  fetchInfiniteQuery(options) {\n    options.behavior = infiniteQueryBehavior(options.pages);\n    return this.fetchQuery(options);\n  }\n  prefetchInfiniteQuery(options) {\n    return this.fetchInfiniteQuery(options).then(noop).catch(noop);\n  }\n  ensureInfiniteQueryData(options) {\n    options.behavior = infiniteQueryBehavior(options.pages);\n    return this.ensureQueryData(options);\n  }\n  resumePausedMutations() {\n    if (onlineManager.isOnline()) {\n      return this.#mutationCache.resumePausedMutations();\n    }\n    return Promise.resolve();\n  }\n  getQueryCache() {\n    return this.#queryCache;\n  }\n  getMutationCache() {\n    return this.#mutationCache;\n  }\n  getDefaultOptions() {\n    return this.#defaultOptions;\n  }\n  setDefaultOptions(options) {\n    this.#defaultOptions = options;\n  }\n  setQueryDefaults(queryKey, options) {\n    this.#queryDefaults.set(hashKey(queryKey), {\n      queryKey,\n      defaultOptions: options\n    });\n  }\n  getQueryDefaults(queryKey) {\n    const defaults = [...this.#queryDefaults.values()];\n    const result = {};\n    defaults.forEach((queryDefault) => {\n      if (partialMatchKey(queryKey, queryDefault.queryKey)) {\n        Object.assign(result, queryDefault.defaultOptions);\n      }\n    });\n    return result;\n  }\n  setMutationDefaults(mutationKey, options) {\n    this.#mutationDefaults.set(hashKey(mutationKey), {\n      mutationKey,\n      defaultOptions: options\n    });\n  }\n  getMutationDefaults(mutationKey) {\n    const defaults = [...this.#mutationDefaults.values()];\n    const result = {};\n    defaults.forEach((queryDefault) => {\n      if (partialMatchKey(mutationKey, queryDefault.mutationKey)) {\n        Object.assign(result, queryDefault.defaultOptions);\n      }\n    });\n    return result;\n  }\n  defaultQueryOptions(options) {\n    if (options._defaulted) {\n      return options;\n    }\n    const defaultedOptions = {\n      ...this.#defaultOptions.queries,\n      ...this.getQueryDefaults(options.queryKey),\n      ...options,\n      _defaulted: true\n    };\n    if (!defaultedOptions.queryHash) {\n      defaultedOptions.queryHash = hashQueryKeyByOptions(\n        defaultedOptions.queryKey,\n        defaultedOptions\n      );\n    }\n    if (defaultedOptions.refetchOnReconnect === void 0) {\n      defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== \"always\";\n    }\n    if (defaultedOptions.throwOnError === void 0) {\n      defaultedOptions.throwOnError = !!defaultedOptions.suspense;\n    }\n    if (!defaultedOptions.networkMode && defaultedOptions.persister) {\n      defaultedOptions.networkMode = \"offlineFirst\";\n    }\n    if (defaultedOptions.queryFn === skipToken) {\n      defaultedOptions.enabled = false;\n    }\n    return defaultedOptions;\n  }\n  defaultMutationOptions(options) {\n    if (options?._defaulted) {\n      return options;\n    }\n    return {\n      ...this.#defaultOptions.mutations,\n      ...options?.mutationKey && this.getMutationDefaults(options.mutationKey),\n      ...options,\n      _defaulted: true\n    };\n  }\n  clear() {\n    this.#queryCache.clear();\n    this.#mutationCache.clear();\n  }\n};\nexport {\n  QueryClient\n};\n//# sourceMappingURL=queryClient.js.map","// src/queryObserver.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { fetchState } from \"./query.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport {\n  isServer,\n  isValidTimeout,\n  noop,\n  replaceData,\n  resolveEnabled,\n  resolveStaleTime,\n  shallowEqualObjects,\n  timeUntilStale\n} from \"./utils.js\";\nvar QueryObserver = class extends Subscribable {\n  constructor(client, options) {\n    super();\n    this.options = options;\n    this.#client = client;\n    this.#selectError = null;\n    this.#currentThenable = pendingThenable();\n    if (!this.options.experimental_prefetchInRender) {\n      this.#currentThenable.reject(\n        new Error(\"experimental_prefetchInRender feature flag is not enabled\")\n      );\n    }\n    this.bindMethods();\n    this.setOptions(options);\n  }\n  #client;\n  #currentQuery = void 0;\n  #currentQueryInitialState = void 0;\n  #currentResult = void 0;\n  #currentResultState;\n  #currentResultOptions;\n  #currentThenable;\n  #selectError;\n  #selectFn;\n  #selectResult;\n  // This property keeps track of the last query with defined data.\n  // It will be used to pass the previous data and query to the placeholder function between renders.\n  #lastQueryWithDefinedData;\n  #staleTimeoutId;\n  #refetchIntervalId;\n  #currentRefetchInterval;\n  #trackedProps = /* @__PURE__ */ new Set();\n  bindMethods() {\n    this.refetch = this.refetch.bind(this);\n  }\n  onSubscribe() {\n    if (this.listeners.size === 1) {\n      this.#currentQuery.addObserver(this);\n      if (shouldFetchOnMount(this.#currentQuery, this.options)) {\n        this.#executeFetch();\n      } else {\n        this.updateResult();\n      }\n      this.#updateTimers();\n    }\n  }\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      this.destroy();\n    }\n  }\n  shouldFetchOnReconnect() {\n    return shouldFetchOn(\n      this.#currentQuery,\n      this.options,\n      this.options.refetchOnReconnect\n    );\n  }\n  shouldFetchOnWindowFocus() {\n    return shouldFetchOn(\n      this.#currentQuery,\n      this.options,\n      this.options.refetchOnWindowFocus\n    );\n  }\n  destroy() {\n    this.listeners = /* @__PURE__ */ new Set();\n    this.#clearStaleTimeout();\n    this.#clearRefetchInterval();\n    this.#currentQuery.removeObserver(this);\n  }\n  setOptions(options) {\n    const prevOptions = this.options;\n    const prevQuery = this.#currentQuery;\n    this.options = this.#client.defaultQueryOptions(options);\n    if (this.options.enabled !== void 0 && typeof this.options.enabled !== \"boolean\" && typeof this.options.enabled !== \"function\" && typeof resolveEnabled(this.options.enabled, this.#currentQuery) !== \"boolean\") {\n      throw new Error(\n        \"Expected enabled to be a boolean or a callback that returns a boolean\"\n      );\n    }\n    this.#updateQuery();\n    this.#currentQuery.setOptions(this.options);\n    if (prevOptions._defaulted && !shallowEqualObjects(this.options, prevOptions)) {\n      this.#client.getQueryCache().notify({\n        type: \"observerOptionsUpdated\",\n        query: this.#currentQuery,\n        observer: this\n      });\n    }\n    const mounted = this.hasListeners();\n    if (mounted && shouldFetchOptionally(\n      this.#currentQuery,\n      prevQuery,\n      this.options,\n      prevOptions\n    )) {\n      this.#executeFetch();\n    }\n    this.updateResult();\n    if (mounted && (this.#currentQuery !== prevQuery || resolveEnabled(this.options.enabled, this.#currentQuery) !== resolveEnabled(prevOptions.enabled, this.#currentQuery) || resolveStaleTime(this.options.staleTime, this.#currentQuery) !== resolveStaleTime(prevOptions.staleTime, this.#currentQuery))) {\n      this.#updateStaleTimeout();\n    }\n    const nextRefetchInterval = this.#computeRefetchInterval();\n    if (mounted && (this.#currentQuery !== prevQuery || resolveEnabled(this.options.enabled, this.#currentQuery) !== resolveEnabled(prevOptions.enabled, this.#currentQuery) || nextRefetchInterval !== this.#currentRefetchInterval)) {\n      this.#updateRefetchInterval(nextRefetchInterval);\n    }\n  }\n  getOptimisticResult(options) {\n    const query = this.#client.getQueryCache().build(this.#client, options);\n    const result = this.createResult(query, options);\n    if (shouldAssignObserverCurrentProperties(this, result)) {\n      this.#currentResult = result;\n      this.#currentResultOptions = this.options;\n      this.#currentResultState = this.#currentQuery.state;\n    }\n    return result;\n  }\n  getCurrentResult() {\n    return this.#currentResult;\n  }\n  trackResult(result, onPropTracked) {\n    return new Proxy(result, {\n      get: (target, key) => {\n        this.trackProp(key);\n        onPropTracked?.(key);\n        return Reflect.get(target, key);\n      }\n    });\n  }\n  trackProp(key) {\n    this.#trackedProps.add(key);\n  }\n  getCurrentQuery() {\n    return this.#currentQuery;\n  }\n  refetch({ ...options } = {}) {\n    return this.fetch({\n      ...options\n    });\n  }\n  fetchOptimistic(options) {\n    const defaultedOptions = this.#client.defaultQueryOptions(options);\n    const query = this.#client.getQueryCache().build(this.#client, defaultedOptions);\n    return query.fetch().then(() => this.createResult(query, defaultedOptions));\n  }\n  fetch(fetchOptions) {\n    return this.#executeFetch({\n      ...fetchOptions,\n      cancelRefetch: fetchOptions.cancelRefetch ?? true\n    }).then(() => {\n      this.updateResult();\n      return this.#currentResult;\n    });\n  }\n  #executeFetch(fetchOptions) {\n    this.#updateQuery();\n    let promise = this.#currentQuery.fetch(\n      this.options,\n      fetchOptions\n    );\n    if (!fetchOptions?.throwOnError) {\n      promise = promise.catch(noop);\n    }\n    return promise;\n  }\n  #updateStaleTimeout() {\n    this.#clearStaleTimeout();\n    const staleTime = resolveStaleTime(\n      this.options.staleTime,\n      this.#currentQuery\n    );\n    if (isServer || this.#currentResult.isStale || !isValidTimeout(staleTime)) {\n      return;\n    }\n    const time = timeUntilStale(this.#currentResult.dataUpdatedAt, staleTime);\n    const timeout = time + 1;\n    this.#staleTimeoutId = setTimeout(() => {\n      if (!this.#currentResult.isStale) {\n        this.updateResult();\n      }\n    }, timeout);\n  }\n  #computeRefetchInterval() {\n    return (typeof this.options.refetchInterval === \"function\" ? this.options.refetchInterval(this.#currentQuery) : this.options.refetchInterval) ?? false;\n  }\n  #updateRefetchInterval(nextInterval) {\n    this.#clearRefetchInterval();\n    this.#currentRefetchInterval = nextInterval;\n    if (isServer || resolveEnabled(this.options.enabled, this.#currentQuery) === false || !isValidTimeout(this.#currentRefetchInterval) || this.#currentRefetchInterval === 0) {\n      return;\n    }\n    this.#refetchIntervalId = setInterval(() => {\n      if (this.options.refetchIntervalInBackground || focusManager.isFocused()) {\n        this.#executeFetch();\n      }\n    }, this.#currentRefetchInterval);\n  }\n  #updateTimers() {\n    this.#updateStaleTimeout();\n    this.#updateRefetchInterval(this.#computeRefetchInterval());\n  }\n  #clearStaleTimeout() {\n    if (this.#staleTimeoutId) {\n      clearTimeout(this.#staleTimeoutId);\n      this.#staleTimeoutId = void 0;\n    }\n  }\n  #clearRefetchInterval() {\n    if (this.#refetchIntervalId) {\n      clearInterval(this.#refetchIntervalId);\n      this.#refetchIntervalId = void 0;\n    }\n  }\n  createResult(query, options) {\n    const prevQuery = this.#currentQuery;\n    const prevOptions = this.options;\n    const prevResult = this.#currentResult;\n    const prevResultState = this.#currentResultState;\n    const prevResultOptions = this.#currentResultOptions;\n    const queryChange = query !== prevQuery;\n    const queryInitialState = queryChange ? query.state : this.#currentQueryInitialState;\n    const { state } = query;\n    let newState = { ...state };\n    let isPlaceholderData = false;\n    let data;\n    if (options._optimisticResults) {\n      const mounted = this.hasListeners();\n      const fetchOnMount = !mounted && shouldFetchOnMount(query, options);\n      const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);\n      if (fetchOnMount || fetchOptionally) {\n        newState = {\n          ...newState,\n          ...fetchState(state.data, query.options)\n        };\n      }\n      if (options._optimisticResults === \"isRestoring\") {\n        newState.fetchStatus = \"idle\";\n      }\n    }\n    let { error, errorUpdatedAt, status } = newState;\n    data = newState.data;\n    let skipSelect = false;\n    if (options.placeholderData !== void 0 && data === void 0 && status === \"pending\") {\n      let placeholderData;\n      if (prevResult?.isPlaceholderData && options.placeholderData === prevResultOptions?.placeholderData) {\n        placeholderData = prevResult.data;\n        skipSelect = true;\n      } else {\n        placeholderData = typeof options.placeholderData === \"function\" ? options.placeholderData(\n          this.#lastQueryWithDefinedData?.state.data,\n          this.#lastQueryWithDefinedData\n        ) : options.placeholderData;\n      }\n      if (placeholderData !== void 0) {\n        status = \"success\";\n        data = replaceData(\n          prevResult?.data,\n          placeholderData,\n          options\n        );\n        isPlaceholderData = true;\n      }\n    }\n    if (options.select && data !== void 0 && !skipSelect) {\n      if (prevResult && data === prevResultState?.data && options.select === this.#selectFn) {\n        data = this.#selectResult;\n      } else {\n        try {\n          this.#selectFn = options.select;\n          data = options.select(data);\n          data = replaceData(prevResult?.data, data, options);\n          this.#selectResult = data;\n          this.#selectError = null;\n        } catch (selectError) {\n          this.#selectError = selectError;\n        }\n      }\n    }\n    if (this.#selectError) {\n      error = this.#selectError;\n      data = this.#selectResult;\n      errorUpdatedAt = Date.now();\n      status = \"error\";\n    }\n    const isFetching = newState.fetchStatus === \"fetching\";\n    const isPending = status === \"pending\";\n    const isError = status === \"error\";\n    const isLoading = isPending && isFetching;\n    const hasData = data !== void 0;\n    const result = {\n      status,\n      fetchStatus: newState.fetchStatus,\n      isPending,\n      isSuccess: status === \"success\",\n      isError,\n      isInitialLoading: isLoading,\n      isLoading,\n      data,\n      dataUpdatedAt: newState.dataUpdatedAt,\n      error,\n      errorUpdatedAt,\n      failureCount: newState.fetchFailureCount,\n      failureReason: newState.fetchFailureReason,\n      errorUpdateCount: newState.errorUpdateCount,\n      isFetched: newState.dataUpdateCount > 0 || newState.errorUpdateCount > 0,\n      isFetchedAfterMount: newState.dataUpdateCount > queryInitialState.dataUpdateCount || newState.errorUpdateCount > queryInitialState.errorUpdateCount,\n      isFetching,\n      isRefetching: isFetching && !isPending,\n      isLoadingError: isError && !hasData,\n      isPaused: newState.fetchStatus === \"paused\",\n      isPlaceholderData,\n      isRefetchError: isError && hasData,\n      isStale: isStale(query, options),\n      refetch: this.refetch,\n      promise: this.#currentThenable,\n      isEnabled: resolveEnabled(options.enabled, query) !== false\n    };\n    const nextResult = result;\n    if (this.options.experimental_prefetchInRender) {\n      const finalizeThenableIfPossible = (thenable) => {\n        if (nextResult.status === \"error\") {\n          thenable.reject(nextResult.error);\n        } else if (nextResult.data !== void 0) {\n          thenable.resolve(nextResult.data);\n        }\n      };\n      const recreateThenable = () => {\n        const pending = this.#currentThenable = nextResult.promise = pendingThenable();\n        finalizeThenableIfPossible(pending);\n      };\n      const prevThenable = this.#currentThenable;\n      switch (prevThenable.status) {\n        case \"pending\":\n          if (query.queryHash === prevQuery.queryHash) {\n            finalizeThenableIfPossible(prevThenable);\n          }\n          break;\n        case \"fulfilled\":\n          if (nextResult.status === \"error\" || nextResult.data !== prevThenable.value) {\n            recreateThenable();\n          }\n          break;\n        case \"rejected\":\n          if (nextResult.status !== \"error\" || nextResult.error !== prevThenable.reason) {\n            recreateThenable();\n          }\n          break;\n      }\n    }\n    return nextResult;\n  }\n  updateResult() {\n    const prevResult = this.#currentResult;\n    const nextResult = this.createResult(this.#currentQuery, this.options);\n    this.#currentResultState = this.#currentQuery.state;\n    this.#currentResultOptions = this.options;\n    if (this.#currentResultState.data !== void 0) {\n      this.#lastQueryWithDefinedData = this.#currentQuery;\n    }\n    if (shallowEqualObjects(nextResult, prevResult)) {\n      return;\n    }\n    this.#currentResult = nextResult;\n    const shouldNotifyListeners = () => {\n      if (!prevResult) {\n        return true;\n      }\n      const { notifyOnChangeProps } = this.options;\n      const notifyOnChangePropsValue = typeof notifyOnChangeProps === \"function\" ? notifyOnChangeProps() : notifyOnChangeProps;\n      if (notifyOnChangePropsValue === \"all\" || !notifyOnChangePropsValue && !this.#trackedProps.size) {\n        return true;\n      }\n      const includedProps = new Set(\n        notifyOnChangePropsValue ?? this.#trackedProps\n      );\n      if (this.options.throwOnError) {\n        includedProps.add(\"error\");\n      }\n      return Object.keys(this.#currentResult).some((key) => {\n        const typedKey = key;\n        const changed = this.#currentResult[typedKey] !== prevResult[typedKey];\n        return changed && includedProps.has(typedKey);\n      });\n    };\n    this.#notify({ listeners: shouldNotifyListeners() });\n  }\n  #updateQuery() {\n    const query = this.#client.getQueryCache().build(this.#client, this.options);\n    if (query === this.#currentQuery) {\n      return;\n    }\n    const prevQuery = this.#currentQuery;\n    this.#currentQuery = query;\n    this.#currentQueryInitialState = query.state;\n    if (this.hasListeners()) {\n      prevQuery?.removeObserver(this);\n      query.addObserver(this);\n    }\n  }\n  onQueryUpdate() {\n    this.updateResult();\n    if (this.hasListeners()) {\n      this.#updateTimers();\n    }\n  }\n  #notify(notifyOptions) {\n    notifyManager.batch(() => {\n      if (notifyOptions.listeners) {\n        this.listeners.forEach((listener) => {\n          listener(this.#currentResult);\n        });\n      }\n      this.#client.getQueryCache().notify({\n        query: this.#currentQuery,\n        type: \"observerResultsUpdated\"\n      });\n    });\n  }\n};\nfunction shouldLoadOnMount(query, options) {\n  return resolveEnabled(options.enabled, query) !== false && query.state.data === void 0 && !(query.state.status === \"error\" && options.retryOnMount === false);\n}\nfunction shouldFetchOnMount(query, options) {\n  return shouldLoadOnMount(query, options) || query.state.data !== void 0 && shouldFetchOn(query, options, options.refetchOnMount);\n}\nfunction shouldFetchOn(query, options, field) {\n  if (resolveEnabled(options.enabled, query) !== false && resolveStaleTime(options.staleTime, query) !== \"static\") {\n    const value = typeof field === \"function\" ? field(query) : field;\n    return value === \"always\" || value !== false && isStale(query, options);\n  }\n  return false;\n}\nfunction shouldFetchOptionally(query, prevQuery, options, prevOptions) {\n  return (query !== prevQuery || resolveEnabled(prevOptions.enabled, query) === false) && (!options.suspense || query.state.status !== \"error\") && isStale(query, options);\n}\nfunction isStale(query, options) {\n  return resolveEnabled(options.enabled, query) !== false && query.isStaleByTime(resolveStaleTime(options.staleTime, query));\n}\nfunction shouldAssignObserverCurrentProperties(observer, optimisticResult) {\n  if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {\n    return true;\n  }\n  return false;\n}\nexport {\n  QueryObserver\n};\n//# sourceMappingURL=queryObserver.js.map","// src/mutationObserver.ts\nimport { getDefaultState } from \"./mutation.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { hashKey, shallowEqualObjects } from \"./utils.js\";\nvar MutationObserver = class extends Subscribable {\n  #client;\n  #currentResult = void 0;\n  #currentMutation;\n  #mutateOptions;\n  constructor(client, options) {\n    super();\n    this.#client = client;\n    this.setOptions(options);\n    this.bindMethods();\n    this.#updateResult();\n  }\n  bindMethods() {\n    this.mutate = this.mutate.bind(this);\n    this.reset = this.reset.bind(this);\n  }\n  setOptions(options) {\n    const prevOptions = this.options;\n    this.options = this.#client.defaultMutationOptions(options);\n    if (!shallowEqualObjects(this.options, prevOptions)) {\n      this.#client.getMutationCache().notify({\n        type: \"observerOptionsUpdated\",\n        mutation: this.#currentMutation,\n        observer: this\n      });\n    }\n    if (prevOptions?.mutationKey && this.options.mutationKey && hashKey(prevOptions.mutationKey) !== hashKey(this.options.mutationKey)) {\n      this.reset();\n    } else if (this.#currentMutation?.state.status === \"pending\") {\n      this.#currentMutation.setOptions(this.options);\n    }\n  }\n  onUnsubscribe() {\n    if (!this.hasListeners()) {\n      this.#currentMutation?.removeObserver(this);\n    }\n  }\n  onMutationUpdate(action) {\n    this.#updateResult();\n    this.#notify(action);\n  }\n  getCurrentResult() {\n    return this.#currentResult;\n  }\n  reset() {\n    this.#currentMutation?.removeObserver(this);\n    this.#currentMutation = void 0;\n    this.#updateResult();\n    this.#notify();\n  }\n  mutate(variables, options) {\n    this.#mutateOptions = options;\n    this.#currentMutation?.removeObserver(this);\n    this.#currentMutation = this.#client.getMutationCache().build(this.#client, this.options);\n    this.#currentMutation.addObserver(this);\n    return this.#currentMutation.execute(variables);\n  }\n  #updateResult() {\n    const state = this.#currentMutation?.state ?? getDefaultState();\n    this.#currentResult = {\n      ...state,\n      isPending: state.status === \"pending\",\n      isSuccess: state.status === \"success\",\n      isError: state.status === \"error\",\n      isIdle: state.status === \"idle\",\n      mutate: this.mutate,\n      reset: this.reset\n    };\n  }\n  #notify(action) {\n    notifyManager.batch(() => {\n      if (this.#mutateOptions && this.hasListeners()) {\n        const variables = this.#currentResult.variables;\n        const context = this.#currentResult.context;\n        if (action?.type === \"success\") {\n          this.#mutateOptions.onSuccess?.(action.data, variables, context);\n          this.#mutateOptions.onSettled?.(action.data, null, variables, context);\n        } else if (action?.type === \"error\") {\n          this.#mutateOptions.onError?.(action.error, variables, context);\n          this.#mutateOptions.onSettled?.(\n            void 0,\n            action.error,\n            variables,\n            context\n          );\n        }\n      }\n      this.listeners.forEach((listener) => {\n        listener(this.#currentResult);\n      });\n    });\n  }\n};\nexport {\n  MutationObserver\n};\n//# sourceMappingURL=mutationObserver.js.map","import { replaceEqualDeep } from '@tanstack/query-core';\nexport function structuralSharing(oldData, newData) {\n    return replaceEqualDeep(oldData, newData);\n}\nexport function hashFn(queryKey) {\n    return JSON.stringify(queryKey, (_, value) => {\n        if (isPlainObject(value))\n            return Object.keys(value)\n                .sort()\n                .reduce((result, key) => {\n                result[key] = value[key];\n                return result;\n            }, {});\n        if (typeof value === 'bigint')\n            return value.toString();\n        return value;\n    });\n}\n// biome-ignore lint/complexity/noBannedTypes: using\nfunction isPlainObject(value) {\n    if (!hasObjectPrototype(value)) {\n        return false;\n    }\n    // If has modified constructor\n    const ctor = value.constructor;\n    if (typeof ctor === 'undefined')\n        return true;\n    // If has modified prototype\n    const prot = ctor.prototype;\n    if (!hasObjectPrototype(prot))\n        return false;\n    // If constructor does not have an Object-specific method\n    // biome-ignore lint/suspicious/noPrototypeBuiltins: using\n    if (!prot.hasOwnProperty('isPrototypeOf'))\n        return false;\n    // Most likely a plain Object\n    return true;\n}\nfunction hasObjectPrototype(o) {\n    return Object.prototype.toString.call(o) === '[object Object]';\n}\nexport function filterQueryOptions(options) {\n    // destructuring is super fast\n    // biome-ignore format: no formatting\n    const { \n    // import('@tanstack/query-core').QueryOptions\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    _defaulted, behavior, gcTime, initialData, initialDataUpdatedAt, maxPages, meta, networkMode, queryFn, queryHash, queryKey, queryKeyHashFn, retry, retryDelay, structuralSharing, \n    // import('@tanstack/query-core').InfiniteQueryObserverOptions\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    getPreviousPageParam, getNextPageParam, initialPageParam, \n    // import('@tanstack/react-query').UseQueryOptions\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    _optimisticResults, enabled, notifyOnChangeProps, placeholderData, refetchInterval, refetchIntervalInBackground, refetchOnMount, refetchOnReconnect, refetchOnWindowFocus, retryOnMount, select, staleTime, suspense, throwOnError, \n    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n    // wagmi\n    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    config, connector, query, ...rest } = options;\n    return rest;\n}\n//# sourceMappingURL=utils.js.map","import { connect, } from '../actions/connect.js';\nexport function connectMutationOptions(config) {\n    return {\n        mutationFn(variables) {\n            return connect(config, variables);\n        },\n        mutationKey: ['connect'],\n    };\n}\n//# sourceMappingURL=connect.js.map","import { disconnect, } from '../actions/disconnect.js';\nexport function disconnectMutationOptions(config) {\n    return {\n        mutationFn(variables) {\n            return disconnect(config, variables);\n        },\n        mutationKey: ['disconnect'],\n    };\n}\n//# sourceMappingURL=disconnect.js.map","import { getBalance, } from '../actions/getBalance.js';\nimport { filterQueryOptions } from './utils.js';\nexport function getBalanceQueryOptions(config, options = {}) {\n    return {\n        async queryFn({ queryKey }) {\n            const { address, scopeKey: _, ...parameters } = queryKey[1];\n            if (!address)\n                throw new Error('address is required');\n            const balance = await getBalance(config, {\n                ...parameters,\n                address,\n            });\n            return balance ?? null;\n        },\n        queryKey: getBalanceQueryKey(options),\n    };\n}\nexport function getBalanceQueryKey(options = {}) {\n    return ['balance', filterQueryOptions(options)];\n}\n//# sourceMappingURL=getBalance.js.map","import { getEnsAvatar, } from '../actions/getEnsAvatar.js';\nimport { filterQueryOptions } from './utils.js';\nexport function getEnsAvatarQueryOptions(config, options = {}) {\n    return {\n        async queryFn({ queryKey }) {\n            const { name, scopeKey: _, ...parameters } = queryKey[1];\n            if (!name)\n                throw new Error('name is required');\n            return getEnsAvatar(config, { ...parameters, name });\n        },\n        queryKey: getEnsAvatarQueryKey(options),\n    };\n}\nexport function getEnsAvatarQueryKey(options = {}) {\n    return ['ensAvatar', filterQueryOptions(options)];\n}\n//# sourceMappingURL=getEnsAvatar.js.map","import { getEnsName, } from '../actions/getEnsName.js';\nimport { filterQueryOptions } from './utils.js';\nexport function getEnsNameQueryOptions(config, options = {}) {\n    return {\n        async queryFn({ queryKey }) {\n            const { address, scopeKey: _, ...parameters } = queryKey[1];\n            if (!address)\n                throw new Error('address is required');\n            return getEnsName(config, { ...parameters, address });\n        },\n        queryKey: getEnsNameQueryKey(options),\n    };\n}\nexport function getEnsNameQueryKey(options = {}) {\n    return ['ensName', filterQueryOptions(options)];\n}\n//# sourceMappingURL=getEnsName.js.map","import { sendTransaction, } from '../actions/sendTransaction.js';\nexport function sendTransactionMutationOptions(config) {\n    return {\n        mutationFn(variables) {\n            return sendTransaction(config, variables);\n        },\n        mutationKey: ['sendTransaction'],\n    };\n}\n//# sourceMappingURL=sendTransaction.js.map","import { signMessage, } from '../actions/signMessage.js';\nexport function signMessageMutationOptions(config) {\n    return {\n        mutationFn(variables) {\n            return signMessage(config, variables);\n        },\n        mutationKey: ['signMessage'],\n    };\n}\n//# sourceMappingURL=signMessage.js.map","import { signTypedData, } from '../actions/signTypedData.js';\nexport function signTypedDataMutationOptions(config) {\n    return {\n        mutationFn(variables) {\n            return signTypedData(config, variables);\n        },\n        mutationKey: ['signTypedData'],\n    };\n}\n//# sourceMappingURL=signTypedData.js.map","import { switchChain, } from '../actions/switchChain.js';\nexport function switchChainMutationOptions(config) {\n    return {\n        mutationFn(variables) {\n            return switchChain(config, variables);\n        },\n        mutationKey: ['switchChain'],\n    };\n}\n//# sourceMappingURL=switchChain.js.map","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","\"use client\";\n\n// src/QueryClientProvider.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nvar QueryClientContext = React.createContext(\n  void 0\n);\nvar useQueryClient = (queryClient) => {\n  const client = React.useContext(QueryClientContext);\n  if (queryClient) {\n    return queryClient;\n  }\n  if (!client) {\n    throw new Error(\"No QueryClient set, use QueryClientProvider to set one\");\n  }\n  return client;\n};\nvar QueryClientProvider = ({\n  client,\n  children\n}) => {\n  React.useEffect(() => {\n    client.mount();\n    return () => {\n      client.unmount();\n    };\n  }, [client]);\n  return /* @__PURE__ */ jsx(QueryClientContext.Provider, { value: client, children });\n};\nexport {\n  QueryClientContext,\n  QueryClientProvider,\n  useQueryClient\n};\n//# sourceMappingURL=QueryClientProvider.js.map","\"use client\";\n\n// src/IsRestoringProvider.ts\nimport * as React from \"react\";\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nvar IsRestoringProvider = IsRestoringContext.Provider;\nexport {\n  IsRestoringProvider,\n  useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map","\"use client\";\n\n// src/QueryErrorResetBoundary.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nfunction createValue() {\n  let isReset = false;\n  return {\n    clearReset: () => {\n      isReset = false;\n    },\n    reset: () => {\n      isReset = true;\n    },\n    isReset: () => {\n      return isReset;\n    }\n  };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nvar QueryErrorResetBoundary = ({\n  children\n}) => {\n  const [value] = React.useState(() => createValue());\n  return /* @__PURE__ */ jsx(QueryErrorResetBoundaryContext.Provider, { value, children: typeof children === \"function\" ? children(value) : children });\n};\nexport {\n  QueryErrorResetBoundary,\n  useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map","\"use client\";\n\n// src/errorBoundaryUtils.ts\nimport * as React from \"react\";\nimport { shouldThrowError } from \"@tanstack/query-core\";\nvar ensurePreventErrorBoundaryRetry = (options, errorResetBoundary) => {\n  if (options.suspense || options.throwOnError || options.experimental_prefetchInRender) {\n    if (!errorResetBoundary.isReset()) {\n      options.retryOnMount = false;\n    }\n  }\n};\nvar useClearResetErrorBoundary = (errorResetBoundary) => {\n  React.useEffect(() => {\n    errorResetBoundary.clearReset();\n  }, [errorResetBoundary]);\n};\nvar getHasError = ({\n  result,\n  errorResetBoundary,\n  throwOnError,\n  query,\n  suspense\n}) => {\n  return result.isError && !errorResetBoundary.isReset() && !result.isFetching && query && (suspense && result.data === void 0 || shouldThrowError(throwOnError, [result.error, query]));\n};\nexport {\n  ensurePreventErrorBoundaryRetry,\n  getHasError,\n  useClearResetErrorBoundary\n};\n//# sourceMappingURL=errorBoundaryUtils.js.map","// src/suspense.ts\nvar defaultThrowOnError = (_error, query) => query.state.data === void 0;\nvar ensureSuspenseTimers = (defaultedOptions) => {\n  if (defaultedOptions.suspense) {\n    const clamp = (value) => value === \"static\" ? value : Math.max(value ?? 1e3, 1e3);\n    const originalStaleTime = defaultedOptions.staleTime;\n    defaultedOptions.staleTime = typeof originalStaleTime === \"function\" ? (...args) => clamp(originalStaleTime(...args)) : clamp(originalStaleTime);\n    if (typeof defaultedOptions.gcTime === \"number\") {\n      defaultedOptions.gcTime = Math.max(defaultedOptions.gcTime, 1e3);\n    }\n  }\n};\nvar willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring;\nvar shouldSuspend = (defaultedOptions, result) => defaultedOptions?.suspense && result.isPending;\nvar fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).catch(() => {\n  errorResetBoundary.clearReset();\n});\nexport {\n  defaultThrowOnError,\n  ensureSuspenseTimers,\n  fetchOptimistic,\n  shouldSuspend,\n  willFetch\n};\n//# sourceMappingURL=suspense.js.map","\"use client\";\n\n// src/useBaseQuery.ts\nimport * as React from \"react\";\nimport { isServer, noop, notifyManager } from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n  ensurePreventErrorBoundaryRetry,\n  getHasError,\n  useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport {\n  ensureSuspenseTimers,\n  fetchOptimistic,\n  shouldSuspend,\n  willFetch\n} from \"./suspense.js\";\nfunction useBaseQuery(options, Observer, queryClient) {\n  if (process.env.NODE_ENV !== \"production\") {\n    if (typeof options !== \"object\" || Array.isArray(options)) {\n      throw new Error(\n        'Bad argument type. Starting with v5, only the \"Object\" form is allowed when calling query related functions. Please use the error stack to find the culprit call. More info here: https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#supports-a-single-signature-one-object'\n      );\n    }\n  }\n  const isRestoring = useIsRestoring();\n  const errorResetBoundary = useQueryErrorResetBoundary();\n  const client = useQueryClient(queryClient);\n  const defaultedOptions = client.defaultQueryOptions(options);\n  client.getDefaultOptions().queries?._experimental_beforeQuery?.(\n    defaultedOptions\n  );\n  if (process.env.NODE_ENV !== \"production\") {\n    if (!defaultedOptions.queryFn) {\n      console.error(\n        `[${defaultedOptions.queryHash}]: No queryFn was passed as an option, and no default queryFn was found. The queryFn parameter is only optional when using a default queryFn. More info here: https://tanstack.com/query/latest/docs/framework/react/guides/default-query-function`\n      );\n    }\n  }\n  defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : \"optimistic\";\n  ensureSuspenseTimers(defaultedOptions);\n  ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary);\n  useClearResetErrorBoundary(errorResetBoundary);\n  const isNewCacheEntry = !client.getQueryCache().get(defaultedOptions.queryHash);\n  const [observer] = React.useState(\n    () => new Observer(\n      client,\n      defaultedOptions\n    )\n  );\n  const result = observer.getOptimisticResult(defaultedOptions);\n  const shouldSubscribe = !isRestoring && options.subscribed !== false;\n  React.useSyncExternalStore(\n    React.useCallback(\n      (onStoreChange) => {\n        const unsubscribe = shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop;\n        observer.updateResult();\n        return unsubscribe;\n      },\n      [observer, shouldSubscribe]\n    ),\n    () => observer.getCurrentResult(),\n    () => observer.getCurrentResult()\n  );\n  React.useEffect(() => {\n    observer.setOptions(defaultedOptions);\n  }, [defaultedOptions, observer]);\n  if (shouldSuspend(defaultedOptions, result)) {\n    throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary);\n  }\n  if (getHasError({\n    result,\n    errorResetBoundary,\n    throwOnError: defaultedOptions.throwOnError,\n    query: client.getQueryCache().get(defaultedOptions.queryHash),\n    suspense: defaultedOptions.suspense\n  })) {\n    throw result.error;\n  }\n  ;\n  client.getDefaultOptions().queries?._experimental_afterQuery?.(\n    defaultedOptions,\n    result\n  );\n  if (defaultedOptions.experimental_prefetchInRender && !isServer && willFetch(result, isRestoring)) {\n    const promise = isNewCacheEntry ? (\n      // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted\n      fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n    ) : (\n      // subscribe to the \"cache promise\" so that we can finalize the currentThenable once data comes in\n      client.getQueryCache().get(defaultedOptions.queryHash)?.promise\n    );\n    promise?.catch(noop).finally(() => {\n      observer.updateResult();\n    });\n  }\n  return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result;\n}\nexport {\n  useBaseQuery\n};\n//# sourceMappingURL=useBaseQuery.js.map","\"use client\";\n\n// src/useQuery.ts\nimport { QueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useQuery(options, queryClient) {\n  return useBaseQuery(options, QueryObserver, queryClient);\n}\nexport {\n  useQuery\n};\n//# sourceMappingURL=useQuery.js.map","\"use client\";\n\n// src/useMutation.ts\nimport * as React from \"react\";\nimport {\n  MutationObserver,\n  noop,\n  notifyManager,\n  shouldThrowError\n} from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nfunction useMutation(options, queryClient) {\n  const client = useQueryClient(queryClient);\n  const [observer] = React.useState(\n    () => new MutationObserver(\n      client,\n      options\n    )\n  );\n  React.useEffect(() => {\n    observer.setOptions(options);\n  }, [observer, options]);\n  const result = React.useSyncExternalStore(\n    React.useCallback(\n      (onStoreChange) => observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n      [observer]\n    ),\n    () => observer.getCurrentResult(),\n    () => observer.getCurrentResult()\n  );\n  const mutate = React.useCallback(\n    (variables, mutateOptions) => {\n      observer.mutate(variables, mutateOptions).catch(noop);\n    },\n    [observer]\n  );\n  if (result.error && shouldThrowError(observer.options.throwOnError, [result.error])) {\n    throw result.error;\n  }\n  return { ...result, mutate, mutateAsync: result.mutate };\n}\nexport {\n  useMutation\n};\n//# sourceMappingURL=useMutation.js.map","import { useInfiniteQuery as tanstack_useInfiniteQuery, useQuery as tanstack_useQuery, useMutation, } from '@tanstack/react-query';\nimport { hashFn } from '@wagmi/core/query';\nexport { useMutation };\n// Adding some basic customization.\n// Ideally we don't have this function, but `import('@tanstack/react-query').useQuery` currently has some quirks where it is super hard to\n// pass down the inferred `initialData` type because of it's discriminated overload in the on `useQuery`.\nexport function useQuery(parameters) {\n    const result = tanstack_useQuery({\n        ...parameters,\n        queryKeyHashFn: hashFn, // for bigint support\n    });\n    result.queryKey = parameters.queryKey;\n    return result;\n}\n// Adding some basic customization.\nexport function useInfiniteQuery(parameters) {\n    const result = tanstack_useInfiniteQuery({\n        ...parameters,\n        queryKeyHashFn: hashFn, // for bigint support\n    });\n    result.queryKey = parameters.queryKey;\n    return result;\n}\n//# sourceMappingURL=query.js.map","'use client';\nimport { getChainId, watchChainId, } from '@wagmi/core';\nimport { useSyncExternalStore } from 'react';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useChainId */\nexport function useChainId(parameters = {}) {\n    const config = useConfig(parameters);\n    return useSyncExternalStore((onChange) => watchChainId(config, { onChange }), () => getChainId(config), () => getChainId(config));\n}\n//# sourceMappingURL=useChainId.js.map","'use client';\nimport { getBalanceQueryOptions, } from '@wagmi/core/query';\nimport { useQuery } from '../utils/query.js';\nimport { useChainId } from './useChainId.js';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useBalance */\nexport function useBalance(parameters = {}) {\n    const { address, query = {} } = parameters;\n    const config = useConfig(parameters);\n    const chainId = useChainId({ config });\n    const options = getBalanceQueryOptions(config, {\n        ...parameters,\n        chainId: parameters.chainId ?? chainId,\n    });\n    const enabled = Boolean(address && (query.enabled ?? true));\n    return useQuery({ ...query, ...options, enabled });\n}\n//# sourceMappingURL=useBalance.js.map","'use client';\nimport { getChains, } from '@wagmi/core';\nimport { watchChains } from '@wagmi/core/internal';\nimport { useSyncExternalStore } from 'react';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useChains */\nexport function useChains(parameters = {}) {\n    const config = useConfig(parameters);\n    return useSyncExternalStore((onChange) => watchChains(config, { onChange }), () => getChains(config), () => getChains(config));\n}\n//# sourceMappingURL=useChains.js.map","'use client';\nimport { getConnectors, watchConnectors, } from '@wagmi/core';\nimport { useSyncExternalStore } from 'react';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useConnectors */\nexport function useConnectors(parameters = {}) {\n    const config = useConfig(parameters);\n    return useSyncExternalStore((onChange) => watchConnectors(config, { onChange }), () => getConnectors(config), () => getConnectors(config));\n}\n//# sourceMappingURL=useConnectors.js.map","'use client';\nimport { useMutation } from '@tanstack/react-query';\nimport { connectMutationOptions, } from '@wagmi/core/query';\nimport { useEffect } from 'react';\nimport { useConfig } from './useConfig.js';\nimport { useConnectors } from './useConnectors.js';\n/** https://wagmi.sh/react/api/hooks/useConnect */\nexport function useConnect(parameters = {}) {\n    const { mutation } = parameters;\n    const config = useConfig(parameters);\n    const mutationOptions = connectMutationOptions(config);\n    const { mutate, mutateAsync, ...result } = useMutation({\n        ...mutation,\n        ...mutationOptions,\n    });\n    // Reset mutation back to an idle state when the connector disconnects.\n    useEffect(() => {\n        return config.subscribe(({ status }) => status, (status, previousStatus) => {\n            if (previousStatus === 'connected' && status === 'disconnected')\n                result.reset();\n        });\n    }, [config, result.reset]);\n    return {\n        ...result,\n        connect: mutate,\n        connectAsync: mutateAsync,\n        connectors: useConnectors({ config }),\n    };\n}\n//# sourceMappingURL=useConnect.js.map","'use client';\nimport { getConnections, watchConnections, } from '@wagmi/core';\nimport { useSyncExternalStore } from 'react';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useConnections */\nexport function useConnections(parameters = {}) {\n    const config = useConfig(parameters);\n    return useSyncExternalStore((onChange) => watchConnections(config, { onChange }), () => getConnections(config), () => getConnections(config));\n}\n//# sourceMappingURL=useConnections.js.map","'use client';\nimport { useMutation } from '@tanstack/react-query';\nimport { disconnectMutationOptions, } from '@wagmi/core/query';\nimport { useConfig } from './useConfig.js';\nimport { useConnections } from './useConnections.js';\n/** https://wagmi.sh/react/api/hooks/useDisconnect */\nexport function useDisconnect(parameters = {}) {\n    const { mutation } = parameters;\n    const config = useConfig(parameters);\n    const mutationOptions = disconnectMutationOptions(config);\n    const { mutate, mutateAsync, ...result } = useMutation({\n        ...mutation,\n        ...mutationOptions,\n    });\n    return {\n        ...result,\n        connectors: useConnections({ config }).map((connection) => connection.connector),\n        disconnect: mutate,\n        disconnectAsync: mutateAsync,\n    };\n}\n//# sourceMappingURL=useDisconnect.js.map","'use client';\nimport { getEnsAvatarQueryOptions, } from '@wagmi/core/query';\nimport { useQuery } from '../utils/query.js';\nimport { useChainId } from './useChainId.js';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useEnsAvatar */\nexport function useEnsAvatar(parameters = {}) {\n    const { name, query = {} } = parameters;\n    const config = useConfig(parameters);\n    const chainId = useChainId({ config });\n    const options = getEnsAvatarQueryOptions(config, {\n        ...parameters,\n        chainId: parameters.chainId ?? chainId,\n    });\n    const enabled = Boolean(name && (query.enabled ?? true));\n    return useQuery({ ...query, ...options, enabled });\n}\n//# sourceMappingURL=useEnsAvatar.js.map","'use client';\nimport { getEnsNameQueryOptions, } from '@wagmi/core/query';\nimport { useQuery } from '../utils/query.js';\nimport { useChainId } from './useChainId.js';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useEnsName */\nexport function useEnsName(parameters = {}) {\n    const { address, query = {} } = parameters;\n    const config = useConfig(parameters);\n    const chainId = useChainId({ config });\n    const options = getEnsNameQueryOptions(config, {\n        ...parameters,\n        chainId: parameters.chainId ?? chainId,\n    });\n    const enabled = Boolean(address && (query.enabled ?? true));\n    return useQuery({ ...query, ...options, enabled });\n}\n//# sourceMappingURL=useEnsName.js.map","'use client';\nimport { useMutation } from '@tanstack/react-query';\nimport { sendTransactionMutationOptions, } from '@wagmi/core/query';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useSendTransaction */\nexport function useSendTransaction(parameters = {}) {\n    const { mutation } = parameters;\n    const config = useConfig(parameters);\n    const mutationOptions = sendTransactionMutationOptions(config);\n    const { mutate, mutateAsync, ...result } = useMutation({\n        ...mutation,\n        ...mutationOptions,\n    });\n    return {\n        ...result,\n        sendTransaction: mutate,\n        sendTransactionAsync: mutateAsync,\n    };\n}\n//# sourceMappingURL=useSendTransaction.js.map","'use client';\nimport { useMutation } from '@tanstack/react-query';\nimport { signMessageMutationOptions, } from '@wagmi/core/query';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useSignMessage */\nexport function useSignMessage(parameters = {}) {\n    const { mutation } = parameters;\n    const config = useConfig(parameters);\n    const mutationOptions = signMessageMutationOptions(config);\n    const { mutate, mutateAsync, ...result } = useMutation({\n        ...mutation,\n        ...mutationOptions,\n    });\n    return {\n        ...result,\n        signMessage: mutate,\n        signMessageAsync: mutateAsync,\n    };\n}\n//# sourceMappingURL=useSignMessage.js.map","'use client';\nimport { useMutation } from '@tanstack/react-query';\nimport { signTypedDataMutationOptions, } from '@wagmi/core/query';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useSignTypedData */\nexport function useSignTypedData(parameters = {}) {\n    const { mutation } = parameters;\n    const config = useConfig(parameters);\n    const mutationOptions = signTypedDataMutationOptions(config);\n    const { mutate, mutateAsync, ...result } = useMutation({\n        ...mutation,\n        ...mutationOptions,\n    });\n    return {\n        ...result,\n        signTypedData: mutate,\n        signTypedDataAsync: mutateAsync,\n    };\n}\n//# sourceMappingURL=useSignTypedData.js.map","'use client';\nimport { useMutation } from '@tanstack/react-query';\nimport { switchChainMutationOptions, } from '@wagmi/core/query';\nimport { useChains } from './useChains.js';\nimport { useConfig } from './useConfig.js';\n/** https://wagmi.sh/react/api/hooks/useSwitchChain */\nexport function useSwitchChain(parameters = {}) {\n    const { mutation } = parameters;\n    const config = useConfig(parameters);\n    const mutationOptions = switchChainMutationOptions(config);\n    const { mutate, mutateAsync, ...result } = useMutation({\n        ...mutation,\n        ...mutationOptions,\n    });\n    return {\n        ...result,\n        chains: useChains({ config }),\n        switchChain: mutate,\n        switchChainAsync: mutateAsync,\n    };\n}\n//# sourceMappingURL=useSwitchChain.js.map","/**\n * Predeploy contracts for OP Stack.\n * @see https://github.com/ethereum-optimism/optimism/blob/develop/specs/predeploys.md\n */\nexport const contracts = {\n    gasPriceOracle: { address: '0x420000000000000000000000000000000000000F' },\n    l1Block: { address: '0x4200000000000000000000000000000000000015' },\n    l2CrossDomainMessenger: {\n        address: '0x4200000000000000000000000000000000000007',\n    },\n    l2Erc721Bridge: { address: '0x4200000000000000000000000000000000000014' },\n    l2StandardBridge: { address: '0x4200000000000000000000000000000000000010' },\n    l2ToL1MessagePasser: {\n        address: '0x4200000000000000000000000000000000000016',\n    },\n};\n//# sourceMappingURL=contracts.js.map","import { hexToBigInt } from '../utils/encoding/fromHex.js';\nimport { defineBlock } from '../utils/formatters/block.js';\nimport { defineTransaction, formatTransaction, } from '../utils/formatters/transaction.js';\nimport { defineTransactionReceipt } from '../utils/formatters/transactionReceipt.js';\nexport const formatters = {\n    block: /*#__PURE__*/ defineBlock({\n        format(args) {\n            const transactions = args.transactions?.map((transaction) => {\n                if (typeof transaction === 'string')\n                    return transaction;\n                const formatted = formatTransaction(transaction);\n                if (formatted.typeHex === '0x7e') {\n                    formatted.isSystemTx = transaction.isSystemTx;\n                    formatted.mint = transaction.mint\n                        ? hexToBigInt(transaction.mint)\n                        : undefined;\n                    formatted.sourceHash = transaction.sourceHash;\n                    formatted.type = 'deposit';\n                }\n                return formatted;\n            });\n            return {\n                transactions,\n                stateRoot: args.stateRoot,\n            };\n        },\n    }),\n    transaction: /*#__PURE__*/ defineTransaction({\n        format(args) {\n            const transaction = {};\n            if (args.type === '0x7e') {\n                transaction.isSystemTx = args.isSystemTx;\n                transaction.mint = args.mint ? hexToBigInt(args.mint) : undefined;\n                transaction.sourceHash = args.sourceHash;\n                transaction.type = 'deposit';\n            }\n            return transaction;\n        },\n    }),\n    transactionReceipt: /*#__PURE__*/ defineTransactionReceipt({\n        format(args) {\n            return {\n                l1GasPrice: args.l1GasPrice ? hexToBigInt(args.l1GasPrice) : null,\n                l1GasUsed: args.l1GasUsed ? hexToBigInt(args.l1GasUsed) : null,\n                l1Fee: args.l1Fee ? hexToBigInt(args.l1Fee) : null,\n                l1FeeScalar: args.l1FeeScalar ? Number(args.l1FeeScalar) : null,\n            };\n        },\n    }),\n};\n//# sourceMappingURL=formatters.js.map","import { InvalidAddressError } from '../errors/address.js';\nimport { isAddress } from '../utils/address/isAddress.js';\nimport { concatHex } from '../utils/data/concat.js';\nimport { toHex } from '../utils/encoding/toHex.js';\nimport { toRlp } from '../utils/encoding/toRlp.js';\nimport { serializeTransaction as serializeTransaction_, } from '../utils/transaction/serializeTransaction.js';\nexport function serializeTransaction(transaction, signature) {\n    if (isDeposit(transaction))\n        return serializeTransactionDeposit(transaction);\n    return serializeTransaction_(transaction, signature);\n}\nexport const serializers = {\n    transaction: serializeTransaction,\n};\nfunction serializeTransactionDeposit(transaction) {\n    assertTransactionDeposit(transaction);\n    const { sourceHash, data, from, gas, isSystemTx, mint, to, value } = transaction;\n    const serializedTransaction = [\n        sourceHash,\n        from,\n        to ?? '0x',\n        mint ? toHex(mint) : '0x',\n        value ? toHex(value) : '0x',\n        gas ? toHex(gas) : '0x',\n        isSystemTx ? '0x1' : '0x',\n        data ?? '0x',\n    ];\n    return concatHex([\n        '0x7e',\n        toRlp(serializedTransaction),\n    ]);\n}\nfunction isDeposit(transaction) {\n    if (transaction.type === 'deposit')\n        return true;\n    if (typeof transaction.sourceHash !== 'undefined')\n        return true;\n    return false;\n}\nexport function assertTransactionDeposit(transaction) {\n    const { from, to } = transaction;\n    if (from && !isAddress(from))\n        throw new InvalidAddressError({ address: from });\n    if (to && !isAddress(to))\n        throw new InvalidAddressError({ address: to });\n}\n//# sourceMappingURL=serializers.js.map","import { contracts } from './contracts.js';\nimport { formatters } from './formatters.js';\nimport { serializers } from './serializers.js';\nexport const chainConfig = {\n    blockTime: 2_000,\n    contracts,\n    formatters,\n    serializers,\n};\n//# sourceMappingURL=chainConfig.js.map","import { defineChain } from '../../utils/chain/defineChain.js';\nexport const arbitrum = /*#__PURE__*/ defineChain({\n    id: 42_161,\n    name: 'Arbitrum One',\n    nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n    blockTime: 250,\n    rpcUrls: {\n        default: {\n            http: ['https://arb1.arbitrum.io/rpc'],\n        },\n    },\n    blockExplorers: {\n        default: {\n            name: 'Arbiscan',\n            url: 'https://arbiscan.io',\n            apiUrl: 'https://api.arbiscan.io/api',\n        },\n    },\n    contracts: {\n        multicall3: {\n            address: '0xca11bde05977b3631167028862be2a173976ca11',\n            blockCreated: 7654707,\n        },\n    },\n});\n//# sourceMappingURL=arbitrum.js.map","import { defineChain } from '../../utils/chain/defineChain.js';\nexport const avalanche = /*#__PURE__*/ defineChain({\n    id: 43_114,\n    name: 'Avalanche',\n    nativeCurrency: {\n        decimals: 18,\n        name: 'Avalanche',\n        symbol: 'AVAX',\n    },\n    rpcUrls: {\n        default: { http: ['https://api.avax.network/ext/bc/C/rpc'] },\n    },\n    blockExplorers: {\n        default: {\n            name: 'SnowTrace',\n            url: 'https://snowtrace.io',\n            apiUrl: 'https://api.snowtrace.io',\n        },\n    },\n    contracts: {\n        multicall3: {\n            address: '0xca11bde05977b3631167028862be2a173976ca11',\n            blockCreated: 11907934,\n        },\n    },\n});\n//# sourceMappingURL=avalanche.js.map","import { chainConfig } from '../../op-stack/chainConfig.js';\nimport { defineChain } from '../../utils/chain/defineChain.js';\nconst sourceId = 1; // mainnet\nexport const base = /*#__PURE__*/ defineChain({\n    ...chainConfig,\n    id: 8453,\n    name: 'Base',\n    nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n    rpcUrls: {\n        default: {\n            http: ['https://mainnet.base.org'],\n        },\n    },\n    blockExplorers: {\n        default: {\n            name: 'Basescan',\n            url: 'https://basescan.org',\n            apiUrl: 'https://api.basescan.org/api',\n        },\n    },\n    contracts: {\n        ...chainConfig.contracts,\n        disputeGameFactory: {\n            [sourceId]: {\n                address: '0x43edB88C4B80fDD2AdFF2412A7BebF9dF42cB40e',\n            },\n        },\n        l2OutputOracle: {\n            [sourceId]: {\n                address: '0x56315b90c40730925ec5485cf004d835058518A0',\n            },\n        },\n        multicall3: {\n            address: '0xca11bde05977b3631167028862be2a173976ca11',\n            blockCreated: 5022,\n        },\n        portal: {\n            [sourceId]: {\n                address: '0x49048044D57e1C92A77f79988d21Fa8fAF74E97e',\n                blockCreated: 17482143,\n            },\n        },\n        l1StandardBridge: {\n            [sourceId]: {\n                address: '0x3154Cf16ccdb4C6d922629664174b904d80F2C35',\n                blockCreated: 17482143,\n            },\n        },\n    },\n    sourceId,\n});\nexport const basePreconf = /*#__PURE__*/ defineChain({\n    ...base,\n    experimental_preconfirmationTime: 200,\n    rpcUrls: {\n        default: {\n            http: ['https://mainnet-preconf.base.org'],\n        },\n    },\n});\n//# sourceMappingURL=base.js.map","import { defineChain } from '../../utils/chain/defineChain.js';\nexport const bsc = /*#__PURE__*/ defineChain({\n    id: 56,\n    name: 'BNB Smart Chain',\n    nativeCurrency: {\n        decimals: 18,\n        name: 'BNB',\n        symbol: 'BNB',\n    },\n    rpcUrls: {\n        default: { http: ['https://56.rpc.thirdweb.com'] },\n    },\n    blockExplorers: {\n        default: {\n            name: 'BscScan',\n            url: 'https://bscscan.com',\n            apiUrl: 'https://api.bscscan.com/api',\n        },\n    },\n    contracts: {\n        multicall3: {\n            address: '0xca11bde05977b3631167028862be2a173976ca11',\n            blockCreated: 15921452,\n        },\n    },\n});\n//# sourceMappingURL=bsc.js.map","import { defineChain } from '../../utils/chain/defineChain.js';\nexport const cronos = /*#__PURE__*/ defineChain({\n    id: 25,\n    name: 'Cronos Mainnet',\n    nativeCurrency: {\n        decimals: 18,\n        name: 'Cronos',\n        symbol: 'CRO',\n    },\n    rpcUrls: {\n        default: { http: ['https://evm.cronos.org'] },\n    },\n    blockExplorers: {\n        default: {\n            name: 'Cronos Explorer',\n            url: 'https://explorer.cronos.org',\n            apiUrl: 'https://explorer-api.cronos.org/mainnet/api',\n        },\n    },\n    contracts: {\n        multicall3: {\n            address: '0xcA11bde05977b3631167028862bE2a173976CA11',\n            blockCreated: 1963112,\n        },\n    },\n});\n//# sourceMappingURL=cronos.js.map","import { defineChain } from '../../utils/chain/defineChain.js';\nexport const fantom = /*#__PURE__*/ defineChain({\n    id: 250,\n    name: 'Fantom',\n    nativeCurrency: {\n        decimals: 18,\n        name: 'Fantom',\n        symbol: 'FTM',\n    },\n    rpcUrls: {\n        default: { http: ['https://250.rpc.thirdweb.com'] },\n    },\n    blockExplorers: {\n        default: {\n            name: 'FTMScan',\n            url: 'https://ftmscan.com',\n            apiUrl: 'https://api.ftmscan.com/api',\n        },\n    },\n    contracts: {\n        multicall3: {\n            address: '0xca11bde05977b3631167028862be2a173976ca11',\n            blockCreated: 33001987,\n        },\n    },\n});\n//# sourceMappingURL=fantom.js.map","import { defineChain } from '../../utils/chain/defineChain.js';\nexport const gnosis = /*#__PURE__*/ defineChain({\n    id: 100,\n    name: 'Gnosis',\n    nativeCurrency: {\n        decimals: 18,\n        name: 'xDAI',\n        symbol: 'XDAI',\n    },\n    rpcUrls: {\n        default: {\n            http: ['https://rpc.gnosischain.com'],\n            webSocket: ['wss://rpc.gnosischain.com/wss'],\n        },\n    },\n    blockExplorers: {\n        default: {\n            name: 'Gnosisscan',\n            url: 'https://gnosisscan.io',\n            apiUrl: 'https://api.gnosisscan.io/api',\n        },\n    },\n    contracts: {\n        multicall3: {\n            address: '0xca11bde05977b3631167028862be2a173976ca11',\n            blockCreated: 21022491,\n        },\n    },\n});\n//# sourceMappingURL=gnosis.js.map","import { defineChain } from '../../utils/chain/defineChain.js';\nexport const mainnet = /*#__PURE__*/ defineChain({\n    id: 1,\n    name: 'Ethereum',\n    nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n    rpcUrls: {\n        default: {\n            http: ['https://eth.merkle.io'],\n        },\n    },\n    blockExplorers: {\n        default: {\n            name: 'Etherscan',\n            url: 'https://etherscan.io',\n            apiUrl: 'https://api.etherscan.io/api',\n        },\n    },\n    contracts: {\n        ensRegistry: {\n            address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n        },\n        ensUniversalResolver: {\n            address: '0xce01f8eee7E479C928F8919abD53E553a36CeF67',\n            blockCreated: 19_258_213,\n        },\n        multicall3: {\n            address: '0xca11bde05977b3631167028862be2a173976ca11',\n            blockCreated: 14_353_601,\n        },\n    },\n});\n//# sourceMappingURL=mainnet.js.map","import { chainConfig } from '../../op-stack/chainConfig.js';\nimport { defineChain } from '../../utils/chain/defineChain.js';\nconst sourceId = 1; // mainnet\nexport const optimism = /*#__PURE__*/ defineChain({\n    ...chainConfig,\n    id: 10,\n    name: 'OP Mainnet',\n    nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n    rpcUrls: {\n        default: {\n            http: ['https://mainnet.optimism.io'],\n        },\n    },\n    blockExplorers: {\n        default: {\n            name: 'Optimism Explorer',\n            url: 'https://optimistic.etherscan.io',\n            apiUrl: 'https://api-optimistic.etherscan.io/api',\n        },\n    },\n    contracts: {\n        ...chainConfig.contracts,\n        disputeGameFactory: {\n            [sourceId]: {\n                address: '0xe5965Ab5962eDc7477C8520243A95517CD252fA9',\n            },\n        },\n        l2OutputOracle: {\n            [sourceId]: {\n                address: '0xdfe97868233d1aa22e815a266982f2cf17685a27',\n            },\n        },\n        multicall3: {\n            address: '0xca11bde05977b3631167028862be2a173976ca11',\n            blockCreated: 4286263,\n        },\n        portal: {\n            [sourceId]: {\n                address: '0xbEb5Fc579115071764c7423A4f12eDde41f106Ed',\n            },\n        },\n        l1StandardBridge: {\n            [sourceId]: {\n                address: '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1',\n            },\n        },\n    },\n    sourceId,\n});\n//# sourceMappingURL=optimism.js.map","import { defineChain } from '../../utils/chain/defineChain.js';\nexport const polygon = /*#__PURE__*/ defineChain({\n    id: 137,\n    name: 'Polygon',\n    nativeCurrency: { name: 'POL', symbol: 'POL', decimals: 18 },\n    rpcUrls: {\n        default: {\n            http: ['https://polygon-rpc.com'],\n        },\n    },\n    blockExplorers: {\n        default: {\n            name: 'PolygonScan',\n            url: 'https://polygonscan.com',\n            apiUrl: 'https://api.polygonscan.com/api',\n        },\n    },\n    contracts: {\n        multicall3: {\n            address: '0xca11bde05977b3631167028862be2a173976ca11',\n            blockCreated: 25770160,\n        },\n    },\n});\n//# sourceMappingURL=polygon.js.map","import { ChainNotConfiguredError, createConnector, } from '@wagmi/core';\nimport { getAddress, numberToHex, SwitchChainError, UserRejectedRequestError, } from 'viem';\ncoinbaseWallet.type = 'coinbaseWallet';\nexport function coinbaseWallet(parameters = {}) {\n    if (parameters.version === '3' || parameters.headlessMode)\n        return version3(parameters);\n    return version4(parameters);\n}\nfunction version4(parameters) {\n    let walletProvider;\n    let accountsChanged;\n    let chainChanged;\n    let disconnect;\n    return createConnector((config) => ({\n        id: 'coinbaseWalletSDK',\n        name: 'Coinbase Wallet',\n        rdns: 'com.coinbase.wallet',\n        type: coinbaseWallet.type,\n        async connect({ chainId, ...rest } = {}) {\n            try {\n                const provider = await this.getProvider();\n                const accounts = (await provider.request({\n                    method: 'eth_requestAccounts',\n                    params: 'instantOnboarding' in rest && rest.instantOnboarding\n                        ? [{ onboarding: 'instant' }]\n                        : [],\n                })).map((x) => getAddress(x));\n                if (!accountsChanged) {\n                    accountsChanged = this.onAccountsChanged.bind(this);\n                    provider.on('accountsChanged', accountsChanged);\n                }\n                if (!chainChanged) {\n                    chainChanged = this.onChainChanged.bind(this);\n                    provider.on('chainChanged', chainChanged);\n                }\n                if (!disconnect) {\n                    disconnect = this.onDisconnect.bind(this);\n                    provider.on('disconnect', disconnect);\n                }\n                // Switch to chain if provided\n                let currentChainId = await this.getChainId();\n                if (chainId && currentChainId !== chainId) {\n                    const chain = await this.switchChain({ chainId }).catch((error) => {\n                        if (error.code === UserRejectedRequestError.code)\n                            throw error;\n                        return { id: currentChainId };\n                    });\n                    currentChainId = chain?.id ?? currentChainId;\n                }\n                return { accounts, chainId: currentChainId };\n            }\n            catch (error) {\n                if (/(user closed modal|accounts received is empty|user denied account|request rejected)/i.test(error.message))\n                    throw new UserRejectedRequestError(error);\n                throw error;\n            }\n        },\n        async disconnect() {\n            const provider = await this.getProvider();\n            if (accountsChanged) {\n                provider.removeListener('accountsChanged', accountsChanged);\n                accountsChanged = undefined;\n            }\n            if (chainChanged) {\n                provider.removeListener('chainChanged', chainChanged);\n                chainChanged = undefined;\n            }\n            if (disconnect) {\n                provider.removeListener('disconnect', disconnect);\n                disconnect = undefined;\n            }\n            provider.disconnect();\n            provider.close?.();\n        },\n        async getAccounts() {\n            const provider = await this.getProvider();\n            return (await provider.request({\n                method: 'eth_accounts',\n            })).map((x) => getAddress(x));\n        },\n        async getChainId() {\n            const provider = await this.getProvider();\n            const chainId = (await provider.request({\n                method: 'eth_chainId',\n            }));\n            return Number(chainId);\n        },\n        async getProvider() {\n            if (!walletProvider) {\n                const preference = (() => {\n                    if (typeof parameters.preference === 'string')\n                        return { options: parameters.preference };\n                    return {\n                        ...parameters.preference,\n                        options: parameters.preference?.options ?? 'all',\n                    };\n                })();\n                const { createCoinbaseWalletSDK } = await import('@coinbase/wallet-sdk');\n                const sdk = createCoinbaseWalletSDK({\n                    ...parameters,\n                    appChainIds: config.chains.map((x) => x.id),\n                    preference,\n                });\n                walletProvider = sdk.getProvider();\n            }\n            return walletProvider;\n        },\n        async isAuthorized() {\n            try {\n                const accounts = await this.getAccounts();\n                return !!accounts.length;\n            }\n            catch {\n                return false;\n            }\n        },\n        async switchChain({ addEthereumChainParameter, chainId }) {\n            const chain = config.chains.find((chain) => chain.id === chainId);\n            if (!chain)\n                throw new SwitchChainError(new ChainNotConfiguredError());\n            const provider = await this.getProvider();\n            try {\n                await provider.request({\n                    method: 'wallet_switchEthereumChain',\n                    params: [{ chainId: numberToHex(chain.id) }],\n                });\n                return chain;\n            }\n            catch (error) {\n                // Indicates chain is not added to provider\n                if (error.code === 4902) {\n                    try {\n                        let blockExplorerUrls;\n                        if (addEthereumChainParameter?.blockExplorerUrls)\n                            blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls;\n                        else\n                            blockExplorerUrls = chain.blockExplorers?.default.url\n                                ? [chain.blockExplorers?.default.url]\n                                : [];\n                        let rpcUrls;\n                        if (addEthereumChainParameter?.rpcUrls?.length)\n                            rpcUrls = addEthereumChainParameter.rpcUrls;\n                        else\n                            rpcUrls = [chain.rpcUrls.default?.http[0] ?? ''];\n                        const addEthereumChain = {\n                            blockExplorerUrls,\n                            chainId: numberToHex(chainId),\n                            chainName: addEthereumChainParameter?.chainName ?? chain.name,\n                            iconUrls: addEthereumChainParameter?.iconUrls,\n                            nativeCurrency: addEthereumChainParameter?.nativeCurrency ??\n                                chain.nativeCurrency,\n                            rpcUrls,\n                        };\n                        await provider.request({\n                            method: 'wallet_addEthereumChain',\n                            params: [addEthereumChain],\n                        });\n                        return chain;\n                    }\n                    catch (error) {\n                        throw new UserRejectedRequestError(error);\n                    }\n                }\n                throw new SwitchChainError(error);\n            }\n        },\n        onAccountsChanged(accounts) {\n            if (accounts.length === 0)\n                this.onDisconnect();\n            else\n                config.emitter.emit('change', {\n                    accounts: accounts.map((x) => getAddress(x)),\n                });\n        },\n        onChainChanged(chain) {\n            const chainId = Number(chain);\n            config.emitter.emit('change', { chainId });\n        },\n        async onDisconnect(_error) {\n            config.emitter.emit('disconnect');\n            const provider = await this.getProvider();\n            if (accountsChanged) {\n                provider.removeListener('accountsChanged', accountsChanged);\n                accountsChanged = undefined;\n            }\n            if (chainChanged) {\n                provider.removeListener('chainChanged', chainChanged);\n                chainChanged = undefined;\n            }\n            if (disconnect) {\n                provider.removeListener('disconnect', disconnect);\n                disconnect = undefined;\n            }\n        },\n    }));\n}\nfunction version3(parameters) {\n    const reloadOnDisconnect = false;\n    let sdk;\n    let walletProvider;\n    let accountsChanged;\n    let chainChanged;\n    let disconnect;\n    return createConnector((config) => ({\n        id: 'coinbaseWalletSDK',\n        name: 'Coinbase Wallet',\n        rdns: 'com.coinbase.wallet',\n        type: coinbaseWallet.type,\n        async connect({ chainId } = {}) {\n            try {\n                const provider = await this.getProvider();\n                const accounts = (await provider.request({\n                    method: 'eth_requestAccounts',\n                })).map((x) => getAddress(x));\n                if (!accountsChanged) {\n                    accountsChanged = this.onAccountsChanged.bind(this);\n                    provider.on('accountsChanged', accountsChanged);\n                }\n                if (!chainChanged) {\n                    chainChanged = this.onChainChanged.bind(this);\n                    provider.on('chainChanged', chainChanged);\n                }\n                if (!disconnect) {\n                    disconnect = this.onDisconnect.bind(this);\n                    provider.on('disconnect', disconnect);\n                }\n                // Switch to chain if provided\n                let currentChainId = await this.getChainId();\n                if (chainId && currentChainId !== chainId) {\n                    const chain = await this.switchChain({ chainId }).catch((error) => {\n                        if (error.code === UserRejectedRequestError.code)\n                            throw error;\n                        return { id: currentChainId };\n                    });\n                    currentChainId = chain?.id ?? currentChainId;\n                }\n                return { accounts, chainId: currentChainId };\n            }\n            catch (error) {\n                if (/(user closed modal|accounts received is empty|user denied account)/i.test(error.message))\n                    throw new UserRejectedRequestError(error);\n                throw error;\n            }\n        },\n        async disconnect() {\n            const provider = await this.getProvider();\n            if (accountsChanged) {\n                provider.removeListener('accountsChanged', accountsChanged);\n                accountsChanged = undefined;\n            }\n            if (chainChanged) {\n                provider.removeListener('chainChanged', chainChanged);\n                chainChanged = undefined;\n            }\n            if (disconnect) {\n                provider.removeListener('disconnect', disconnect);\n                disconnect = undefined;\n            }\n            provider.disconnect();\n            provider.close();\n        },\n        async getAccounts() {\n            const provider = await this.getProvider();\n            return (await provider.request({\n                method: 'eth_accounts',\n            })).map((x) => getAddress(x));\n        },\n        async getChainId() {\n            const provider = await this.getProvider();\n            const chainId = await provider.request({\n                method: 'eth_chainId',\n            });\n            return Number(chainId);\n        },\n        async getProvider() {\n            if (!walletProvider) {\n                // Unwrapping import for Vite compatibility.\n                // See: https://github.com/vitejs/vite/issues/9703\n                const CoinbaseWalletSDK = await (async () => {\n                    const { default: SDK } = await import('cbw-sdk');\n                    if (typeof SDK !== 'function' && typeof SDK.default === 'function')\n                        return SDK.default;\n                    return SDK;\n                })();\n                sdk = new CoinbaseWalletSDK({ ...parameters, reloadOnDisconnect });\n                // Force types to retrieve private `walletExtension` method from the Coinbase Wallet SDK.\n                const walletExtensionChainId = sdk.walletExtension?.getChainId();\n                const chain = config.chains.find((chain) => parameters.chainId\n                    ? chain.id === parameters.chainId\n                    : chain.id === walletExtensionChainId) || config.chains[0];\n                const chainId = parameters.chainId || chain?.id;\n                const jsonRpcUrl = parameters.jsonRpcUrl || chain?.rpcUrls.default.http[0];\n                walletProvider = sdk.makeWeb3Provider(jsonRpcUrl, chainId);\n            }\n            return walletProvider;\n        },\n        async isAuthorized() {\n            try {\n                const accounts = await this.getAccounts();\n                return !!accounts.length;\n            }\n            catch {\n                return false;\n            }\n        },\n        async switchChain({ addEthereumChainParameter, chainId }) {\n            const chain = config.chains.find((chain) => chain.id === chainId);\n            if (!chain)\n                throw new SwitchChainError(new ChainNotConfiguredError());\n            const provider = await this.getProvider();\n            try {\n                await provider.request({\n                    method: 'wallet_switchEthereumChain',\n                    params: [{ chainId: numberToHex(chain.id) }],\n                });\n                return chain;\n            }\n            catch (error) {\n                // Indicates chain is not added to provider\n                if (error.code === 4902) {\n                    try {\n                        let blockExplorerUrls;\n                        if (addEthereumChainParameter?.blockExplorerUrls)\n                            blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls;\n                        else\n                            blockExplorerUrls = chain.blockExplorers?.default.url\n                                ? [chain.blockExplorers?.default.url]\n                                : [];\n                        let rpcUrls;\n                        if (addEthereumChainParameter?.rpcUrls?.length)\n                            rpcUrls = addEthereumChainParameter.rpcUrls;\n                        else\n                            rpcUrls = [chain.rpcUrls.default?.http[0] ?? ''];\n                        const addEthereumChain = {\n                            blockExplorerUrls,\n                            chainId: numberToHex(chainId),\n                            chainName: addEthereumChainParameter?.chainName ?? chain.name,\n                            iconUrls: addEthereumChainParameter?.iconUrls,\n                            nativeCurrency: addEthereumChainParameter?.nativeCurrency ??\n                                chain.nativeCurrency,\n                            rpcUrls,\n                        };\n                        await provider.request({\n                            method: 'wallet_addEthereumChain',\n                            params: [addEthereumChain],\n                        });\n                        return chain;\n                    }\n                    catch (error) {\n                        throw new UserRejectedRequestError(error);\n                    }\n                }\n                throw new SwitchChainError(error);\n            }\n        },\n        onAccountsChanged(accounts) {\n            if (accounts.length === 0)\n                this.onDisconnect();\n            else\n                config.emitter.emit('change', {\n                    accounts: accounts.map((x) => getAddress(x)),\n                });\n        },\n        onChainChanged(chain) {\n            const chainId = Number(chain);\n            config.emitter.emit('change', { chainId });\n        },\n        async onDisconnect(_error) {\n            config.emitter.emit('disconnect');\n            const provider = await this.getProvider();\n            if (accountsChanged) {\n                provider.removeListener('accountsChanged', accountsChanged);\n                accountsChanged = undefined;\n            }\n            if (chainChanged) {\n                provider.removeListener('chainChanged', chainChanged);\n                chainChanged = undefined;\n            }\n            if (disconnect) {\n                provider.removeListener('disconnect', disconnect);\n                disconnect = undefined;\n            }\n        },\n    }));\n}\n//# sourceMappingURL=coinbaseWallet.js.map","import { ChainNotConfiguredError, createConnector, extractRpcUrls, ProviderNotFoundError, } from '@wagmi/core';\nimport { getAddress, hexToNumber, numberToHex, ResourceUnavailableRpcError, SwitchChainError, UserRejectedRequestError, withRetry, withTimeout, } from 'viem';\nmetaMask.type = 'metaMask';\nexport function metaMask(parameters = {}) {\n    let sdk;\n    let provider;\n    let providerPromise;\n    let accountsChanged;\n    let chainChanged;\n    let connect;\n    let displayUri;\n    let disconnect;\n    return createConnector((config) => ({\n        id: 'metaMaskSDK',\n        name: 'MetaMask',\n        rdns: ['io.metamask', 'io.metamask.mobile'],\n        type: metaMask.type,\n        async setup() {\n            const provider = await this.getProvider();\n            if (provider?.on) {\n                if (!connect) {\n                    connect = this.onConnect.bind(this);\n                    provider.on('connect', connect);\n                }\n                // We shouldn't need to listen for `'accountsChanged'` here since the `'connect'` event should suffice (and wallet shouldn't be connected yet).\n                // Some wallets, like MetaMask, do not implement the `'connect'` event and overload `'accountsChanged'` instead.\n                if (!accountsChanged) {\n                    accountsChanged = this.onAccountsChanged.bind(this);\n                    provider.on('accountsChanged', accountsChanged);\n                }\n            }\n        },\n        async connect({ chainId, isReconnecting } = {}) {\n            const provider = await this.getProvider();\n            if (!displayUri) {\n                displayUri = this.onDisplayUri;\n                provider.on('display_uri', displayUri);\n            }\n            let accounts = [];\n            if (isReconnecting)\n                accounts = await this.getAccounts().catch(() => []);\n            try {\n                let signResponse;\n                let connectWithResponse;\n                if (!accounts?.length) {\n                    if (parameters.connectAndSign || parameters.connectWith) {\n                        if (parameters.connectAndSign)\n                            signResponse = await sdk.connectAndSign({\n                                msg: parameters.connectAndSign,\n                            });\n                        else if (parameters.connectWith)\n                            connectWithResponse = await sdk.connectWith({\n                                method: parameters.connectWith.method,\n                                params: parameters.connectWith.params,\n                            });\n                        accounts = await this.getAccounts();\n                    }\n                    else {\n                        const requestedAccounts = (await sdk.connect());\n                        accounts = requestedAccounts.map((x) => getAddress(x));\n                    }\n                }\n                // Switch to chain if provided\n                let currentChainId = (await this.getChainId());\n                if (chainId && currentChainId !== chainId) {\n                    const chain = await this.switchChain({ chainId }).catch((error) => {\n                        if (error.code === UserRejectedRequestError.code)\n                            throw error;\n                        return { id: currentChainId };\n                    });\n                    currentChainId = chain?.id ?? currentChainId;\n                }\n                if (displayUri) {\n                    provider.removeListener('display_uri', displayUri);\n                    displayUri = undefined;\n                }\n                if (signResponse)\n                    provider.emit('connectAndSign', {\n                        accounts,\n                        chainId: currentChainId,\n                        signResponse,\n                    });\n                else if (connectWithResponse)\n                    provider.emit('connectWith', {\n                        accounts,\n                        chainId: currentChainId,\n                        connectWithResponse,\n                    });\n                // Manage EIP-1193 event listeners\n                // https://eips.ethereum.org/EIPS/eip-1193#events\n                if (connect) {\n                    provider.removeListener('connect', connect);\n                    connect = undefined;\n                }\n                if (!accountsChanged) {\n                    accountsChanged = this.onAccountsChanged.bind(this);\n                    provider.on('accountsChanged', accountsChanged);\n                }\n                if (!chainChanged) {\n                    chainChanged = this.onChainChanged.bind(this);\n                    provider.on('chainChanged', chainChanged);\n                }\n                if (!disconnect) {\n                    disconnect = this.onDisconnect.bind(this);\n                    provider.on('disconnect', disconnect);\n                }\n                return { accounts, chainId: currentChainId };\n            }\n            catch (err) {\n                const error = err;\n                if (error.code === UserRejectedRequestError.code)\n                    throw new UserRejectedRequestError(error);\n                if (error.code === ResourceUnavailableRpcError.code)\n                    throw new ResourceUnavailableRpcError(error);\n                throw error;\n            }\n        },\n        async disconnect() {\n            const provider = await this.getProvider();\n            // Manage EIP-1193 event listeners\n            if (chainChanged) {\n                provider.removeListener('chainChanged', chainChanged);\n                chainChanged = undefined;\n            }\n            if (disconnect) {\n                provider.removeListener('disconnect', disconnect);\n                disconnect = undefined;\n            }\n            if (!connect) {\n                connect = this.onConnect.bind(this);\n                provider.on('connect', connect);\n            }\n            await sdk.terminate();\n        },\n        async getAccounts() {\n            const provider = await this.getProvider();\n            const accounts = (await provider.request({\n                method: 'eth_accounts',\n            }));\n            return accounts.map((x) => getAddress(x));\n        },\n        async getChainId() {\n            const provider = await this.getProvider();\n            const chainId = provider.getChainId() ||\n                (await provider?.request({ method: 'eth_chainId' }));\n            return Number(chainId);\n        },\n        async getProvider() {\n            async function initProvider() {\n                // Unwrapping import for Vite compatibility.\n                // See: https://github.com/vitejs/vite/issues/9703\n                const MetaMaskSDK = await (async () => {\n                    const { default: SDK } = await import('@metamask/sdk');\n                    if (typeof SDK !== 'function' && typeof SDK.default === 'function')\n                        return SDK.default;\n                    return SDK;\n                })();\n                const readonlyRPCMap = {};\n                for (const chain of config.chains)\n                    readonlyRPCMap[numberToHex(chain.id)] = extractRpcUrls({\n                        chain,\n                        transports: config.transports,\n                    })?.[0];\n                sdk = new MetaMaskSDK({\n                    _source: 'wagmi',\n                    forceDeleteProvider: false,\n                    forceInjectProvider: false,\n                    injectProvider: false,\n                    // Workaround cast since MetaMask SDK does not support `'exactOptionalPropertyTypes'`\n                    ...parameters,\n                    readonlyRPCMap,\n                    dappMetadata: {\n                        ...parameters.dappMetadata,\n                        // Test if name and url are set AND not empty\n                        name: parameters.dappMetadata?.name\n                            ? parameters.dappMetadata?.name\n                            : 'wagmi',\n                        url: parameters.dappMetadata?.url\n                            ? parameters.dappMetadata?.url\n                            : typeof window !== 'undefined'\n                                ? window.location.origin\n                                : 'https://wagmi.sh',\n                    },\n                    useDeeplink: parameters.useDeeplink ?? true,\n                });\n                const result = await sdk.init();\n                // On initial load, sometimes `sdk.getProvider` does not return provider.\n                // https://github.com/wevm/wagmi/issues/4367\n                // Use result of `init` call if available.\n                const provider = (() => {\n                    if (result?.activeProvider)\n                        return result.activeProvider;\n                    return sdk.getProvider();\n                })();\n                if (!provider)\n                    throw new ProviderNotFoundError();\n                return provider;\n            }\n            if (!provider) {\n                if (!providerPromise)\n                    providerPromise = initProvider();\n                provider = await providerPromise;\n            }\n            return provider;\n        },\n        async isAuthorized() {\n            try {\n                // MetaMask mobile provider sometimes fails to immediately resolve\n                // JSON-RPC requests on page load\n                const timeout = 200;\n                const accounts = await withRetry(() => withTimeout(() => this.getAccounts(), { timeout }), {\n                    delay: timeout + 1,\n                    retryCount: 3,\n                });\n                return !!accounts.length;\n            }\n            catch {\n                return false;\n            }\n        },\n        async switchChain({ addEthereumChainParameter, chainId }) {\n            const provider = await this.getProvider();\n            const chain = config.chains.find((x) => x.id === chainId);\n            if (!chain)\n                throw new SwitchChainError(new ChainNotConfiguredError());\n            try {\n                await provider.request({\n                    method: 'wallet_switchEthereumChain',\n                    params: [{ chainId: numberToHex(chainId) }],\n                });\n                // During `'wallet_switchEthereumChain'`, MetaMask makes a `'net_version'` RPC call to the target chain.\n                // If this request fails, MetaMask does not emit the `'chainChanged'` event, but will still switch the chain.\n                // To counter this behavior, we request and emit the current chain ID to confirm the chain switch either via\n                // this callback or an externally emitted `'chainChanged'` event.\n                // https://github.com/MetaMask/metamask-extension/issues/24247\n                await waitForChainIdToSync();\n                await sendAndWaitForChangeEvent(chainId);\n                return chain;\n            }\n            catch (err) {\n                const error = err;\n                if (error.code === UserRejectedRequestError.code)\n                    throw new UserRejectedRequestError(error);\n                // Indicates chain is not added to provider\n                if (error.code === 4902 ||\n                    // Unwrapping for MetaMask Mobile\n                    // https://github.com/MetaMask/metamask-mobile/issues/2944#issuecomment-976988719\n                    error\n                        ?.data?.originalError?.code === 4902) {\n                    try {\n                        await provider.request({\n                            method: 'wallet_addEthereumChain',\n                            params: [\n                                {\n                                    blockExplorerUrls: (() => {\n                                        const { default: blockExplorer, ...blockExplorers } = chain.blockExplorers ?? {};\n                                        if (addEthereumChainParameter?.blockExplorerUrls)\n                                            return addEthereumChainParameter.blockExplorerUrls;\n                                        if (blockExplorer)\n                                            return [\n                                                blockExplorer.url,\n                                                ...Object.values(blockExplorers).map((x) => x.url),\n                                            ];\n                                        return;\n                                    })(),\n                                    chainId: numberToHex(chainId),\n                                    chainName: addEthereumChainParameter?.chainName ?? chain.name,\n                                    iconUrls: addEthereumChainParameter?.iconUrls,\n                                    nativeCurrency: addEthereumChainParameter?.nativeCurrency ??\n                                        chain.nativeCurrency,\n                                    rpcUrls: (() => {\n                                        if (addEthereumChainParameter?.rpcUrls?.length)\n                                            return addEthereumChainParameter.rpcUrls;\n                                        return [chain.rpcUrls.default?.http[0] ?? ''];\n                                    })(),\n                                },\n                            ],\n                        });\n                        await waitForChainIdToSync();\n                        await sendAndWaitForChangeEvent(chainId);\n                        return chain;\n                    }\n                    catch (err) {\n                        const error = err;\n                        if (error.code === UserRejectedRequestError.code)\n                            throw new UserRejectedRequestError(error);\n                        throw new SwitchChainError(error);\n                    }\n                }\n                throw new SwitchChainError(error);\n            }\n            async function waitForChainIdToSync() {\n                // On mobile, there is a race condition between the result of `'wallet_addEthereumChain'` and `'eth_chainId'`.\n                // To avoid this, we wait for `'eth_chainId'` to return the expected chain ID with a retry loop.\n                await withRetry(async () => {\n                    const value = hexToNumber(\n                    // `'eth_chainId'` is cached by the MetaMask SDK side to avoid unnecessary deeplinks\n                    (await provider.request({ method: 'eth_chainId' })));\n                    // `value` doesn't match expected `chainId`, throw to trigger retry\n                    if (value !== chainId)\n                        throw new Error('User rejected switch after adding network.');\n                    return value;\n                }, {\n                    delay: 50,\n                    retryCount: 20, // android device encryption is slower\n                });\n            }\n            async function sendAndWaitForChangeEvent(chainId) {\n                await new Promise((resolve) => {\n                    const listener = ((data) => {\n                        if ('chainId' in data && data.chainId === chainId) {\n                            config.emitter.off('change', listener);\n                            resolve();\n                        }\n                    });\n                    config.emitter.on('change', listener);\n                    config.emitter.emit('change', { chainId });\n                });\n            }\n        },\n        async onAccountsChanged(accounts) {\n            // Disconnect if there are no accounts\n            if (accounts.length === 0) {\n                // ... and using browser extension\n                if (sdk.isExtensionActive())\n                    this.onDisconnect();\n                // FIXME(upstream): Mobile app sometimes emits invalid `accountsChanged` event with empty accounts array\n                else\n                    return;\n            }\n            // Connect if emitter is listening for connect event (e.g. is disconnected and connects through wallet interface)\n            else if (config.emitter.listenerCount('connect')) {\n                const chainId = (await this.getChainId()).toString();\n                this.onConnect({ chainId });\n            }\n            // Regular change event\n            else\n                config.emitter.emit('change', {\n                    accounts: accounts.map((x) => getAddress(x)),\n                });\n        },\n        onChainChanged(chain) {\n            const chainId = Number(chain);\n            config.emitter.emit('change', { chainId });\n        },\n        async onConnect(connectInfo) {\n            const accounts = await this.getAccounts();\n            if (accounts.length === 0)\n                return;\n            const chainId = Number(connectInfo.chainId);\n            config.emitter.emit('connect', { accounts, chainId });\n            const provider = await this.getProvider();\n            if (connect) {\n                provider.removeListener('connect', connect);\n                connect = undefined;\n            }\n            if (!accountsChanged) {\n                accountsChanged = this.onAccountsChanged.bind(this);\n                provider.on('accountsChanged', accountsChanged);\n            }\n            if (!chainChanged) {\n                chainChanged = this.onChainChanged.bind(this);\n                provider.on('chainChanged', chainChanged);\n            }\n            if (!disconnect) {\n                disconnect = this.onDisconnect.bind(this);\n                provider.on('disconnect', disconnect);\n            }\n        },\n        async onDisconnect(error) {\n            const provider = await this.getProvider();\n            // If MetaMask emits a `code: 1013` error, wait for reconnection before disconnecting\n            // https://github.com/MetaMask/providers/pull/120\n            if (error && error.code === 1013) {\n                if (provider && !!(await this.getAccounts()).length)\n                    return;\n            }\n            config.emitter.emit('disconnect');\n            // Manage EIP-1193 event listeners\n            if (chainChanged) {\n                provider.removeListener('chainChanged', chainChanged);\n                chainChanged = undefined;\n            }\n            if (disconnect) {\n                provider.removeListener('disconnect', disconnect);\n                disconnect = undefined;\n            }\n            if (!connect) {\n                connect = this.onConnect.bind(this);\n                provider.on('connect', connect);\n            }\n        },\n        onDisplayUri(uri) {\n            config.emitter.emit('message', { type: 'display_uri', data: uri });\n        },\n    }));\n}\n//# sourceMappingURL=metaMask.js.map","import { ChainNotConfiguredError, createConnector, extractRpcUrls, ProviderNotFoundError, } from '@wagmi/core';\nimport { getAddress, numberToHex, SwitchChainError, UserRejectedRequestError, } from 'viem';\nwalletConnect.type = 'walletConnect';\nexport function walletConnect(parameters) {\n    const isNewChainsStale = parameters.isNewChainsStale ?? true;\n    let provider_;\n    let providerPromise;\n    const NAMESPACE = 'eip155';\n    let accountsChanged;\n    let chainChanged;\n    let connect;\n    let displayUri;\n    let sessionDelete;\n    let disconnect;\n    return createConnector((config) => ({\n        id: 'walletConnect',\n        name: 'WalletConnect',\n        type: walletConnect.type,\n        async setup() {\n            const provider = await this.getProvider().catch(() => null);\n            if (!provider)\n                return;\n            if (!connect) {\n                connect = this.onConnect.bind(this);\n                provider.on('connect', connect);\n            }\n            if (!sessionDelete) {\n                sessionDelete = this.onSessionDelete.bind(this);\n                provider.on('session_delete', sessionDelete);\n            }\n        },\n        async connect({ chainId, ...rest } = {}) {\n            try {\n                const provider = await this.getProvider();\n                if (!provider)\n                    throw new ProviderNotFoundError();\n                if (!displayUri) {\n                    displayUri = this.onDisplayUri;\n                    provider.on('display_uri', displayUri);\n                }\n                let targetChainId = chainId;\n                if (!targetChainId) {\n                    const state = (await config.storage?.getItem('state')) ?? {};\n                    const isChainSupported = config.chains.some((x) => x.id === state.chainId);\n                    if (isChainSupported)\n                        targetChainId = state.chainId;\n                    else\n                        targetChainId = config.chains[0]?.id;\n                }\n                if (!targetChainId)\n                    throw new Error('No chains found on connector.');\n                const isChainsStale = await this.isChainsStale();\n                // If there is an active session with stale chains, disconnect current session.\n                if (provider.session && isChainsStale)\n                    await provider.disconnect();\n                // If there isn't an active session or chains are stale, connect.\n                if (!provider.session || isChainsStale) {\n                    const optionalChains = config.chains\n                        .filter((chain) => chain.id !== targetChainId)\n                        .map((optionalChain) => optionalChain.id);\n                    await provider.connect({\n                        optionalChains: [targetChainId, ...optionalChains],\n                        ...('pairingTopic' in rest\n                            ? { pairingTopic: rest.pairingTopic }\n                            : {}),\n                    });\n                    this.setRequestedChainsIds(config.chains.map((x) => x.id));\n                }\n                // If session exists and chains are authorized, enable provider for required chain\n                const accounts = (await provider.enable()).map((x) => getAddress(x));\n                const currentChainId = await this.getChainId();\n                if (displayUri) {\n                    provider.removeListener('display_uri', displayUri);\n                    displayUri = undefined;\n                }\n                if (connect) {\n                    provider.removeListener('connect', connect);\n                    connect = undefined;\n                }\n                if (!accountsChanged) {\n                    accountsChanged = this.onAccountsChanged.bind(this);\n                    provider.on('accountsChanged', accountsChanged);\n                }\n                if (!chainChanged) {\n                    chainChanged = this.onChainChanged.bind(this);\n                    provider.on('chainChanged', chainChanged);\n                }\n                if (!disconnect) {\n                    disconnect = this.onDisconnect.bind(this);\n                    provider.on('disconnect', disconnect);\n                }\n                if (!sessionDelete) {\n                    sessionDelete = this.onSessionDelete.bind(this);\n                    provider.on('session_delete', sessionDelete);\n                }\n                return { accounts, chainId: currentChainId };\n            }\n            catch (error) {\n                if (/(user rejected|connection request reset)/i.test(error?.message)) {\n                    throw new UserRejectedRequestError(error);\n                }\n                throw error;\n            }\n        },\n        async disconnect() {\n            const provider = await this.getProvider();\n            try {\n                await provider?.disconnect();\n            }\n            catch (error) {\n                if (!/No matching key/i.test(error.message))\n                    throw error;\n            }\n            finally {\n                if (chainChanged) {\n                    provider?.removeListener('chainChanged', chainChanged);\n                    chainChanged = undefined;\n                }\n                if (disconnect) {\n                    provider?.removeListener('disconnect', disconnect);\n                    disconnect = undefined;\n                }\n                if (!connect) {\n                    connect = this.onConnect.bind(this);\n                    provider?.on('connect', connect);\n                }\n                if (accountsChanged) {\n                    provider?.removeListener('accountsChanged', accountsChanged);\n                    accountsChanged = undefined;\n                }\n                if (sessionDelete) {\n                    provider?.removeListener('session_delete', sessionDelete);\n                    sessionDelete = undefined;\n                }\n                this.setRequestedChainsIds([]);\n            }\n        },\n        async getAccounts() {\n            const provider = await this.getProvider();\n            return provider.accounts.map((x) => getAddress(x));\n        },\n        async getProvider({ chainId } = {}) {\n            async function initProvider() {\n                const optionalChains = config.chains.map((x) => x.id);\n                if (!optionalChains.length)\n                    return;\n                const { EthereumProvider } = await import('@walletconnect/ethereum-provider');\n                return await EthereumProvider.init({\n                    ...parameters,\n                    disableProviderPing: true,\n                    optionalChains,\n                    projectId: parameters.projectId,\n                    rpcMap: Object.fromEntries(config.chains.map((chain) => {\n                        const [url] = extractRpcUrls({\n                            chain,\n                            transports: config.transports,\n                        });\n                        return [chain.id, url];\n                    })),\n                    showQrModal: parameters.showQrModal ?? true,\n                });\n            }\n            if (!provider_) {\n                if (!providerPromise)\n                    providerPromise = initProvider();\n                provider_ = await providerPromise;\n                provider_?.events.setMaxListeners(Number.POSITIVE_INFINITY);\n            }\n            if (chainId)\n                await this.switchChain?.({ chainId });\n            return provider_;\n        },\n        async getChainId() {\n            const provider = await this.getProvider();\n            return provider.chainId;\n        },\n        async isAuthorized() {\n            try {\n                const [accounts, provider] = await Promise.all([\n                    this.getAccounts(),\n                    this.getProvider(),\n                ]);\n                // If an account does not exist on the session, then the connector is unauthorized.\n                if (!accounts.length)\n                    return false;\n                // If the chains are stale on the session, then the connector is unauthorized.\n                const isChainsStale = await this.isChainsStale();\n                if (isChainsStale && provider.session) {\n                    await provider.disconnect().catch(() => { });\n                    return false;\n                }\n                return true;\n            }\n            catch {\n                return false;\n            }\n        },\n        async switchChain({ addEthereumChainParameter, chainId }) {\n            const provider = await this.getProvider();\n            if (!provider)\n                throw new ProviderNotFoundError();\n            const chain = config.chains.find((x) => x.id === chainId);\n            if (!chain)\n                throw new SwitchChainError(new ChainNotConfiguredError());\n            try {\n                await Promise.all([\n                    new Promise((resolve) => {\n                        const listener = ({ chainId: currentChainId, }) => {\n                            if (currentChainId === chainId) {\n                                config.emitter.off('change', listener);\n                                resolve();\n                            }\n                        };\n                        config.emitter.on('change', listener);\n                    }),\n                    provider.request({\n                        method: 'wallet_switchEthereumChain',\n                        params: [{ chainId: numberToHex(chainId) }],\n                    }),\n                ]);\n                const requestedChains = await this.getRequestedChainsIds();\n                this.setRequestedChainsIds([...requestedChains, chainId]);\n                return chain;\n            }\n            catch (err) {\n                const error = err;\n                if (/(user rejected)/i.test(error.message))\n                    throw new UserRejectedRequestError(error);\n                // Indicates chain is not added to provider\n                try {\n                    let blockExplorerUrls;\n                    if (addEthereumChainParameter?.blockExplorerUrls)\n                        blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls;\n                    else\n                        blockExplorerUrls = chain.blockExplorers?.default.url\n                            ? [chain.blockExplorers?.default.url]\n                            : [];\n                    let rpcUrls;\n                    if (addEthereumChainParameter?.rpcUrls?.length)\n                        rpcUrls = addEthereumChainParameter.rpcUrls;\n                    else\n                        rpcUrls = [...chain.rpcUrls.default.http];\n                    const addEthereumChain = {\n                        blockExplorerUrls,\n                        chainId: numberToHex(chainId),\n                        chainName: addEthereumChainParameter?.chainName ?? chain.name,\n                        iconUrls: addEthereumChainParameter?.iconUrls,\n                        nativeCurrency: addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency,\n                        rpcUrls,\n                    };\n                    await provider.request({\n                        method: 'wallet_addEthereumChain',\n                        params: [addEthereumChain],\n                    });\n                    const requestedChains = await this.getRequestedChainsIds();\n                    this.setRequestedChainsIds([...requestedChains, chainId]);\n                    return chain;\n                }\n                catch (error) {\n                    throw new UserRejectedRequestError(error);\n                }\n            }\n        },\n        onAccountsChanged(accounts) {\n            if (accounts.length === 0)\n                this.onDisconnect();\n            else\n                config.emitter.emit('change', {\n                    accounts: accounts.map((x) => getAddress(x)),\n                });\n        },\n        onChainChanged(chain) {\n            const chainId = Number(chain);\n            config.emitter.emit('change', { chainId });\n        },\n        async onConnect(connectInfo) {\n            const chainId = Number(connectInfo.chainId);\n            const accounts = await this.getAccounts();\n            config.emitter.emit('connect', { accounts, chainId });\n        },\n        async onDisconnect(_error) {\n            this.setRequestedChainsIds([]);\n            config.emitter.emit('disconnect');\n            const provider = await this.getProvider();\n            if (accountsChanged) {\n                provider.removeListener('accountsChanged', accountsChanged);\n                accountsChanged = undefined;\n            }\n            if (chainChanged) {\n                provider.removeListener('chainChanged', chainChanged);\n                chainChanged = undefined;\n            }\n            if (disconnect) {\n                provider.removeListener('disconnect', disconnect);\n                disconnect = undefined;\n            }\n            if (sessionDelete) {\n                provider.removeListener('session_delete', sessionDelete);\n                sessionDelete = undefined;\n            }\n            if (!connect) {\n                connect = this.onConnect.bind(this);\n                provider.on('connect', connect);\n            }\n        },\n        onDisplayUri(uri) {\n            config.emitter.emit('message', { type: 'display_uri', data: uri });\n        },\n        onSessionDelete() {\n            this.onDisconnect();\n        },\n        getNamespaceChainsIds() {\n            if (!provider_)\n                return [];\n            const chainIds = provider_.session?.namespaces[NAMESPACE]?.accounts?.map((account) => Number.parseInt(account.split(':')[1] || ''));\n            return chainIds ?? [];\n        },\n        async getRequestedChainsIds() {\n            return ((await config.storage?.getItem(this.requestedChainsStorageKey)) ?? []);\n        },\n        /**\n         * Checks if the target chains match the chains that were\n         * initially requested by the connector for the WalletConnect session.\n         * If there is a mismatch, this means that the chains on the connector\n         * are considered stale, and need to be revalidated at a later point (via\n         * connection).\n         *\n         * There may be a scenario where a dapp adds a chain to the\n         * connector later on, however, this chain will not have been approved or rejected\n         * by the wallet. In this case, the chain is considered stale.\n         */\n        async isChainsStale() {\n            if (!isNewChainsStale)\n                return false;\n            const connectorChains = config.chains.map((x) => x.id);\n            const namespaceChains = this.getNamespaceChainsIds();\n            if (namespaceChains.length &&\n                !namespaceChains.some((id) => connectorChains.includes(id)))\n                return false;\n            const requestedChains = await this.getRequestedChainsIds();\n            return !connectorChains.every((id) => requestedChains.includes(id));\n        },\n        async setRequestedChainsIds(chains) {\n            await config.storage?.setItem(this.requestedChainsStorageKey, chains);\n        },\n        get requestedChainsStorageKey() {\n            return `${this.id}.requestedChains`;\n        },\n    }));\n}\n//# sourceMappingURL=walletConnect.js.map","import { createConfig, http } from 'wagmi';\nimport { mainnet, polygon, arbitrum, optimism, bsc, avalanche, base, fantom, cronos, gnosis } from 'wagmi/chains';\nimport { metaMask, walletConnect, coinbaseWallet, injected } from 'wagmi/connectors';\n// Top 10 EVM Networks by popularity and TVL\nconst defaultChains = [\n    mainnet, // Ethereum (ETH) - Chain ID: 1\n    polygon, // Polygon (MATIC) - Chain ID: 137  \n    bsc, // Binance Smart Chain (BNB) - Chain ID: 56\n    arbitrum, // Arbitrum One (ARB) - Chain ID: 42161\n    optimism, // Optimism (OP) - Chain ID: 10\n    avalanche, // Avalanche C-Chain (AVAX) - Chain ID: 43114\n    base, // Base - Chain ID: 8453\n    fantom, // Fantom (FTM) - Chain ID: 250\n    cronos, // Cronos (CRO) - Chain ID: 25\n    gnosis, // Gnosis Chain (xDAI) - Chain ID: 100\n];\nexport function createCoinleyWalletConfig(options) {\n    const chains = options.chains || defaultChains;\n    const metadata = {\n        name: options.appName,\n        description: options.appDescription || `${options.appName} - Web3 Application`,\n        url: options.appUrl || (typeof window !== 'undefined' ? window.location.origin : ''),\n        icons: options.appIcon ? [options.appIcon] : []\n    };\n    const connectors = [\n        // MetaMask connector - prefer this over generic injected for MetaMask\n        metaMask(),\n        // Generic injected connector for other wallets\n        injected({\n            shimDisconnect: true\n        }),\n        // Coinbase Wallet - configure to prefer extension over popup\n        coinbaseWallet({\n            appName: options.appName,\n            appLogoUrl: options.appIcon,\n            preference: 'smartWalletOnly' // This should use extension first\n        })\n    ];\n    // Only add WalletConnect if projectId is provided\n    if (options.projectId) {\n        connectors.push(walletConnect({\n            projectId: options.projectId,\n            metadata,\n            showQrModal: false // We'll handle the modal ourselves\n        }));\n    }\n    // Enhanced RPC transports with fallbacks for better reliability\n    const createTransport = (chain) => {\n        // Use multiple RPC endpoints for better reliability\n        const rpcUrls = {\n            1: ['https://eth.merkle.io', 'https://rpc.ankr.com/eth'],\n            137: ['https://polygon-rpc.com', 'https://rpc.ankr.com/polygon'],\n            56: ['https://bsc-dataseed.binance.org', 'https://rpc.ankr.com/bsc'],\n            42161: ['https://arb1.arbitrum.io/rpc', 'https://rpc.ankr.com/arbitrum'],\n            10: ['https://mainnet.optimism.io', 'https://rpc.ankr.com/optimism'],\n            43114: ['https://api.avax.network/ext/bc/C/rpc', 'https://rpc.ankr.com/avalanche'],\n            8453: ['https://base.publicnode.com', 'https://base.llamarpc.com'], // Better Base RPCs\n            250: ['https://rpc.ftm.tools', 'https://rpc.ankr.com/fantom'],\n            25: ['https://evm.cronos.org', 'https://cronos.blockpi.network/v1/rpc/public'],\n            100: ['https://rpc.gnosischain.com', 'https://gnosis.publicnode.com']\n        };\n        const urls = rpcUrls[chain.id] || [chain.rpcUrls?.default?.http?.[0]];\n        return http(urls[0]); // Use primary RPC\n    };\n    return createConfig({\n        chains: chains,\n        connectors,\n        transports: chains.reduce((acc, chain) => ({\n            ...acc,\n            [chain.id]: createTransport(chain)\n        }), {}),\n        ssr: true\n    });\n}\n// Top 10 EVM chain configurations for easy access\nexport const popularChains = {\n    ethereum: mainnet, // Chain ID: 1 - The original EVM network\n    polygon: polygon, // Chain ID: 137 - Layer 2 scaling solution\n    bsc: bsc, // Chain ID: 56 - High throughput, lower fees\n    arbitrum: arbitrum, // Chain ID: 42161 - Optimistic rollup Layer 2\n    optimism: optimism, // Chain ID: 10 - Another major Optimistic rollup\n    avalanche: avalanche, // Chain ID: 43114 - Fast finality and low fees\n    base: base, // Chain ID: 8453 - Coinbase's Layer 2 solution\n    fantom: fantom, // Chain ID: 250 - Fast and cheap transactions\n    cronos: cronos, // Chain ID: 25 - Crypto.com's blockchain\n    gnosis: gnosis, // Chain ID: 100 - Stable transaction costs\n};\n// Helper to create config with popular chains\nexport function createQuickConfig(options) {\n    const chains = options.chains\n        ? options.chains.map(name => popularChains[name])\n        : defaultChains;\n    return createCoinleyWalletConfig({\n        ...options,\n        chains\n    });\n}\n//# sourceMappingURL=config.js.map","import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { createContext, useContext, useState, useCallback } from 'react';\nimport { WagmiProvider } from 'wagmi';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nconst CoinleyWalletContext = createContext(null);\nconst queryClient = new QueryClient({\n    defaultOptions: {\n        queries: {\n            staleTime: 1000 * 60 * 5, // 5 minutes\n            gcTime: 1000 * 60 * 10, // 10 minutes\n        },\n    },\n});\nexport function CoinleyWalletProvider({ config, walletConfig, children }) {\n    const [isModalOpen, setIsModalOpen] = useState(false);\n    const openModal = useCallback(() => setIsModalOpen(true), []);\n    const closeModal = useCallback(() => setIsModalOpen(false), []);\n    return (_jsx(QueryClientProvider, { client: queryClient, children: _jsx(WagmiProvider, { config: config, children: _jsx(CoinleyWalletContext.Provider, { value: {\n                    isModalOpen,\n                    openModal,\n                    closeModal,\n                    config: walletConfig\n                }, children: children }) }) }));\n}\nexport function useCoinleyWallet() {\n    const context = useContext(CoinleyWalletContext);\n    if (!context) {\n        throw new Error('useCoinleyWallet must be used within CoinleyWalletProvider');\n    }\n    return context;\n}\n//# sourceMappingURL=provider.js.map","import { useAccount, useConnect, useDisconnect, useBalance, useChainId, useSwitchChain, useSignMessage, useSignTypedData, useSendTransaction, useConnectors, useEnsName, useEnsAvatar } from 'wagmi';\nimport { useCoinleyWallet } from './provider';\nimport { formatEther } from 'viem';\nimport { useCallback, useEffect, useState } from 'react';\n// Wallet detection utility\nfunction detectInstalledWallets() {\n    const wallets = [];\n    if (typeof window === 'undefined')\n        return wallets;\n    const ethereum = window.ethereum;\n    if (ethereum) {\n        // MetaMask\n        if (ethereum.isMetaMask) {\n            wallets.push({ name: 'MetaMask', icon: '🦊', provider: 'MetaMask', id: 'metaMask' });\n        }\n        // Coinbase Wallet\n        if (ethereum.isCoinbaseWallet || ethereum.selectedProvider?.isCoinbaseWallet) {\n            wallets.push({ name: 'Coinbase Wallet', icon: '🔵', provider: 'Coinbase', id: 'coinbaseWallet' });\n        }\n        // Trust Wallet\n        if (ethereum.isTrust) {\n            wallets.push({ name: 'Trust Wallet', icon: '🛡️', provider: 'Trust', id: 'trust' });\n        }\n        // OKX Wallet\n        if (ethereum.isOKExWallet) {\n            wallets.push({ name: 'OKX Wallet', icon: '⚫', provider: 'OKX', id: 'okx' });\n        }\n        // Rabby Wallet\n        if (ethereum.isRabby) {\n            wallets.push({ name: 'Rabby Wallet', icon: '🐰', provider: 'Rabby', id: 'rabby' });\n        }\n        // Brave Wallet\n        if (ethereum.isBraveWallet) {\n            wallets.push({ name: 'Brave Wallet', icon: '🦁', provider: 'Brave', id: 'brave' });\n        }\n        // Rainbow Wallet\n        if (ethereum.isRainbow) {\n            wallets.push({ name: 'Rainbow Wallet', icon: '🌈', provider: 'Rainbow', id: 'rainbow' });\n        }\n        // Zerion Wallet\n        if (ethereum.isZerion) {\n            wallets.push({ name: 'Zerion Wallet', icon: '🔷', provider: 'Zerion', id: 'zerion' });\n        }\n        // TokenPocket\n        if (ethereum.isTokenPocket) {\n            wallets.push({ name: 'TokenPocket', icon: '💼', provider: 'TokenPocket', id: 'tokenpocket' });\n        }\n        // imToken\n        if (ethereum.isImToken) {\n            wallets.push({ name: 'imToken', icon: '💎', provider: 'imToken', id: 'imtoken' });\n        }\n        // Check multiple providers array\n        if (ethereum.providers && Array.isArray(ethereum.providers)) {\n            ethereum.providers.forEach((provider) => {\n                if (provider.isMetaMask && !wallets.find(w => w.id === 'metaMask')) {\n                    wallets.push({ name: 'MetaMask', icon: '🦊', provider: 'MetaMask', id: 'metaMask' });\n                }\n                if (provider.isCoinbaseWallet && !wallets.find(w => w.id === 'coinbaseWallet')) {\n                    wallets.push({ name: 'Coinbase Wallet', icon: '🔵', provider: 'Coinbase', id: 'coinbaseWallet' });\n                }\n                if (provider.isTrust && !wallets.find(w => w.id === 'trust')) {\n                    wallets.push({ name: 'Trust Wallet', icon: '🛡️', provider: 'Trust', id: 'trust' });\n                }\n                if (provider.isOKExWallet && !wallets.find(w => w.id === 'okx')) {\n                    wallets.push({ name: 'OKX Wallet', icon: '⚫', provider: 'OKX', id: 'okx' });\n                }\n                if (provider.isRabby && !wallets.find(w => w.id === 'rabby')) {\n                    wallets.push({ name: 'Rabby Wallet', icon: '🐰', provider: 'Rabby', id: 'rabby' });\n                }\n                if (provider.isZerion && !wallets.find(w => w.id === 'zerion')) {\n                    wallets.push({ name: 'Zerion Wallet', icon: '🔷', provider: 'Zerion', id: 'zerion' });\n                }\n                if (provider.isRainbow && !wallets.find(w => w.id === 'rainbow')) {\n                    wallets.push({ name: 'Rainbow Wallet', icon: '🌈', provider: 'Rainbow', id: 'rainbow' });\n                }\n            });\n        }\n        // Generic fallback if none detected\n        if (wallets.length === 0) {\n            wallets.push({ name: 'Browser Wallet', icon: '🌐', provider: 'Generic', id: 'injected' });\n        }\n    }\n    // Check for Keplr (Cosmos)\n    if (window.keplr) {\n        wallets.push({ name: 'Keplr', icon: '🌌', provider: 'Keplr', id: 'keplr' });\n    }\n    // Check for Phantom (Solana)\n    if (window.phantom?.solana) {\n        wallets.push({ name: 'Phantom', icon: '👻', provider: 'Phantom', id: 'phantom' });\n    }\n    return wallets;\n}\n// Hook for wallet detection - built into the library\nexport function useWalletDetection() {\n    const [detectedWallets, setDetectedWallets] = useState([]);\n    useEffect(() => {\n        const detect = () => {\n            const wallets = detectInstalledWallets();\n            setDetectedWallets(wallets);\n        };\n        // Detect immediately and after delay (some wallets inject later)\n        detect();\n        const timeout = setTimeout(detect, 1000);\n        return () => clearTimeout(timeout);\n    }, []);\n    return {\n        detectedWallets,\n        hasWallets: detectedWallets.length > 0,\n        walletCount: detectedWallets.length\n    };\n}\n// Main hook that abstracts wagmi complexity\nexport function useWallet() {\n    const { address, isConnected, isConnecting, isDisconnected } = useAccount();\n    const chainId = useChainId();\n    const { disconnect } = useDisconnect();\n    const { closeModal } = useCoinleyWallet();\n    const connectors = useConnectors();\n    const { data: balance, isLoading: isBalanceLoading } = useBalance({\n        address,\n        query: {\n            enabled: !!address\n        }\n    });\n    // ENS resolution\n    const { data: ensName } = useEnsName({\n        address,\n        chainId: 1, // ENS is on mainnet\n        query: {\n            enabled: !!address\n        }\n    });\n    const { data: ensAvatar } = useEnsAvatar({\n        name: ensName || undefined,\n        chainId: 1,\n        query: {\n            enabled: !!ensName\n        }\n    });\n    // Simplified disconnect that also closes modal\n    const handleDisconnect = useCallback(() => {\n        disconnect();\n        closeModal();\n    }, [disconnect, closeModal]);\n    // Format balance as string\n    const formattedBalance = balance ? formatEther(balance.value) : '0';\n    return {\n        // Wallet state\n        address,\n        isConnected,\n        isConnecting,\n        isDisconnected,\n        chainId,\n        // ENS\n        ensName,\n        ensAvatar,\n        // Balance\n        balance: balance?.value.toString() || '0',\n        balanceFormatted: formattedBalance,\n        balanceSymbol: balance?.symbol || 'ETH',\n        isBalanceLoading,\n        // Actions\n        disconnect: handleDisconnect,\n        // Available connectors\n        connectors: connectors.map(connector => ({\n            id: connector.id,\n            name: connector.name,\n            icon: connector.icon,\n            installed: connector.installed,\n            ready: connector.ready\n        }))\n    };\n}\n// Hook for connecting to specific wallet\nexport function useWalletConnect() {\n    const { connect, connectors, isPending, error } = useConnect();\n    const { closeModal } = useCoinleyWallet();\n    const connectWallet = useCallback((connectorId) => {\n        const connector = connectors.find((c) => c.id === connectorId);\n        if (connector) {\n            // Add timeout handling for stuck connections\n            const connectionTimeout = setTimeout(() => {\n                console.warn(`Connection to ${connector.name} timed out after 30 seconds`);\n            }, 30000);\n            connect({ connector }, {\n                onSuccess: () => {\n                    clearTimeout(connectionTimeout);\n                    closeModal();\n                },\n                onError: (error) => {\n                    clearTimeout(connectionTimeout);\n                    console.error(`Failed to connect to ${connector.name}:`, error);\n                }\n            });\n        }\n        else {\n            console.error(`Connector ${connectorId} not found`);\n        }\n    }, [connect, connectors, closeModal]);\n    return {\n        connectWallet,\n        isPending,\n        error,\n        connectors: connectors.map((connector) => ({\n            id: connector.id,\n            name: connector.name,\n            icon: connector.icon,\n            installed: connector.installed ?? true, // Default to true if undefined\n            ready: connector.ready ?? true // Default to true if undefined\n        }))\n    };\n}\n/**\n * Hook for switching networks/chains\n * @returns Object with async switchChain function, loading state, and error\n * @example\n * const { switchChain, isSwitching, error } = useNetworkSwitch()\n * await switchChain({ chainId: 137 }) // Switch to Polygon\n */\nexport function useNetworkSwitch() {\n    const { switchChainAsync, isPending, error } = useSwitchChain();\n    const switchChain = useCallback(async (params) => {\n        try {\n            await switchChainAsync(params);\n        }\n        catch (error) {\n            console.error('Switch chain error:', error);\n            throw error;\n        }\n    }, [switchChainAsync]);\n    return {\n        switchChain,\n        isSwitching: isPending,\n        error\n    };\n}\n/**\n * Hook for signing messages\n * @returns Object with async sign function, loading state, and error\n * @example\n * const { sign, isSigning, error } = useWalletSign()\n * const signature = await sign('Hello World!')\n */\nexport function useWalletSign() {\n    const { signMessageAsync, isPending, error } = useSignMessage();\n    const sign = useCallback(async (message) => {\n        try {\n            const signature = await signMessageAsync({ message });\n            return signature;\n        }\n        catch (error) {\n            console.error('Sign message error:', error);\n            throw error;\n        }\n    }, [signMessageAsync]);\n    return {\n        sign,\n        isSigning: isPending,\n        error\n    };\n}\n/**\n * Hook for signing EIP-712 typed data\n * @returns Object with async signTypedData function, loading state, and error\n * @example\n * const { signTypedData, isSigning, error } = useWalletSignTypedData()\n * const signature = await signTypedData({\n *   domain: { name: 'MyApp', version: '1', chainId: 1 },\n *   types: { Person: [{ name: 'name', type: 'string' }] },\n *   primaryType: 'Person',\n *   message: { name: 'Alice' }\n * })\n */\nexport function useWalletSignTypedData() {\n    const { signTypedDataAsync, isPending, error } = useSignTypedData();\n    const signTypedMessage = useCallback(async (typedData) => {\n        try {\n            const signature = await signTypedDataAsync(typedData);\n            return signature;\n        }\n        catch (error) {\n            console.error('Sign typed data error:', error);\n            throw error;\n        }\n    }, [signTypedDataAsync]);\n    return {\n        signTypedData: signTypedMessage,\n        isSigning: isPending,\n        error\n    };\n}\n/**\n * Hook for sending transactions\n * @returns Object with async sendTransaction function, loading state, and error\n * @example\n * const { sendTransaction, isSending, error } = useWalletTransaction()\n * const hash = await sendTransaction({\n *   to: '0x...',\n *   value: '0x5AF3107A4000', // 0.0001 ETH\n *   data: '0x...'\n * })\n */\nexport function useWalletTransaction() {\n    const { sendTransactionAsync, isPending, error } = useSendTransaction();\n    const sendTransaction = useCallback(async (transaction) => {\n        try {\n            const hash = await sendTransactionAsync(transaction);\n            return hash;\n        }\n        catch (error) {\n            console.error('Send transaction error:', error);\n            throw error;\n        }\n    }, [sendTransactionAsync]);\n    return {\n        sendTransaction,\n        isSending: isPending,\n        error\n    };\n}\n// Hook for token balance\nexport function useTokenBalance(tokenAddress) {\n    const { address } = useAccount();\n    const { data: balance, isLoading } = useBalance({\n        address,\n        token: tokenAddress,\n        query: {\n            enabled: !!address && !!tokenAddress\n        }\n    });\n    return {\n        balance: balance?.value.toString() || '0',\n        balanceFormatted: balance ? formatEther(balance.value) : '0',\n        symbol: balance?.symbol,\n        decimals: balance?.decimals,\n        isLoading\n    };\n}\n// Hook for modal control\nexport function useWalletModal() {\n    const { isModalOpen, openModal, closeModal } = useCoinleyWallet();\n    return {\n        isOpen: isModalOpen,\n        openModal,\n        closeModal\n    };\n}\n//# sourceMappingURL=hooks.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useWallet, useWalletModal } from '../hooks';\nimport './ConnectButton.css';\nexport function ConnectButton({ theme = 'default', size = 'medium', className = '', showBalance = false, showChainId = false }) {\n    const { isConnected, address, balanceFormatted, balanceSymbol, chainId, disconnect } = useWallet();\n    const { openModal } = useWalletModal();\n    const formatAddress = (addr) => {\n        return `${addr.slice(0, 6)}...${addr.slice(-4)}`;\n    };\n    if (isConnected && address) {\n        return (_jsx(\"div\", { className: `connect-button-group ${className}`, children: _jsxs(\"div\", { className: `wallet-info wallet-info--${theme} wallet-info--${size}`, children: [_jsxs(\"div\", { className: \"wallet-info__main\", children: [_jsx(\"div\", { className: \"wallet-info__address\", children: formatAddress(address) }), showBalance && (_jsxs(\"div\", { className: \"wallet-info__balance\", children: [parseFloat(balanceFormatted).toFixed(4), \" \", balanceSymbol] })), showChainId && (_jsxs(\"div\", { className: \"wallet-info__chain\", children: [\"Chain: \", chainId] }))] }), _jsx(\"button\", { className: `disconnect-button disconnect-button--${theme} disconnect-button--${size}`, onClick: disconnect, title: \"Disconnect wallet\", children: _jsx(\"svg\", { width: \"16\", height: \"16\", viewBox: \"0 0 16 16\", fill: \"none\", children: _jsx(\"path\", { d: \"M6 2H3.5C2.67157 2 2 2.67157 2 3.5V12.5C2 13.3284 2.67157 14 3.5 14H6M10 11L13 8M13 8L10 5M13 8H6\", stroke: \"currentColor\", strokeWidth: \"1.5\", strokeLinecap: \"round\", strokeLinejoin: \"round\" }) }) })] }) }));\n    }\n    return (_jsx(\"button\", { className: `connect-button connect-button--${theme} connect-button--${size} ${className}`, onClick: openModal, children: _jsxs(\"div\", { className: \"connect-button__content\", children: [_jsx(\"svg\", { width: \"20\", height: \"20\", viewBox: \"0 0 20 20\", fill: \"none\", className: \"connect-button__icon\", children: _jsx(\"path\", { d: \"M17.5 7.5L12.5 12.5L15 15M7.5 2.5L2.5 7.5L7.5 12.5M17.5 7.5H7.5M7.5 2.5H15C16.3807 2.5 17.5 3.61929 17.5 5V10M7.5 12.5H15C16.3807 12.5 17.5 13.6193 17.5 15V17.5\", stroke: \"currentColor\", strokeWidth: \"1.5\", strokeLinecap: \"round\", strokeLinejoin: \"round\" }) }), _jsx(\"span\", { children: \"Connect Wallet\" })] }) }));\n}\n//# sourceMappingURL=ConnectButton.js.map","import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useWalletConnect, useWalletModal } from '../hooks';\nimport './WalletModal.css';\nfunction WalletOption({ id, name, icon, installed, ready, onClick, isPending }) {\n    // WalletConnect is always available (it's a protocol, not an installed wallet)\n    const isWalletConnect = id === 'walletConnect';\n    // Injected wallets are available if ready\n    const isInjected = id === 'injected';\n    const isAvailable = isWalletConnect || isInjected || (installed && ready);\n    return (_jsxs(\"button\", { className: `wallet-option ${!isAvailable ? 'wallet-option--disabled' : ''} ${isPending ? 'wallet-option--pending' : ''}`, onClick: onClick, disabled: !isAvailable || isPending, children: [_jsx(\"div\", { className: \"wallet-option__icon\", children: icon ? (_jsx(\"img\", { src: icon, alt: name })) : (_jsx(\"div\", { className: \"wallet-option__icon-placeholder\", children: name.charAt(0).toUpperCase() })) }), _jsxs(\"div\", { className: \"wallet-option__info\", children: [_jsx(\"div\", { className: \"wallet-option__name\", children: name }), isWalletConnect ? (_jsx(\"div\", { className: \"wallet-option__status wallet-option__status--available\", children: \"Connect to mobile wallets\" })) : isInjected ? (_jsx(\"div\", { className: \"wallet-option__status wallet-option__status--available\", children: \"Browser wallet\" })) : (_jsxs(_Fragment, { children: [!installed && (_jsx(\"div\", { className: \"wallet-option__status\", children: \"Not installed\" })), installed && !ready && (_jsx(\"div\", { className: \"wallet-option__status\", children: \"Not ready\" })), installed && ready && (_jsx(\"div\", { className: \"wallet-option__status wallet-option__status--available\", children: \"Ready\" }))] }))] }), isPending && (_jsx(\"div\", { className: \"wallet-option__spinner\", children: _jsx(\"div\", { className: \"spinner\" }) }))] }));\n}\nexport function WalletModal() {\n    const { isOpen, closeModal } = useWalletModal();\n    const { connectWallet, isPending, connectors, error } = useWalletConnect();\n    if (!isOpen)\n        return null;\n    const handleConnect = (connectorId) => {\n        connectWallet(connectorId);\n    };\n    const handleOverlayClick = (e) => {\n        if (e.target === e.currentTarget) {\n            closeModal();\n        }\n    };\n    return (_jsx(\"div\", { className: \"wallet-modal-overlay\", onClick: handleOverlayClick, children: _jsxs(\"div\", { className: \"wallet-modal\", children: [_jsxs(\"div\", { className: \"wallet-modal__header\", children: [_jsx(\"h2\", { className: \"wallet-modal__title\", children: \"Connect Your Wallet\" }), _jsx(\"button\", { className: \"wallet-modal__close\", onClick: closeModal, \"aria-label\": \"Close modal\", children: _jsx(\"svg\", { width: \"24\", height: \"24\", viewBox: \"0 0 24 24\", fill: \"none\", children: _jsx(\"path\", { d: \"M18 6L6 18M6 6L18 18\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\", strokeLinejoin: \"round\" }) }) })] }), _jsxs(\"div\", { className: \"wallet-modal__content\", children: [_jsx(\"p\", { className: \"wallet-modal__description\", children: \"Choose your preferred wallet to connect to this application.\" }), error && (_jsxs(\"div\", { className: \"wallet-modal__error\", children: [_jsxs(\"svg\", { width: \"20\", height: \"20\", viewBox: \"0 0 20 20\", fill: \"none\", children: [_jsx(\"path\", { d: \"M10 18C14.4183 18 18 14.4183 18 10C18 5.58172 14.4183 2 10 2C5.58172 2 2 5.58172 2 10C2 14.4183 5.58172 18 10 18Z\", stroke: \"currentColor\", strokeWidth: \"2\" }), _jsx(\"path\", { d: \"M10 6V10M10 14H10.01\", stroke: \"currentColor\", strokeWidth: \"2\", strokeLinecap: \"round\" })] }), _jsx(\"span\", { children: error.message })] })), _jsx(\"div\", { className: \"wallet-options\", children: (() => {\n                                const availableConnectors = connectors.filter((connector) => {\n                                    // Always show WalletConnect (doesn't need to be \"installed\")\n                                    if (connector.id === 'walletConnect')\n                                        return true;\n                                    // Show injected connectors (they detect installed wallets)\n                                    if (connector.id === 'injected')\n                                        return true;\n                                    // Show other connectors if they're ready or installed\n                                    return connector.installed || connector.ready;\n                                });\n                                if (availableConnectors.length === 0) {\n                                    return (_jsxs(\"div\", { className: \"wallet-options__empty\", children: [_jsx(\"p\", { children: \"No wallets detected. Please install a wallet like MetaMask.\" }), _jsx(\"a\", { href: \"https://metamask.io/download/\", target: \"_blank\", rel: \"noopener noreferrer\", className: \"wallet-modal__link\", children: \"Download MetaMask\" })] }));\n                                }\n                                return availableConnectors.map((connector) => (_jsx(WalletOption, { id: connector.id, name: connector.name, icon: connector.icon, installed: connector.installed, ready: connector.ready, onClick: () => handleConnect(connector.id), isPending: isPending }, connector.id)));\n                            })() }), _jsx(\"div\", { className: \"wallet-modal__footer\", children: _jsxs(\"p\", { className: \"wallet-modal__help\", children: [\"New to Ethereum wallets?\", ' ', _jsx(\"a\", { href: \"https://ethereum.org/en/wallets/\", target: \"_blank\", rel: \"noopener noreferrer\", className: \"wallet-modal__link\", children: \"Learn more\" })] }) })] })] }) }));\n}\n//# sourceMappingURL=WalletModal.js.map","// src/services/walletCoreService.js - Modern wallet service using @coinley/wallet-connect-core\r\nimport { \r\n  createQuickConfig, \r\n  CoinleyWalletProvider,\r\n  ConnectButton,\r\n  WalletModal,\r\n  useWallet,\r\n  useWalletConnect,\r\n  useWalletSign,\r\n  useWalletSignTypedData,\r\n  useNetworkSwitch,\r\n  useTokenBalance,\r\n  useWalletTransaction,\r\n  useWalletModal,\r\n  useWalletDetection\r\n} from '@coinley/wallet-connect-core';\r\n\r\n// Wallet Types (maintaining backward compatibility)\r\nexport const WALLET_TYPES = {\r\n  METAMASK: 'metamask',\r\n  PHANTOM: 'phantom',\r\n  TRONLINK: 'tronlink',\r\n  TRUST_WALLET: 'trustwallet',\r\n  LUTE: 'lute',\r\n  COINBASE_WALLET: 'coinbaseWallet',\r\n  WALLETCONNECT: 'walletConnect'\r\n};\r\n\r\n// Network Types (maintaining backward compatibility)\r\nexport const NETWORK_TYPES = {\r\n  ETHEREUM: 'ethereum',\r\n  BSC: 'bsc',\r\n  TRON: 'tron',\r\n  ALGORAND: 'algorand',\r\n  SOLANA: 'solana',\r\n  POLYGON: 'polygon',\r\n  ARBITRUM: 'arbitrum',\r\n  OPTIMISM: 'optimism',\r\n  AVALANCHE: 'avalanche',\r\n  BASE: 'base'\r\n};\r\n\r\n// Enhanced Network Configuration with wallet-connect-core supported networks\r\nexport const NETWORK_CONFIG = {\r\n  [NETWORK_TYPES.ETHEREUM]: {\r\n    name: 'Ethereum Mainnet',\r\n    chainId: 1,\r\n    symbol: 'ETH',\r\n    decimals: 18,\r\n    rpcUrl: 'https://eth.llamarpc.com',\r\n    blockExplorerUrl: 'https://etherscan.io'\r\n  },\r\n  [NETWORK_TYPES.POLYGON]: {\r\n    name: 'Polygon',\r\n    chainId: 137,\r\n    symbol: 'MATIC',\r\n    decimals: 18,\r\n    rpcUrl: 'https://polygon.llamarpc.com',\r\n    blockExplorerUrl: 'https://polygonscan.com'\r\n  },\r\n  [NETWORK_TYPES.BSC]: {\r\n    name: 'BNB Smart Chain',\r\n    chainId: 56,\r\n    symbol: 'BNB',\r\n    decimals: 18,\r\n    rpcUrl: 'https://bsc.llamarpc.com',\r\n    blockExplorerUrl: 'https://bscscan.com'\r\n  },\r\n  [NETWORK_TYPES.ARBITRUM]: {\r\n    name: 'Arbitrum One',\r\n    chainId: 42161,\r\n    symbol: 'ARB',\r\n    decimals: 18,\r\n    rpcUrl: 'https://arbitrum.llamarpc.com',\r\n    blockExplorerUrl: 'https://arbiscan.io'\r\n  },\r\n  [NETWORK_TYPES.OPTIMISM]: {\r\n    name: 'Optimism',\r\n    chainId: 10,\r\n    symbol: 'OP',\r\n    decimals: 18,\r\n    rpcUrl: 'https://optimism.llamarpc.com',\r\n    blockExplorerUrl: 'https://optimistic.etherscan.io'\r\n  },\r\n  [NETWORK_TYPES.AVALANCHE]: {\r\n    name: 'Avalanche',\r\n    chainId: 43114,\r\n    symbol: 'AVAX',\r\n    decimals: 18,\r\n    rpcUrl: 'https://avalanche.llamarpc.com',\r\n    blockExplorerUrl: 'https://snowtrace.io'\r\n  },\r\n  [NETWORK_TYPES.BASE]: {\r\n    name: 'Base',\r\n    chainId: 8453,\r\n    symbol: 'ETH',\r\n    decimals: 18,\r\n    rpcUrl: 'https://base.llamarpc.com',\r\n    blockExplorerUrl: 'https://basescan.org'\r\n  },\r\n  // Non-EVM networks (for backward compatibility)\r\n  [NETWORK_TYPES.TRON]: {\r\n    name: 'TRON Mainnet',\r\n    symbol: 'TRX',\r\n    decimals: 6,\r\n    rpcUrl: 'https://api.trongrid.io',\r\n    blockExplorerUrl: 'https://tronscan.org'\r\n  },\r\n  [NETWORK_TYPES.ALGORAND]: {\r\n    name: 'Algorand Mainnet',\r\n    symbol: 'ALGO',\r\n    decimals: 6,\r\n    rpcUrl: 'https://mainnet-api.algonode.cloud',\r\n    blockExplorerUrl: 'https://algoexplorer.io'\r\n  },\r\n  [NETWORK_TYPES.SOLANA]: {\r\n    name: 'Solana Mainnet',\r\n    symbol: 'SOL',\r\n    decimals: 9,\r\n    rpcUrl: 'https://rpc.ankr.com/solana',\r\n    blockExplorerUrl: 'https://explorer.solana.com'\r\n  }\r\n};\r\n\r\n// Token configurations with multi-network support\r\nexport const TOKEN_CONFIG = {\r\n  USDT: {\r\n    ethereum: {\r\n      contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    polygon: {\r\n      contractAddress: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    bsc: {\r\n      contractAddress: '0x55d398326f99059fF775485246999027B3197955',\r\n      decimals: 18,\r\n      symbol: 'USDT'\r\n    },\r\n    arbitrum: {\r\n      contractAddress: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    optimism: {\r\n      contractAddress: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    avalanche: {\r\n      contractAddress: '0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    base: {\r\n      contractAddress: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    // Non-EVM networks\r\n    tron: {\r\n      contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    algorand: {\r\n      assetId: 312769,\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    solana: {\r\n      contractAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    }\r\n  },\r\n  USDC: {\r\n    ethereum: {\r\n      contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    polygon: {\r\n      contractAddress: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    bsc: {\r\n      contractAddress: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n      decimals: 18,\r\n      symbol: 'USDC'\r\n    },\r\n    arbitrum: {\r\n      contractAddress: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    optimism: {\r\n      contractAddress: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    avalanche: {\r\n      contractAddress: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    base: {\r\n      contractAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    // Non-EVM networks\r\n    tron: {\r\n      contractAddress: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    algorand: {\r\n      assetId: 31566704,\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    solana: {\r\n      contractAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    }\r\n  }\r\n};\r\n\r\n// Network to wallet mapping (updated for wallet-connect-core)\r\nexport const NETWORK_WALLET_MAP = {\r\n  [NETWORK_TYPES.ETHEREUM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.COINBASE_WALLET, WALLET_TYPES.WALLETCONNECT, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.POLYGON]: [WALLET_TYPES.METAMASK, WALLET_TYPES.COINBASE_WALLET, WALLET_TYPES.WALLETCONNECT, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.BSC]: [WALLET_TYPES.METAMASK, WALLET_TYPES.COINBASE_WALLET, WALLET_TYPES.WALLETCONNECT, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.ARBITRUM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.COINBASE_WALLET, WALLET_TYPES.WALLETCONNECT, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.OPTIMISM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.COINBASE_WALLET, WALLET_TYPES.WALLETCONNECT, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.AVALANCHE]: [WALLET_TYPES.METAMASK, WALLET_TYPES.COINBASE_WALLET, WALLET_TYPES.WALLETCONNECT, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.BASE]: [WALLET_TYPES.METAMASK, WALLET_TYPES.COINBASE_WALLET, WALLET_TYPES.WALLETCONNECT, WALLET_TYPES.TRUST_WALLET],\r\n  // Non-EVM networks (legacy support)\r\n  [NETWORK_TYPES.TRON]: [WALLET_TYPES.TRONLINK, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.ALGORAND]: [WALLET_TYPES.LUTE],\r\n  [NETWORK_TYPES.SOLANA]: [WALLET_TYPES.PHANTOM, WALLET_TYPES.TRUST_WALLET]\r\n};\r\n\r\n// Global wallet configuration\r\nlet walletConfig = null;\r\n\r\n/**\r\n * Initialize wallet core configuration\r\n */\r\nexport const initializeWalletCore = (config = {}) => {\r\n  const defaultConfig = {\r\n    appName: 'Coinley Checkout',\r\n    appDescription: 'Secure cryptocurrency payment processing',\r\n    appUrl: 'https://coinley.com',\r\n    appIcon: 'https://coinley.com/icon.png',\r\n    theme: 'auto',\r\n    enableAnalytics: false,\r\n    // Use only supported EVM networks for wallet-connect-core\r\n    chains: ['ethereum', 'polygon', 'arbitrum', 'optimism', 'avalanche', 'base'],\r\n    ...config\r\n  };\r\n\r\n  try {\r\n    walletConfig = createQuickConfig(defaultConfig);\r\n    return walletConfig;\r\n  } catch (error) {\r\n    console.error('❌ Failed to initialize wallet core:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n/**\r\n * Get the current wallet configuration\r\n */\r\nexport const getWalletConfig = () => {\r\n  if (!walletConfig) {\r\n    console.warn('⚠️ Wallet core not initialized, creating default config');\r\n    return initializeWalletCore();\r\n  }\r\n  return walletConfig;\r\n};\r\n\r\n/**\r\n * Modern wallet connection using @coinley/wallet-connect-core\r\n */\r\nexport const connectWallet = async (walletType, network) => {\r\n  \r\n  try {\r\n    // For EVM networks, use wallet-connect-core\r\n    if (isEvmNetwork(network)) {\r\n      return await connectEvmWallet(walletType, network);\r\n    }\r\n    \r\n    // For non-EVM networks, fall back to legacy connection\r\n    return await connectLegacyWallet(walletType, network);\r\n    \r\n  } catch (error) {\r\n    console.error(`❌ Wallet connection failed for ${walletType}:`, error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n/**\r\n * Connect to EVM wallets using wallet-connect-core\r\n */\r\nconst connectEvmWallet = async (walletType, network) => {\r\n  // This function would be called within a React component context\r\n  // For now, we'll return a placeholder that indicates the need for React context\r\n  throw new Error('EVM wallet connection requires React component context. Use useWalletConnect hook instead.');\r\n};\r\n\r\n/**\r\n * Legacy wallet connection for non-EVM networks\r\n */\r\nconst connectLegacyWallet = async (walletType, network) => {\r\n  // Import legacy connection functions\r\n  const { connectWallet: legacyConnect } = await import('./walletService.js');\r\n  return await legacyConnect(walletType, network);\r\n};\r\n\r\n/**\r\n * Check if network is EVM-compatible\r\n */\r\nexport const isEvmNetwork = (network) => {\r\n  return [\r\n    NETWORK_TYPES.ETHEREUM,\r\n    NETWORK_TYPES.POLYGON,\r\n    NETWORK_TYPES.BSC,\r\n    NETWORK_TYPES.ARBITRUM,\r\n    NETWORK_TYPES.OPTIMISM,\r\n    NETWORK_TYPES.AVALANCHE,\r\n    NETWORK_TYPES.BASE\r\n  ].includes(network);\r\n};\r\n\r\n/**\r\n * Send transaction using wallet-connect-core (for EVM) or legacy service\r\n */\r\nexport const sendTransaction = async (walletConnection, transactionData) => {\r\n  const { to, amount, currency, network, tokenAddress } = transactionData;\r\n  \r\n  \r\n  try {\r\n    if (isEvmNetwork(network)) {\r\n      // This would require React context - throw helpful error\r\n      throw new Error('EVM transactions require React component context. Use useWalletTransaction hook instead.');\r\n    }\r\n    \r\n    // For non-EVM networks, use legacy service\r\n    const { sendTransaction: legacySend } = await import('./walletService.js');\r\n    return await legacySend(walletConnection, transactionData);\r\n    \r\n  } catch (error) {\r\n    console.error('❌ Transaction failed:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n/**\r\n * Get token balance using wallet-connect-core or legacy service\r\n */\r\nexport const getTokenBalance = async (tokenAddress, network, walletAddress) => {\r\n  try {\r\n    if (isEvmNetwork(network)) {\r\n      // This would require React context - return null for now\r\n      console.warn('⚠️ EVM token balance requires React component context. Use useTokenBalance hook instead.');\r\n      return null;\r\n    }\r\n    \r\n    // For non-EVM networks, use legacy service\r\n    const { getTokenBalance: legacyBalance } = await import('./web3.js');\r\n    return await legacyBalance(tokenAddress, network, walletAddress);\r\n    \r\n  } catch (error) {\r\n    console.error('❌ Failed to get token balance:', error);\r\n    return null;\r\n  }\r\n};\r\n\r\n/**\r\n * Detect available wallets\r\n */\r\nexport const detectWallets = async () => {\r\n  try {\r\n    // Detect EVM wallets\r\n    const evmWallets = {};\r\n    \r\n    // Check for browser wallets\r\n    if (typeof window !== 'undefined') {\r\n      evmWallets[WALLET_TYPES.METAMASK] = !!window.ethereum?.isMetaMask;\r\n      evmWallets[WALLET_TYPES.COINBASE_WALLET] = !!window.ethereum?.isCoinbaseWallet;\r\n      evmWallets[WALLET_TYPES.TRUST_WALLET] = !!window.ethereum?.isTrustWallet;\r\n    }\r\n    \r\n    // For non-EVM wallets, use legacy detection\r\n    const { detectWallets: legacyDetect } = await import('./walletService.js');\r\n    const legacyWallets = await legacyDetect();\r\n    \r\n    return {\r\n      ...evmWallets,\r\n      ...legacyWallets\r\n    };\r\n    \r\n  } catch (error) {\r\n    console.error('Error detecting wallets:', error);\r\n    return {\r\n      [WALLET_TYPES.METAMASK]: false,\r\n      [WALLET_TYPES.COINBASE_WALLET]: false,\r\n      [WALLET_TYPES.TRUST_WALLET]: false,\r\n      [WALLET_TYPES.PHANTOM]: false,\r\n      [WALLET_TYPES.TRONLINK]: false,\r\n      [WALLET_TYPES.LUTE]: false\r\n    };\r\n  }\r\n};\r\n\r\n/**\r\n * Get supported wallets for a network\r\n */\r\nexport const getSupportedWalletsForNetwork = (network) => {\r\n  return NETWORK_WALLET_MAP[network] || [];\r\n};\r\n\r\n/**\r\n * Get wallet install URL\r\n */\r\nexport const getWalletInstallUrl = (walletType) => {\r\n  const urls = {\r\n    [WALLET_TYPES.METAMASK]: 'https://metamask.io/download/',\r\n    [WALLET_TYPES.COINBASE_WALLET]: 'https://www.coinbase.com/wallet/downloads',\r\n    [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/download/',\r\n    [WALLET_TYPES.PHANTOM]: 'https://phantom.app/download',\r\n    [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/download/',\r\n    [WALLET_TYPES.LUTE]: 'https://lute.app/download/'\r\n  };\r\n  return urls[walletType] || '';\r\n};\r\n\r\n/**\r\n * Disconnect wallet\r\n */\r\nexport const disconnectWallet = async (walletConnection) => {\r\n  try {\r\n    if (walletConnection.network && isEvmNetwork(walletConnection.network)) {\r\n      return { success: true };\r\n    }\r\n    \r\n    // For non-EVM wallets, use legacy disconnection\r\n    const { disconnectWallet: legacyDisconnect } = await import('./walletService.js');\r\n    return await legacyDisconnect(walletConnection);\r\n    \r\n  } catch (error) {\r\n    console.error('❌ Failed to disconnect wallet:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n/**\r\n * Switch network (EVM networks only)\r\n */\r\nexport const switchNetwork = async (targetNetwork) => {\r\n  if (!isEvmNetwork(targetNetwork)) {\r\n    throw new Error(`Network switching not supported for ${targetNetwork}`);\r\n  }\r\n  \r\n  // This would require React context\r\n  throw new Error('Network switching requires React component context. Use useNetworkSwitch hook instead.');\r\n};\r\n\r\n// Export React components and hooks for use in components\r\nexport {\r\n  CoinleyWalletProvider,\r\n  ConnectButton,\r\n  WalletModal,\r\n  useWallet,\r\n  useWalletConnect,\r\n  useWalletSign,\r\n  useWalletSignTypedData,\r\n  useNetworkSwitch,\r\n  useTokenBalance,\r\n  useWalletTransaction,\r\n  useWalletModal,\r\n  useWalletDetection\r\n};\r\n\r\n// Debug helper\r\nexport const debugWalletEnvironment = () => {\r\n  return {\r\n    message: 'Wallet debugging for modern wallet-connect-core integration',\r\n    evmNetworksSupported: Object.keys(NETWORK_CONFIG).filter(isEvmNetwork),\r\n    legacyNetworksSupported: Object.keys(NETWORK_CONFIG).filter(n => !isEvmNetwork(n)),\r\n    availableWallets: Object.keys(WALLET_TYPES),\r\n    walletCoreInitialized: !!walletConfig\r\n  };\r\n};","function getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nvar browser = {exports: {}};\n\n// shim for using process in browser\nvar process = browser.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ());\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] };\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\nvar browserExports = browser.exports;\nconst process$1 = /*@__PURE__*/getDefaultExportFromCjs(browserExports);\n\nexport { process$1 as default, process$1 as process };\n//# sourceMappingURL=index.js.map\n","// // coinley-sdk/src/services/coinleyConnectClient.js\r\n\r\n// /**\r\n//  * Coinley Connect Client SDK\r\n//  * Handles external wallet connections through Coinley Connect service\r\n//  */\r\n// class CoinleyConnectClient {\r\n//     constructor(options = {}) {\r\n//         this.apiUrl = options.apiUrl || 'http://localhost:3001/api';\r\n//         this.walletInterfaceUrl = options.walletInterfaceUrl || 'http://localhost:3001';\r\n//         this.debug = options.debug || false;\r\n        \r\n//         this.log('Coinley Connect Client initialized', { apiUrl: this.apiUrl });\r\n//     }\r\n    \r\n//     /**\r\n//      * Get supported wallets for a specific network\r\n//      */\r\n//     async getSupportedWallets(network = null) {\r\n//         try {\r\n//             const url = network ? \r\n//                 `${this.apiUrl}/wallets/supported?network=${network}` : \r\n//                 `${this.apiUrl}/wallets/supported`;\r\n                \r\n//             const response = await fetch(url);\r\n//             const data = await response.json();\r\n            \r\n//             if (!data.success) {\r\n//                 throw new Error(data.error || 'Failed to get supported wallets');\r\n//             }\r\n            \r\n//             return data.wallets;\r\n//         } catch (error) {\r\n//             this.log('Error getting supported wallets:', error);\r\n//             throw error;\r\n//         }\r\n//     }\r\n    \r\n//     /**\r\n//      * Initiate wallet connection\r\n//      */\r\n//     async connectWallet(walletType, network, options = {}) {\r\n//         try {\r\n//             this.log('Initiating wallet connection', { walletType, network });\r\n            \r\n//             const response = await fetch(`${this.apiUrl}/connections/connect`, {\r\n//                 method: 'POST',\r\n//                 headers: {\r\n//                     'Content-Type': 'application/json'\r\n//                 },\r\n//                 body: JSON.stringify({\r\n//                     walletType,\r\n//                     network,\r\n//                     returnUrl: options.returnUrl,\r\n//                     metadata: options.metadata || {}\r\n//                 })\r\n//             });\r\n            \r\n//             const data = await response.json();\r\n            \r\n//             if (!data.success) {\r\n//                 throw new Error(data.error || 'Failed to initiate connection');\r\n//             }\r\n            \r\n//             // Build interface URL\r\n//             const interfaceUrl = this.buildInterfaceUrl(data.sessionId, walletType, network, options.transaction);\r\n            \r\n//             // Open wallet interface based on options\r\n//             if (options.openInNewTab) {\r\n//                 window.open(interfaceUrl, '_blank');\r\n//             } else if (options.popup) {\r\n//                 this.openPopup(interfaceUrl, options.popup);\r\n//             } else if (options.iframe) {\r\n//                 this.openIframe(interfaceUrl, options.iframe);\r\n//             } else {\r\n//                 // Default: open in popup\r\n//                 this.openPopup(interfaceUrl, { width: 420, height: 650 });\r\n//             }\r\n            \r\n//             return {\r\n//                 sessionId: data.sessionId,\r\n//                 interfaceUrl,\r\n//                 statusUrl: `${this.apiUrl}/connections/status/${data.sessionId}`\r\n//             };\r\n            \r\n//         } catch (error) {\r\n//             this.log('Error initiating wallet connection:', error);\r\n//             throw error;\r\n//         }\r\n//     }\r\n    \r\n//     /**\r\n//      * Check connection status\r\n//      */\r\n//     async getConnectionStatus(sessionId) {\r\n//         try {\r\n//             const response = await fetch(`${this.apiUrl}/connections/status/${sessionId}`);\r\n//             const data = await response.json();\r\n            \r\n//             if (!data.success) {\r\n//                 throw new Error(data.error || 'Failed to get connection status');\r\n//             }\r\n            \r\n//             return data.session;\r\n//         } catch (error) {\r\n//             this.log('Error getting connection status:', error);\r\n//             throw error;\r\n//         }\r\n//     }\r\n    \r\n//     /**\r\n//      * Poll connection status until connected or failed\r\n//      */\r\n//     async waitForConnection(sessionId, timeout = 300000) { // 5 minutes default\r\n//         return new Promise((resolve, reject) => {\r\n//             const startTime = Date.now();\r\n            \r\n//             const checkStatus = async () => {\r\n//                 try {\r\n//                     const status = await this.getConnectionStatus(sessionId);\r\n                    \r\n//                     if (status.status === 'connected') {\r\n//                         resolve(status);\r\n//                         return;\r\n//                     }\r\n                    \r\n//                     if (status.status === 'failed' || status.status === 'expired') {\r\n//                         reject(new Error(status.error || `Connection ${status.status}`));\r\n//                         return;\r\n//                     }\r\n                    \r\n//                     // Check timeout\r\n//                     if (Date.now() - startTime > timeout) {\r\n//                         reject(new Error('Connection timeout'));\r\n//                         return;\r\n//                     }\r\n                    \r\n//                     // Continue polling\r\n//                     setTimeout(checkStatus, 2000);\r\n                    \r\n//                 } catch (error) {\r\n//                     reject(error);\r\n//                 }\r\n//             };\r\n            \r\n//             checkStatus();\r\n//         });\r\n//     }\r\n    \r\n//     /**\r\n//      * Send transaction through connected wallet\r\n//      */\r\n//     async sendTransaction(sessionId, transactionData) {\r\n//         try {\r\n//             this.log('Sending transaction', { sessionId, transactionData });\r\n            \r\n//             const response = await fetch(`${this.apiUrl}/transactions/send`, {\r\n//                 method: 'POST',\r\n//                 headers: {\r\n//                     'Content-Type': 'application/json'\r\n//                 },\r\n//                 body: JSON.stringify({\r\n//                     sessionId,\r\n//                     ...transactionData\r\n//                 })\r\n//             });\r\n            \r\n//             const data = await response.json();\r\n            \r\n//             if (!data.success) {\r\n//                 throw new Error(data.error || 'Failed to send transaction');\r\n//             }\r\n            \r\n//             return data;\r\n//         } catch (error) {\r\n//             this.log('Error sending transaction:', error);\r\n//             throw error;\r\n//         }\r\n//     }\r\n    \r\n//     /**\r\n//      * Disconnect wallet\r\n//      */\r\n//     async disconnectWallet(sessionId) {\r\n//         try {\r\n//             const response = await fetch(`${this.apiUrl}/connections/disconnect`, {\r\n//                 method: 'POST',\r\n//                 headers: {\r\n//                     'Content-Type': 'application/json'\r\n//                 },\r\n//                 body: JSON.stringify({ sessionId })\r\n//             });\r\n            \r\n//             const data = await response.json();\r\n            \r\n//             if (!data.success) {\r\n//                 throw new Error(data.error || 'Failed to disconnect wallet');\r\n//             }\r\n            \r\n//             return data;\r\n//         } catch (error) {\r\n//             this.log('Error disconnecting wallet:', error);\r\n//             throw error;\r\n//         }\r\n//     }\r\n    \r\n//     /**\r\n//      * Build wallet interface URL\r\n//      */\r\n//     buildInterfaceUrl(sessionId, walletType, network, transaction = null) {\r\n//         const params = new URLSearchParams({\r\n//             sessionId,\r\n//             walletType,\r\n//             network\r\n//         });\r\n        \r\n//         if (transaction) {\r\n//             Object.entries(transaction).forEach(([key, value]) => {\r\n//                 if (value !== null && value !== undefined) {\r\n//                     params.append(key, value.toString());\r\n//                 }\r\n//             });\r\n//         }\r\n        \r\n//         return `${this.walletInterfaceUrl}?${params.toString()}`;\r\n//     }\r\n    \r\n//     /**\r\n//      * Open popup window for wallet connection\r\n//      */\r\n//     openPopup(url, options = {}) {\r\n//         const defaultOptions = {\r\n//             width: 420,\r\n//             height: 650,\r\n//             left: (screen.width - 420) / 2,\r\n//             top: (screen.height - 650) / 2,\r\n//             scrollbars: 'no',\r\n//             resizable: 'no',\r\n//             toolbar: 'no',\r\n//             menubar: 'no',\r\n//             location: 'no',\r\n//             status: 'no'\r\n//         };\r\n        \r\n//         const popupOptions = { ...defaultOptions, ...options };\r\n//         const optionsString = Object.entries(popupOptions)\r\n//             .map(([key, value]) => `${key}=${value}`)\r\n//             .join(',');\r\n            \r\n//         const popup = window.open(url, 'coinley-connect', optionsString);\r\n        \r\n//         // Listen for messages from popup\r\n//         const messageHandler = (event) => {\r\n//             if (event.origin !== new URL(this.walletInterfaceUrl).origin) return;\r\n            \r\n//             if (event.data.type === 'wallet_connected') {\r\n//                 this.log('Wallet connected via popup:', event.data);\r\n//             }\r\n            \r\n//             if (event.data.type === 'transaction_sent') {\r\n//                 this.log('Transaction sent via popup:', event.data);\r\n//             }\r\n//         };\r\n        \r\n//         window.addEventListener('message', messageHandler);\r\n        \r\n//         // Clean up event listener when popup closes\r\n//         const checkClosed = setInterval(() => {\r\n//             if (popup.closed) {\r\n//                 window.removeEventListener('message', messageHandler);\r\n//                 clearInterval(checkClosed);\r\n//             }\r\n//         }, 1000);\r\n        \r\n//         return popup;\r\n//     }\r\n    \r\n//     /**\r\n//      * Open iframe for wallet connection (embedded mode)\r\n//      */\r\n//     openIframe(url, options = {}) {\r\n//         const defaultOptions = {\r\n//             width: '420px',\r\n//             height: '650px',\r\n//             border: 'none',\r\n//             borderRadius: '12px',\r\n//             boxShadow: '0 10px 40px rgba(0,0,0,0.15)'\r\n//         };\r\n        \r\n//         const iframeOptions = { ...defaultOptions, ...options };\r\n        \r\n//         // Create iframe\r\n//         const iframe = document.createElement('iframe');\r\n//         iframe.src = url;\r\n//         iframe.style.width = iframeOptions.width;\r\n//         iframe.style.height = iframeOptions.height;\r\n//         iframe.style.border = iframeOptions.border;\r\n//         iframe.style.borderRadius = iframeOptions.borderRadius;\r\n//         iframe.style.boxShadow = iframeOptions.boxShadow;\r\n        \r\n//         // Create overlay\r\n//         const overlay = document.createElement('div');\r\n//         overlay.style.cssText = `\r\n//             position: fixed;\r\n//             top: 0;\r\n//             left: 0;\r\n//             width: 100%;\r\n//             height: 100%;\r\n//             background: rgba(0,0,0,0.5);\r\n//             display: flex;\r\n//             align-items: center;\r\n//             justify-content: center;\r\n//             z-index: 10000;\r\n//         `;\r\n        \r\n//         overlay.appendChild(iframe);\r\n//         document.body.appendChild(overlay);\r\n        \r\n//         // Close on overlay click\r\n//         overlay.addEventListener('click', (e) => {\r\n//             if (e.target === overlay) {\r\n//                 document.body.removeChild(overlay);\r\n//             }\r\n//         });\r\n        \r\n//         // Listen for messages from iframe\r\n//         const messageHandler = (event) => {\r\n//             if (event.origin !== new URL(this.walletInterfaceUrl).origin) return;\r\n            \r\n//             if (event.data.type === 'wallet_connected') {\r\n//                 this.log('Wallet connected via iframe:', event.data);\r\n//             }\r\n            \r\n//             if (event.data.type === 'transaction_sent') {\r\n//                 this.log('Transaction sent via iframe:', event.data);\r\n//                 // Close iframe after transaction\r\n//                 document.body.removeChild(overlay);\r\n//             }\r\n//         };\r\n        \r\n//         window.addEventListener('message', messageHandler);\r\n        \r\n//         return { iframe, overlay };\r\n//     }\r\n    \r\n//     /**\r\n//      * Debug logging\r\n//      */\r\n//     log(message, data = null) {\r\n//         if (this.debug) {\r\n//             console.log(`[Coinley Connect] ${message}`, data || '');\r\n//         }\r\n//     }\r\n// }\r\n\r\n// // ✅ FIXED: Proper export\r\n// export { CoinleyConnectClient };\r\n\r\n// // ✅ Also export as default for flexibility\r\n// export default CoinleyConnectClient;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// coinley-sdk/src/services/coinleyConnectClient.js - Fixed version without ethers.js dependency\r\n\r\n// this is code page consuming api from coinley-connect\r\n\r\n\r\n// coinley-sdk/src/services/coinleyConnectClient.js - Fixed version for wallet integration\r\n\r\nclass CoinleyConnectClient {\r\n    constructor(options = {}) {\r\n        this.apiUrl = options.apiUrl || 'http://localhost:3001/api';\r\n        this.walletInterfaceUrl = options.walletInterfaceUrl || 'http://localhost:3001';\r\n        this.debug = options.debug || false;\r\n        \r\n        this.log('Coinley Connect Client initialized', { apiUrl: this.apiUrl });\r\n    }\r\n    \r\n    /**\r\n     * ✅ FIXED: Enhanced wallet connection with proper popup handling\r\n     */\r\n    async connectWallet(walletType, network, options = {}) {\r\n        try {\r\n            this.log('Initiating wallet connection', { walletType, network });\r\n            \r\n            // First create a session on the server\r\n            const response = await fetch(`${this.apiUrl}/connections/connect`, {\r\n                method: 'POST',\r\n                headers: {\r\n                    'Content-Type': 'application/json'\r\n                },\r\n                body: JSON.stringify({\r\n                    walletType,\r\n                    network,\r\n                    returnUrl: options.returnUrl,\r\n                    metadata: options.metadata || {}\r\n                })\r\n            });\r\n            \r\n            const data = await response.json();\r\n            \r\n            if (!data.success) {\r\n                throw new Error(data.error || 'Failed to initiate connection');\r\n            }\r\n            \r\n            // ✅ Build the wallet interface URL with session ID\r\n            const interfaceUrl = `${this.walletInterfaceUrl}?sessionId=${data.sessionId}&walletType=${walletType}&network=${network}`;\r\n            \r\n            this.log('Opening wallet interface:', interfaceUrl);\r\n            \r\n            // Open the wallet interface popup\r\n            const popup = this.openPopup(interfaceUrl, {\r\n                width: 420,\r\n                height: 650,\r\n                title: `Connect ${walletType}`\r\n            });\r\n            \r\n            // ✅ Listen for wallet connection messages from popup\r\n            return new Promise((resolve, reject) => {\r\n                const timeout = setTimeout(() => {\r\n                    reject(new Error('Connection timeout'));\r\n                }, 300000); // 5 minutes\r\n                \r\n                const messageHandler = (event) => {\r\n                    // Verify origin for security\r\n                    if (event.origin !== new URL(this.walletInterfaceUrl).origin) {\r\n                        return;\r\n                    }\r\n                    \r\n                    this.log('Received message from popup:', event.data);\r\n                    \r\n                    if (event.data.type === 'wallet_connected') {\r\n                        clearTimeout(timeout);\r\n                        window.removeEventListener('message', messageHandler);\r\n                        \r\n                        // Update the session status on the server\r\n                        this.updateConnectionStatus(data.sessionId, {\r\n                            status: 'connected',\r\n                            address: event.data.address,\r\n                            walletType: event.data.walletType\r\n                        });\r\n                        \r\n                        resolve({\r\n                            sessionId: data.sessionId,\r\n                            address: event.data.address,\r\n                            walletType: event.data.walletType,\r\n                            network: network,\r\n                            isConnected: true\r\n                        });\r\n                    }\r\n                    \r\n                    if (event.data.type === 'wallet_connection_failed') {\r\n                        clearTimeout(timeout);\r\n                        window.removeEventListener('message', messageHandler);\r\n                        reject(new Error(event.data.error || 'Connection failed'));\r\n                    }\r\n                };\r\n                \r\n                window.addEventListener('message', messageHandler);\r\n                \r\n                // Also check if popup was closed without connection\r\n                const checkClosed = setInterval(() => {\r\n                    if (popup.closed) {\r\n                        clearTimeout(timeout);\r\n                        clearInterval(checkClosed);\r\n                        window.removeEventListener('message', messageHandler);\r\n                        reject(new Error('Connection cancelled - popup was closed'));\r\n                    }\r\n                }, 1000);\r\n            });\r\n            \r\n        } catch (error) {\r\n            this.log('Error initiating wallet connection:', error);\r\n            throw error;\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * ✅ Update connection status on server\r\n     */\r\n    async updateConnectionStatus(sessionId, statusData) {\r\n        try {\r\n            const response = await fetch(`${this.apiUrl}/connections/update-status`, {\r\n                method: 'POST',\r\n                headers: {\r\n                    'Content-Type': 'application/json'\r\n                },\r\n                body: JSON.stringify({\r\n                    sessionId,\r\n                    ...statusData\r\n                })\r\n            });\r\n            \r\n            const data = await response.json();\r\n            this.log('Connection status updated:', data);\r\n            return data;\r\n            \r\n        } catch (error) {\r\n            this.log('Error updating connection status:', error);\r\n            throw error;\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * ✅ ENHANCED: Send transaction with better popup handling\r\n     */\r\n    async sendTransaction(sessionId, transactionData) {\r\n        try {\r\n            this.log('Sending transaction', { sessionId, transactionData });\r\n            \r\n            const { to, amount, currency, network } = transactionData;\r\n            \r\n            if (!to || !amount) {\r\n                throw new Error('Recipient address and amount are required');\r\n            }\r\n            \r\n            // First create the transaction record on server\r\n            const response = await fetch(`${this.apiUrl}/transactions/send`, {\r\n                method: 'POST',\r\n                headers: {\r\n                    'Content-Type': 'application/json'\r\n                },\r\n                body: JSON.stringify({\r\n                    sessionId,\r\n                    ...transactionData\r\n                })\r\n            });\r\n            \r\n            if (!response.ok) {\r\n                let errorData;\r\n                try {\r\n                    errorData = await response.json();\r\n                } catch (e) {\r\n                    throw new Error(`Transaction failed: ${response.status} ${response.statusText}`);\r\n                }\r\n                throw new Error(errorData.error || `Transaction failed: ${response.status}`);\r\n            }\r\n            \r\n            const data = await response.json();\r\n            \r\n            if (!data.success) {\r\n                throw new Error(data.error || 'Failed to send transaction');\r\n            }\r\n            \r\n            \r\n            // ✅ Open transaction interface for user to confirm in wallet\r\n            const txInterfaceUrl = `${this.walletInterfaceUrl}?sessionId=${sessionId}&action=transaction&transactionId=${data.transactionId}&to=${to}&amount=${amount}&currency=${currency}&network=${network}`;\r\n            \r\n            this.log('Opening transaction interface:', txInterfaceUrl);\r\n            \r\n            const popup = this.openPopup(txInterfaceUrl, {\r\n                width: 420,\r\n                height: 650,\r\n                title: `Send Transaction`\r\n            });\r\n            \r\n            // ✅ Wait for transaction completion\r\n            return new Promise((resolve, reject) => {\r\n                const timeout = setTimeout(() => {\r\n                    reject(new Error('Transaction timeout'));\r\n                }, 300000); // 5 minutes\r\n                \r\n                const messageHandler = (event) => {\r\n                    if (event.origin !== new URL(this.walletInterfaceUrl).origin) {\r\n                        return;\r\n                    }\r\n                    \r\n                    this.log('Received transaction message:', event.data);\r\n                    \r\n                    if (event.data.type === 'transaction_sent') {\r\n                        clearTimeout(timeout);\r\n                        window.removeEventListener('message', messageHandler);\r\n                        \r\n                        // Update the transaction status on server\r\n                        this.updateTransactionStatus(data.transactionId, {\r\n                            hash: event.data.hash,\r\n                            status: 'confirmed'\r\n                        });\r\n                        \r\n                        resolve(event.data.hash);\r\n                    }\r\n                    \r\n                    if (event.data.type === 'transaction_failed') {\r\n                        clearTimeout(timeout);\r\n                        window.removeEventListener('message', messageHandler);\r\n                        reject(new Error(event.data.error || 'Transaction failed'));\r\n                    }\r\n                };\r\n                \r\n                window.addEventListener('message', messageHandler);\r\n                \r\n                const checkClosed = setInterval(() => {\r\n                    if (popup.closed) {\r\n                        clearTimeout(timeout);\r\n                        clearInterval(checkClosed);\r\n                        window.removeEventListener('message', messageHandler);\r\n                        reject(new Error('Transaction cancelled'));\r\n                    }\r\n                }, 1000);\r\n            });\r\n            \r\n        } catch (error) {\r\n            this.log('Error sending transaction:', error);\r\n            throw error;\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * ✅ Update transaction status on server\r\n     */\r\n    async updateTransactionStatus(transactionId, statusData) {\r\n        try {\r\n            const response = await fetch(`${this.apiUrl}/transactions/update-status`, {\r\n                method: 'POST',\r\n                headers: {\r\n                    'Content-Type': 'application/json'\r\n                },\r\n                body: JSON.stringify({\r\n                    transactionId,\r\n                    ...statusData\r\n                })\r\n            });\r\n            \r\n            const data = await response.json();\r\n            this.log('Transaction status updated:', data);\r\n            return data;\r\n            \r\n        } catch (error) {\r\n            this.log('Error updating transaction status:', error);\r\n            throw error;\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * ✅ ENHANCED: Better popup handling\r\n     */\r\n    openPopup(url, options = {}) {\r\n        const defaultOptions = {\r\n            width: 420,\r\n            height: 650,\r\n            left: Math.round((screen.width - 420) / 2),\r\n            top: Math.round((screen.height - 650) / 2),\r\n            scrollbars: 'no',\r\n            resizable: 'no',\r\n            toolbar: 'no',\r\n            menubar: 'no',\r\n            location: 'no',\r\n            status: 'no'\r\n        };\r\n        \r\n        const popupOptions = { ...defaultOptions, ...options };\r\n        const optionsString = Object.entries(popupOptions)\r\n            .map(([key, value]) => `${key}=${value}`)\r\n            .join(',');\r\n            \r\n        const popup = window.open(url, 'coinley-connect', optionsString);\r\n        \r\n        if (!popup) {\r\n            throw new Error('Popup blocked. Please allow popups for wallet connections.');\r\n        }\r\n        \r\n        // Focus the popup\r\n        popup.focus();\r\n        \r\n        return popup;\r\n    }\r\n    \r\n    /**\r\n     * Check connection status\r\n     */\r\n    async getConnectionStatus(sessionId) {\r\n        try {\r\n            const response = await fetch(`${this.apiUrl}/connections/status/${sessionId}`);\r\n            const data = await response.json();\r\n            \r\n            if (!data.success) {\r\n                throw new Error(data.error || 'Failed to get connection status');\r\n            }\r\n            \r\n            return data.session;\r\n        } catch (error) {\r\n            this.log('Error getting connection status:', error);\r\n            throw error;\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * Get supported wallets for a network\r\n     */\r\n    async getSupportedWallets(network = null) {\r\n        try {\r\n            const url = network ? \r\n                `${this.apiUrl}/wallets/supported?network=${network}` : \r\n                `${this.apiUrl}/wallets/supported`;\r\n                \r\n            const response = await fetch(url);\r\n            const data = await response.json();\r\n            \r\n            if (!data.success) {\r\n                throw new Error(data.error || 'Failed to get supported wallets');\r\n            }\r\n            \r\n            return data.wallets;\r\n        } catch (error) {\r\n            this.log('Error getting supported wallets:', error);\r\n            throw error;\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * Disconnect wallet\r\n     */\r\n    async disconnectWallet(sessionId) {\r\n        try {\r\n            const response = await fetch(`${this.apiUrl}/connections/disconnect`, {\r\n                method: 'POST',\r\n                headers: {\r\n                    'Content-Type': 'application/json'\r\n                },\r\n                body: JSON.stringify({ sessionId })\r\n            });\r\n            \r\n            const data = await response.json();\r\n            \r\n            if (!data.success) {\r\n                throw new Error(data.error || 'Failed to disconnect wallet');\r\n            }\r\n            \r\n            return data;\r\n        } catch (error) {\r\n            this.log('Error disconnecting wallet:', error);\r\n            throw error;\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * Debug logging\r\n     */\r\n    log(message, data = null) {\r\n        if (this.debug) {\r\n            console.log(`[Coinley Connect] ${message}`, data || '');\r\n        }\r\n    }\r\n}\r\n\r\nexport { CoinleyConnectClient };\r\nexport default CoinleyConnectClient;","// // src/services/walletService.js \r\n// import { ethers } from 'ethers';\r\n\r\n// // Wallet Types - Added Phantom\r\n// export const WALLET_TYPES = {\r\n//   METAMASK: 'metamask',\r\n//   TRONLINK: 'tronlink',\r\n//   TRUST_WALLET: 'trustwallet',\r\n//   LUTE: 'lute',\r\n//   PHANTOM: 'phantom' // New Phantom wallet for Solana\r\n// };\r\n\r\n// // Network Types - Added Solana\r\n// export const NETWORK_TYPES = {\r\n//   ETHEREUM: 'ethereum',\r\n//   BSC: 'bsc',\r\n//   TRON: 'tron',\r\n//   ALGORAND: 'algorand',\r\n//   SOLANA: 'solana' // New Solana network\r\n// };\r\n\r\n// // Network configuration - Added Solana\r\n// export const NETWORK_CONFIG = {\r\n//   [NETWORK_TYPES.ETHEREUM]: {\r\n//     name: 'Ethereum Mainnet',\r\n//     chainId: 1,\r\n//     symbol: 'ETH',\r\n//     decimals: 18,\r\n//     rpcUrl: 'https://mainnet.infura.io/v3/your-infura-key',\r\n//     blockExplorerUrl: 'https://etherscan.io'\r\n//   },\r\n//   [NETWORK_TYPES.BSC]: {\r\n//     name: 'Binance Smart Chain',\r\n//     chainId: 56,\r\n//     symbol: 'BNB',\r\n//     decimals: 18,\r\n//     rpcUrl: 'https://bsc-dataseed.binance.org/',\r\n//     blockExplorerUrl: 'https://bscscan.com'\r\n//   },\r\n//   [NETWORK_TYPES.TRON]: {\r\n//     name: 'TRON Mainnet',\r\n//     symbol: 'TRX',\r\n//     decimals: 6,\r\n//     rpcUrl: 'https://api.trongrid.io',\r\n//     blockExplorerUrl: 'https://tronscan.org'\r\n//   },\r\n//   [NETWORK_TYPES.ALGORAND]: {\r\n//     name: 'Algorand Mainnet',\r\n//     symbol: 'ALGO',\r\n//     decimals: 6,\r\n//     rpcUrl: 'https://mainnet-api.algonode.cloud',\r\n//     blockExplorerUrl: 'https://algoexplorer.io'\r\n//   },\r\n//   [NETWORK_TYPES.SOLANA]: {\r\n//     name: 'Solana Mainnet',\r\n//     symbol: 'SOL',\r\n//     decimals: 9,\r\n//     rpcUrl: 'https://api.mainnet-beta.solana.com',\r\n//     blockExplorerUrl: 'https://explorer.solana.com'\r\n//   }\r\n// };\r\n\r\n// // Token configurations with correct contract addresses and decimals - Added Solana tokens\r\n// export const TOKEN_CONFIG = {\r\n//   USDT: {\r\n//     ethereum: {\r\n//       contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     bsc: {\r\n//       contractAddress: '0x55d398326f99059fF775485246999027B3197955',\r\n//       decimals: 18,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     tron: {\r\n//       contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     algorand: {\r\n//       assetId: 312769,\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     solana: {\r\n//       contractAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', // USDT on Solana\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     }\r\n//   },\r\n//   USDC: {\r\n//     ethereum: {\r\n//       contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     bsc: {\r\n//       contractAddress: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n//       decimals: 18,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     tron: {\r\n//       contractAddress: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     algorand: {\r\n//       assetId: 31566704,\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     solana: {\r\n//       contractAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC on Solana\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     }\r\n//   },\r\n//   BNB: {\r\n//     bsc: {\r\n//       decimals: 18,\r\n//       symbol: 'BNB',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   ETH: {\r\n//     ethereum: {\r\n//       decimals: 18,\r\n//       symbol: 'ETH',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   TRX: {\r\n//     tron: {\r\n//       decimals: 6,\r\n//       symbol: 'TRX',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   ALGO: {\r\n//     algorand: {\r\n//       decimals: 6,\r\n//       symbol: 'ALGO',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   SOL: {\r\n//     solana: {\r\n//       decimals: 9,\r\n//       symbol: 'SOL',\r\n//       isNative: true\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Network to wallet mapping - Added Solana/Phantom\r\n// export const NETWORK_WALLET_MAP = {\r\n//   [NETWORK_TYPES.ETHEREUM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.BSC]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.TRON]: [WALLET_TYPES.TRONLINK],\r\n//   [NETWORK_TYPES.ALGORAND]: [WALLET_TYPES.LUTE],\r\n//   [NETWORK_TYPES.SOLANA]: [WALLET_TYPES.PHANTOM] // Phantom for Solana\r\n// };\r\n\r\n// // Installation URLs for wallets - Added Phantom\r\n// export const getWalletInstallUrl = (walletType) => {\r\n//   const urls = {\r\n//     [WALLET_TYPES.METAMASK]: 'https://metamask.io/download/',\r\n//     [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/download/',\r\n//     [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/download/',\r\n//     [WALLET_TYPES.LUTE]: 'https://lute.app/download/',\r\n//     [WALLET_TYPES.PHANTOM]: 'https://phantom.app/download'\r\n//   };\r\n//   return urls[walletType] || '';\r\n// };\r\n\r\n// // Enhanced Lute wallet detection\r\n// const detectLuteWallet = () => {\r\n//   if (typeof window === 'undefined') return false;\r\n  \r\n//   // Multiple ways to detect Lute wallet\r\n//   const luteDetectionMethods = [\r\n//     // Check for window.lute\r\n//     () => window.lute !== undefined,\r\n//     // Check for window.algorand (some Algorand wallets use this)\r\n//     () => window.algorand !== undefined,\r\n//     // Check for AlgoSigner (alternative Algorand wallet)\r\n//     () => window.AlgoSigner !== undefined,\r\n//     // Check for specific Lute wallet identifiers\r\n//     () => window.luteWallet !== undefined,\r\n//     // Check for wallet extension in DOM\r\n//     () => document.querySelector('[data-wallet=\"lute\"]') !== null,\r\n//     // Check if Lute is injected via content script\r\n//     () => window.postMessage && document.documentElement.getAttribute('data-lute-extension') === 'true'\r\n//   ];\r\n  \r\n//   return luteDetectionMethods.some(method => {\r\n//     try {\r\n//       return method();\r\n//     } catch (error) {\r\n//       console.warn('Lute detection method failed:', error);\r\n//       return false;\r\n//     }\r\n//   });\r\n// };\r\n\r\n// // Enhanced Phantom wallet detection\r\n// const detectPhantomWallet = () => {\r\n//   if (typeof window === 'undefined') return false;\r\n  \r\n//   // Multiple ways to detect Phantom wallet\r\n//   const phantomDetectionMethods = [\r\n//     // Check for window.solana with isPhantom\r\n//     () => window.solana && window.solana.isPhantom,\r\n//     // Check for window.phantom\r\n//     () => window.phantom && window.phantom.solana,\r\n//     // Check for specific Phantom wallet identifiers\r\n//     () => window.phantomWallet !== undefined,\r\n//     // Check for wallet extension in DOM\r\n//     () => document.querySelector('[data-wallet=\"phantom\"]') !== null\r\n//   ];\r\n  \r\n//   return phantomDetectionMethods.some(method => {\r\n//     try {\r\n//       return method();\r\n//     } catch (error) {\r\n//       console.warn('Phantom detection method failed:', error);\r\n//       return false;\r\n//     }\r\n//   });\r\n// };\r\n\r\n// // Detect available wallets in the browser - Added Phantom\r\n// export const detectWallets = () => {\r\n//   const availableWallets = {\r\n//     [WALLET_TYPES.METAMASK]: typeof window !== 'undefined' && window.ethereum !== undefined && window.ethereum.isMetaMask,\r\n//     [WALLET_TYPES.TRONLINK]: typeof window !== 'undefined' && window.tronWeb !== undefined,\r\n//     [WALLET_TYPES.TRUST_WALLET]: typeof window !== 'undefined' && \r\n//       window.ethereum !== undefined && \r\n//       window.ethereum.isTrust === true,\r\n//     [WALLET_TYPES.LUTE]: detectLuteWallet(),\r\n//     [WALLET_TYPES.PHANTOM]: detectPhantomWallet()\r\n//   };\r\n  \r\n//   // Enhanced logging for wallet detection\r\n//   if (typeof window !== 'undefined') {\r\n//     console.log('=== WALLET DETECTION DEBUG ===');\r\n//     console.log('MetaMask:', availableWallets[WALLET_TYPES.METAMASK]);\r\n//     console.log('TronLink:', availableWallets[WALLET_TYPES.TRONLINK]);\r\n//     console.log('Trust Wallet:', availableWallets[WALLET_TYPES.TRUST_WALLET]);\r\n//     console.log('Lute:', availableWallets[WALLET_TYPES.LUTE]);\r\n//     console.log('Phantom:', availableWallets[WALLET_TYPES.PHANTOM]);\r\n//     console.log('window.solana:', Boolean(window.solana));\r\n//     console.log('window.phantom:', Boolean(window.phantom));\r\n//     console.log('=== END WALLET DETECTION DEBUG ===');\r\n//   }\r\n  \r\n//   return availableWallets;\r\n// };\r\n\r\n// // Detect wallets with retry and enhanced detection\r\n// export const detectWalletsWithRetry = async (maxRetries = 5, delay = 1000) => {\r\n//   let retries = 0;\r\n//   let wallets = detectWallets();\r\n  \r\n//   // Special handling for wallet injection - give it more time\r\n//   while (retries < maxRetries) {\r\n//     wallets = detectWallets();\r\n    \r\n//     // Check if we found any wallets or if we've reached max retries\r\n//     const hasAnyWallet = Object.values(wallets).some(v => v === true);\r\n    \r\n//     if (hasAnyWallet || retries >= maxRetries - 1) {\r\n//       break;\r\n//     }\r\n    \r\n//     console.log(`Wallet detection attempt ${retries + 1}/${maxRetries}...`);\r\n//     console.log('Current detection results:', wallets);\r\n    \r\n//     // Wait before next attempt\r\n//     await new Promise(resolve => setTimeout(resolve, delay));\r\n//     retries++;\r\n//   }\r\n  \r\n//   // Final check with extended detection\r\n//   if (!wallets[WALLET_TYPES.LUTE] || !wallets[WALLET_TYPES.PHANTOM]) {\r\n//     console.log('Performing extended wallet detection...');\r\n    \r\n//     if (typeof window !== 'undefined') {\r\n//       try {\r\n//         // Dispatch custom events that might trigger wallet injection\r\n//         const luteEvent = new CustomEvent('lute-wallet-detect', { detail: { source: 'coinley-sdk' } });\r\n//         const phantomEvent = new CustomEvent('phantom-wallet-detect', { detail: { source: 'coinley-sdk' } });\r\n//         window.dispatchEvent(luteEvent);\r\n//         window.dispatchEvent(phantomEvent);\r\n        \r\n//         // Wait a bit more for potential injection\r\n//         await new Promise(resolve => setTimeout(resolve, 500));\r\n        \r\n//         // Re-detect\r\n//         wallets[WALLET_TYPES.LUTE] = detectLuteWallet();\r\n//         wallets[WALLET_TYPES.PHANTOM] = detectPhantomWallet();\r\n//       } catch (error) {\r\n//         console.warn('Extended wallet detection failed:', error);\r\n//       }\r\n//     }\r\n//   }\r\n  \r\n//   console.log('Final wallet detection results:', wallets);\r\n//   return wallets;\r\n// };\r\n\r\n// // Debug wallet environment - Added Phantom\r\n// export const debugWalletEnvironment = () => {\r\n//   console.log('=== WALLET ENVIRONMENT DEBUG ===');\r\n//   console.log('ethereum:', typeof window !== 'undefined' ? Boolean(window.ethereum) : 'Not in browser');\r\n//   console.log('tronWeb:', typeof window !== 'undefined' ? Boolean(window.tronWeb) : 'Not in browser');\r\n//   console.log('lute:', typeof window !== 'undefined' ? Boolean(window.lute) : 'Not in browser');\r\n//   console.log('algorand:', typeof window !== 'undefined' ? Boolean(window.algorand) : 'Not in browser');\r\n//   console.log('AlgoSigner:', typeof window !== 'undefined' ? Boolean(window.AlgoSigner) : 'Not in browser');\r\n//   console.log('solana:', typeof window !== 'undefined' ? Boolean(window.solana) : 'Not in browser');\r\n//   console.log('phantom:', typeof window !== 'undefined' ? Boolean(window.phantom) : 'Not in browser');\r\n  \r\n//   if (typeof window !== 'undefined' && window.ethereum) {\r\n//     console.log('ethereum details:', {\r\n//       isTrust: window.ethereum.isTrust,\r\n//       isMetaMask: window.ethereum.isMetaMask,\r\n//       chainId: window.ethereum.chainId\r\n//     });\r\n//   }\r\n  \r\n//   if (typeof window !== 'undefined' && window.tronWeb) {\r\n//     console.log('tronWeb details:', {\r\n//       ready: window.tronWeb.ready,\r\n//       fullNode: window.tronWeb.fullNode?.host,\r\n//       defaultAddress: window.tronWeb.defaultAddress\r\n//     });\r\n//   }\r\n  \r\n//   if (typeof window !== 'undefined' && window.solana) {\r\n//     console.log('solana details:', {\r\n//       isPhantom: window.solana.isPhantom,\r\n//       publicKey: window.solana.publicKey?.toString(),\r\n//       isConnected: window.solana.isConnected\r\n//     });\r\n//   }\r\n  \r\n//   if (typeof window !== 'undefined') {\r\n//     console.log('All window wallet properties:');\r\n//     const walletProps = Object.keys(window).filter(key => \r\n//       key.toLowerCase().includes('lute') || \r\n//       key.toLowerCase().includes('algo') || \r\n//       key.toLowerCase().includes('wallet') ||\r\n//       key.toLowerCase().includes('phantom') ||\r\n//       key.toLowerCase().includes('solana')\r\n//     );\r\n//     console.log('Potential wallet properties:', walletProps);\r\n//   }\r\n  \r\n//   const wallets = detectWallets();\r\n//   console.log('Detected wallets:', wallets);\r\n//   console.log('=== END WALLET ENVIRONMENT DEBUG ===');\r\n// };\r\n\r\n// // Connect to MetaMask wallet\r\n// const connectMetamaskWallet = async () => {\r\n//   console.log('Connecting to MetaMask wallet...');\r\n  \r\n//   if (!window.ethereum || !window.ethereum.isMetaMask) {\r\n//     console.error('MetaMask not found.');\r\n//     throw new Error('MetaMask not detected. Please install MetaMask extension.');\r\n//   }\r\n  \r\n//   try {\r\n//     // Use the direct window.ethereum.request method for compatibility\r\n//     const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });\r\n    \r\n//     if (!accounts || accounts.length === 0) {\r\n//       throw new Error('No accounts found');\r\n//     }\r\n    \r\n//     const address = accounts[0];\r\n//     const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\r\n//     const chainId = parseInt(chainIdHex, 16);\r\n    \r\n//     let networkType;\r\n//     switch (chainId) {\r\n//       case 1: networkType = NETWORK_TYPES.ETHEREUM; break;\r\n//       case 56: networkType = NETWORK_TYPES.BSC; break;\r\n//       default: networkType = `unknown-${chainId}`;\r\n//     }\r\n    \r\n//     // Create a proper ethers-compatible provider\r\n//     const web3Provider = new ethers.BrowserProvider(window.ethereum);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.METAMASK,\r\n//       address,\r\n//       provider: web3Provider,\r\n//       network: networkType,\r\n//       isConnected: true,\r\n//       chainId\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to MetaMask:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Connect to Trust Wallet\r\n// const connectTrustWallet = async () => {\r\n//   console.log('Connecting to Trust Wallet...');\r\n  \r\n//   if (!window.ethereum || !window.ethereum.isTrust) {\r\n//     console.error('Trust Wallet not found.');\r\n//     throw new Error('Trust Wallet not detected. Please install Trust Wallet.');\r\n//   }\r\n  \r\n//   try {\r\n//     const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });\r\n    \r\n//     if (!accounts || accounts.length === 0) {\r\n//       throw new Error('No accounts found');\r\n//     }\r\n    \r\n//     const address = accounts[0];\r\n//     const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\r\n//     const chainId = parseInt(chainIdHex, 16);\r\n    \r\n//     let networkType;\r\n//     switch (chainId) {\r\n//       case 1: networkType = NETWORK_TYPES.ETHEREUM; break;\r\n//       case 56: networkType = NETWORK_TYPES.BSC; break;\r\n//       default: networkType = `unknown-${chainId}`;\r\n//     }\r\n    \r\n//     // Create a proper ethers-compatible provider\r\n//     const web3Provider = new ethers.BrowserProvider(window.ethereum);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.TRUST_WALLET,\r\n//       address,\r\n//       provider: web3Provider,\r\n//       network: networkType,\r\n//       isConnected: true,\r\n//       chainId\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to Trust Wallet:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Connect to TronLink wallet\r\n// const connectTronlinkWallet = async () => {\r\n//   console.log('Connecting to TronLink wallet...');\r\n  \r\n//   if (!window.tronWeb) {\r\n//     console.error('TronWeb not found. Is TronLink installed?');\r\n//     throw new Error('TronLink not detected. Please install TronLink extension.');\r\n//   }\r\n  \r\n//   const waitForTronWeb = async (maxAttempts = 10, interval = 500) => {\r\n//     for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n//       if (window.tronWeb && window.tronWeb.ready) {\r\n//         return window.tronWeb;\r\n//       }\r\n//       console.log(`Waiting for TronWeb to be ready... Attempt ${attempt + 1}/${maxAttempts}`);\r\n//       await new Promise(resolve => setTimeout(resolve, interval));\r\n//     }\r\n//     throw new Error('TronWeb took too long to be ready');\r\n//   };\r\n  \r\n//   try {\r\n//     const tronWeb = await waitForTronWeb();\r\n    \r\n//     if (!tronWeb.defaultAddress || !tronWeb.defaultAddress.base58) {\r\n//       try {\r\n//         await window.tronWeb.request({ method: 'tron_requestAccounts' });\r\n//       } catch (permissionError) {\r\n//         console.error('Failed to get permission from TronLink:', permissionError);\r\n//         throw new Error('Please unlock TronLink and approve connection');\r\n//       }\r\n//     }\r\n    \r\n//     const address = tronWeb.defaultAddress.base58;\r\n//     console.log('Connected to TronLink wallet:', address);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.TRONLINK,\r\n//       address: address,\r\n//       provider: tronWeb,\r\n//       network: NETWORK_TYPES.TRON,\r\n//       isConnected: true\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to TronLink:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Enhanced Lute wallet connection with multiple detection methods\r\n// const connectLuteWallet = async () => {\r\n//   console.log('Connecting to Lute wallet...');\r\n  \r\n//   // Try multiple wallet detection methods\r\n//   let walletProvider = null;\r\n//   let walletName = '';\r\n  \r\n//   // Method 1: Direct Lute wallet\r\n//   if (window.lute) {\r\n//     walletProvider = window.lute;\r\n//     walletName = 'Lute';\r\n//   }\r\n//   // Method 2: Generic Algorand provider\r\n//   else if (window.algorand) {\r\n//     walletProvider = window.algorand;\r\n//     walletName = 'Algorand Provider';\r\n//   }\r\n//   // Method 3: AlgoSigner (alternative Algorand wallet)\r\n//   else if (window.AlgoSigner) {\r\n//     walletProvider = window.AlgoSigner;\r\n//     walletName = 'AlgoSigner';\r\n//   }\r\n//   // Method 4: Check for luteWallet\r\n//   else if (window.luteWallet) {\r\n//     walletProvider = window.luteWallet;\r\n//     walletName = 'Lute Wallet';\r\n//   }\r\n  \r\n//   if (!walletProvider) {\r\n//     console.error('No Algorand wallet detected.');\r\n//     console.log('Available window properties:', Object.keys(window).filter(key => \r\n//       key.toLowerCase().includes('lute') || \r\n//       key.toLowerCase().includes('algo') || \r\n//       key.toLowerCase().includes('wallet')\r\n//     ));\r\n//     throw new Error('Lute wallet not detected. Please install Lute extension or another Algorand wallet.');\r\n//   }\r\n  \r\n//   console.log(`Found ${walletName} wallet provider:`, walletProvider);\r\n  \r\n//   try {\r\n//     let address = null;\r\n    \r\n//     // Try different connection methods based on the wallet type\r\n//     if (walletProvider.connect) {\r\n//       console.log('Using connect() method...');\r\n//       const result = await walletProvider.connect();\r\n//       address = result.address || result;\r\n//     }\r\n//     else if (walletProvider.enable) {\r\n//       console.log('Using enable() method...');\r\n//       const accounts = await walletProvider.enable();\r\n//       address = accounts[0] || accounts;\r\n//     }\r\n//     else if (walletProvider.requestAccounts) {\r\n//       console.log('Using requestAccounts() method...');\r\n//       const accounts = await walletProvider.requestAccounts();\r\n//       address = accounts[0];\r\n//     }\r\n//     // For AlgoSigner\r\n//     else if (walletProvider.connect && walletName === 'AlgoSigner') {\r\n//       console.log('Using AlgoSigner connect...');\r\n//       await walletProvider.connect();\r\n//       const accounts = await walletProvider.accounts({ ledger: 'MainNet' });\r\n//       address = accounts[0]?.address;\r\n//     }\r\n    \r\n//     if (!address) {\r\n//       throw new Error(`No address returned from ${walletName}. Please unlock your wallet and try again.`);\r\n//     }\r\n    \r\n//     console.log(`Connected to ${walletName} wallet:`, address);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.LUTE,\r\n//       address: address,\r\n//       provider: walletProvider,\r\n//       network: NETWORK_TYPES.ALGORAND,\r\n//       isConnected: true,\r\n//       walletName: walletName\r\n//     };\r\n//   } catch (error) {\r\n//     console.error(`Error connecting to ${walletName}:`, error);\r\n    \r\n//     if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Connection rejected by user. Please approve the connection in your wallet.');\r\n//     } else if (error.message && error.message.includes('locked')) {\r\n//       throw new Error('Wallet is locked. Please unlock your wallet and try again.');\r\n//     } else {\r\n//       throw new Error(`Failed to connect to ${walletName}: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // NEW: Connect to Phantom wallet\r\n// const connectPhantomWallet = async () => {\r\n//   console.log('Connecting to Phantom wallet...');\r\n  \r\n//   // Try multiple detection methods\r\n//   let phantomProvider = null;\r\n  \r\n//   if (window.solana && window.solana.isPhantom) {\r\n//     phantomProvider = window.solana;\r\n//   } else if (window.phantom && window.phantom.solana) {\r\n//     phantomProvider = window.phantom.solana;\r\n//   }\r\n  \r\n//   if (!phantomProvider) {\r\n//     console.error('Phantom wallet not found.');\r\n//     console.log('Available Solana providers:', {\r\n//       'window.solana': Boolean(window.solana),\r\n//       'window.phantom': Boolean(window.phantom),\r\n//       'window.solana.isPhantom': window.solana?.isPhantom\r\n//     });\r\n//     throw new Error('Phantom wallet not detected. Please install Phantom extension.');\r\n//   }\r\n  \r\n//   console.log('Found Phantom wallet provider:', phantomProvider);\r\n  \r\n//   try {\r\n//     // Connect to Phantom\r\n//     const response = await phantomProvider.connect();\r\n    \r\n//     if (!response || !response.publicKey) {\r\n//       throw new Error('No public key returned from Phantom');\r\n//     }\r\n    \r\n//     const address = response.publicKey.toString();\r\n//     console.log('Connected to Phantom wallet:', address);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.PHANTOM,\r\n//       address: address,\r\n//       provider: phantomProvider,\r\n//       network: NETWORK_TYPES.SOLANA,\r\n//       isConnected: true,\r\n//       publicKey: response.publicKey\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to Phantom:', error);\r\n    \r\n//     if (error.code === 4001) {\r\n//       throw new Error('Connection rejected by user. Please approve the connection in Phantom.');\r\n//     } else if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Connection rejected by user. Please approve the connection in Phantom.');\r\n//     } else {\r\n//       throw new Error(`Failed to connect to Phantom: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // General wallet connection function - Added Phantom\r\n// export const connectWallet = async (walletType) => {\r\n//   console.log('Connecting to wallet:', walletType);\r\n  \r\n//   switch (walletType) {\r\n//     case WALLET_TYPES.METAMASK:\r\n//       return connectMetamaskWallet();\r\n//     case WALLET_TYPES.TRONLINK:\r\n//       return connectTronlinkWallet();\r\n//     case WALLET_TYPES.TRUST_WALLET:\r\n//       return connectTrustWallet();\r\n//     case WALLET_TYPES.LUTE:\r\n//       return connectLuteWallet();\r\n//     case WALLET_TYPES.PHANTOM:\r\n//       return connectPhantomWallet();\r\n//     default:\r\n//       throw new Error(`Unsupported wallet type: ${walletType}`);\r\n//   }\r\n// };\r\n\r\n// // Get supported wallets for a network\r\n// export const getSupportedWalletsForNetwork = (network) => {\r\n//   return NETWORK_WALLET_MAP[network] || [];\r\n// };\r\n\r\n// // Send native currency transaction\r\n// export const sendNativeTransaction = async (walletConnection, toAddress, amount) => {\r\n//   console.log('Sending native transaction:', { toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   if (!toAddress) {\r\n//     throw new Error('Recipient address not provided');\r\n//   }\r\n  \r\n//   if (!amount || isNaN(parseFloat(amount)) || parseFloat(amount) <= 0) {\r\n//     throw new Error('Invalid amount');\r\n//   }\r\n  \r\n//   try {\r\n//     let transaction;\r\n    \r\n//     switch (walletConnection.walletType) {\r\n//       case WALLET_TYPES.METAMASK:\r\n//       case WALLET_TYPES.TRUST_WALLET:\r\n//         const provider = walletConnection.provider;\r\n//         const signer = await provider.getSigner();\r\n        \r\n//         const amountInEther = amount.toString();\r\n//         const amountWei = ethers.parseEther(amountInEther);\r\n        \r\n//         console.log('Sending ETH/BNB:', {\r\n//           to: toAddress,\r\n//           value: amountWei.toString()\r\n//         });\r\n        \r\n//         // Estimate gas using the provider directly\r\n//         const gasEstimate = await provider.estimateGas({\r\n//           to: toAddress,\r\n//           value: amountWei,\r\n//           from: await signer.getAddress()\r\n//         });\r\n        \r\n//         console.log('Gas estimate:', gasEstimate.toString());\r\n        \r\n//         // Add 10% buffer to gas estimate\r\n//         const gasLimit = (gasEstimate * BigInt(110)) / BigInt(100);\r\n        \r\n//         console.log('Using gas limit:', gasLimit.toString());\r\n        \r\n//         // Send transaction\r\n//         transaction = await signer.sendTransaction({\r\n//           to: toAddress,\r\n//           value: amountWei,\r\n//           gasLimit: gasLimit\r\n//         });\r\n//         break;\r\n        \r\n//       case WALLET_TYPES.TRONLINK:\r\n//         const tronWeb = walletConnection.provider;\r\n        \r\n//         if (!tronWeb || !tronWeb.ready) {\r\n//           throw new Error('TronWeb not initialized');\r\n//         }\r\n        \r\n//         const amountSun = tronWeb.toSun(amount.toString());\r\n        \r\n//         console.log('Sending TRX:', {\r\n//           to: toAddress,\r\n//           value: amountSun\r\n//         });\r\n        \r\n//         transaction = await tronWeb.trx.sendTransaction(\r\n//           toAddress,\r\n//           amountSun\r\n//         );\r\n//         break;\r\n        \r\n//       case WALLET_TYPES.LUTE:\r\n//         const algorandProvider = walletConnection.provider;\r\n        \r\n//         const microAlgos = Math.floor(parseFloat(amount) * 1000000);\r\n        \r\n//         console.log('Sending Algos:', {\r\n//           to: toAddress,\r\n//           amount: microAlgos,\r\n//           walletName: walletConnection.walletName\r\n//         });\r\n        \r\n//         // Handle different Algorand wallet APIs\r\n//         if (algorandProvider.sendPayment) {\r\n//           transaction = await algorandProvider.sendPayment({\r\n//             recipient: toAddress,\r\n//             amount: microAlgos\r\n//           });\r\n//         } else if (algorandProvider.signTransaction) {\r\n//           // For AlgoSigner or other wallets that require manual transaction building\r\n//           const txn = {\r\n//             to: toAddress,\r\n//             fee: 1000,\r\n//             amount: microAlgos,\r\n//             firstRound: 1000,\r\n//             lastRound: 2000,\r\n//             type: 'pay'\r\n//           };\r\n//           transaction = await algorandProvider.signTransaction(txn);\r\n//         } else {\r\n//           throw new Error(`Unsupported Algorand wallet API for ${walletConnection.walletName}`);\r\n//         }\r\n//         break;\r\n        \r\n//       case WALLET_TYPES.PHANTOM:\r\n//         const phantomProvider = walletConnection.provider;\r\n        \r\n//         if (!phantomProvider || !phantomProvider.isConnected) {\r\n//           throw new Error('Phantom wallet not connected');\r\n//         }\r\n        \r\n//         // Create a Solana web3 connection\r\n//         const { Connection, PublicKey, Transaction, SystemProgram, LAMPORTS_PER_SOL } = await import('@solana/web3.js');\r\n        \r\n//         const connection = new Connection(NETWORK_CONFIG[NETWORK_TYPES.SOLANA].rpcUrl);\r\n//         const fromPubkey = walletConnection.publicKey;\r\n//         const toPubkey = new PublicKey(toAddress);\r\n        \r\n//         const lamports = Math.floor(parseFloat(amount) * LAMPORTS_PER_SOL);\r\n        \r\n//         console.log('Sending SOL:', {\r\n//           from: fromPubkey.toString(),\r\n//           to: toAddress,\r\n//           lamports: lamports\r\n//         });\r\n        \r\n//         // Create transaction\r\n//         const transferTransaction = new Transaction().add(\r\n//           SystemProgram.transfer({\r\n//             fromPubkey,\r\n//             toPubkey,\r\n//             lamports\r\n//           })\r\n//         );\r\n        \r\n//         // Get recent blockhash\r\n//         const { blockhash } = await connection.getLatestBlockhash();\r\n//         transferTransaction.recentBlockhash = blockhash;\r\n//         transferTransaction.feePayer = fromPubkey;\r\n        \r\n//         // Sign and send transaction\r\n//         const signedTransaction = await phantomProvider.signAndSendTransaction(transferTransaction);\r\n//         transaction = signedTransaction;\r\n//         break;\r\n        \r\n//       default:\r\n//         throw new Error(`Unsupported wallet type: ${walletConnection.walletType}`);\r\n//     }\r\n    \r\n//     console.log('Transaction sent:', transaction);\r\n    \r\n//     const hash = transaction.hash || transaction.signature || transaction.txID || transaction.txId || transaction;\r\n//     console.log('Transaction hash:', hash);\r\n//     return hash;\r\n//   } catch (error) {\r\n//     console.error('Native transaction error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Send transaction - main function\r\n// export const sendTransaction = async (walletConnection, transactionDetails) => {\r\n//   console.log('Sending transaction with:', transactionDetails);\r\n  \r\n//   if (!walletConnection) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   const { to, amount, tokenAddress, currency, network } = transactionDetails;\r\n  \r\n//   if (!to) {\r\n//     throw new Error('Recipient address not provided');\r\n//   }\r\n  \r\n//   // Check if this is a native currency or token transfer\r\n//   const tokenConfig = TOKEN_CONFIG[currency]?.[network];\r\n  \r\n//   if (tokenConfig && tokenConfig.isNative) {\r\n//     return sendNativeTransaction(walletConnection, to, amount);\r\n//   } else if (tokenConfig) {\r\n//     return sendTokenTransaction(walletConnection, tokenConfig, to, amount);\r\n//   } else {\r\n//     // Fallback to native transaction\r\n//     return sendNativeTransaction(walletConnection, to, amount);\r\n//   }\r\n// };\r\n\r\n// // Send token transaction\r\n// export const sendTokenTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending token transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   if (!tokenConfig) {\r\n//     throw new Error('Token configuration not provided');\r\n//   }\r\n  \r\n//   if (!toAddress) {\r\n//     throw new Error('Recipient address not provided');\r\n//   }\r\n\r\n//   if (!amount || isNaN(parseFloat(amount)) || parseFloat(amount) <= 0) {\r\n//     throw new Error('Invalid amount');\r\n//   }\r\n\r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n//   console.log(`Token: ${symbol}, Decimals: ${decimals}, Contract: ${contractAddress}`);\r\n  \r\n//   switch (walletConnection.walletType) {\r\n//     case WALLET_TYPES.TRONLINK:\r\n//       return sendTRC20Transaction(walletConnection, tokenConfig, toAddress, amount);\r\n//     case WALLET_TYPES.LUTE:\r\n//       return sendAlgorandAssetTransaction(walletConnection, tokenConfig, toAddress, amount);\r\n//     case WALLET_TYPES.PHANTOM:\r\n//       return sendSolanaTokenTransaction(walletConnection, tokenConfig, toAddress, amount);\r\n//     default:\r\n//       return sendERC20Transaction(walletConnection, tokenConfig, toAddress, amount);\r\n//   }\r\n// };\r\n\r\n// // NEW: Solana token transaction function\r\n// export const sendSolanaTokenTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending Solana token transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Phantom wallet not connected');\r\n//   }\r\n  \r\n//   const phantomProvider = walletConnection.provider;\r\n  \r\n//   if (!phantomProvider || !phantomProvider.isConnected) {\r\n//     throw new Error('Phantom wallet not connected');\r\n//   }\r\n  \r\n//   if (!tokenConfig || !tokenConfig.contractAddress) {\r\n//     throw new Error('Invalid token configuration');\r\n//   }\r\n  \r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   const amountInSmallestUnit = Math.floor(tokenAmount * Math.pow(10, tokenDecimals));\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${amountInSmallestUnit} base units) to ${toAddress}`);\r\n  \r\n//   try {\r\n//     // Import Solana web3 and SPL token libraries\r\n//     const { Connection, PublicKey, Transaction } = await import('@solana/web3.js');\r\n//     const { createTransferInstruction, getAssociatedTokenAddress, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } = await import('@solana/spl-token');\r\n    \r\n//     const connection = new Connection(NETWORK_CONFIG[NETWORK_TYPES.SOLANA].rpcUrl);\r\n//     const fromPubkey = walletConnection.publicKey;\r\n//     const toPubkey = new PublicKey(toAddress);\r\n//     const mintPubkey = new PublicKey(contractAddress);\r\n    \r\n//     // Get associated token accounts\r\n//     const fromTokenAccount = await getAssociatedTokenAddress(\r\n//       mintPubkey,\r\n//       fromPubkey,\r\n//       false,\r\n//       TOKEN_PROGRAM_ID,\r\n//       ASSOCIATED_TOKEN_PROGRAM_ID\r\n//     );\r\n    \r\n//     const toTokenAccount = await getAssociatedTokenAddress(\r\n//       mintPubkey,\r\n//       toPubkey,\r\n//       false,\r\n//       TOKEN_PROGRAM_ID,\r\n//       ASSOCIATED_TOKEN_PROGRAM_ID\r\n//     );\r\n    \r\n//     // Create transfer instruction\r\n//     const transferInstruction = createTransferInstruction(\r\n//       fromTokenAccount,\r\n//       toTokenAccount,\r\n//       fromPubkey,\r\n//       amountInSmallestUnit,\r\n//       [],\r\n//       TOKEN_PROGRAM_ID\r\n//     );\r\n    \r\n//     // Create transaction\r\n//     const transaction = new Transaction().add(transferInstruction);\r\n    \r\n//     // Get recent blockhash\r\n//     const { blockhash } = await connection.getLatestBlockhash();\r\n//     transaction.recentBlockhash = blockhash;\r\n//     transaction.feePayer = fromPubkey;\r\n    \r\n//     // Sign and send transaction\r\n//     const signedTransaction = await phantomProvider.signAndSendTransaction(transaction);\r\n    \r\n//     console.log('Solana token transaction sent:', signedTransaction);\r\n//     return signedTransaction.signature || signedTransaction;\r\n//   } catch (error) {\r\n//     console.error('Solana token transaction error:', error);\r\n    \r\n//     if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('Insufficient')) {\r\n//       throw new Error('Insufficient token balance');\r\n//     } else {\r\n//       throw error;\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // ERC20/BEP20 token transaction function\r\n// export const sendERC20Transaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending ERC20/BEP20 transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   const provider = walletConnection.provider;\r\n//   const signer = await provider.getSigner();\r\n  \r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   // Use ethers v6 parseUnits directly\r\n//   const tokenUnits = ethers.parseUnits(tokenAmount.toString(), tokenDecimals);\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${tokenUnits.toString()} base units) to ${toAddress}`);\r\n//   console.log(`Token config:`, { contractAddress, decimals, symbol });\r\n  \r\n//   try {\r\n//     // Create contract instance with proper signer\r\n//     const tokenContract = new ethers.Contract(\r\n//       contractAddress,\r\n//       [\r\n//         'function transfer(address to, uint256 amount) returns (bool)',\r\n//         'function balanceOf(address owner) view returns (uint256)',\r\n//         'function decimals() view returns (uint8)'\r\n//       ],\r\n//       signer\r\n//     );\r\n    \r\n//     // Check token balance first\r\n//     const userAddress = await signer.getAddress();\r\n//     const balance = await tokenContract.balanceOf(userAddress);\r\n//     console.log(`User ${symbol} balance:`, ethers.formatUnits(balance, decimals));\r\n    \r\n//     if (balance < tokenUnits) {\r\n//       throw new Error(`Insufficient ${symbol} balance. Required: ${tokenAmount}, Available: ${ethers.formatUnits(balance, decimals)}`);\r\n//     }\r\n    \r\n//     try {\r\n//       // Estimate gas for the transfer with higher gas limit for USDC\r\n//       const gasEstimate = await tokenContract.transfer.estimateGas(toAddress, tokenUnits);\r\n//       console.log('Gas estimate:', gasEstimate.toString());\r\n      \r\n//       // USDC requires significantly more gas due to additional checks\r\n//       let gasMultiplier;\r\n//       if (symbol === 'USDC') {\r\n//         gasMultiplier = BigInt(150); // 50% buffer for USDC\r\n//       } else if (symbol === 'USDT') {\r\n//         gasMultiplier = BigInt(130); // 30% buffer for USDT\r\n//       } else {\r\n//         gasMultiplier = BigInt(120); // 20% buffer for others\r\n//       }\r\n      \r\n//       const gasLimit = (gasEstimate * gasMultiplier) / BigInt(100);\r\n        \r\n//       console.log('Using gas limit:', gasLimit.toString());\r\n      \r\n//       // Send with explicit gas limit\r\n//       const transaction = await tokenContract.transfer(toAddress, tokenUnits, {\r\n//         gasLimit: gasLimit\r\n//       });\r\n      \r\n//       console.log('Transaction sent:', transaction);\r\n//       return transaction.hash;\r\n//     } catch (gasError) {\r\n//       console.error('Gas estimation failed:', gasError);\r\n      \r\n//       // For USDC/USDT, try with higher fixed gas limits\r\n//       let fixedGasLimit;\r\n//       if (symbol === 'USDC') {\r\n//         fixedGasLimit = BigInt(200000); // Higher for USDC\r\n//       } else if (symbol === 'USDT') {\r\n//         fixedGasLimit = BigInt(180000); // Higher for USDT\r\n//       } else {\r\n//         fixedGasLimit = BigInt(150000);\r\n//       }\r\n      \r\n//       console.log(`Trying ${symbol} transaction with fixed gas limit:`, fixedGasLimit.toString());\r\n      \r\n//       const transaction = await tokenContract.transfer(toAddress, tokenUnits, {\r\n//         gasLimit: fixedGasLimit\r\n//       });\r\n      \r\n//       console.log('Transaction sent with fixed gas limit:', transaction);\r\n//       return transaction.hash;\r\n//     }\r\n//   } catch (error) {\r\n//     console.error('ERC20 transaction error:', error);\r\n    \r\n//     // Improve error messages\r\n//     if (error.message && error.message.includes('user rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('insufficient funds')) {\r\n//       throw new Error('Insufficient funds for transaction');\r\n//     } else if (error.message && error.message.includes('Insufficient')) {\r\n//       throw error; // Already formatted\r\n//     } else {\r\n//       throw error;\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // TRC20 token transaction function\r\n// export const sendTRC20Transaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending TRC20 transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Tron wallet not connected');\r\n//   }\r\n  \r\n//   const tronWeb = walletConnection.provider;\r\n//   if (!tronWeb || !tronWeb.ready) {\r\n//     throw new Error('TronWeb not initialized');\r\n//   }\r\n  \r\n//   if (!tokenConfig || !tokenConfig.contractAddress) {\r\n//     throw new Error('Invalid token configuration');\r\n//   }\r\n  \r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   const amountWithDecimals = tokenAmount * Math.pow(10, tokenDecimals);\r\n//   const amountString = amountWithDecimals.toString();\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${amountString} base units) to ${toAddress}`);\r\n  \r\n//   try {\r\n//     const contract = await tronWeb.contract().at(contractAddress);\r\n    \r\n//     if (!contract.transfer) {\r\n//       throw new Error('Invalid TRC-20 contract');\r\n//     }\r\n    \r\n//     const transaction = await contract.transfer(\r\n//       toAddress,\r\n//       amountString\r\n//     ).send({\r\n//       feeLimit: 100000000,\r\n//       callValue: 0,\r\n//       shouldPollResponse: false\r\n//     });\r\n    \r\n//     console.log('TRC20 transaction sent:', transaction);\r\n//     return transaction;\r\n//   } catch (error) {\r\n//     console.error('TRC20 transaction failed:', error);\r\n    \r\n//     if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('bandwidth')) {\r\n//       throw new Error('Insufficient energy or bandwidth. Make sure you have enough TRX for fees.');\r\n//     } else if (error.message && error.message.includes('balance')) {\r\n//       throw new Error('Insufficient token balance for transfer');\r\n//     } else {\r\n//       throw new Error(`Transaction failed: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Enhanced Algorand asset transaction function\r\n// export const sendAlgorandAssetTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending Algorand asset transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Algorand wallet not connected');\r\n//   }\r\n  \r\n//   const algorandProvider = walletConnection.provider;\r\n  \r\n//   if (!tokenConfig || !tokenConfig.assetId) {\r\n//     throw new Error('Invalid token configuration - missing assetId');\r\n//   }\r\n  \r\n//   const { assetId, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   const assetAmount = Math.floor(tokenAmount * Math.pow(10, tokenDecimals));\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${assetAmount} base units) to ${toAddress}`);\r\n//   console.log(`Using wallet: ${walletConnection.walletName || 'Unknown'}`);\r\n  \r\n//   try {\r\n//     let transaction;\r\n    \r\n//     // Handle different Algorand wallet APIs\r\n//     if (algorandProvider.sendAssetTransfer) {\r\n//       console.log('Using sendAssetTransfer method...');\r\n//       transaction = await algorandProvider.sendAssetTransfer({\r\n//         recipient: toAddress,\r\n//         assetId: assetId,\r\n//         amount: assetAmount\r\n//       });\r\n//     } else if (algorandProvider.signTransaction) {\r\n//       console.log('Using signTransaction method for asset transfer...');\r\n//       // Build asset transfer transaction for wallets like AlgoSigner\r\n//       const txn = {\r\n//         type: 'axfer',\r\n//         from: walletConnection.address,\r\n//         to: toAddress,\r\n//         amount: assetAmount,\r\n//         assetIndex: assetId,\r\n//         fee: 1000,\r\n//         firstRound: 1000,\r\n//         lastRound: 2000\r\n//       };\r\n//       transaction = await algorandProvider.signTransaction(txn);\r\n//     } else {\r\n//       throw new Error(`Unsupported Algorand wallet API for asset transfers in ${walletConnection.walletName || 'this wallet'}`);\r\n//     }\r\n    \r\n//     console.log('Algorand asset transaction sent:', transaction);\r\n//     return transaction.txId || transaction.txID || transaction;\r\n//   } catch (error) {\r\n//     console.error('Algorand asset transaction error:', error);\r\n    \r\n//     if (error.message && error.message.includes('rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('balance')) {\r\n//       throw new Error('Insufficient asset balance');\r\n//     } else if (error.message && error.message.includes('opted')) {\r\n//       throw new Error('Account not opted in to this asset. Please opt in first.');\r\n//     } else {\r\n//       throw error;\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Get token configuration for a specific currency and network\r\n// export const getTokenConfig = (currency, network) => {\r\n//   if (!currency || !network) {\r\n//     return null;\r\n//   }\r\n  \r\n//   const tokenConfig = TOKEN_CONFIG[currency.toUpperCase()];\r\n//   if (!tokenConfig) {\r\n//     return null;\r\n//   }\r\n  \r\n//   return tokenConfig[network.toLowerCase()];\r\n// };\r\n\r\n// // Export everything as a default object as well\r\n// export default {\r\n//   WALLET_TYPES,\r\n//   NETWORK_TYPES,\r\n//   NETWORK_CONFIG,\r\n//   TOKEN_CONFIG,\r\n//   NETWORK_WALLET_MAP,\r\n//   getWalletInstallUrl,\r\n//   detectWallets,\r\n//   detectWalletsWithRetry,\r\n//   debugWalletEnvironment,\r\n//   connectWallet,\r\n//   getSupportedWalletsForNetwork,\r\n//   sendNativeTransaction,\r\n//   sendTokenTransaction,\r\n//   sendTransaction,\r\n//   sendTRC20Transaction,\r\n//   sendERC20Transaction,\r\n//   sendSolanaTokenTransaction,\r\n//   sendAlgorandAssetTransaction,\r\n//   getTokenConfig\r\n// };\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // src/services/walletService.js \r\n// import { ethers } from 'ethers';\r\n\r\n// // Wallet Types - Added Phantom\r\n// export const WALLET_TYPES = {\r\n//   METAMASK: 'metamask',\r\n//   TRONLINK: 'tronlink',\r\n//   TRUST_WALLET: 'trustwallet',\r\n//   LUTE: 'lute',\r\n//   PHANTOM: 'phantom' // New Phantom wallet for Solana\r\n// };\r\n\r\n// // Network Types - Added Solana\r\n// export const NETWORK_TYPES = {\r\n//   ETHEREUM: 'ethereum',\r\n//   BSC: 'bsc',\r\n//   TRON: 'tron',\r\n//   ALGORAND: 'algorand',\r\n//   SOLANA: 'solana' // New Solana network\r\n// };\r\n\r\n// // Network configuration - Added Solana\r\n// export const NETWORK_CONFIG = {\r\n//   [NETWORK_TYPES.ETHEREUM]: {\r\n//     name: 'Ethereum Mainnet',\r\n//     chainId: 1,\r\n//     symbol: 'ETH',\r\n//     decimals: 18,\r\n//     rpcUrl: 'https://mainnet.infura.io/v3/your-infura-key',\r\n//     blockExplorerUrl: 'https://etherscan.io'\r\n//   },\r\n//   [NETWORK_TYPES.BSC]: {\r\n//     name: 'Binance Smart Chain',\r\n//     chainId: 56,\r\n//     symbol: 'BNB',\r\n//     decimals: 18,\r\n//     rpcUrl: 'https://bsc-dataseed.binance.org/',\r\n//     blockExplorerUrl: 'https://bscscan.com'\r\n//   },\r\n//   [NETWORK_TYPES.TRON]: {\r\n//     name: 'TRON Mainnet',\r\n//     symbol: 'TRX',\r\n//     decimals: 6,\r\n//     rpcUrl: 'https://api.trongrid.io',\r\n//     blockExplorerUrl: 'https://tronscan.org'\r\n//   },\r\n//   [NETWORK_TYPES.ALGORAND]: {\r\n//     name: 'Algorand Mainnet',\r\n//     symbol: 'ALGO',\r\n//     decimals: 6,\r\n//     rpcUrl: 'https://mainnet-api.algonode.cloud',\r\n//     blockExplorerUrl: 'https://algoexplorer.io'\r\n//   },\r\n//   [NETWORK_TYPES.SOLANA]: {\r\n//     name: 'Solana Mainnet',\r\n//     symbol: 'SOL',\r\n//     decimals: 9,\r\n//     rpcUrl: 'https://api.mainnet-beta.solana.com',\r\n//     blockExplorerUrl: 'https://explorer.solana.com'\r\n//   }\r\n// };\r\n\r\n// // Token configurations with correct contract addresses and decimals - Added Solana tokens\r\n// export const TOKEN_CONFIG = {\r\n//   USDT: {\r\n//     ethereum: {\r\n//       contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     bsc: {\r\n//       contractAddress: '0x55d398326f99059fF775485246999027B3197955',\r\n//       decimals: 18,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     tron: {\r\n//       contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     algorand: {\r\n//       assetId: 312769,\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     solana: {\r\n//       contractAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', // USDT on Solana\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     }\r\n//   },\r\n//   USDC: {\r\n//     ethereum: {\r\n//       contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     bsc: {\r\n//       contractAddress: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n//       decimals: 18,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     tron: {\r\n//       contractAddress: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     algorand: {\r\n//       assetId: 31566704,\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     solana: {\r\n//       contractAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC on Solana\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     }\r\n//   },\r\n//   BNB: {\r\n//     bsc: {\r\n//       decimals: 18,\r\n//       symbol: 'BNB',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   ETH: {\r\n//     ethereum: {\r\n//       decimals: 18,\r\n//       symbol: 'ETH',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   TRX: {\r\n//     tron: {\r\n//       decimals: 6,\r\n//       symbol: 'TRX',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   ALGO: {\r\n//     algorand: {\r\n//       decimals: 6,\r\n//       symbol: 'ALGO',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   SOL: {\r\n//     solana: {\r\n//       decimals: 9,\r\n//       symbol: 'SOL',\r\n//       isNative: true\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Network to wallet mapping - Added Solana/Phantom\r\n// export const NETWORK_WALLET_MAP = {\r\n//   [NETWORK_TYPES.ETHEREUM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.BSC]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.TRON]: [WALLET_TYPES.TRONLINK],\r\n//   [NETWORK_TYPES.ALGORAND]: [WALLET_TYPES.LUTE],\r\n//   [NETWORK_TYPES.SOLANA]: [WALLET_TYPES.PHANTOM] // Phantom for Solana\r\n// };\r\n\r\n// // Installation URLs for wallets - Added Phantom\r\n// export const getWalletInstallUrl = (walletType) => {\r\n//   const urls = {\r\n//     [WALLET_TYPES.METAMASK]: 'https://metamask.io/download/',\r\n//     [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/download/',\r\n//     [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/download/',\r\n//     [WALLET_TYPES.LUTE]: 'https://lute.app/download/',\r\n//     [WALLET_TYPES.PHANTOM]: 'https://phantom.app/download'\r\n//   };\r\n//   return urls[walletType] || '';\r\n// };\r\n\r\n// // Enhanced Lute wallet detection\r\n// const detectLuteWallet = () => {\r\n//   if (typeof window === 'undefined') return false;\r\n  \r\n//   // Multiple ways to detect Lute wallet\r\n//   const luteDetectionMethods = [\r\n//     // Check for window.lute\r\n//     () => window.lute !== undefined,\r\n//     // Check for window.algorand (some Algorand wallets use this)\r\n//     () => window.algorand !== undefined,\r\n//     // Check for AlgoSigner (alternative Algorand wallet)\r\n//     () => window.AlgoSigner !== undefined,\r\n//     // Check for specific Lute wallet identifiers\r\n//     () => window.luteWallet !== undefined,\r\n//     // Check for wallet extension in DOM\r\n//     () => document.querySelector('[data-wallet=\"lute\"]') !== null,\r\n//     // Check if Lute is injected via content script\r\n//     () => window.postMessage && document.documentElement.getAttribute('data-lute-extension') === 'true'\r\n//   ];\r\n  \r\n//   return luteDetectionMethods.some(method => {\r\n//     try {\r\n//       return method();\r\n//     } catch (error) {\r\n//       console.warn('Lute detection method failed:', error);\r\n//       return false;\r\n//     }\r\n//   });\r\n// };\r\n\r\n// // Enhanced Phantom wallet detection\r\n// const detectPhantomWallet = () => {\r\n//   if (typeof window === 'undefined') return false;\r\n  \r\n//   // Multiple ways to detect Phantom wallet\r\n//   const phantomDetectionMethods = [\r\n//     // Check for window.solana with isPhantom\r\n//     () => window.solana && window.solana.isPhantom,\r\n//     // Check for window.phantom\r\n//     () => window.phantom && window.phantom.solana,\r\n//     // Check for specific Phantom wallet identifiers\r\n//     () => window.phantomWallet !== undefined,\r\n//     // Check for wallet extension in DOM\r\n//     () => document.querySelector('[data-wallet=\"phantom\"]') !== null\r\n//   ];\r\n  \r\n//   return phantomDetectionMethods.some(method => {\r\n//     try {\r\n//       return method();\r\n//     } catch (error) {\r\n//       console.warn('Phantom detection method failed:', error);\r\n//       return false;\r\n//     }\r\n//   });\r\n// };\r\n\r\n// // Detect available wallets in the browser - Added Phantom\r\n// export const detectWallets = () => {\r\n//   const availableWallets = {\r\n//     [WALLET_TYPES.METAMASK]: typeof window !== 'undefined' && window.ethereum !== undefined && window.ethereum.isMetaMask,\r\n//     [WALLET_TYPES.TRONLINK]: typeof window !== 'undefined' && window.tronWeb !== undefined,\r\n//     [WALLET_TYPES.TRUST_WALLET]: typeof window !== 'undefined' && \r\n//       window.ethereum !== undefined && \r\n//       window.ethereum.isTrust === true,\r\n//     [WALLET_TYPES.LUTE]: detectLuteWallet(),\r\n//     [WALLET_TYPES.PHANTOM]: detectPhantomWallet()\r\n//   };\r\n  \r\n//   // Enhanced logging for wallet detection\r\n//   if (typeof window !== 'undefined') {\r\n//     console.log('=== WALLET DETECTION DEBUG ===');\r\n//     console.log('MetaMask:', availableWallets[WALLET_TYPES.METAMASK]);\r\n//     console.log('TronLink:', availableWallets[WALLET_TYPES.TRONLINK]);\r\n//     console.log('Trust Wallet:', availableWallets[WALLET_TYPES.TRUST_WALLET]);\r\n//     console.log('Lute:', availableWallets[WALLET_TYPES.LUTE]);\r\n//     console.log('Phantom:', availableWallets[WALLET_TYPES.PHANTOM]);\r\n//     console.log('window.solana:', Boolean(window.solana));\r\n//     console.log('window.phantom:', Boolean(window.phantom));\r\n//     console.log('=== END WALLET DETECTION DEBUG ===');\r\n//   }\r\n  \r\n//   return availableWallets;\r\n// };\r\n\r\n// // Detect wallets with retry and enhanced detection\r\n// export const detectWalletsWithRetry = async (maxRetries = 5, delay = 1000) => {\r\n//   let retries = 0;\r\n//   let wallets = detectWallets();\r\n  \r\n//   // Special handling for wallet injection - give it more time\r\n//   while (retries < maxRetries) {\r\n//     wallets = detectWallets();\r\n    \r\n//     // Check if we found any wallets or if we've reached max retries\r\n//     const hasAnyWallet = Object.values(wallets).some(v => v === true);\r\n    \r\n//     if (hasAnyWallet || retries >= maxRetries - 1) {\r\n//       break;\r\n//     }\r\n    \r\n//     console.log(`Wallet detection attempt ${retries + 1}/${maxRetries}...`);\r\n//     console.log('Current detection results:', wallets);\r\n    \r\n//     // Wait before next attempt\r\n//     await new Promise(resolve => setTimeout(resolve, delay));\r\n//     retries++;\r\n//   }\r\n  \r\n//   // Final check with extended detection\r\n//   if (!wallets[WALLET_TYPES.LUTE] || !wallets[WALLET_TYPES.PHANTOM]) {\r\n//     console.log('Performing extended wallet detection...');\r\n    \r\n//     if (typeof window !== 'undefined') {\r\n//       try {\r\n//         // Dispatch custom events that might trigger wallet injection\r\n//         const luteEvent = new CustomEvent('lute-wallet-detect', { detail: { source: 'coinley-sdk' } });\r\n//         const phantomEvent = new CustomEvent('phantom-wallet-detect', { detail: { source: 'coinley-sdk' } });\r\n//         window.dispatchEvent(luteEvent);\r\n//         window.dispatchEvent(phantomEvent);\r\n        \r\n//         // Wait a bit more for potential injection\r\n//         await new Promise(resolve => setTimeout(resolve, 500));\r\n        \r\n//         // Re-detect\r\n//         wallets[WALLET_TYPES.LUTE] = detectLuteWallet();\r\n//         wallets[WALLET_TYPES.PHANTOM] = detectPhantomWallet();\r\n//       } catch (error) {\r\n//         console.warn('Extended wallet detection failed:', error);\r\n//       }\r\n//     }\r\n//   }\r\n  \r\n//   console.log('Final wallet detection results:', wallets);\r\n//   return wallets;\r\n// };\r\n\r\n// // Debug wallet environment - Added Phantom\r\n// export const debugWalletEnvironment = () => {\r\n//   console.log('=== WALLET ENVIRONMENT DEBUG ===');\r\n//   console.log('ethereum:', typeof window !== 'undefined' ? Boolean(window.ethereum) : 'Not in browser');\r\n//   console.log('tronWeb:', typeof window !== 'undefined' ? Boolean(window.tronWeb) : 'Not in browser');\r\n//   console.log('lute:', typeof window !== 'undefined' ? Boolean(window.lute) : 'Not in browser');\r\n//   console.log('algorand:', typeof window !== 'undefined' ? Boolean(window.algorand) : 'Not in browser');\r\n//   console.log('AlgoSigner:', typeof window !== 'undefined' ? Boolean(window.AlgoSigner) : 'Not in browser');\r\n//   console.log('solana:', typeof window !== 'undefined' ? Boolean(window.solana) : 'Not in browser');\r\n//   console.log('phantom:', typeof window !== 'undefined' ? Boolean(window.phantom) : 'Not in browser');\r\n  \r\n//   if (typeof window !== 'undefined' && window.ethereum) {\r\n//     console.log('ethereum details:', {\r\n//       isTrust: window.ethereum.isTrust,\r\n//       isMetaMask: window.ethereum.isMetaMask,\r\n//       chainId: window.ethereum.chainId\r\n//     });\r\n//   }\r\n  \r\n//   if (typeof window !== 'undefined' && window.tronWeb) {\r\n//     console.log('tronWeb details:', {\r\n//       ready: window.tronWeb.ready,\r\n//       fullNode: window.tronWeb.fullNode?.host,\r\n//       defaultAddress: window.tronWeb.defaultAddress\r\n//     });\r\n//   }\r\n  \r\n//   if (typeof window !== 'undefined' && window.solana) {\r\n//     console.log('solana details:', {\r\n//       isPhantom: window.solana.isPhantom,\r\n//       publicKey: window.solana.publicKey?.toString(),\r\n//       isConnected: window.solana.isConnected\r\n//     });\r\n//   }\r\n  \r\n//   if (typeof window !== 'undefined') {\r\n//     console.log('All window wallet properties:');\r\n//     const walletProps = Object.keys(window).filter(key => \r\n//       key.toLowerCase().includes('lute') || \r\n//       key.toLowerCase().includes('algo') || \r\n//       key.toLowerCase().includes('wallet') ||\r\n//       key.toLowerCase().includes('phantom') ||\r\n//       key.toLowerCase().includes('solana')\r\n//     );\r\n//     console.log('Potential wallet properties:', walletProps);\r\n//   }\r\n  \r\n//   const wallets = detectWallets();\r\n//   console.log('Detected wallets:', wallets);\r\n//   console.log('=== END WALLET ENVIRONMENT DEBUG ===');\r\n// };\r\n\r\n// // Connect to MetaMask wallet\r\n// const connectMetamaskWallet = async () => {\r\n//   console.log('Connecting to MetaMask wallet...');\r\n  \r\n//   if (!window.ethereum || !window.ethereum.isMetaMask) {\r\n//     console.error('MetaMask not found.');\r\n//     throw new Error('MetaMask not detected. Please install MetaMask extension.');\r\n//   }\r\n  \r\n//   try {\r\n//     // Use the direct window.ethereum.request method for compatibility\r\n//     const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });\r\n    \r\n//     if (!accounts || accounts.length === 0) {\r\n//       throw new Error('No accounts found');\r\n//     }\r\n    \r\n//     const address = accounts[0];\r\n//     const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\r\n//     const chainId = parseInt(chainIdHex, 16);\r\n    \r\n//     let networkType;\r\n//     switch (chainId) {\r\n//       case 1: networkType = NETWORK_TYPES.ETHEREUM; break;\r\n//       case 56: networkType = NETWORK_TYPES.BSC; break;\r\n//       default: networkType = `unknown-${chainId}`;\r\n//     }\r\n    \r\n//     // Create a proper ethers-compatible provider\r\n//     const web3Provider = new ethers.BrowserProvider(window.ethereum);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.METAMASK,\r\n//       address,\r\n//       provider: web3Provider,\r\n//       network: networkType,\r\n//       isConnected: true,\r\n//       chainId\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to MetaMask:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Connect to Trust Wallet\r\n// const connectTrustWallet = async () => {\r\n//   console.log('Connecting to Trust Wallet...');\r\n  \r\n//   if (!window.ethereum || !window.ethereum.isTrust) {\r\n//     console.error('Trust Wallet not found.');\r\n//     throw new Error('Trust Wallet not detected. Please install Trust Wallet.');\r\n//   }\r\n  \r\n//   try {\r\n//     const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });\r\n    \r\n//     if (!accounts || accounts.length === 0) {\r\n//       throw new Error('No accounts found');\r\n//     }\r\n    \r\n//     const address = accounts[0];\r\n//     const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\r\n//     const chainId = parseInt(chainIdHex, 16);\r\n    \r\n//     let networkType;\r\n//     switch (chainId) {\r\n//       case 1: networkType = NETWORK_TYPES.ETHEREUM; break;\r\n//       case 56: networkType = NETWORK_TYPES.BSC; break;\r\n//       default: networkType = `unknown-${chainId}`;\r\n//     }\r\n    \r\n//     // Create a proper ethers-compatible provider\r\n//     const web3Provider = new ethers.BrowserProvider(window.ethereum);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.TRUST_WALLET,\r\n//       address,\r\n//       provider: web3Provider,\r\n//       network: networkType,\r\n//       isConnected: true,\r\n//       chainId\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to Trust Wallet:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Connect to TronLink wallet\r\n// const connectTronlinkWallet = async () => {\r\n//   console.log('Connecting to TronLink wallet...');\r\n  \r\n//   if (!window.tronWeb) {\r\n//     console.error('TronWeb not found. Is TronLink installed?');\r\n//     throw new Error('TronLink not detected. Please install TronLink extension.');\r\n//   }\r\n  \r\n//   const waitForTronWeb = async (maxAttempts = 10, interval = 500) => {\r\n//     for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n//       if (window.tronWeb && window.tronWeb.ready) {\r\n//         return window.tronWeb;\r\n//       }\r\n//       console.log(`Waiting for TronWeb to be ready... Attempt ${attempt + 1}/${maxAttempts}`);\r\n//       await new Promise(resolve => setTimeout(resolve, interval));\r\n//     }\r\n//     throw new Error('TronWeb took too long to be ready');\r\n//   };\r\n  \r\n//   try {\r\n//     const tronWeb = await waitForTronWeb();\r\n    \r\n//     if (!tronWeb.defaultAddress || !tronWeb.defaultAddress.base58) {\r\n//       try {\r\n//         await window.tronWeb.request({ method: 'tron_requestAccounts' });\r\n//       } catch (permissionError) {\r\n//         console.error('Failed to get permission from TronLink:', permissionError);\r\n//         throw new Error('Please unlock TronLink and approve connection');\r\n//       }\r\n//     }\r\n    \r\n//     const address = tronWeb.defaultAddress.base58;\r\n//     console.log('Connected to TronLink wallet:', address);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.TRONLINK,\r\n//       address: address,\r\n//       provider: tronWeb,\r\n//       network: NETWORK_TYPES.TRON,\r\n//       isConnected: true\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to TronLink:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Enhanced Lute wallet connection with multiple detection methods\r\n// const connectLuteWallet = async () => {\r\n//   console.log('Connecting to Lute wallet...');\r\n  \r\n//   // Try multiple wallet detection methods\r\n//   let walletProvider = null;\r\n//   let walletName = '';\r\n  \r\n//   // Method 1: Direct Lute wallet\r\n//   if (window.lute) {\r\n//     walletProvider = window.lute;\r\n//     walletName = 'Lute';\r\n//   }\r\n//   // Method 2: Generic Algorand provider\r\n//   else if (window.algorand) {\r\n//     walletProvider = window.algorand;\r\n//     walletName = 'Algorand Provider';\r\n//   }\r\n//   // Method 3: AlgoSigner (alternative Algorand wallet)\r\n//   else if (window.AlgoSigner) {\r\n//     walletProvider = window.AlgoSigner;\r\n//     walletName = 'AlgoSigner';\r\n//   }\r\n//   // Method 4: Check for luteWallet\r\n//   else if (window.luteWallet) {\r\n//     walletProvider = window.luteWallet;\r\n//     walletName = 'Lute Wallet';\r\n//   }\r\n  \r\n//   if (!walletProvider) {\r\n//     console.error('No Algorand wallet detected.');\r\n//     console.log('Available window properties:', Object.keys(window).filter(key => \r\n//       key.toLowerCase().includes('lute') || \r\n//       key.toLowerCase().includes('algo') || \r\n//       key.toLowerCase().includes('wallet')\r\n//     ));\r\n//     throw new Error('Lute wallet not detected. Please install Lute extension or another Algorand wallet.');\r\n//   }\r\n  \r\n//   console.log(`Found ${walletName} wallet provider:`, walletProvider);\r\n  \r\n//   try {\r\n//     let address = null;\r\n    \r\n//     // Try different connection methods based on the wallet type\r\n//     if (walletProvider.connect) {\r\n//       console.log('Using connect() method...');\r\n//       const result = await walletProvider.connect();\r\n//       address = result.address || result;\r\n//     }\r\n//     else if (walletProvider.enable) {\r\n//       console.log('Using enable() method...');\r\n//       const accounts = await walletProvider.enable();\r\n//       address = accounts[0] || accounts;\r\n//     }\r\n//     else if (walletProvider.requestAccounts) {\r\n//       console.log('Using requestAccounts() method...');\r\n//       const accounts = await walletProvider.requestAccounts();\r\n//       address = accounts[0];\r\n//     }\r\n//     // For AlgoSigner\r\n//     else if (walletProvider.connect && walletName === 'AlgoSigner') {\r\n//       console.log('Using AlgoSigner connect...');\r\n//       await walletProvider.connect();\r\n//       const accounts = await walletProvider.accounts({ ledger: 'MainNet' });\r\n//       address = accounts[0]?.address;\r\n//     }\r\n    \r\n//     if (!address) {\r\n//       throw new Error(`No address returned from ${walletName}. Please unlock your wallet and try again.`);\r\n//     }\r\n    \r\n//     console.log(`Connected to ${walletName} wallet:`, address);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.LUTE,\r\n//       address: address,\r\n//       provider: walletProvider,\r\n//       network: NETWORK_TYPES.ALGORAND,\r\n//       isConnected: true,\r\n//       walletName: walletName\r\n//     };\r\n//   } catch (error) {\r\n//     console.error(`Error connecting to ${walletName}:`, error);\r\n    \r\n//     if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Connection rejected by user. Please approve the connection in your wallet.');\r\n//     } else if (error.message && error.message.includes('locked')) {\r\n//       throw new Error('Wallet is locked. Please unlock your wallet and try again.');\r\n//     } else {\r\n//       throw new Error(`Failed to connect to ${walletName}: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // NEW: Connect to Phantom wallet\r\n// const connectPhantomWallet = async () => {\r\n//   console.log('Connecting to Phantom wallet...');\r\n  \r\n//   // Try multiple detection methods\r\n//   let phantomProvider = null;\r\n  \r\n//   if (window.solana && window.solana.isPhantom) {\r\n//     phantomProvider = window.solana;\r\n//   } else if (window.phantom && window.phantom.solana) {\r\n//     phantomProvider = window.phantom.solana;\r\n//   }\r\n  \r\n//   if (!phantomProvider) {\r\n//     console.error('Phantom wallet not found.');\r\n//     console.log('Available Solana providers:', {\r\n//       'window.solana': Boolean(window.solana),\r\n//       'window.phantom': Boolean(window.phantom),\r\n//       'window.solana.isPhantom': window.solana?.isPhantom\r\n//     });\r\n//     throw new Error('Phantom wallet not detected. Please install Phantom extension.');\r\n//   }\r\n  \r\n//   console.log('Found Phantom wallet provider:', phantomProvider);\r\n  \r\n//   try {\r\n//     // Connect to Phantom\r\n//     const response = await phantomProvider.connect();\r\n    \r\n//     if (!response || !response.publicKey) {\r\n//       throw new Error('No public key returned from Phantom');\r\n//     }\r\n    \r\n//     const address = response.publicKey.toString();\r\n//     console.log('Connected to Phantom wallet:', address);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.PHANTOM,\r\n//       address: address,\r\n//       provider: phantomProvider,\r\n//       network: NETWORK_TYPES.SOLANA,\r\n//       isConnected: true,\r\n//       publicKey: response.publicKey\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to Phantom:', error);\r\n    \r\n//     if (error.code === 4001) {\r\n//       throw new Error('Connection rejected by user. Please approve the connection in Phantom.');\r\n//     } else if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Connection rejected by user. Please approve the connection in Phantom.');\r\n//     } else {\r\n//       throw new Error(`Failed to connect to Phantom: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // General wallet connection function - Added Phantom\r\n// export const connectWallet = async (walletType) => {\r\n//   console.log('Connecting to wallet:', walletType);\r\n  \r\n//   switch (walletType) {\r\n//     case WALLET_TYPES.METAMASK:\r\n//       return connectMetamaskWallet();\r\n//     case WALLET_TYPES.TRONLINK:\r\n//       return connectTronlinkWallet();\r\n//     case WALLET_TYPES.TRUST_WALLET:\r\n//       return connectTrustWallet();\r\n//     case WALLET_TYPES.LUTE:\r\n//       return connectLuteWallet();\r\n//     case WALLET_TYPES.PHANTOM:\r\n//       return connectPhantomWallet();\r\n//     default:\r\n//       throw new Error(`Unsupported wallet type: ${walletType}`);\r\n//   }\r\n// };\r\n\r\n// // Get supported wallets for a network\r\n// export const getSupportedWalletsForNetwork = (network) => {\r\n//   return NETWORK_WALLET_MAP[network] || [];\r\n// };\r\n\r\n// // Send native currency transaction\r\n// export const sendNativeTransaction = async (walletConnection, toAddress, amount) => {\r\n//   console.log('Sending native transaction:', { toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   if (!toAddress) {\r\n//     throw new Error('Recipient address not provided');\r\n//   }\r\n  \r\n//   if (!amount || isNaN(parseFloat(amount)) || parseFloat(amount) <= 0) {\r\n//     throw new Error('Invalid amount');\r\n//   }\r\n  \r\n//   try {\r\n//     let transaction;\r\n    \r\n//     switch (walletConnection.walletType) {\r\n//       case WALLET_TYPES.METAMASK:\r\n//       case WALLET_TYPES.TRUST_WALLET:\r\n//         const provider = walletConnection.provider;\r\n//         const signer = await provider.getSigner();\r\n        \r\n//         const amountInEther = amount.toString();\r\n//         const amountWei = ethers.parseEther(amountInEther);\r\n        \r\n//         console.log('Sending ETH/BNB:', {\r\n//           to: toAddress,\r\n//           value: amountWei.toString()\r\n//         });\r\n        \r\n//         // Estimate gas using the provider directly\r\n//         const gasEstimate = await provider.estimateGas({\r\n//           to: toAddress,\r\n//           value: amountWei,\r\n//           from: await signer.getAddress()\r\n//         });\r\n        \r\n//         console.log('Gas estimate:', gasEstimate.toString());\r\n        \r\n//         // Add 10% buffer to gas estimate\r\n//         const gasLimit = (gasEstimate * BigInt(110)) / BigInt(100);\r\n        \r\n//         console.log('Using gas limit:', gasLimit.toString());\r\n        \r\n//         // Send transaction\r\n//         transaction = await signer.sendTransaction({\r\n//           to: toAddress,\r\n//           value: amountWei,\r\n//           gasLimit: gasLimit\r\n//         });\r\n//         break;\r\n        \r\n//       case WALLET_TYPES.TRONLINK:\r\n//         const tronWeb = walletConnection.provider;\r\n        \r\n//         if (!tronWeb || !tronWeb.ready) {\r\n//           throw new Error('TronWeb not initialized');\r\n//         }\r\n        \r\n//         const amountSun = tronWeb.toSun(amount.toString());\r\n        \r\n//         console.log('Sending TRX:', {\r\n//           to: toAddress,\r\n//           value: amountSun\r\n//         });\r\n        \r\n//         transaction = await tronWeb.trx.sendTransaction(\r\n//           toAddress,\r\n//           amountSun\r\n//         );\r\n//         break;\r\n        \r\n//       case WALLET_TYPES.LUTE:\r\n//         const algorandProvider = walletConnection.provider;\r\n        \r\n//         const microAlgos = Math.floor(parseFloat(amount) * 1000000);\r\n        \r\n//         console.log('Sending Algos:', {\r\n//           to: toAddress,\r\n//           amount: microAlgos,\r\n//           walletName: walletConnection.walletName\r\n//         });\r\n        \r\n//         // Handle different Algorand wallet APIs\r\n//         if (algorandProvider.sendPayment) {\r\n//           transaction = await algorandProvider.sendPayment({\r\n//             recipient: toAddress,\r\n//             amount: microAlgos\r\n//           });\r\n//         } else if (algorandProvider.signTransaction) {\r\n//           // For AlgoSigner or other wallets that require manual transaction building\r\n//           const txn = {\r\n//             to: toAddress,\r\n//             fee: 1000,\r\n//             amount: microAlgos,\r\n//             firstRound: 1000,\r\n//             lastRound: 2000,\r\n//             type: 'pay'\r\n//           };\r\n//           transaction = await algorandProvider.signTransaction(txn);\r\n//         } else {\r\n//           throw new Error(`Unsupported Algorand wallet API for ${walletConnection.walletName}`);\r\n//         }\r\n//         break;\r\n        \r\n//       case WALLET_TYPES.PHANTOM:\r\n//         const phantomProvider = walletConnection.provider;\r\n        \r\n//         if (!phantomProvider || !phantomProvider.isConnected) {\r\n//           throw new Error('Phantom wallet not connected');\r\n//         }\r\n        \r\n//         // For Phantom, we need to be careful about the amount calculation\r\n//         // The issue is likely that we're calculating lamports but Phantom expects SOL\r\n//         const amountFloat = parseFloat(amount);\r\n        \r\n//         console.log('Phantom SOL Transaction Debug:', {\r\n//           originalAmount: amount,\r\n//           amountFloat: amountFloat,\r\n//           walletType: 'Phantom Native SOL'\r\n//         });\r\n        \r\n//         // For native SOL transfers, Phantom expects the amount in SOL, not lamports\r\n//         // Let's create a simple transfer using Phantom's built-in methods\r\n//         try {\r\n//           // Try using Phantom's simple transfer method first\r\n//           if (phantomProvider.request) {\r\n//             const result = await phantomProvider.request({\r\n//               method: 'transfer',\r\n//               params: {\r\n//                 to: toAddress,\r\n//                 amount: amountFloat // Send in SOL, not lamports\r\n//               }\r\n//             });\r\n            \r\n//             console.log('Phantom transfer result:', result);\r\n//             transaction = result;\r\n//           } else {\r\n//             // Fallback: manual transaction construction\r\n//             // Import Solana libraries only when needed and handle the import error\r\n//             let Connection, PublicKey, Transaction, SystemProgram, LAMPORTS_PER_SOL;\r\n            \r\n//             try {\r\n//               const solanaWeb3 = await import('@solana/web3.js');\r\n//               Connection = solanaWeb3.Connection;\r\n//               PublicKey = solanaWeb3.PublicKey;\r\n//               Transaction = solanaWeb3.Transaction;\r\n//               SystemProgram = solanaWeb3.SystemProgram;\r\n//               LAMPORTS_PER_SOL = solanaWeb3.LAMPORTS_PER_SOL;\r\n//             } catch (importError) {\r\n//               console.error('Failed to import Solana libraries:', importError);\r\n//               throw new Error('Solana libraries not available. Please ensure @solana/web3.js is installed.');\r\n//             }\r\n            \r\n//             const connection = new Connection(NETWORK_CONFIG[NETWORK_TYPES.SOLANA].rpcUrl);\r\n//             const fromPubkey = walletConnection.publicKey;\r\n//             const toPubkey = new PublicKey(toAddress);\r\n            \r\n//             // Convert to lamports for the transaction\r\n//             const lamports = Math.floor(amountFloat * LAMPORTS_PER_SOL);\r\n            \r\n//             console.log('Manual Solana transaction:', {\r\n//               from: fromPubkey.toString(),\r\n//               to: toAddress,\r\n//               amountSOL: amountFloat,\r\n//               lamports: lamports,\r\n//               conversionCheck: `${amountFloat} SOL = ${lamports} lamports`\r\n//             });\r\n            \r\n//             // Validate the conversion\r\n//             if (lamports <= 0) {\r\n//               throw new Error(`Invalid amount: ${amountFloat} SOL converts to ${lamports} lamports`);\r\n//             }\r\n            \r\n//             // Create transaction\r\n//             const transferTransaction = new Transaction().add(\r\n//               SystemProgram.transfer({\r\n//                 fromPubkey,\r\n//                 toPubkey,\r\n//                 lamports\r\n//               })\r\n//             );\r\n            \r\n//             // Get recent blockhash\r\n//             const { blockhash } = await connection.getLatestBlockhash();\r\n//             transferTransaction.recentBlockhash = blockhash;\r\n//             transferTransaction.feePayer = fromPubkey;\r\n            \r\n//             // Sign and send transaction\r\n//             const signedTransaction = await phantomProvider.signAndSendTransaction(transferTransaction);\r\n//             transaction = signedTransaction;\r\n//           }\r\n//         } catch (phantomError) {\r\n//           console.error('Phantom transaction error:', phantomError);\r\n//           throw new Error(`Phantom transaction failed: ${phantomError.message || 'Unknown error'}`);\r\n//         }\r\n//         break;\r\n        \r\n//       default:\r\n//         throw new Error(`Unsupported wallet type: ${walletConnection.walletType}`);\r\n//     }\r\n    \r\n//     console.log('Transaction sent:', transaction);\r\n    \r\n//     const hash = transaction.hash || transaction.signature || transaction.txID || transaction.txId || transaction;\r\n//     console.log('Transaction hash:', hash);\r\n//     return hash;\r\n//   } catch (error) {\r\n//     console.error('Native transaction error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Helper function to validate transaction amounts before sending\r\n// const validateTransactionAmount = (amount, currency, network) => {\r\n//   const amountFloat = parseFloat(amount);\r\n  \r\n//   console.log('=== TRANSACTION AMOUNT VALIDATION ===');\r\n//   console.log('Amount:', amountFloat);\r\n//   console.log('Currency:', currency);\r\n//   console.log('Network:', network);\r\n  \r\n//   // Warn for large amounts\r\n//   if (currency === 'SOL' && amountFloat > 1) {\r\n//     const estimatedUSDValue = amountFloat * 100; // Rough estimate: 1 SOL = $100\r\n//     console.warn(`⚠️ Large SOL transaction: ${amountFloat} SOL (~${estimatedUSDValue})`);\r\n//     return {\r\n//       isLarge: true,\r\n//       warning: `You are about to send ${amountFloat} SOL (approximately ${estimatedUSDValue}). Please confirm this is correct.`\r\n//     };\r\n//   }\r\n  \r\n//   if (['USDC', 'USDT'].includes(currency) && amountFloat > 100) {\r\n//     console.warn(`⚠️ Large stablecoin transaction: ${amountFloat} ${currency}`);\r\n//     return {\r\n//       isLarge: true,\r\n//       warning: `You are about to send ${amountFloat} ${currency}. Please confirm this is correct.`\r\n//     };\r\n//   }\r\n  \r\n//   console.log('✅ Transaction amount looks reasonable');\r\n//   console.log('=== END TRANSACTION AMOUNT VALIDATION ===');\r\n  \r\n//   return { isLarge: false };\r\n// };\r\n// export const sendTransaction = async (walletConnection, transactionDetails) => {\r\n//   console.log('Sending transaction with:', transactionDetails);\r\n  \r\n//   if (!walletConnection) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   const { to, amount, tokenAddress, currency, network } = transactionDetails;\r\n  \r\n//   if (!to) {\r\n//     throw new Error('Recipient address not provided');\r\n//   }\r\n  \r\n//   // Check if this is a native currency or token transfer\r\n//   const tokenConfig = TOKEN_CONFIG[currency]?.[network];\r\n  \r\n//   if (tokenConfig && tokenConfig.isNative) {\r\n//     return sendNativeTransaction(walletConnection, to, amount);\r\n//   } else if (tokenConfig) {\r\n//     return sendTokenTransaction(walletConnection, tokenConfig, to, amount);\r\n//   } else {\r\n//     // Fallback to native transaction\r\n//     return sendNativeTransaction(walletConnection, to, amount);\r\n//   }\r\n// };\r\n\r\n// // Send token transaction\r\n// export const sendTokenTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending token transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   if (!tokenConfig) {\r\n//     throw new Error('Token configuration not provided');\r\n//   }\r\n  \r\n//   if (!toAddress) {\r\n//     throw new Error('Recipient address not provided');\r\n//   }\r\n\r\n//   if (!amount || isNaN(parseFloat(amount)) || parseFloat(amount) <= 0) {\r\n//     throw new Error('Invalid amount');\r\n//   }\r\n\r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n//   console.log(`Token: ${symbol}, Decimals: ${decimals}, Contract: ${contractAddress}`);\r\n  \r\n//   switch (walletConnection.walletType) {\r\n//     case WALLET_TYPES.TRONLINK:\r\n//       return sendTRC20Transaction(walletConnection, tokenConfig, toAddress, amount);\r\n//     case WALLET_TYPES.LUTE:\r\n//       return sendAlgorandAssetTransaction(walletConnection, tokenConfig, toAddress, amount);\r\n//     case WALLET_TYPES.PHANTOM:\r\n//       return sendSolanaTokenTransaction(walletConnection, tokenConfig, toAddress, amount);\r\n//     default:\r\n//       return sendERC20Transaction(walletConnection, tokenConfig, toAddress, amount);\r\n//   }\r\n// };\r\n\r\n// // NEW: Solana token transaction function\r\n// export const sendSolanaTokenTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('=== SOLANA TOKEN TRANSACTION DEBUG ===');\r\n//   console.log('Input params:', { tokenConfig, toAddress, amount });\r\n//   console.log('Wallet connection:', walletConnection);\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Phantom wallet not connected');\r\n//   }\r\n  \r\n//   const phantomProvider = walletConnection.provider;\r\n  \r\n//   if (!phantomProvider || !phantomProvider.isConnected) {\r\n//     throw new Error('Phantom wallet not connected');\r\n//   }\r\n  \r\n//   if (!tokenConfig || !tokenConfig.contractAddress) {\r\n//     throw new Error('Invalid token configuration');\r\n//   }\r\n  \r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   console.log('Token config details:', {\r\n//     symbol,\r\n//     contractAddress,\r\n//     decimals: tokenDecimals,\r\n//     inputAmount: tokenAmount\r\n//   });\r\n  \r\n//   // The key issue: For USDC with 6 decimals, $0.31 should be 310,000 micro-USDC\r\n//   // But we need to make sure this is what we actually want to send\r\n  \r\n//   // Calculate the amount in the token's smallest unit\r\n//   const amountInSmallestUnit = Math.floor(tokenAmount * Math.pow(10, tokenDecimals));\r\n  \r\n//   console.log('Amount calculation:', {\r\n//     tokenAmount: tokenAmount,\r\n//     decimals: tokenDecimals,\r\n//     calculation: `${tokenAmount} * 10^${tokenDecimals}`,\r\n//     amountInSmallestUnit: amountInSmallestUnit,\r\n//     humanReadable: `${tokenAmount} ${symbol} = ${amountInSmallestUnit} micro-${symbol}`\r\n//   });\r\n  \r\n//   // IMPORTANT: Validate that this is actually what we want\r\n//   // For $0.31 USDC (6 decimals): 0.31 * 10^6 = 310,000 micro-USDC\r\n//   // This should be ~$0.31, not $310k\r\n  \r\n//   if (amountInSmallestUnit <= 0) {\r\n//     throw new Error(`Invalid amount: ${tokenAmount} ${symbol} converts to ${amountInSmallestUnit} base units`);\r\n//   }\r\n  \r\n//   // For very small amounts, warn if we might lose precision\r\n//   if (tokenAmount < 1 && amountInSmallestUnit === 0) {\r\n//     throw new Error(`Amount too small: ${tokenAmount} ${symbol} is smaller than the minimum unit (1/${Math.pow(10, tokenDecimals)} ${symbol})`);\r\n//   }\r\n  \r\n//   try {\r\n//     // Import Solana libraries with proper error handling\r\n//     let Connection, PublicKey, Transaction, createTransferInstruction, getAssociatedTokenAddress, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID;\r\n    \r\n//     try {\r\n//       const solanaWeb3 = await import('@solana/web3.js');\r\n//       const splToken = await import('@solana/spl-token');\r\n      \r\n//       Connection = solanaWeb3.Connection;\r\n//       PublicKey = solanaWeb3.PublicKey;\r\n//       Transaction = solanaWeb3.Transaction;\r\n//       createTransferInstruction = splToken.createTransferInstruction;\r\n//       getAssociatedTokenAddress = splToken.getAssociatedTokenAddress;\r\n//       TOKEN_PROGRAM_ID = splToken.TOKEN_PROGRAM_ID;\r\n//       ASSOCIATED_TOKEN_PROGRAM_ID = splToken.ASSOCIATED_TOKEN_PROGRAM_ID;\r\n//     } catch (importError) {\r\n//       console.error('Failed to import Solana libraries:', importError);\r\n//       throw new Error('Solana libraries not available. Please ensure @solana/web3.js and @solana/spl-token are installed.');\r\n//     }\r\n    \r\n//     const connection = new Connection(NETWORK_CONFIG[NETWORK_TYPES.SOLANA].rpcUrl);\r\n//     const fromPubkey = walletConnection.publicKey;\r\n//     const toPubkey = new PublicKey(toAddress);\r\n//     const mintPubkey = new PublicKey(contractAddress);\r\n    \r\n//     console.log('Public keys:', {\r\n//       from: fromPubkey.toString(),\r\n//       to: toPubkey.toString(),\r\n//       mint: mintPubkey.toString()\r\n//     });\r\n    \r\n//     // Get associated token accounts\r\n//     const fromTokenAccount = await getAssociatedTokenAddress(\r\n//       mintPubkey,\r\n//       fromPubkey,\r\n//       false,\r\n//       TOKEN_PROGRAM_ID,\r\n//       ASSOCIATED_TOKEN_PROGRAM_ID\r\n//     );\r\n    \r\n//     const toTokenAccount = await getAssociatedTokenAddress(\r\n//       mintPubkey,\r\n//       toPubkey,\r\n//       false,\r\n//       TOKEN_PROGRAM_ID,\r\n//       ASSOCIATED_TOKEN_PROGRAM_ID\r\n//     );\r\n    \r\n//     console.log('Token accounts:', {\r\n//       fromTokenAccount: fromTokenAccount.toString(),\r\n//       toTokenAccount: toTokenAccount.toString()\r\n//     });\r\n    \r\n//     // Create transfer instruction\r\n//     console.log('Creating transfer instruction with amount:', amountInSmallestUnit);\r\n    \r\n//     const transferInstruction = createTransferInstruction(\r\n//       fromTokenAccount,\r\n//       toTokenAccount,\r\n//       fromPubkey,\r\n//       amountInSmallestUnit,\r\n//       [],\r\n//       TOKEN_PROGRAM_ID\r\n//     );\r\n    \r\n//     // Create transaction\r\n//     const transaction = new Transaction().add(transferInstruction);\r\n    \r\n//     // Get recent blockhash\r\n//     const { blockhash } = await connection.getLatestBlockhash();\r\n//     transaction.recentBlockhash = blockhash;\r\n//     transaction.feePayer = fromPubkey;\r\n    \r\n//     console.log('Transaction created, sending to Phantom...');\r\n    \r\n//     // Sign and send transaction\r\n//     const signedTransaction = await phantomProvider.signAndSendTransaction(transaction);\r\n    \r\n//     console.log('✅ Solana token transaction sent successfully:', signedTransaction);\r\n//     console.log('=== END SOLANA TOKEN TRANSACTION DEBUG ===');\r\n    \r\n//     return signedTransaction.signature || signedTransaction;\r\n//   } catch (error) {\r\n//     console.error('❌ Solana token transaction error:', error);\r\n//     console.log('=== END SOLANA TOKEN TRANSACTION DEBUG (ERROR) ===');\r\n    \r\n//     if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('Insufficient')) {\r\n//       throw new Error('Insufficient token balance');\r\n//     } else if (error.message && error.message.includes('Invalid amount') || error.message && error.message.includes('Amount too small')) {\r\n//       throw error; // Re-throw our validation errors\r\n//     } else if (error.message && error.message.includes('Solana libraries not available')) {\r\n//       throw error; // Re-throw import errors\r\n//     } else {\r\n//       throw new Error(`Token transaction failed: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // ERC20/BEP20 token transaction function\r\n// export const sendERC20Transaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending ERC20/BEP20 transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   const provider = walletConnection.provider;\r\n//   const signer = await provider.getSigner();\r\n  \r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   // Use ethers v6 parseUnits directly\r\n//   const tokenUnits = ethers.parseUnits(tokenAmount.toString(), tokenDecimals);\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${tokenUnits.toString()} base units) to ${toAddress}`);\r\n//   console.log(`Token config:`, { contractAddress, decimals, symbol });\r\n  \r\n//   try {\r\n//     // Create contract instance with proper signer\r\n//     const tokenContract = new ethers.Contract(\r\n//       contractAddress,\r\n//       [\r\n//         'function transfer(address to, uint256 amount) returns (bool)',\r\n//         'function balanceOf(address owner) view returns (uint256)',\r\n//         'function decimals() view returns (uint8)'\r\n//       ],\r\n//       signer\r\n//     );\r\n    \r\n//     // Check token balance first\r\n//     const userAddress = await signer.getAddress();\r\n//     const balance = await tokenContract.balanceOf(userAddress);\r\n//     console.log(`User ${symbol} balance:`, ethers.formatUnits(balance, decimals));\r\n    \r\n//     if (balance < tokenUnits) {\r\n//       throw new Error(`Insufficient ${symbol} balance. Required: ${tokenAmount}, Available: ${ethers.formatUnits(balance, decimals)}`);\r\n//     }\r\n    \r\n//     try {\r\n//       // Estimate gas for the transfer with higher gas limit for USDC\r\n//       const gasEstimate = await tokenContract.transfer.estimateGas(toAddress, tokenUnits);\r\n//       console.log('Gas estimate:', gasEstimate.toString());\r\n      \r\n//       // USDC requires significantly more gas due to additional checks\r\n//       let gasMultiplier;\r\n//       if (symbol === 'USDC') {\r\n//         gasMultiplier = BigInt(150); // 50% buffer for USDC\r\n//       } else if (symbol === 'USDT') {\r\n//         gasMultiplier = BigInt(130); // 30% buffer for USDT\r\n//       } else {\r\n//         gasMultiplier = BigInt(120); // 20% buffer for others\r\n//       }\r\n      \r\n//       const gasLimit = (gasEstimate * gasMultiplier) / BigInt(100);\r\n        \r\n//       console.log('Using gas limit:', gasLimit.toString());\r\n      \r\n//       // Send with explicit gas limit\r\n//       const transaction = await tokenContract.transfer(toAddress, tokenUnits, {\r\n//         gasLimit: gasLimit\r\n//       });\r\n      \r\n//       console.log('Transaction sent:', transaction);\r\n//       return transaction.hash;\r\n//     } catch (gasError) {\r\n//       console.error('Gas estimation failed:', gasError);\r\n      \r\n//       // For USDC/USDT, try with higher fixed gas limits\r\n//       let fixedGasLimit;\r\n//       if (symbol === 'USDC') {\r\n//         fixedGasLimit = BigInt(200000); // Higher for USDC\r\n//       } else if (symbol === 'USDT') {\r\n//         fixedGasLimit = BigInt(180000); // Higher for USDT\r\n//       } else {\r\n//         fixedGasLimit = BigInt(150000);\r\n//       }\r\n      \r\n//       console.log(`Trying ${symbol} transaction with fixed gas limit:`, fixedGasLimit.toString());\r\n      \r\n//       const transaction = await tokenContract.transfer(toAddress, tokenUnits, {\r\n//         gasLimit: fixedGasLimit\r\n//       });\r\n      \r\n//       console.log('Transaction sent with fixed gas limit:', transaction);\r\n//       return transaction.hash;\r\n//     }\r\n//   } catch (error) {\r\n//     console.error('ERC20 transaction error:', error);\r\n    \r\n//     // Improve error messages\r\n//     if (error.message && error.message.includes('user rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('insufficient funds')) {\r\n//       throw new Error('Insufficient funds for transaction');\r\n//     } else if (error.message && error.message.includes('Insufficient')) {\r\n//       throw error; // Already formatted\r\n//     } else {\r\n//       throw error;\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // TRC20 token transaction function\r\n// export const sendTRC20Transaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending TRC20 transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Tron wallet not connected');\r\n//   }\r\n  \r\n//   const tronWeb = walletConnection.provider;\r\n//   if (!tronWeb || !tronWeb.ready) {\r\n//     throw new Error('TronWeb not initialized');\r\n//   }\r\n  \r\n//   if (!tokenConfig || !tokenConfig.contractAddress) {\r\n//     throw new Error('Invalid token configuration');\r\n//   }\r\n  \r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   const amountWithDecimals = tokenAmount * Math.pow(10, tokenDecimals);\r\n//   const amountString = amountWithDecimals.toString();\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${amountString} base units) to ${toAddress}`);\r\n  \r\n//   try {\r\n//     const contract = await tronWeb.contract().at(contractAddress);\r\n    \r\n//     if (!contract.transfer) {\r\n//       throw new Error('Invalid TRC-20 contract');\r\n//     }\r\n    \r\n//     const transaction = await contract.transfer(\r\n//       toAddress,\r\n//       amountString\r\n//     ).send({\r\n//       feeLimit: 100000000,\r\n//       callValue: 0,\r\n//       shouldPollResponse: false\r\n//     });\r\n    \r\n//     console.log('TRC20 transaction sent:', transaction);\r\n//     return transaction;\r\n//   } catch (error) {\r\n//     console.error('TRC20 transaction failed:', error);\r\n    \r\n//     if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('bandwidth')) {\r\n//       throw new Error('Insufficient energy or bandwidth. Make sure you have enough TRX for fees.');\r\n//     } else if (error.message && error.message.includes('balance')) {\r\n//       throw new Error('Insufficient token balance for transfer');\r\n//     } else {\r\n//       throw new Error(`Transaction failed: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Enhanced Algorand asset transaction function\r\n// export const sendAlgorandAssetTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending Algorand asset transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Algorand wallet not connected');\r\n//   }\r\n  \r\n//   const algorandProvider = walletConnection.provider;\r\n  \r\n//   if (!tokenConfig || !tokenConfig.assetId) {\r\n//     throw new Error('Invalid token configuration - missing assetId');\r\n//   }\r\n  \r\n//   const { assetId, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   const assetAmount = Math.floor(tokenAmount * Math.pow(10, tokenDecimals));\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${assetAmount} base units) to ${toAddress}`);\r\n//   console.log(`Using wallet: ${walletConnection.walletName || 'Unknown'}`);\r\n  \r\n//   try {\r\n//     let transaction;\r\n    \r\n//     // Handle different Algorand wallet APIs\r\n//     if (algorandProvider.sendAssetTransfer) {\r\n//       console.log('Using sendAssetTransfer method...');\r\n//       transaction = await algorandProvider.sendAssetTransfer({\r\n//         recipient: toAddress,\r\n//         assetId: assetId,\r\n//         amount: assetAmount\r\n//       });\r\n//     } else if (algorandProvider.signTransaction) {\r\n//       console.log('Using signTransaction method for asset transfer...');\r\n//       // Build asset transfer transaction for wallets like AlgoSigner\r\n//       const txn = {\r\n//         type: 'axfer',\r\n//         from: walletConnection.address,\r\n//         to: toAddress,\r\n//         amount: assetAmount,\r\n//         assetIndex: assetId,\r\n//         fee: 1000,\r\n//         firstRound: 1000,\r\n//         lastRound: 2000\r\n//       };\r\n//       transaction = await algorandProvider.signTransaction(txn);\r\n//     } else {\r\n//       throw new Error(`Unsupported Algorand wallet API for asset transfers in ${walletConnection.walletName || 'this wallet'}`);\r\n//     }\r\n    \r\n//     console.log('Algorand asset transaction sent:', transaction);\r\n//     return transaction.txId || transaction.txID || transaction;\r\n//   } catch (error) {\r\n//     console.error('Algorand asset transaction error:', error);\r\n    \r\n//     if (error.message && error.message.includes('rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('balance')) {\r\n//       throw new Error('Insufficient asset balance');\r\n//     } else if (error.message && error.message.includes('opted')) {\r\n//       throw new Error('Account not opted in to this asset. Please opt in first.');\r\n//     } else {\r\n//       throw error;\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Get token configuration for a specific currency and network\r\n// export const getTokenConfig = (currency, network) => {\r\n//   if (!currency || !network) {\r\n//     return null;\r\n//   }\r\n  \r\n//   const tokenConfig = TOKEN_CONFIG[currency.toUpperCase()];\r\n//   if (!tokenConfig) {\r\n//     return null;\r\n//   }\r\n  \r\n//   return tokenConfig[network.toLowerCase()];\r\n// };\r\n\r\n// // Export everything as a default object as well\r\n// export default {\r\n//   WALLET_TYPES,\r\n//   NETWORK_TYPES,\r\n//   NETWORK_CONFIG,\r\n//   TOKEN_CONFIG,\r\n//   NETWORK_WALLET_MAP,\r\n//   getWalletInstallUrl,\r\n//   detectWallets,\r\n//   detectWalletsWithRetry,\r\n//   debugWalletEnvironment,\r\n//   connectWallet,\r\n//   getSupportedWalletsForNetwork,\r\n//   sendNativeTransaction,\r\n//   sendTokenTransaction,\r\n//   sendTransaction,\r\n//   sendTRC20Transaction,\r\n//   sendERC20Transaction,\r\n//   sendSolanaTokenTransaction,\r\n//   sendAlgorandAssetTransaction,\r\n//   getTokenConfig\r\n// };\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // src/services/walletService.js \r\n// import { ethers } from 'ethers';\r\n\r\n// // Import Solana libraries statically to avoid dynamic import issues\r\n// import {\r\n//   Connection,\r\n//   PublicKey,\r\n//   Transaction,\r\n//   SystemProgram,\r\n//   LAMPORTS_PER_SOL\r\n// } from '@solana/web3.js';\r\n\r\n// import {\r\n//   createTransferInstruction,\r\n//   createAssociatedTokenAccountInstruction,\r\n//   getAssociatedTokenAddress,\r\n//   TOKEN_PROGRAM_ID,\r\n//   ASSOCIATED_TOKEN_PROGRAM_ID\r\n// } from '@solana/spl-token';\r\n\r\n// // Wallet Types - Enhanced Trust Wallet support\r\n// export const WALLET_TYPES = {\r\n//   METAMASK: 'metamask',\r\n//   TRONLINK: 'tronlink',\r\n//   TRUST_WALLET: 'trustwallet',\r\n//   LUTE: 'lute',\r\n//   PHANTOM: 'phantom'\r\n// };\r\n\r\n// // Network Types\r\n// export const NETWORK_TYPES = {\r\n//   ETHEREUM: 'ethereum',\r\n//   BSC: 'bsc',\r\n//   TRON: 'tron',\r\n//   ALGORAND: 'algorand',\r\n//   SOLANA: 'solana'\r\n// };\r\n\r\n// // Network configuration\r\n// export const NETWORK_CONFIG = {\r\n//   [NETWORK_TYPES.ETHEREUM]: {\r\n//     name: 'Ethereum Mainnet',\r\n//     chainId: 1,\r\n//     symbol: 'ETH',\r\n//     decimals: 18,\r\n//     rpcUrl: 'https://mainnet.infura.io/v3/your-infura-key',\r\n//     blockExplorerUrl: 'https://etherscan.io'\r\n//   },\r\n//   [NETWORK_TYPES.BSC]: {\r\n//     name: 'Binance Smart Chain',\r\n//     chainId: 56,\r\n//     symbol: 'BNB',\r\n//     decimals: 18,\r\n//     rpcUrl: 'https://bsc-dataseed.binance.org/',\r\n//     blockExplorerUrl: 'https://bscscan.com'\r\n//   },\r\n//   [NETWORK_TYPES.TRON]: {\r\n//     name: 'TRON Mainnet',\r\n//     symbol: 'TRX',\r\n//     decimals: 6,\r\n//     rpcUrl: 'https://api.trongrid.io',\r\n//     blockExplorerUrl: 'https://tronscan.org'\r\n//   },\r\n//   [NETWORK_TYPES.ALGORAND]: {\r\n//     name: 'Algorand Mainnet',\r\n//     symbol: 'ALGO',\r\n//     decimals: 6,\r\n//     rpcUrl: 'https://mainnet-api.algonode.cloud',\r\n//     blockExplorerUrl: 'https://algoexplorer.io'\r\n//   },\r\n//   [NETWORK_TYPES.SOLANA]: {\r\n//     name: 'Solana Mainnet',\r\n//     symbol: 'SOL',\r\n//     decimals: 9,\r\n//     rpcUrl: 'https://rpc.ankr.com/solana',\r\n//     fallbackRpcUrls: [\r\n//       'https://solana-api.projectserum.com',\r\n//       'https://api.mainnet-beta.solana.com',\r\n//       'https://solana-mainnet.g.alchemy.com/v2/demo'\r\n//     ],\r\n//     blockExplorerUrl: 'https://explorer.solana.com'\r\n//   }\r\n// };\r\n\r\n// // Token configurations with correct contract addresses and decimals\r\n// export const TOKEN_CONFIG = {\r\n//   USDT: {\r\n//     ethereum: {\r\n//       contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     bsc: {\r\n//       contractAddress: '0x55d398326f99059fF775485246999027B3197955',\r\n//       decimals: 18,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     tron: {\r\n//       contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     algorand: {\r\n//       assetId: 312769,\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     solana: {\r\n//       contractAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     }\r\n//   },\r\n//   USDC: {\r\n//     ethereum: {\r\n//       contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     bsc: {\r\n//       contractAddress: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n//       decimals: 18,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     tron: {\r\n//       contractAddress: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     algorand: {\r\n//       assetId: 31566704,\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     solana: {\r\n//       contractAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     }\r\n//   },\r\n//   BNB: {\r\n//     bsc: {\r\n//       decimals: 18,\r\n//       symbol: 'BNB',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   ETH: {\r\n//     ethereum: {\r\n//       decimals: 18,\r\n//       symbol: 'ETH',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   TRX: {\r\n//     tron: {\r\n//       decimals: 6,\r\n//       symbol: 'TRX',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   ALGO: {\r\n//     algorand: {\r\n//       decimals: 6,\r\n//       symbol: 'ALGO',\r\n//       isNative: true\r\n//     }\r\n//   },\r\n//   SOL: {\r\n//     solana: {\r\n//       decimals: 9,\r\n//       symbol: 'SOL',\r\n//       isNative: true\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Network to wallet mapping - Enhanced Trust Wallet support\r\n// export const NETWORK_WALLET_MAP = {\r\n//   [NETWORK_TYPES.ETHEREUM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.BSC]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.TRON]: [WALLET_TYPES.TRONLINK, WALLET_TYPES.TRUST_WALLET], // Trust Wallet supports TRON\r\n//   [NETWORK_TYPES.ALGORAND]: [WALLET_TYPES.LUTE],\r\n//   [NETWORK_TYPES.SOLANA]: [WALLET_TYPES.PHANTOM, WALLET_TYPES.TRUST_WALLET] // Trust Wallet supports Solana\r\n// };\r\n\r\n// // Installation URLs for wallets\r\n// export const getWalletInstallUrl = (walletType) => {\r\n//   const urls = {\r\n//     [WALLET_TYPES.METAMASK]: 'https://metamask.io/download/',\r\n//     [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/download/',\r\n//     [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/download/',\r\n//     [WALLET_TYPES.LUTE]: 'https://lute.app/download/',\r\n//     [WALLET_TYPES.PHANTOM]: 'https://phantom.app/download'\r\n//   };\r\n//   return urls[walletType] || '';\r\n// };\r\n\r\n// // Helper function to create Solana connection with fallback RPC URLs\r\n// const createSolanaConnection = async () => {\r\n//   const config = NETWORK_CONFIG[NETWORK_TYPES.SOLANA];\r\n//   const urls = [config.rpcUrl, ...(config.fallbackRpcUrls || [])];\r\n  \r\n//   for (const url of urls) {\r\n//     try {\r\n//       console.log(`Trying Solana RPC: ${url}`);\r\n//       const connection = new Connection(url, 'confirmed');\r\n      \r\n//       // Test the connection by getting the latest blockhash\r\n//       await connection.getLatestBlockhash();\r\n//       console.log(`✅ Successfully connected to Solana RPC: ${url}`);\r\n//       return connection;\r\n//     } catch (error) {\r\n//       console.warn(`❌ Failed to connect to ${url}:`, error.message);\r\n//       continue;\r\n//     }\r\n//   }\r\n  \r\n//   throw new Error('Failed to connect to any Solana RPC endpoint. Please try again later.');\r\n// };\r\n\r\n// // Enhanced Trust Wallet detection with multiple methods\r\n// const detectTrustWallet = () => {\r\n//   if (typeof window === 'undefined') return false;\r\n  \r\n//   console.log('=== TRUST WALLET DETECTION DEBUG ===');\r\n  \r\n//   // Log all available ethereum providers for debugging\r\n//   if (window.ethereum) {\r\n//     console.log('window.ethereum exists:', {\r\n//       isMetaMask: window.ethereum.isMetaMask,\r\n//       isTrust: window.ethereum.isTrust,\r\n//       isTrustWallet: window.ethereum.isTrustWallet,\r\n//       providers: window.ethereum.providers?.length || 0,\r\n//       chainId: window.ethereum.chainId\r\n//     });\r\n    \r\n//     if (window.ethereum.providers) {\r\n//       console.log('Multiple providers detected:', window.ethereum.providers.map(p => ({\r\n//         isMetaMask: p.isMetaMask,\r\n//         isTrust: p.isTrust,\r\n//         isTrustWallet: p.isTrustWallet\r\n//       })));\r\n//     }\r\n//   }\r\n  \r\n//   // Check for Trust Wallet specific global objects\r\n//   console.log('Trust Wallet globals:', {\r\n//     trustwallet: Boolean(window.trustwallet),\r\n//     trust: Boolean(window.trust),\r\n//     isTrustWallet: Boolean(window.isTrustWallet)\r\n//   });\r\n  \r\n//   // Multiple ways to detect Trust Wallet\r\n//   const trustDetectionMethods = [\r\n//     // Method 1: Direct Trust Wallet identifier\r\n//     () => {\r\n//       const result = window.ethereum && window.ethereum.isTrust === true;\r\n//       console.log('Method 1 (ethereum.isTrust):', result);\r\n//       return result;\r\n//     },\r\n    \r\n//     // Method 2: TrustWallet global object\r\n//     () => {\r\n//       const result = window.trustwallet !== undefined;\r\n//       console.log('Method 2 (window.trustwallet):', result);\r\n//       return result;\r\n//     },\r\n    \r\n//     // Method 3: Trust Wallet mobile/extension interface\r\n//     () => {\r\n//       const result = window.ethereum && window.ethereum.isTrustWallet === true;\r\n//       console.log('Method 3 (ethereum.isTrustWallet):', result);\r\n//       return result;\r\n//     },\r\n    \r\n//     // Method 4: Provider array detection\r\n//     () => {\r\n//       const result = window.ethereum && window.ethereum.providers && \r\n//             window.ethereum.providers.some(p => p.isTrust === true || p.isTrustWallet === true);\r\n//       console.log('Method 4 (providers array):', result);\r\n//       return result;\r\n//     },\r\n    \r\n//     // Method 5: Trust Wallet as primary provider when no MetaMask\r\n//     () => {\r\n//       const result = window.ethereum && \r\n//             !window.ethereum.isMetaMask &&\r\n//             window.ethereum.request &&\r\n//             (window.ethereum.isTrust !== false);\r\n//       console.log('Method 5 (primary provider, not MetaMask):', result);\r\n//       return result;\r\n//     },\r\n    \r\n//     // Method 6: Check for Trust Wallet specific methods/properties\r\n//     () => {\r\n//       const result = window.ethereum && (\r\n//         typeof window.ethereum.isTrust === 'boolean' ||\r\n//         window.ethereum._trustwallet ||\r\n//         window.ethereum.trustWallet\r\n//       );\r\n//       console.log('Method 6 (Trust Wallet specific properties):', result);\r\n//       return result;\r\n//     },\r\n    \r\n//     // Method 7: User agent detection (for mobile web)\r\n//     () => {\r\n//       const result = /TrustWallet/i.test(navigator.userAgent);\r\n//       console.log('Method 7 (user agent):', result);\r\n//       return result;\r\n//     },\r\n    \r\n//     // Method 8: DOM element detection\r\n//     () => {\r\n//       const result = document.querySelector('[data-wallet=\"trustwallet\"]') !== null ||\r\n//                     document.querySelector('#trustwallet-extension') !== null;\r\n//       console.log('Method 8 (DOM elements):', result);\r\n//       return result;\r\n//     },\r\n    \r\n//     // Method 9: Check for Trust Wallet via window.trust\r\n//     () => {\r\n//       const result = window.trust !== undefined;\r\n//       console.log('Method 9 (window.trust):', result);\r\n//       return result;\r\n//     },\r\n    \r\n//     // Method 10: Advanced provider detection\r\n//     () => {\r\n//       if (!window.ethereum) return false;\r\n      \r\n//       // Check if ethereum object has Trust Wallet characteristics\r\n//       const hasTrustFeatures = (\r\n//         // Not MetaMask and not other known wallets\r\n//         !window.ethereum.isMetaMask &&\r\n//         !window.ethereum.isPhantom &&\r\n//         !window.ethereum.isFrame &&\r\n//         // Has ethereum methods but could be Trust Wallet\r\n//         window.ethereum.request &&\r\n//         window.ethereum.on &&\r\n//         // Check for Trust Wallet specific patterns\r\n//         (window.ethereum.chainId || window.ethereum.networkVersion)\r\n//       );\r\n      \r\n//       console.log('Method 10 (advanced detection):', hasTrustFeatures);\r\n//       return hasTrustFeatures;\r\n//     }\r\n//   ];\r\n  \r\n//   const detectionResults = trustDetectionMethods.map((method, index) => {\r\n//     try {\r\n//       return method();\r\n//     } catch (error) {\r\n//       console.warn(`Trust Wallet detection method ${index + 1} failed:`, error);\r\n//       return false;\r\n//     }\r\n//   });\r\n  \r\n//   const isDetected = detectionResults.some(result => result === true);\r\n  \r\n//   console.log('Detection results:', detectionResults);\r\n//   console.log('Final Trust Wallet detection result:', isDetected);\r\n//   console.log('=== END TRUST WALLET DETECTION DEBUG ===');\r\n  \r\n//   return isDetected;\r\n// };\r\n\r\n// // Enhanced Lute wallet detection\r\n// const detectLuteWallet = () => {\r\n//   if (typeof window === 'undefined') return false;\r\n  \r\n//   const luteDetectionMethods = [\r\n//     () => window.lute !== undefined,\r\n//     () => window.algorand !== undefined,\r\n//     () => window.AlgoSigner !== undefined,\r\n//     () => window.luteWallet !== undefined,\r\n//     () => document.querySelector('[data-wallet=\"lute\"]') !== null,\r\n//     () => window.postMessage && document.documentElement.getAttribute('data-lute-extension') === 'true'\r\n//   ];\r\n  \r\n//   return luteDetectionMethods.some(method => {\r\n//     try {\r\n//       return method();\r\n//     } catch (error) {\r\n//       console.warn('Lute detection method failed:', error);\r\n//       return false;\r\n//     }\r\n//   });\r\n// };\r\n\r\n// // Enhanced Phantom wallet detection\r\n// const detectPhantomWallet = () => {\r\n//   if (typeof window === 'undefined') return false;\r\n  \r\n//   const phantomDetectionMethods = [\r\n//     () => window.solana && window.solana.isPhantom,\r\n//     () => window.phantom && window.phantom.solana,\r\n//     () => window.phantomWallet !== undefined,\r\n//     () => document.querySelector('[data-wallet=\"phantom\"]') !== null\r\n//   ];\r\n  \r\n//   return phantomDetectionMethods.some(method => {\r\n//     try {\r\n//       return method();\r\n//     } catch (error) {\r\n//       console.warn('Phantom detection method failed:', error);\r\n//       return false;\r\n//     }\r\n//   });\r\n// };\r\n\r\n// // Enhanced MetaMask detection (to avoid conflicts with Trust Wallet)\r\n// const detectMetamaskWallet = () => {\r\n//   if (typeof window === 'undefined') return false;\r\n  \r\n//   try {\r\n//     // Ensure it's MetaMask and not Trust Wallet or other wallets\r\n//     return window.ethereum !== undefined && \r\n//            window.ethereum.isMetaMask === true &&\r\n//            window.ethereum.isTrust !== true &&\r\n//            window.ethereum.isTrustWallet !== true;\r\n//   } catch (error) {\r\n//     console.warn('MetaMask detection failed:', error);\r\n//     return false;\r\n//   }\r\n// };\r\n\r\n// // Detect available wallets in the browser - Enhanced Trust Wallet detection\r\n// export const detectWallets = () => {\r\n//   const availableWallets = {\r\n//     [WALLET_TYPES.METAMASK]: detectMetamaskWallet(),\r\n//     [WALLET_TYPES.TRONLINK]: typeof window !== 'undefined' && window.tronWeb !== undefined,\r\n//     [WALLET_TYPES.TRUST_WALLET]: detectTrustWallet(),\r\n//     [WALLET_TYPES.LUTE]: detectLuteWallet(),\r\n//     [WALLET_TYPES.PHANTOM]: detectPhantomWallet()\r\n//   };\r\n  \r\n//   // Enhanced logging for wallet detection\r\n//   if (typeof window !== 'undefined') {\r\n//     console.log('=== WALLET DETECTION DEBUG ===');\r\n//     console.log('MetaMask:', availableWallets[WALLET_TYPES.METAMASK]);\r\n//     console.log('TronLink:', availableWallets[WALLET_TYPES.TRONLINK]);\r\n//     console.log('Trust Wallet:', availableWallets[WALLET_TYPES.TRUST_WALLET]);\r\n//     console.log('Lute:', availableWallets[WALLET_TYPES.LUTE]);\r\n//     console.log('Phantom:', availableWallets[WALLET_TYPES.PHANTOM]);\r\n    \r\n//     // Additional Trust Wallet debugging\r\n//     if (window.ethereum) {\r\n//       console.log('Ethereum provider details:', {\r\n//         isMetaMask: window.ethereum.isMetaMask,\r\n//         isTrust: window.ethereum.isTrust,\r\n//         isTrustWallet: window.ethereum.isTrustWallet,\r\n//         providers: window.ethereum.providers?.length || 0\r\n//       });\r\n//     }\r\n    \r\n//     console.log('=== END WALLET DETECTION DEBUG ===');\r\n//   }\r\n  \r\n//   return availableWallets;\r\n// };\r\n\r\n// // Detect wallets with retry and enhanced detection\r\n// export const detectWalletsWithRetry = async (maxRetries = 5, delay = 1000) => {\r\n//   let retries = 0;\r\n//   let wallets = detectWallets();\r\n  \r\n//   while (retries < maxRetries) {\r\n//     wallets = detectWallets();\r\n    \r\n//     const hasAnyWallet = Object.values(wallets).some(v => v === true);\r\n    \r\n//     if (hasAnyWallet || retries >= maxRetries - 1) {\r\n//       break;\r\n//     }\r\n    \r\n//     console.log(`Wallet detection attempt ${retries + 1}/${maxRetries}...`);\r\n//     console.log('Current detection results:', wallets);\r\n    \r\n//     await new Promise(resolve => setTimeout(resolve, delay));\r\n//     retries++;\r\n//   }\r\n  \r\n//   // Final check with extended detection\r\n//   if (!wallets[WALLET_TYPES.TRUST_WALLET] || !wallets[WALLET_TYPES.LUTE] || !wallets[WALLET_TYPES.PHANTOM]) {\r\n//     console.log('Performing extended wallet detection...');\r\n    \r\n//     if (typeof window !== 'undefined') {\r\n//       try {\r\n//         // Dispatch custom events that might trigger wallet injection\r\n//         const events = [\r\n//           new CustomEvent('trust-wallet-detect', { detail: { source: 'coinley-sdk' } }),\r\n//           new CustomEvent('lute-wallet-detect', { detail: { source: 'coinley-sdk' } }),\r\n//           new CustomEvent('phantom-wallet-detect', { detail: { source: 'coinley-sdk' } })\r\n//         ];\r\n        \r\n//         events.forEach(event => window.dispatchEvent(event));\r\n        \r\n//         await new Promise(resolve => setTimeout(resolve, 500));\r\n        \r\n//         // Re-detect\r\n//         wallets[WALLET_TYPES.TRUST_WALLET] = detectTrustWallet();\r\n//         wallets[WALLET_TYPES.LUTE] = detectLuteWallet();\r\n//         wallets[WALLET_TYPES.PHANTOM] = detectPhantomWallet();\r\n//       } catch (error) {\r\n//         console.warn('Extended wallet detection failed:', error);\r\n//       }\r\n//     }\r\n//   }\r\n  \r\n//   console.log('Final wallet detection results:', wallets);\r\n//   return wallets;\r\n// };\r\n\r\n// // Debug wallet environment - Enhanced Trust Wallet debugging\r\n// export const debugWalletEnvironment = () => {\r\n//   console.log('=== WALLET ENVIRONMENT DEBUG ===');\r\n//   console.log('ethereum:', typeof window !== 'undefined' ? Boolean(window.ethereum) : 'Not in browser');\r\n//   console.log('tronWeb:', typeof window !== 'undefined' ? Boolean(window.tronWeb) : 'Not in browser');\r\n//   console.log('lute:', typeof window !== 'undefined' ? Boolean(window.lute) : 'Not in browser');\r\n//   console.log('algorand:', typeof window !== 'undefined' ? Boolean(window.algorand) : 'Not in browser');\r\n//   console.log('AlgoSigner:', typeof window !== 'undefined' ? Boolean(window.AlgoSigner) : 'Not in browser');\r\n//   console.log('solana:', typeof window !== 'undefined' ? Boolean(window.solana) : 'Not in browser');\r\n//   console.log('phantom:', typeof window !== 'undefined' ? Boolean(window.phantom) : 'Not in browser');\r\n//   console.log('trustwallet:', typeof window !== 'undefined' ? Boolean(window.trustwallet) : 'Not in browser');\r\n//   console.log('trust:', typeof window !== 'undefined' ? Boolean(window.trust) : 'Not in browser');\r\n  \r\n//   if (typeof window !== 'undefined' && window.ethereum) {\r\n//     console.log('ethereum details:', {\r\n//       isMetaMask: window.ethereum.isMetaMask,\r\n//       isTrust: window.ethereum.isTrust,\r\n//       isTrustWallet: window.ethereum.isTrustWallet,\r\n//       chainId: window.ethereum.chainId,\r\n//       providers: window.ethereum.providers?.length || 0,\r\n//       selectedAddress: window.ethereum.selectedAddress\r\n//     });\r\n    \r\n//     // Log all providers if multiple exist\r\n//     if (window.ethereum.providers && window.ethereum.providers.length > 0) {\r\n//       console.log('All providers:');\r\n//       window.ethereum.providers.forEach((provider, index) => {\r\n//         console.log(`Provider ${index}:`, {\r\n//           isMetaMask: provider.isMetaMask,\r\n//           isTrust: provider.isTrust,\r\n//           isTrustWallet: provider.isTrustWallet,\r\n//           selectedAddress: provider.selectedAddress\r\n//         });\r\n//       });\r\n//     }\r\n//   }\r\n  \r\n//   if (typeof window !== 'undefined' && window.tronWeb) {\r\n//     console.log('tronWeb details:', {\r\n//       ready: window.tronWeb.ready,\r\n//       fullNode: window.tronWeb.fullNode?.host,\r\n//       defaultAddress: window.tronWeb.defaultAddress,\r\n//       isTrust: window.tronWeb.isTrust\r\n//     });\r\n//   }\r\n  \r\n//   if (typeof window !== 'undefined' && window.solana) {\r\n//     console.log('solana details:', {\r\n//       isPhantom: window.solana.isPhantom,\r\n//       isTrust: window.solana.isTrust,\r\n//       publicKey: window.solana.publicKey?.toString(),\r\n//       isConnected: window.solana.isConnected\r\n//     });\r\n//   }\r\n  \r\n//   if (typeof window !== 'undefined') {\r\n//     console.log('All window wallet properties:');\r\n//     const walletProps = Object.keys(window).filter(key => \r\n//       key.toLowerCase().includes('lute') || \r\n//       key.toLowerCase().includes('algo') || \r\n//       key.toLowerCase().includes('wallet') ||\r\n//       key.toLowerCase().includes('phantom') ||\r\n//       key.toLowerCase().includes('solana') ||\r\n//       key.toLowerCase().includes('trust') ||\r\n//       key.toLowerCase().includes('metamask')\r\n//     );\r\n//     console.log('Potential wallet properties:', walletProps);\r\n    \r\n//     // Check for Trust Wallet specific injections\r\n//     console.log('Trust Wallet specific checks:', {\r\n//       'window.trustwallet': Boolean(window.trustwallet),\r\n//       'window.trust': Boolean(window.trust),\r\n//       'window.isTrustWallet': Boolean(window.isTrustWallet),\r\n//       'document trust elements': document.querySelectorAll('[id*=\"trust\"], [class*=\"trust\"]').length\r\n//     });\r\n//   }\r\n  \r\n//   // Run detection methods and show results\r\n//   console.log('=== DETECTION RESULTS ===');\r\n//   const wallets = detectWallets();\r\n//   console.log('Final detection results:', wallets);\r\n  \r\n//   // Run Trust Wallet specific detection\r\n//   console.log('Trust Wallet specific detection result:', detectTrustWallet());\r\n  \r\n//   console.log('=== END WALLET ENVIRONMENT DEBUG ===');\r\n  \r\n//   // Return debug info for external use\r\n//   return {\r\n//     wallets,\r\n//     ethereum: typeof window !== 'undefined' ? window.ethereum : null,\r\n//     trustWalletDetected: typeof window !== 'undefined' ? detectTrustWallet() : false\r\n//   };\r\n// };\r\n\r\n// // Connect to MetaMask wallet\r\n// const connectMetamaskWallet = async () => {\r\n//   console.log('Connecting to MetaMask wallet...');\r\n  \r\n//   if (!window.ethereum || !window.ethereum.isMetaMask || window.ethereum.isTrust === true) {\r\n//     console.error('MetaMask not found or Trust Wallet detected instead.');\r\n//     throw new Error('MetaMask not detected. Please install MetaMask extension.');\r\n//   }\r\n  \r\n//   try {\r\n//     const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });\r\n    \r\n//     if (!accounts || accounts.length === 0) {\r\n//       throw new Error('No accounts found');\r\n//     }\r\n    \r\n//     const address = accounts[0];\r\n//     const chainIdHex = await window.ethereum.request({ method: 'eth_chainId' });\r\n//     const chainId = parseInt(chainIdHex, 16);\r\n    \r\n//     let networkType;\r\n//     switch (chainId) {\r\n//       case 1: networkType = NETWORK_TYPES.ETHEREUM; break;\r\n//       case 56: networkType = NETWORK_TYPES.BSC; break;\r\n//       default: networkType = `unknown-${chainId}`;\r\n//     }\r\n    \r\n//     const web3Provider = new ethers.BrowserProvider(window.ethereum);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.METAMASK,\r\n//       address,\r\n//       provider: web3Provider,\r\n//       network: networkType,\r\n//       isConnected: true,\r\n//       chainId\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to MetaMask:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Enhanced Trust Wallet connection with AGGRESSIVE connection strategies\r\n// const connectTrustWallet = async (targetNetwork = null) => {\r\n//   console.log('=== TRUST WALLET CONNECTION DEBUG ===');\r\n//   console.log('Connecting to Trust Wallet for network:', targetNetwork);\r\n  \r\n//   let networkType = targetNetwork || NETWORK_TYPES.ETHEREUM;\r\n  \r\n//   try {\r\n//     // For Ethereum and BSC networks\r\n//     if (networkType === NETWORK_TYPES.ETHEREUM || networkType === NETWORK_TYPES.BSC) {\r\n//       if (!window.ethereum) {\r\n//         throw new Error('No Ethereum provider found. Please install Trust Wallet browser extension.');\r\n//       }\r\n      \r\n//       console.log('Available ethereum details:', {\r\n//         isMetaMask: window.ethereum.isMetaMask,\r\n//         isTrust: window.ethereum.isTrust,\r\n//         isTrustWallet: window.ethereum.isTrustWallet,\r\n//         providers: window.ethereum.providers?.length || 0,\r\n//         selectedAddress: window.ethereum.selectedAddress\r\n//       });\r\n      \r\n//       // AGGRESSIVE STRATEGY: Try every possible provider until one works\r\n//       const providersToTry = [];\r\n      \r\n//       // Add all possible providers to the list\r\n//       if (window.ethereum.providers && window.ethereum.providers.length > 0) {\r\n//         // Add all providers from the providers array\r\n//         providersToTry.push(...window.ethereum.providers);\r\n//         console.log(`Found ${window.ethereum.providers.length} providers in array`);\r\n//       } else {\r\n//         // Add the main ethereum provider\r\n//         providersToTry.push(window.ethereum);\r\n//         console.log('Using main ethereum provider');\r\n//       }\r\n      \r\n//       // Also add any other potential Trust Wallet providers\r\n//       if (window.trustwallet?.ethereum) {\r\n//         providersToTry.push(window.trustwallet.ethereum);\r\n//         console.log('Added trustwallet.ethereum provider');\r\n//       }\r\n      \r\n//       console.log(`Total providers to try: ${providersToTry.length}`);\r\n      \r\n//       // Try each provider until one works\r\n//       let successfulProvider = null;\r\n//       let accounts = null;\r\n//       let lastError = null;\r\n      \r\n//       for (let i = 0; i < providersToTry.length; i++) {\r\n//         const provider = providersToTry[i];\r\n//         console.log(`\\n🔍 Trying provider ${i + 1}/${providersToTry.length}:`, {\r\n//           isMetaMask: provider.isMetaMask,\r\n//           isTrust: provider.isTrust,\r\n//           isTrustWallet: provider.isTrustWallet,\r\n//           selectedAddress: provider.selectedAddress\r\n//         });\r\n        \r\n//         try {\r\n//           // Try to connect to this provider\r\n//           console.log(`📞 Requesting accounts from provider ${i + 1}...`);\r\n//           const testAccounts = await provider.request({ \r\n//             method: 'eth_requestAccounts' \r\n//           });\r\n          \r\n//           if (testAccounts && testAccounts.length > 0) {\r\n//             console.log(`✅ Provider ${i + 1} worked! Got ${testAccounts.length} accounts`);\r\n//             console.log(`📝 First account: ${testAccounts[0]}`);\r\n            \r\n//             successfulProvider = provider;\r\n//             accounts = testAccounts;\r\n            \r\n//             // If this provider is NOT MetaMask, prefer it (likely Trust Wallet)\r\n//             if (!provider.isMetaMask) {\r\n//               console.log(`🎯 Provider ${i + 1} is not MetaMask - using this one!`);\r\n//               break;\r\n//             } else {\r\n//               console.log(`⚠️ Provider ${i + 1} is MetaMask - will use it if no other works`);\r\n//               // Continue looking for non-MetaMask providers, but keep this as backup\r\n//             }\r\n//           } else {\r\n//             console.log(`❌ Provider ${i + 1} returned no accounts`);\r\n//           }\r\n//         } catch (providerError) {\r\n//           console.log(`❌ Provider ${i + 1} failed:`, providerError.message);\r\n//           lastError = providerError;\r\n          \r\n//           // If user rejected, don't try other providers\r\n//           if (providerError.code === 4001) {\r\n//             console.log('🛑 User rejected connection - stopping attempts');\r\n//             throw new Error('Connection rejected by user. Please approve the connection in your wallet.');\r\n//           }\r\n          \r\n//           continue;\r\n//         }\r\n//       }\r\n      \r\n//       // Check if we got a successful connection\r\n//       if (!successfulProvider || !accounts || accounts.length === 0) {\r\n//         console.error('❌ All providers failed');\r\n        \r\n//         if (lastError) {\r\n//           if (lastError.code === 4001) {\r\n//             throw new Error('Connection rejected by user. Please approve the connection in your wallet.');\r\n//           } else {\r\n//             throw new Error(`Connection failed: ${lastError.message}. Please make sure your wallet is unlocked and try again.`);\r\n//           }\r\n//         } else {\r\n//           throw new Error('No wallet accounts found. Please make sure Trust Wallet is unlocked and has at least one account.');\r\n//         }\r\n//       }\r\n      \r\n//       console.log('\\n🎉 Successfully connected!');\r\n//       console.log('Using provider:', {\r\n//         isMetaMask: successfulProvider.isMetaMask,\r\n//         isTrust: successfulProvider.isTrust,\r\n//         isTrustWallet: successfulProvider.isTrustWallet\r\n//       });\r\n      \r\n//       const address = accounts[0];\r\n//       let chainIdHex, chainId;\r\n      \r\n//       try {\r\n//         chainIdHex = await successfulProvider.request({ method: 'eth_chainId' });\r\n//         chainId = parseInt(chainIdHex, 16);\r\n//         console.log('Chain ID:', chainId);\r\n//       } catch (chainError) {\r\n//         console.warn('Could not get chain ID:', chainError);\r\n//         chainId = 1; // Default to Ethereum mainnet\r\n//       }\r\n      \r\n//       // Determine actual network based on chain ID\r\n//       switch (chainId) {\r\n//         case 1: networkType = NETWORK_TYPES.ETHEREUM; break;\r\n//         case 56: networkType = NETWORK_TYPES.BSC; break;\r\n//         default: networkType = `unknown-${chainId}`;\r\n//       }\r\n      \r\n//       const web3Provider = new ethers.BrowserProvider(successfulProvider);\r\n      \r\n//       console.log('✅ Trust Wallet connected successfully:', {\r\n//         address,\r\n//         network: networkType,\r\n//         chainId\r\n//       });\r\n//       console.log('=== END TRUST WALLET CONNECTION DEBUG ===');\r\n      \r\n//       return {\r\n//         walletType: WALLET_TYPES.TRUST_WALLET,\r\n//         address,\r\n//         provider: web3Provider,\r\n//         network: networkType,\r\n//         isConnected: true,\r\n//         chainId,\r\n//         nativeProvider: successfulProvider\r\n//       };\r\n//     }\r\n    \r\n//     // For TRON network\r\n//     else if (networkType === NETWORK_TYPES.TRON) {\r\n//       if (!window.tronWeb) {\r\n//         throw new Error('TronWeb not found. Please install Trust Wallet with TRON support or use Trust Wallet mobile app.');\r\n//       }\r\n      \r\n//       const waitForTronWeb = async (maxAttempts = 10, interval = 500) => {\r\n//         for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n//           if (window.tronWeb && window.tronWeb.ready) {\r\n//             return window.tronWeb;\r\n//           }\r\n//           console.log(`Waiting for TronWeb to be ready... Attempt ${attempt + 1}/${maxAttempts}`);\r\n//           await new Promise(resolve => setTimeout(resolve, interval));\r\n//         }\r\n//         throw new Error('TronWeb took too long to be ready');\r\n//       };\r\n      \r\n//       const tronWeb = await waitForTronWeb();\r\n      \r\n//       if (!tronWeb.defaultAddress || !tronWeb.defaultAddress.base58) {\r\n//         try {\r\n//           await window.tronWeb.request({ method: 'tron_requestAccounts' });\r\n//         } catch (permissionError) {\r\n//           console.error('Failed to get permission from Trust Wallet TRON:', permissionError);\r\n//           throw new Error('Please unlock Trust Wallet and approve TRON connection');\r\n//         }\r\n//       }\r\n      \r\n//       const address = tronWeb.defaultAddress.base58;\r\n//       console.log('Connected to Trust Wallet TRON:', address);\r\n      \r\n//       return {\r\n//         walletType: WALLET_TYPES.TRUST_WALLET,\r\n//         address: address,\r\n//         provider: tronWeb,\r\n//         network: NETWORK_TYPES.TRON,\r\n//         isConnected: true,\r\n//         nativeProvider: tronWeb\r\n//       };\r\n//     }\r\n    \r\n//     // For Solana network\r\n//     else if (networkType === NETWORK_TYPES.SOLANA) {\r\n//       let solanaProvider = null;\r\n      \r\n//       if (window.solana && window.solana.isTrust === true) {\r\n//         solanaProvider = window.solana;\r\n//       } else if (window.trustwallet && window.trustwallet.solana) {\r\n//         solanaProvider = window.trustwallet.solana;\r\n//       } else if (window.solana && !window.solana.isPhantom) {\r\n//         // Could be Trust Wallet if not Phantom\r\n//         solanaProvider = window.solana;\r\n//       }\r\n      \r\n//       if (!solanaProvider) {\r\n//         throw new Error('Trust Wallet Solana provider not found. Please install Trust Wallet with Solana support or use Trust Wallet mobile app.');\r\n//       }\r\n      \r\n//       console.log('Found Trust Wallet Solana provider');\r\n      \r\n//       const response = await solanaProvider.connect();\r\n      \r\n//       if (!response || !response.publicKey) {\r\n//         throw new Error('No public key returned from Trust Wallet Solana');\r\n//       }\r\n      \r\n//       const address = response.publicKey.toString();\r\n//       console.log('Connected to Trust Wallet Solana:', address);\r\n      \r\n//       return {\r\n//         walletType: WALLET_TYPES.TRUST_WALLET,\r\n//         address: address,\r\n//         provider: solanaProvider,\r\n//         network: NETWORK_TYPES.SOLANA,\r\n//         isConnected: true,\r\n//         publicKey: response.publicKey,\r\n//         nativeProvider: solanaProvider\r\n//       };\r\n//     }\r\n    \r\n//     else {\r\n//       throw new Error(`Trust Wallet does not support network: ${networkType}`);\r\n//     }\r\n    \r\n//   } catch (error) {\r\n//     console.error('=== TRUST WALLET CONNECTION ERROR ===');\r\n//     console.error('Error details:', error);\r\n//     console.log('=== END TRUST WALLET CONNECTION DEBUG ===');\r\n    \r\n//     // Don't modify user rejection errors\r\n//     if (error.code === 4001 || error.message.includes('rejected by user')) {\r\n//       throw error;\r\n//     } else if (error.message.includes('locked')) {\r\n//       throw new Error('Trust Wallet is locked. Please unlock your wallet and try again.');\r\n//     } else {\r\n//       throw error;\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Connect to TronLink wallet\r\n// const connectTronlinkWallet = async () => {\r\n//   console.log('Connecting to TronLink wallet...');\r\n  \r\n//   if (!window.tronWeb) {\r\n//     console.error('TronWeb not found. Is TronLink installed?');\r\n//     throw new Error('TronLink not detected. Please install TronLink extension.');\r\n//   }\r\n  \r\n//   // Make sure this is TronLink and not Trust Wallet\r\n//   if (window.tronWeb.isTrust === true) {\r\n//     throw new Error('Trust Wallet TRON detected instead of TronLink. Please switch to TronLink or use Trust Wallet option.');\r\n//   }\r\n  \r\n//   const waitForTronWeb = async (maxAttempts = 10, interval = 500) => {\r\n//     for (let attempt = 0; attempt < maxAttempts; attempt++) {\r\n//       if (window.tronWeb && window.tronWeb.ready) {\r\n//         return window.tronWeb;\r\n//       }\r\n//       console.log(`Waiting for TronWeb to be ready... Attempt ${attempt + 1}/${maxAttempts}`);\r\n//       await new Promise(resolve => setTimeout(resolve, interval));\r\n//     }\r\n//     throw new Error('TronWeb took too long to be ready');\r\n//   };\r\n  \r\n//   try {\r\n//     const tronWeb = await waitForTronWeb();\r\n    \r\n//     if (!tronWeb.defaultAddress || !tronWeb.defaultAddress.base58) {\r\n//       try {\r\n//         await window.tronWeb.request({ method: 'tron_requestAccounts' });\r\n//       } catch (permissionError) {\r\n//         console.error('Failed to get permission from TronLink:', permissionError);\r\n//         throw new Error('Please unlock TronLink and approve connection');\r\n//       }\r\n//     }\r\n    \r\n//     const address = tronWeb.defaultAddress.base58;\r\n//     console.log('Connected to TronLink wallet:', address);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.TRONLINK,\r\n//       address: address,\r\n//       provider: tronWeb,\r\n//       network: NETWORK_TYPES.TRON,\r\n//       isConnected: true\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to TronLink:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Enhanced Lute wallet connection with multiple detection methods\r\n// const connectLuteWallet = async () => {\r\n//   console.log('Connecting to Lute wallet...');\r\n  \r\n//   let walletProvider = null;\r\n//   let walletName = '';\r\n  \r\n//   if (window.lute) {\r\n//     walletProvider = window.lute;\r\n//     walletName = 'Lute';\r\n//   } else if (window.algorand) {\r\n//     walletProvider = window.algorand;\r\n//     walletName = 'Algorand Provider';\r\n//   } else if (window.AlgoSigner) {\r\n//     walletProvider = window.AlgoSigner;\r\n//     walletName = 'AlgoSigner';\r\n//   } else if (window.luteWallet) {\r\n//     walletProvider = window.luteWallet;\r\n//     walletName = 'Lute Wallet';\r\n//   }\r\n  \r\n//   if (!walletProvider) {\r\n//     console.error('No Algorand wallet detected.');\r\n//     console.log('Available window properties:', Object.keys(window).filter(key => \r\n//       key.toLowerCase().includes('lute') || \r\n//       key.toLowerCase().includes('algo') || \r\n//       key.toLowerCase().includes('wallet')\r\n//     ));\r\n//     throw new Error('Lute wallet not detected. Please install Lute extension or another Algorand wallet.');\r\n//   }\r\n  \r\n//   console.log(`Found ${walletName} wallet provider:`, walletProvider);\r\n  \r\n//   try {\r\n//     let address = null;\r\n    \r\n//     if (walletProvider.connect) {\r\n//       console.log('Using connect() method...');\r\n//       const result = await walletProvider.connect();\r\n//       address = result.address || result;\r\n//     }\r\n//     else if (walletProvider.enable) {\r\n//       console.log('Using enable() method...');\r\n//       const accounts = await walletProvider.enable();\r\n//       address = accounts[0] || accounts;\r\n//     }\r\n//     else if (walletProvider.requestAccounts) {\r\n//       console.log('Using requestAccounts() method...');\r\n//       const accounts = await walletProvider.requestAccounts();\r\n//       address = accounts[0];\r\n//     }\r\n//     else if (walletProvider.connect && walletName === 'AlgoSigner') {\r\n//       console.log('Using AlgoSigner connect...');\r\n//       await walletProvider.connect();\r\n//       const accounts = await walletProvider.accounts({ ledger: 'MainNet' });\r\n//       address = accounts[0]?.address;\r\n//     }\r\n    \r\n//     if (!address) {\r\n//       throw new Error(`No address returned from ${walletName}. Please unlock your wallet and try again.`);\r\n//     }\r\n    \r\n//     console.log(`Connected to ${walletName} wallet:`, address);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.LUTE,\r\n//       address: address,\r\n//       provider: walletProvider,\r\n//       network: NETWORK_TYPES.ALGORAND,\r\n//       isConnected: true,\r\n//       walletName: walletName\r\n//     };\r\n//   } catch (error) {\r\n//     console.error(`Error connecting to ${walletName}:`, error);\r\n    \r\n//     if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Connection rejected by user. Please approve the connection in your wallet.');\r\n//     } else if (error.message && error.message.includes('locked')) {\r\n//       throw new Error('Wallet is locked. Please unlock your wallet and try again.');\r\n//     } else {\r\n//       throw new Error(`Failed to connect to ${walletName}: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Connect to Phantom wallet\r\n// const connectPhantomWallet = async () => {\r\n//   console.log('Connecting to Phantom wallet...');\r\n  \r\n//   let phantomProvider = null;\r\n  \r\n//   if (window.solana && window.solana.isPhantom) {\r\n//     phantomProvider = window.solana;\r\n//   } else if (window.phantom && window.phantom.solana) {\r\n//     phantomProvider = window.phantom.solana;\r\n//   }\r\n  \r\n//   if (!phantomProvider) {\r\n//     console.error('Phantom wallet not found.');\r\n//     console.log('Available Solana providers:', {\r\n//       'window.solana': Boolean(window.solana),\r\n//       'window.phantom': Boolean(window.phantom),\r\n//       'window.solana.isPhantom': window.solana?.isPhantom\r\n//     });\r\n//     throw new Error('Phantom wallet not detected. Please install Phantom extension.');\r\n//   }\r\n  \r\n//   // Make sure this is Phantom and not Trust Wallet\r\n//   if (phantomProvider.isTrust === true) {\r\n//     throw new Error('Trust Wallet Solana detected instead of Phantom. Please switch to Phantom or use Trust Wallet option.');\r\n//   }\r\n  \r\n//   console.log('Found Phantom wallet provider:', phantomProvider);\r\n  \r\n//   try {\r\n//     const response = await phantomProvider.connect();\r\n    \r\n//     if (!response || !response.publicKey) {\r\n//       throw new Error('No public key returned from Phantom');\r\n//     }\r\n    \r\n//     const address = response.publicKey.toString();\r\n//     console.log('Connected to Phantom wallet:', address);\r\n    \r\n//     return {\r\n//       walletType: WALLET_TYPES.PHANTOM,\r\n//       address: address,\r\n//       provider: phantomProvider,\r\n//       network: NETWORK_TYPES.SOLANA,\r\n//       isConnected: true,\r\n//       publicKey: response.publicKey\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error connecting to Phantom:', error);\r\n    \r\n//     if (error.code === 4001) {\r\n//       throw new Error('Connection rejected by user. Please approve the connection in Phantom.');\r\n//     } else if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Connection rejected by user. Please approve the connection in Phantom.');\r\n//     } else {\r\n//       throw new Error(`Failed to connect to Phantom: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // General wallet connection function - Enhanced with Trust Wallet\r\n// export const connectWallet = async (walletType, targetNetwork = null) => {\r\n//   console.log('Connecting to wallet:', walletType, 'for network:', targetNetwork);\r\n  \r\n//   switch (walletType) {\r\n//     case WALLET_TYPES.METAMASK:\r\n//       return connectMetamaskWallet();\r\n//     case WALLET_TYPES.TRONLINK:\r\n//       return connectTronlinkWallet();\r\n//     case WALLET_TYPES.TRUST_WALLET:\r\n//       return connectTrustWallet(targetNetwork);\r\n//     case WALLET_TYPES.LUTE:\r\n//       return connectLuteWallet();\r\n//     case WALLET_TYPES.PHANTOM:\r\n//       return connectPhantomWallet();\r\n//     default:\r\n//       throw new Error(`Unsupported wallet type: ${walletType}`);\r\n//   }\r\n// };\r\n\r\n// // Get supported wallets for a network\r\n// export const getSupportedWalletsForNetwork = (network) => {\r\n//   return NETWORK_WALLET_MAP[network] || [];\r\n// };\r\n\r\n// // Send native currency transaction - Enhanced for Trust Wallet\r\n// export const sendNativeTransaction = async (walletConnection, toAddress, amount) => {\r\n//   console.log('Sending native transaction:', { toAddress, amount, walletType: walletConnection.walletType });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   if (!toAddress) {\r\n//     throw new Error('Recipient address not provided');\r\n//   }\r\n  \r\n//   if (!amount || isNaN(parseFloat(amount)) || parseFloat(amount) <= 0) {\r\n//     throw new Error('Invalid amount');\r\n//   }\r\n  \r\n//   try {\r\n//     let transaction;\r\n    \r\n//     switch (walletConnection.walletType) {\r\n//       case WALLET_TYPES.METAMASK:\r\n//       case WALLET_TYPES.TRUST_WALLET: // Trust Wallet uses same EVM interface as MetaMask\r\n//         const provider = walletConnection.provider;\r\n//         const signer = await provider.getSigner();\r\n        \r\n//         const amountInEther = amount.toString();\r\n//         const amountWei = ethers.parseEther(amountInEther);\r\n        \r\n//         console.log(`Sending ${walletConnection.walletType} ETH/BNB:`, {\r\n//           to: toAddress,\r\n//           value: amountWei.toString()\r\n//         });\r\n        \r\n//         const gasEstimate = await provider.estimateGas({\r\n//           to: toAddress,\r\n//           value: amountWei,\r\n//           from: await signer.getAddress()\r\n//         });\r\n        \r\n//         console.log('Gas estimate:', gasEstimate.toString());\r\n        \r\n//         const gasLimit = (gasEstimate * BigInt(110)) / BigInt(100);\r\n        \r\n//         console.log('Using gas limit:', gasLimit.toString());\r\n        \r\n//         transaction = await signer.sendTransaction({\r\n//           to: toAddress,\r\n//           value: amountWei,\r\n//           gasLimit: gasLimit\r\n//         });\r\n//         break;\r\n        \r\n//       case WALLET_TYPES.TRONLINK:\r\n//         const tronWeb = walletConnection.provider;\r\n        \r\n//         if (!tronWeb || !tronWeb.ready) {\r\n//           throw new Error('TronWeb not initialized');\r\n//         }\r\n        \r\n//         const amountSun = tronWeb.toSun(amount.toString());\r\n        \r\n//         console.log('Sending TRX:', {\r\n//           to: toAddress,\r\n//           value: amountSun\r\n//         });\r\n        \r\n//         transaction = await tronWeb.trx.sendTransaction(\r\n//           toAddress,\r\n//           amountSun\r\n//         );\r\n//         break;\r\n        \r\n//       case WALLET_TYPES.LUTE:\r\n//         const algorandProvider = walletConnection.provider;\r\n        \r\n//         const microAlgos = Math.floor(parseFloat(amount) * 1000000);\r\n        \r\n//         console.log('Sending Algos:', {\r\n//           to: toAddress,\r\n//           amount: microAlgos,\r\n//           walletName: walletConnection.walletName\r\n//         });\r\n        \r\n//         if (algorandProvider.sendPayment) {\r\n//           transaction = await algorandProvider.sendPayment({\r\n//             recipient: toAddress,\r\n//             amount: microAlgos\r\n//           });\r\n//         } else if (algorandProvider.signTransaction) {\r\n//           const txn = {\r\n//             to: toAddress,\r\n//             fee: 1000,\r\n//             amount: microAlgos,\r\n//             firstRound: 1000,\r\n//             lastRound: 2000,\r\n//             type: 'pay'\r\n//           };\r\n//           transaction = await algorandProvider.signTransaction(txn);\r\n//         } else {\r\n//           throw new Error(`Unsupported Algorand wallet API for ${walletConnection.walletName}`);\r\n//         }\r\n//         break;\r\n        \r\n//       case WALLET_TYPES.PHANTOM:\r\n//         const phantomProvider = walletConnection.provider;\r\n        \r\n//         if (!phantomProvider || !phantomProvider.isConnected) {\r\n//           throw new Error('Phantom wallet not connected');\r\n//         }\r\n        \r\n//         const amountFloat = parseFloat(amount);\r\n        \r\n//         console.log('Phantom SOL Transaction Debug:', {\r\n//           originalAmount: amount,\r\n//           amountFloat: amountFloat,\r\n//           walletType: 'Phantom Native SOL'\r\n//         });\r\n        \r\n//         try {\r\n//           const connection = await createSolanaConnection();\r\n//           const fromPubkey = walletConnection.publicKey;\r\n//           const toPubkey = new PublicKey(toAddress);\r\n          \r\n//           const lamports = Math.floor(amountFloat * LAMPORTS_PER_SOL);\r\n          \r\n//           console.log('Solana native transaction:', {\r\n//             from: fromPubkey.toString(),\r\n//             to: toAddress,\r\n//             amountSOL: amountFloat,\r\n//             lamports: lamports,\r\n//             conversionCheck: `${amountFloat} SOL = ${lamports} lamports`\r\n//           });\r\n          \r\n//           if (lamports <= 0) {\r\n//             throw new Error(`Invalid amount: ${amountFloat} SOL converts to ${lamports} lamports`);\r\n//           }\r\n          \r\n//           const transferTransaction = new Transaction().add(\r\n//             SystemProgram.transfer({\r\n//               fromPubkey,\r\n//               toPubkey,\r\n//               lamports\r\n//             })\r\n//           );\r\n          \r\n//           const { blockhash } = await connection.getLatestBlockhash();\r\n//           transferTransaction.recentBlockhash = blockhash;\r\n//           transferTransaction.feePayer = fromPubkey;\r\n          \r\n//           const signedTransaction = await phantomProvider.signAndSendTransaction(transferTransaction);\r\n//           transaction = signedTransaction;\r\n          \r\n//         } catch (phantomError) {\r\n//           console.error('Phantom transaction error:', phantomError);\r\n//           throw new Error(`Phantom transaction failed: ${phantomError.message || 'Unknown error'}`);\r\n//         }\r\n//         break;\r\n        \r\n//       default:\r\n//         throw new Error(`Unsupported wallet type: ${walletConnection.walletType}`);\r\n//     }\r\n    \r\n//     console.log('Transaction sent:', transaction);\r\n    \r\n//     const hash = transaction.hash || transaction.signature || transaction.txID || transaction.txId || transaction;\r\n//     console.log('Transaction hash:', hash);\r\n//     return hash;\r\n//   } catch (error) {\r\n//     console.error('Native transaction error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Helper function to validate transaction amounts before sending\r\n// const validateTransactionAmount = (amount, currency, network) => {\r\n//   const amountFloat = parseFloat(amount);\r\n  \r\n//   console.log('=== TRANSACTION AMOUNT VALIDATION ===');\r\n//   console.log('Amount:', amountFloat);\r\n//   console.log('Currency:', currency);\r\n//   console.log('Network:', network);\r\n  \r\n//   if (currency === 'SOL' && amountFloat > 1) {\r\n//     const estimatedUSDValue = amountFloat * 100;\r\n//     console.warn(`⚠️ Large SOL transaction: ${amountFloat} SOL (~$${estimatedUSDValue})`);\r\n//     return {\r\n//       isLarge: true,\r\n//       warning: `You are about to send ${amountFloat} SOL (approximately $${estimatedUSDValue}). Please confirm this is correct.`\r\n//     };\r\n//   }\r\n  \r\n//   if (['USDC', 'USDT'].includes(currency) && amountFloat > 100) {\r\n//     console.warn(`⚠️ Large stablecoin transaction: ${amountFloat} ${currency}`);\r\n//     return {\r\n//       isLarge: true,\r\n//       warning: `You are about to send ${amountFloat} ${currency}. Please confirm this is correct.`\r\n//     };\r\n//   }\r\n  \r\n//   console.log('✅ Transaction amount looks reasonable');\r\n//   console.log('=== END TRANSACTION AMOUNT VALIDATION ===');\r\n  \r\n//   return { isLarge: false };\r\n// };\r\n\r\n// // Send transaction - main function\r\n// export const sendTransaction = async (walletConnection, transactionDetails) => {\r\n//   console.log('=== SEND TRANSACTION DEBUG ===');\r\n//   console.log('Wallet connection:', walletConnection);\r\n//   console.log('Transaction details:', transactionDetails);\r\n  \r\n//   if (!walletConnection) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   const { to, amount, tokenAddress, currency, network } = transactionDetails;\r\n  \r\n//   if (!to) {\r\n//     throw new Error('Recipient address not provided');\r\n//   }\r\n  \r\n//   const validation = validateTransactionAmount(amount, currency, network);\r\n//   if (validation.isLarge) {\r\n//     console.warn('Large transaction warning:', validation.warning);\r\n//   }\r\n  \r\n//   const tokenConfig = TOKEN_CONFIG[currency]?.[network];\r\n  \r\n//   console.log('Token config lookup:', {\r\n//     currency,\r\n//     network,\r\n//     tokenConfig,\r\n//     isNative: tokenConfig?.isNative\r\n//   });\r\n  \r\n//   if (tokenConfig && tokenConfig.isNative) {\r\n//     console.log('Sending native currency transaction');\r\n//     return sendNativeTransaction(walletConnection, to, amount);\r\n//   } else if (tokenConfig) {\r\n//     console.log('Sending token transaction');\r\n//     return sendTokenTransaction(walletConnection, tokenConfig, to, amount);\r\n//   } else {\r\n//     console.log('No token config found, defaulting to native transaction');\r\n//     return sendNativeTransaction(walletConnection, to, amount);\r\n//   }\r\n// };\r\n\r\n// // Send token transaction - Enhanced for Trust Wallet\r\n// export const sendTokenTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending token transaction with:', { tokenConfig, toAddress, amount, walletType: walletConnection.walletType });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   if (!tokenConfig) {\r\n//     throw new Error('Token configuration not provided');\r\n//   }\r\n  \r\n//   if (!toAddress) {\r\n//     throw new Error('Recipient address not provided');\r\n//   }\r\n\r\n//   if (!amount || isNaN(parseFloat(amount)) || parseFloat(amount) <= 0) {\r\n//     throw new Error('Invalid amount');\r\n//   }\r\n\r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n//   console.log(`Token: ${symbol}, Decimals: ${decimals}, Contract: ${contractAddress}`);\r\n  \r\n//   switch (walletConnection.walletType) {\r\n//     case WALLET_TYPES.TRONLINK:\r\n//       return sendTRC20Transaction(walletConnection, tokenConfig, toAddress, amount);\r\n//     case WALLET_TYPES.LUTE:\r\n//       return sendAlgorandAssetTransaction(walletConnection, tokenConfig, toAddress, amount);\r\n//     case WALLET_TYPES.PHANTOM:\r\n//       return sendSolanaTokenTransaction(walletConnection, tokenConfig, toAddress, amount);\r\n//     case WALLET_TYPES.TRUST_WALLET:\r\n//       // Trust Wallet can handle multiple network types\r\n//       if (walletConnection.network === NETWORK_TYPES.SOLANA) {\r\n//         return sendSolanaTokenTransaction(walletConnection, tokenConfig, toAddress, amount);\r\n//       } else if (walletConnection.network === NETWORK_TYPES.TRON) {\r\n//         return sendTRC20Transaction(walletConnection, tokenConfig, toAddress, amount);\r\n//       } else {\r\n//         // Default to ERC20/BEP20 for Ethereum and BSC\r\n//         return sendERC20Transaction(walletConnection, tokenConfig, toAddress, amount);\r\n//       }\r\n//     default:\r\n//       return sendERC20Transaction(walletConnection, tokenConfig, toAddress, amount);\r\n//   }\r\n// };\r\n\r\n// // Solana token transaction function\r\n// export const sendSolanaTokenTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('=== SOLANA TOKEN TRANSACTION DEBUG ===');\r\n//   console.log('Input params:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Solana wallet not connected');\r\n//   }\r\n  \r\n//   const solanaProvider = walletConnection.provider;\r\n  \r\n//   if (!solanaProvider || !solanaProvider.isConnected) {\r\n//     throw new Error('Solana wallet not connected');\r\n//   }\r\n  \r\n//   if (!tokenConfig || !tokenConfig.contractAddress) {\r\n//     throw new Error('Invalid token configuration');\r\n//   }\r\n  \r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   console.log('Token config details:', {\r\n//     symbol,\r\n//     contractAddress,\r\n//     decimals: tokenDecimals,\r\n//     inputAmount: tokenAmount\r\n//   });\r\n  \r\n//   const amountInSmallestUnit = Math.floor(tokenAmount * Math.pow(10, tokenDecimals));\r\n  \r\n//   console.log('Amount calculation:', {\r\n//     tokenAmount: tokenAmount,\r\n//     decimals: tokenDecimals,\r\n//     calculation: `${tokenAmount} * 10^${tokenDecimals}`,\r\n//     amountInSmallestUnit: amountInSmallestUnit,\r\n//     humanReadable: `${tokenAmount} ${symbol} = ${amountInSmallestUnit} micro-${symbol}`\r\n//   });\r\n  \r\n//   if (amountInSmallestUnit <= 0) {\r\n//     throw new Error(`Invalid amount: ${tokenAmount} ${symbol} converts to ${amountInSmallestUnit} base units`);\r\n//   }\r\n  \r\n//   if (tokenAmount < 1 && amountInSmallestUnit === 0) {\r\n//     throw new Error(`Amount too small: ${tokenAmount} ${symbol} is smaller than the minimum unit`);\r\n//   }\r\n  \r\n//   try {\r\n//     const connection = await createSolanaConnection();\r\n//     const fromPubkey = walletConnection.publicKey;\r\n//     const toPubkey = new PublicKey(toAddress);\r\n//     const mintPubkey = new PublicKey(contractAddress);\r\n    \r\n//     console.log('Public keys:', {\r\n//       from: fromPubkey.toString(),\r\n//       to: toPubkey.toString(),\r\n//       mint: mintPubkey.toString()\r\n//     });\r\n    \r\n//     const fromTokenAccount = await getAssociatedTokenAddress(\r\n//       mintPubkey,\r\n//       fromPubkey,\r\n//       false,\r\n//       TOKEN_PROGRAM_ID,\r\n//       ASSOCIATED_TOKEN_PROGRAM_ID\r\n//     );\r\n    \r\n//     const toTokenAccount = await getAssociatedTokenAddress(\r\n//       mintPubkey,\r\n//       toPubkey,\r\n//       false,\r\n//       TOKEN_PROGRAM_ID,\r\n//       ASSOCIATED_TOKEN_PROGRAM_ID\r\n//     );\r\n    \r\n//     console.log('Token accounts:', {\r\n//       fromTokenAccount: fromTokenAccount.toString(),\r\n//       toTokenAccount: toTokenAccount.toString()\r\n//     });\r\n    \r\n//     const toAccountInfo = await connection.getAccountInfo(toTokenAccount);\r\n//     console.log('Recipient token account exists:', !!toAccountInfo);\r\n    \r\n//     const transaction = new Transaction();\r\n    \r\n//     if (!toAccountInfo) {\r\n//       console.log('Creating associated token account for recipient...');\r\n//       const createAccountInstruction = createAssociatedTokenAccountInstruction(\r\n//         fromPubkey,\r\n//         toTokenAccount,\r\n//         toPubkey,\r\n//         mintPubkey,\r\n//         TOKEN_PROGRAM_ID,\r\n//         ASSOCIATED_TOKEN_PROGRAM_ID\r\n//       );\r\n//       transaction.add(createAccountInstruction);\r\n//     }\r\n    \r\n//     console.log('Creating transfer instruction with amount:', amountInSmallestUnit);\r\n    \r\n//     const transferInstruction = createTransferInstruction(\r\n//       fromTokenAccount,\r\n//       toTokenAccount,\r\n//       fromPubkey,\r\n//       amountInSmallestUnit,\r\n//       [],\r\n//       TOKEN_PROGRAM_ID\r\n//     );\r\n    \r\n//     transaction.add(transferInstruction);\r\n    \r\n//     const { blockhash } = await connection.getLatestBlockhash();\r\n//     transaction.recentBlockhash = blockhash;\r\n//     transaction.feePayer = fromPubkey;\r\n    \r\n//     console.log('Transaction created with instructions:', transaction.instructions.length);\r\n//     console.log('Transaction sending to Solana provider...');\r\n    \r\n//     const signedTransaction = await solanaProvider.signAndSendTransaction(transaction);\r\n    \r\n//     console.log('✅ Solana token transaction sent successfully:', signedTransaction);\r\n//     console.log('=== END SOLANA TOKEN TRANSACTION DEBUG ===');\r\n    \r\n//     return signedTransaction.signature || signedTransaction;\r\n//   } catch (error) {\r\n//     console.error('❌ Solana token transaction error:', error);\r\n//     console.log('=== END SOLANA TOKEN TRANSACTION DEBUG (ERROR) ===');\r\n    \r\n//     if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('Insufficient')) {\r\n//       throw new Error('Insufficient token balance');\r\n//     } else if (error.message && error.message.includes('Invalid amount') || error.message && error.message.includes('Amount too small')) {\r\n//       throw error;\r\n//     } else {\r\n//       throw new Error(`Token transaction failed: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // ERC20/BEP20 token transaction function - Enhanced for Trust Wallet\r\n// export const sendERC20Transaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending ERC20/BEP20 transaction with:', { tokenConfig, toAddress, amount, walletType: walletConnection.walletType });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Wallet not connected');\r\n//   }\r\n  \r\n//   const provider = walletConnection.provider;\r\n//   const signer = await provider.getSigner();\r\n  \r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   const tokenUnits = ethers.parseUnits(tokenAmount.toString(), tokenDecimals);\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${tokenUnits.toString()} base units) to ${toAddress} via ${walletConnection.walletType}`);\r\n//   console.log(`Token config:`, { contractAddress, decimals, symbol });\r\n  \r\n//   try {\r\n//     const tokenContract = new ethers.Contract(\r\n//       contractAddress,\r\n//       [\r\n//         'function transfer(address to, uint256 amount) returns (bool)',\r\n//         'function balanceOf(address owner) view returns (uint256)',\r\n//         'function decimals() view returns (uint8)'\r\n//       ],\r\n//       signer\r\n//     );\r\n    \r\n//     const userAddress = await signer.getAddress();\r\n//     const balance = await tokenContract.balanceOf(userAddress);\r\n//     console.log(`User ${symbol} balance:`, ethers.formatUnits(balance, decimals));\r\n    \r\n//     if (balance < tokenUnits) {\r\n//       throw new Error(`Insufficient ${symbol} balance. Required: ${tokenAmount}, Available: ${ethers.formatUnits(balance, decimals)}`);\r\n//     }\r\n    \r\n//     try {\r\n//       const gasEstimate = await tokenContract.transfer.estimateGas(toAddress, tokenUnits);\r\n//       console.log('Gas estimate:', gasEstimate.toString());\r\n      \r\n//       // Trust Wallet may need different gas multipliers\r\n//       let gasMultiplier;\r\n//       if (walletConnection.walletType === WALLET_TYPES.TRUST_WALLET) {\r\n//         if (symbol === 'USDC') {\r\n//           gasMultiplier = BigInt(160); // Higher buffer for Trust Wallet + USDC\r\n//         } else if (symbol === 'USDT') {\r\n//           gasMultiplier = BigInt(140); // Higher buffer for Trust Wallet + USDT\r\n//         } else {\r\n//           gasMultiplier = BigInt(130); // Higher buffer for Trust Wallet\r\n//         }\r\n//       } else {\r\n//         if (symbol === 'USDC') {\r\n//           gasMultiplier = BigInt(150);\r\n//         } else if (symbol === 'USDT') {\r\n//           gasMultiplier = BigInt(130);\r\n//         } else {\r\n//           gasMultiplier = BigInt(120);\r\n//         }\r\n//       }\r\n      \r\n//       const gasLimit = (gasEstimate * gasMultiplier) / BigInt(100);\r\n        \r\n//       console.log('Using gas limit:', gasLimit.toString());\r\n      \r\n//       const transaction = await tokenContract.transfer(toAddress, tokenUnits, {\r\n//         gasLimit: gasLimit\r\n//       });\r\n      \r\n//       console.log('Transaction sent:', transaction);\r\n//       return transaction.hash;\r\n//     } catch (gasError) {\r\n//       console.error('Gas estimation failed:', gasError);\r\n      \r\n//       // Trust Wallet fallback with higher fixed gas limits\r\n//       let fixedGasLimit;\r\n//       if (walletConnection.walletType === WALLET_TYPES.TRUST_WALLET) {\r\n//         if (symbol === 'USDC') {\r\n//           fixedGasLimit = BigInt(220000); // Higher for Trust Wallet + USDC\r\n//         } else if (symbol === 'USDT') {\r\n//           fixedGasLimit = BigInt(200000); // Higher for Trust Wallet + USDT\r\n//         } else {\r\n//           fixedGasLimit = BigInt(180000); // Higher for Trust Wallet\r\n//         }\r\n//       } else {\r\n//         if (symbol === 'USDC') {\r\n//           fixedGasLimit = BigInt(200000);\r\n//         } else if (symbol === 'USDT') {\r\n//           fixedGasLimit = BigInt(180000);\r\n//         } else {\r\n//           fixedGasLimit = BigInt(150000);\r\n//         }\r\n//       }\r\n      \r\n//       console.log(`Trying ${symbol} transaction with fixed gas limit for ${walletConnection.walletType}:`, fixedGasLimit.toString());\r\n      \r\n//       const transaction = await tokenContract.transfer(toAddress, tokenUnits, {\r\n//         gasLimit: fixedGasLimit\r\n//       });\r\n      \r\n//       console.log('Transaction sent with fixed gas limit:', transaction);\r\n//       return transaction.hash;\r\n//     }\r\n//   } catch (error) {\r\n//     console.error('ERC20 transaction error:', error);\r\n    \r\n//     if (error.message && error.message.includes('user rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('insufficient funds')) {\r\n//       throw new Error('Insufficient funds for transaction');\r\n//     } else if (error.message && error.message.includes('Insufficient')) {\r\n//       throw error;\r\n//     } else {\r\n//       throw error;\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // TRC20 token transaction function\r\n// export const sendTRC20Transaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending TRC20 transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Tron wallet not connected');\r\n//   }\r\n  \r\n//   const tronWeb = walletConnection.provider;\r\n//   if (!tronWeb || !tronWeb.ready) {\r\n//     throw new Error('TronWeb not initialized');\r\n//   }\r\n  \r\n//   if (!tokenConfig || !tokenConfig.contractAddress) {\r\n//     throw new Error('Invalid token configuration');\r\n//   }\r\n  \r\n//   const { contractAddress, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   const amountWithDecimals = tokenAmount * Math.pow(10, tokenDecimals);\r\n//   const amountString = amountWithDecimals.toString();\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${amountString} base units) to ${toAddress}`);\r\n  \r\n//   try {\r\n//     const contract = await tronWeb.contract().at(contractAddress);\r\n    \r\n//     if (!contract.transfer) {\r\n//       throw new Error('Invalid TRC-20 contract');\r\n//     }\r\n    \r\n//     const transaction = await contract.transfer(\r\n//       toAddress,\r\n//       amountString\r\n//     ).send({\r\n//       feeLimit: 100000000,\r\n//       callValue: 0,\r\n//       shouldPollResponse: false\r\n//     });\r\n    \r\n//     console.log('TRC20 transaction sent:', transaction);\r\n//     return transaction;\r\n//   } catch (error) {\r\n//     console.error('TRC20 transaction failed:', error);\r\n    \r\n//     if (error.message && error.message.includes('User rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('bandwidth')) {\r\n//       throw new Error('Insufficient energy or bandwidth. Make sure you have enough TRX for fees.');\r\n//     } else if (error.message && error.message.includes('balance')) {\r\n//       throw new Error('Insufficient token balance for transfer');\r\n//     } else {\r\n//       throw new Error(`Transaction failed: ${error.message || 'Unknown error'}`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Enhanced Algorand asset transaction function\r\n// export const sendAlgorandAssetTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//   console.log('Sending Algorand asset transaction with:', { tokenConfig, toAddress, amount });\r\n  \r\n//   if (!walletConnection || !walletConnection.provider) {\r\n//     throw new Error('Algorand wallet not connected');\r\n//   }\r\n  \r\n//   const algorandProvider = walletConnection.provider;\r\n  \r\n//   if (!tokenConfig || !tokenConfig.assetId) {\r\n//     throw new Error('Invalid token configuration - missing assetId');\r\n//   }\r\n  \r\n//   const { assetId, decimals, symbol } = tokenConfig;\r\n  \r\n//   const tokenAmount = parseFloat(amount);\r\n//   const tokenDecimals = parseInt(decimals);\r\n  \r\n//   const assetAmount = Math.floor(tokenAmount * Math.pow(10, tokenDecimals));\r\n  \r\n//   console.log(`Sending ${tokenAmount} ${symbol} (${assetAmount} base units) to ${toAddress}`);\r\n//   console.log(`Using wallet: ${walletConnection.walletName || 'Unknown'}`);\r\n  \r\n//   try {\r\n//     let transaction;\r\n    \r\n//     if (algorandProvider.sendAssetTransfer) {\r\n//       console.log('Using sendAssetTransfer method...');\r\n//       transaction = await algorandProvider.sendAssetTransfer({\r\n//         recipient: toAddress,\r\n//         assetId: assetId,\r\n//         amount: assetAmount\r\n//       });\r\n//     } else if (algorandProvider.signTransaction) {\r\n//       console.log('Using signTransaction method for asset transfer...');\r\n//       const txn = {\r\n//         type: 'axfer',\r\n//         from: walletConnection.address,\r\n//         to: toAddress,\r\n//         amount: assetAmount,\r\n//         assetIndex: assetId,\r\n//         fee: 1000,\r\n//         firstRound: 1000,\r\n//         lastRound: 2000\r\n//       };\r\n//       transaction = await algorandProvider.signTransaction(txn);\r\n//     } else {\r\n//       throw new Error(`Unsupported Algorand wallet API for asset transfers in ${walletConnection.walletName || 'this wallet'}`);\r\n//     }\r\n    \r\n//     console.log('Algorand asset transaction sent:', transaction);\r\n//     return transaction.txId || transaction.txID || transaction;\r\n//   } catch (error) {\r\n//     console.error('Algorand asset transaction error:', error);\r\n    \r\n//     if (error.message && error.message.includes('rejected')) {\r\n//       throw new Error('Transaction rejected by user');\r\n//     } else if (error.message && error.message.includes('balance')) {\r\n//       throw new Error('Insufficient asset balance');\r\n//     } else if (error.message && error.message.includes('opted')) {\r\n//       throw new Error('Account not opted in to this asset. Please opt in first.');\r\n//     } else {\r\n//       throw error;\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Get token configuration for a specific currency and network\r\n// export const getTokenConfig = (currency, network) => {\r\n//   if (!currency || !network) {\r\n//     return null;\r\n//   }\r\n  \r\n//   const tokenConfig = TOKEN_CONFIG[currency.toUpperCase()];\r\n//   if (!tokenConfig) {\r\n//     return null;\r\n//   }\r\n  \r\n//   return tokenConfig[network.toLowerCase()];\r\n// };\r\n\r\n// // Export everything as a default object as well\r\n// export default {\r\n//   WALLET_TYPES,\r\n//   NETWORK_TYPES,\r\n//   NETWORK_CONFIG,\r\n//   TOKEN_CONFIG,\r\n//   NETWORK_WALLET_MAP,\r\n//   getWalletInstallUrl,\r\n//   detectWallets,\r\n//   detectWalletsWithRetry,\r\n//   debugWalletEnvironment,\r\n//   connectWallet,\r\n//   getSupportedWalletsForNetwork,\r\n//   sendNativeTransaction,\r\n//   sendTokenTransaction,\r\n//   sendTransaction,\r\n//   sendTRC20Transaction,\r\n//   sendERC20Transaction,\r\n//   sendSolanaTokenTransaction,\r\n//   sendAlgorandAssetTransaction,\r\n//   getTokenConfig\r\n// };\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // coinley-sdk/src/services/walletService.js (UPDATED - Simplified)\r\n// import { CoinleyConnectClient } from './coinleyConnectClient';\r\n\r\n// // Wallet Types (matching Coinley Connect)\r\n// export const WALLET_TYPES = {\r\n//   METAMASK: 'metamask',\r\n//   PHANTOM: 'phantom',\r\n//   TRONLINK: 'tronlink',\r\n//   TRUST_WALLET: 'trustwallet',\r\n//   LUTE: 'lute'\r\n// };\r\n\r\n// // Network Types (matching Coinley Connect)\r\n// export const NETWORK_TYPES = {\r\n//   ETHEREUM: 'ethereum',\r\n//   BSC: 'bsc',\r\n//   TRON: 'tron',\r\n//   ALGORAND: 'algorand',\r\n//   SOLANA: 'solana'\r\n// };\r\n\r\n// // Network to wallet mapping\r\n// export const NETWORK_WALLET_MAP = {\r\n//   [NETWORK_TYPES.ETHEREUM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.BSC]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.TRON]: [WALLET_TYPES.TRONLINK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.ALGORAND]: [WALLET_TYPES.LUTE],\r\n//   [NETWORK_TYPES.SOLANA]: [WALLET_TYPES.PHANTOM, WALLET_TYPES.TRUST_WALLET]\r\n// };\r\n\r\n// // Initialize Coinley Connect client\r\n// const coinleyConnect = new CoinleyConnectClient({\r\n//     apiUrl: process.env.COINLEY_CONNECT_API_URL || 'http://localhost:3001/api',\r\n//     walletInterfaceUrl: process.env.COINLEY_CONNECT_URL || 'http://localhost:3001',\r\n//     debug: process.env.NODE_ENV === 'development'\r\n// });\r\n\r\n// /**\r\n//  * Connect to wallet via Coinley Connect service\r\n//  * This replaces all the complex wallet connection logic\r\n//  */\r\n// export const connectWallet = async (walletType, network) => {\r\n//     try {\r\n//         console.log(`🔗 Connecting to ${walletType} on ${network} via Coinley Connect`);\r\n        \r\n//         // Initiate connection through Coinley Connect\r\n//         const connection = await coinleyConnect.connectWallet(walletType, network, {\r\n//             popup: true, // Open in popup by default\r\n//             popup: { width: 420, height: 650 }\r\n//         });\r\n        \r\n//         console.log('Connection initiated:', connection);\r\n        \r\n//         // Wait for connection to complete\r\n//         const session = await coinleyConnect.waitForConnection(connection.sessionId);\r\n        \r\n//         console.log('✅ Wallet connected successfully:', session);\r\n        \r\n//         return {\r\n//             walletType: session.walletType,\r\n//             address: session.address,\r\n//             network: session.network,\r\n//             sessionId: session.id,\r\n//             isConnected: true,\r\n//             chainId: session.chainId,\r\n//             // Keep these for backward compatibility\r\n//             provider: null, // External service handles provider\r\n//             rawProvider: null\r\n//         };\r\n        \r\n//     } catch (error) {\r\n//         console.error('❌ Wallet connection failed:', error);\r\n//         throw error;\r\n//     }\r\n// };\r\n\r\n// /**\r\n//  * Send transaction via Coinley Connect service\r\n//  * This replaces all the complex transaction logic\r\n//  */\r\n// export const sendTransaction = async (walletConnection, transactionDetails) => {\r\n//     try {\r\n//         console.log('🚀 Sending transaction via Coinley Connect:', transactionDetails);\r\n        \r\n//         if (!walletConnection.sessionId) {\r\n//             throw new Error('No active wallet session. Please connect wallet first.');\r\n//         }\r\n        \r\n//         const { to, amount, currency, network, tokenAddress, tokenDecimals } = transactionDetails;\r\n        \r\n//         // Send transaction through Coinley Connect\r\n//         const result = await coinleyConnect.sendTransaction(walletConnection.sessionId, {\r\n//             to,\r\n//             amount: amount.toString(),\r\n//             currency,\r\n//             network,\r\n//             tokenAddress,\r\n//             tokenDecimals\r\n//         });\r\n        \r\n//         console.log('✅ Transaction sent successfully:', result);\r\n        \r\n//         // Return transaction hash for compatibility\r\n//         return result.transaction?.hash || result.transactionId;\r\n        \r\n//     } catch (error) {\r\n//         console.error('❌ Transaction failed:', error);\r\n//         throw error;\r\n//     }\r\n// };\r\n\r\n// /**\r\n//  * Detect available wallets via Coinley Connect\r\n//  */\r\n// export const detectWallets = async () => {\r\n//     try {\r\n//         // Get supported wallets from Coinley Connect\r\n//         const wallets = await coinleyConnect.getSupportedWallets();\r\n        \r\n//         // Convert to the format expected by your SDK\r\n//         const detectedWallets = {};\r\n        \r\n//         wallets.forEach(wallet => {\r\n//             // For now, assume all supported wallets are \"detected\"\r\n//             // In a real implementation, Coinley Connect would handle detection\r\n//             detectedWallets[wallet.type] = true;\r\n//         });\r\n        \r\n//         return detectedWallets;\r\n        \r\n//     } catch (error) {\r\n//         console.error('Error detecting wallets:', error);\r\n//         return {};\r\n//     }\r\n// };\r\n\r\n// /**\r\n//  * Get supported wallets for a network\r\n//  */\r\n// export const getSupportedWalletsForNetwork = (network) => {\r\n//     return NETWORK_WALLET_MAP[network] || [];\r\n// };\r\n\r\n// /**\r\n//  * Get wallet install URL\r\n//  */\r\n// export const getWalletInstallUrl = (walletType) => {\r\n//     const urls = {\r\n//         [WALLET_TYPES.METAMASK]: 'https://metamask.io/download/',\r\n//         [WALLET_TYPES.PHANTOM]: 'https://phantom.app/download',\r\n//         [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/download/',\r\n//         [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/download/',\r\n//         [WALLET_TYPES.LUTE]: 'https://lute.app/download/'\r\n//     };\r\n//     return urls[walletType] || '';\r\n// };\r\n\r\n// /**\r\n//  * Disconnect wallet\r\n//  */\r\n// export const disconnectWallet = async (walletConnection) => {\r\n//     try {\r\n//         if (walletConnection.sessionId) {\r\n//             await coinleyConnect.disconnectWallet(walletConnection.sessionId);\r\n//         }\r\n//         return true;\r\n//     } catch (error) {\r\n//         console.error('Error disconnecting wallet:', error);\r\n//         return false;\r\n//     }\r\n// };\r\n\r\n// // Export the client for advanced usage\r\n// export { coinleyConnect };\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// new one\r\n\r\n\r\n\r\n\r\n// // coinley-sdk/src/services/walletService.js (COMPLETE WITH ALL EXPORTS)\r\n// import CoinleyConnectClient from './coinleyConnectClient';\r\n\r\n// // Wallet Types (matching Coinley Connect)\r\n// export const WALLET_TYPES = {\r\n//   METAMASK: 'metamask',\r\n//   PHANTOM: 'phantom',\r\n//   TRONLINK: 'tronlink',\r\n//   TRUST_WALLET: 'trustwallet',\r\n//   LUTE: 'lute'\r\n// };\r\n\r\n// // Network Types (matching Coinley Connect)\r\n// export const NETWORK_TYPES = {\r\n//   ETHEREUM: 'ethereum',\r\n//   BSC: 'bsc',\r\n//   TRON: 'tron',\r\n//   ALGORAND: 'algorand',\r\n//   SOLANA: 'solana'\r\n// };\r\n\r\n// // Network configuration (for backward compatibility)\r\n// export const NETWORK_CONFIG = {\r\n//   [NETWORK_TYPES.ETHEREUM]: {\r\n//     name: 'Ethereum Mainnet',\r\n//     chainId: 1,\r\n//     symbol: 'ETH',\r\n//     decimals: 18,\r\n//     rpcUrl: 'https://mainnet.infura.io/v3/your-infura-key',\r\n//     blockExplorerUrl: 'https://etherscan.io'\r\n//   },\r\n//   [NETWORK_TYPES.BSC]: {\r\n//     name: 'Binance Smart Chain',\r\n//     chainId: 56,\r\n//     symbol: 'BNB',\r\n//     decimals: 18,\r\n//     rpcUrl: 'https://bsc-dataseed.binance.org/',\r\n//     blockExplorerUrl: 'https://bscscan.com'\r\n//   },\r\n//   [NETWORK_TYPES.TRON]: {\r\n//     name: 'TRON Mainnet',\r\n//     symbol: 'TRX',\r\n//     decimals: 6,\r\n//     rpcUrl: 'https://api.trongrid.io',\r\n//     blockExplorerUrl: 'https://tronscan.org'\r\n//   },\r\n//   [NETWORK_TYPES.ALGORAND]: {\r\n//     name: 'Algorand Mainnet',\r\n//     symbol: 'ALGO',\r\n//     decimals: 6,\r\n//     rpcUrl: 'https://mainnet-api.algonode.cloud',\r\n//     blockExplorerUrl: 'https://algoexplorer.io'\r\n//   },\r\n//   [NETWORK_TYPES.SOLANA]: {\r\n//     name: 'Solana Mainnet',\r\n//     symbol: 'SOL',\r\n//     decimals: 9,\r\n//     rpcUrl: 'https://rpc.ankr.com/solana',\r\n//     blockExplorerUrl: 'https://explorer.solana.com'\r\n//   }\r\n// };\r\n\r\n// // Token configurations (for backward compatibility)\r\n// export const TOKEN_CONFIG = {\r\n//   USDT: {\r\n//     ethereum: {\r\n//       contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     bsc: {\r\n//       contractAddress: '0x55d398326f99059fF775485246999027B3197955',\r\n//       decimals: 18,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     tron: {\r\n//       contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     algorand: {\r\n//       assetId: 312769,\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     },\r\n//     solana: {\r\n//       contractAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\r\n//       decimals: 6,\r\n//       symbol: 'USDT'\r\n//     }\r\n//   },\r\n//   USDC: {\r\n//     ethereum: {\r\n//       contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     bsc: {\r\n//       contractAddress: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n//       decimals: 18,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     tron: {\r\n//       contractAddress: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     algorand: {\r\n//       assetId: 31566704,\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     },\r\n//     solana: {\r\n//       contractAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\r\n//       decimals: 6,\r\n//       symbol: 'USDC'\r\n//     }\r\n//   }\r\n// };\r\n\r\n// // Network to wallet mapping\r\n// export const NETWORK_WALLET_MAP = {\r\n//   [NETWORK_TYPES.ETHEREUM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.BSC]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.TRON]: [WALLET_TYPES.TRONLINK, WALLET_TYPES.TRUST_WALLET],\r\n//   [NETWORK_TYPES.ALGORAND]: [WALLET_TYPES.LUTE],\r\n//   [NETWORK_TYPES.SOLANA]: [WALLET_TYPES.PHANTOM, WALLET_TYPES.TRUST_WALLET]\r\n// };\r\n\r\n// // Get environment variables or use defaults\r\n// const getConnectConfig = () => {\r\n//   // Check if we're in a browser environment\r\n//   if (typeof window !== 'undefined') {\r\n//     return {\r\n//       apiUrl: window.COINLEY_CONNECT_API_URL || 'http://localhost:3001/api',\r\n//       walletInterfaceUrl: window.COINLEY_CONNECT_URL || 'http://localhost:3001',\r\n//       debug: window.NODE_ENV === 'development' || false\r\n//     };\r\n//   }\r\n  \r\n//   // Node.js environment\r\n//   return {\r\n//     apiUrl: process.env.COINLEY_CONNECT_API_URL || 'http://localhost:3001/api',\r\n//     walletInterfaceUrl: process.env.COINLEY_CONNECT_URL || 'http://localhost:3001',\r\n//     debug: process.env.NODE_ENV === 'development' || false\r\n//   };\r\n// };\r\n\r\n// // Initialize Coinley Connect client\r\n// const coinleyConnect = new CoinleyConnectClient(getConnectConfig());\r\n\r\n// /**\r\n//  * Connect to wallet via Coinley Connect service\r\n//  * This replaces all the complex wallet connection logic\r\n//  */\r\n// export const connectWallet = async (walletType, network) => {\r\n//     try {\r\n//         console.log(`🔗 Connecting to ${walletType} on ${network} via Coinley Connect`);\r\n        \r\n//         // Initiate connection through Coinley Connect\r\n//         const connection = await coinleyConnect.connectWallet(walletType, network, {\r\n//             popup: true, // Open in popup by default\r\n//             popup: { width: 420, height: 650 }\r\n//         });\r\n        \r\n//         console.log('Connection initiated:', connection);\r\n        \r\n//         // Wait for connection to complete\r\n//         const session = await coinleyConnect.waitForConnection(connection.sessionId);\r\n        \r\n//         console.log('✅ Wallet connected successfully:', session);\r\n        \r\n//         return {\r\n//             walletType: session.walletType,\r\n//             address: session.address,\r\n//             network: session.network,\r\n//             sessionId: session.id,\r\n//             isConnected: true,\r\n//             chainId: session.chainId,\r\n//             // Keep these for backward compatibility\r\n//             provider: null, // External service handles provider\r\n//             rawProvider: null\r\n//         };\r\n        \r\n//     } catch (error) {\r\n//         console.error('❌ Wallet connection failed:', error);\r\n//         throw error;\r\n//     }\r\n// };\r\n\r\n// /**\r\n//  * Send transaction via Coinley Connect service\r\n//  * This replaces all the complex transaction logic\r\n//  */\r\n// export const sendTransaction = async (walletConnection, transactionDetails) => {\r\n//     try {\r\n//         console.log('🚀 Sending transaction via Coinley Connect:', transactionDetails);\r\n        \r\n//         if (!walletConnection.sessionId) {\r\n//             throw new Error('No active wallet session. Please connect wallet first.');\r\n//         }\r\n        \r\n//         const { to, amount, currency, network, tokenAddress, tokenDecimals } = transactionDetails;\r\n        \r\n//         // Send transaction through Coinley Connect\r\n//         const result = await coinleyConnect.sendTransaction(walletConnection.sessionId, {\r\n//             to,\r\n//             amount: amount.toString(),\r\n//             currency,\r\n//             network,\r\n//             tokenAddress,\r\n//             tokenDecimals\r\n//         });\r\n        \r\n//         console.log('✅ Transaction sent successfully:', result);\r\n        \r\n//         // Return transaction hash for compatibility\r\n//         return result.transaction?.hash || result.transactionId;\r\n        \r\n//     } catch (error) {\r\n//         console.error('❌ Transaction failed:', error);\r\n//         throw error;\r\n//     }\r\n// };\r\n\r\n// /**\r\n//  * Detect available wallets via Coinley Connect\r\n//  */\r\n// export const detectWallets = async () => {\r\n//     try {\r\n//         // Get supported wallets from Coinley Connect\r\n//         const wallets = await coinleyConnect.getSupportedWallets();\r\n        \r\n//         // Convert to the format expected by your SDK\r\n//         const detectedWallets = {};\r\n        \r\n//         wallets.forEach(wallet => {\r\n//             // For now, assume all supported wallets are \"detected\"\r\n//             // In a real implementation, Coinley Connect would handle detection\r\n//             detectedWallets[wallet.type] = true;\r\n//         });\r\n        \r\n//         return detectedWallets;\r\n        \r\n//     } catch (error) {\r\n//         console.error('Error detecting wallets:', error);\r\n//         // Return fallback for common wallets\r\n//         return {\r\n//             [WALLET_TYPES.METAMASK]: true,\r\n//             [WALLET_TYPES.PHANTOM]: true,\r\n//             [WALLET_TYPES.TRONLINK]: false,\r\n//             [WALLET_TYPES.TRUST_WALLET]: false,\r\n//             [WALLET_TYPES.LUTE]: false\r\n//         };\r\n//     }\r\n// };\r\n\r\n// /**\r\n//  * ✅ FIXED: Get wallet install URL (was missing)\r\n//  */\r\n// export const getWalletInstallUrl = (walletType) => {\r\n//     const urls = {\r\n//         [WALLET_TYPES.METAMASK]: 'https://metamask.io/download/',\r\n//         [WALLET_TYPES.PHANTOM]: 'https://phantom.app/download',\r\n//         [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/download/',\r\n//         [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/download/',\r\n//         [WALLET_TYPES.LUTE]: 'https://lute.app/download/'\r\n//     };\r\n//     return urls[walletType] || '';\r\n// };\r\n\r\n// /**\r\n//  * Get supported wallets for a network\r\n//  */\r\n// export const getSupportedWalletsForNetwork = (network) => {\r\n//     return NETWORK_WALLET_MAP[network] || [];\r\n// };\r\n\r\n// /**\r\n//  * ✅ FIXED: Debug wallet environment (was missing)\r\n//  */\r\n// export const debugWalletEnvironment = () => {\r\n//     console.warn('debugWalletEnvironment is deprecated - wallet debugging is now handled by Coinley Connect');\r\n//     return { \r\n//         message: 'Wallet debugging handled by Coinley Connect service',\r\n//         coinleyConnectUrl: getConnectConfig().walletInterfaceUrl,\r\n//         availableWallets: Object.keys(WALLET_TYPES),\r\n//         supportedNetworks: Object.keys(NETWORK_TYPES)\r\n//     };\r\n// };\r\n\r\n// /**\r\n//  * ✅ FIXED: Detect wallets with retry (was missing)\r\n//  */\r\n// export const detectWalletsWithRetry = async (maxRetries = 3, delay = 1000) => {\r\n//     console.warn('detectWalletsWithRetry is deprecated - using detectWallets instead');\r\n//     return detectWallets();\r\n// };\r\n\r\n// /**\r\n//  * Disconnect wallet\r\n//  */\r\n// export const disconnectWallet = async (walletConnection) => {\r\n//     try {\r\n//         if (walletConnection.sessionId) {\r\n//             await coinleyConnect.disconnectWallet(walletConnection.sessionId);\r\n//         }\r\n//         return true;\r\n//     } catch (error) {\r\n//         console.error('Error disconnecting wallet:', error);\r\n//         return false;\r\n//     }\r\n// };\r\n\r\n// /**\r\n//  * ✅ FIXED: Send native transaction (for backward compatibility)\r\n//  */\r\n// export const sendNativeTransaction = async (walletConnection, toAddress, amount) => {\r\n//     console.warn('sendNativeTransaction is deprecated - use sendTransaction instead');\r\n//     return sendTransaction(walletConnection, {\r\n//         to: toAddress,\r\n//         amount: amount,\r\n//         currency: 'ETH', // Default to ETH\r\n//         network: walletConnection.network || 'ethereum'\r\n//     });\r\n// };\r\n\r\n// /**\r\n//  * ✅ FIXED: Send token transaction (for backward compatibility)\r\n//  */\r\n// export const sendTokenTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//     console.warn('sendTokenTransaction is deprecated - use sendTransaction instead');\r\n//     return sendTransaction(walletConnection, {\r\n//         to: toAddress,\r\n//         amount: amount,\r\n//         currency: tokenConfig.symbol,\r\n//         network: walletConnection.network,\r\n//         tokenAddress: tokenConfig.contractAddress,\r\n//         tokenDecimals: tokenConfig.decimals\r\n//     });\r\n// };\r\n\r\n// /**\r\n//  * ✅ FIXED: Send ERC20 transaction (for backward compatibility)\r\n//  */\r\n// export const sendERC20Transaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n//     console.warn('sendERC20Transaction is deprecated - use sendTransaction instead');\r\n//     return sendTokenTransaction(walletConnection, tokenConfig, toAddress, amount);\r\n// };\r\n\r\n// /**\r\n//  * ✅ FIXED: Get token config (for backward compatibility)\r\n//  */\r\n// export const getTokenConfig = (currency, network) => {\r\n//     if (!currency || !network) {\r\n//         return null;\r\n//     }\r\n    \r\n//     const tokenConfig = TOKEN_CONFIG[currency.toUpperCase()];\r\n//     if (!tokenConfig) {\r\n//         return null;\r\n//     }\r\n    \r\n//     return tokenConfig[network.toLowerCase()];\r\n// };\r\n\r\n// // Export the client for advanced usage\r\n// export { coinleyConnect };\r\n\r\n// // ✅ FIXED: Default export for the entire service\r\n// export default {\r\n//     WALLET_TYPES,\r\n//     NETWORK_TYPES,\r\n//     NETWORK_CONFIG,\r\n//     TOKEN_CONFIG,\r\n//     NETWORK_WALLET_MAP,\r\n//     connectWallet,\r\n//     sendTransaction,\r\n//     detectWallets,\r\n//     getWalletInstallUrl,\r\n//     getSupportedWalletsForNetwork,\r\n//     debugWalletEnvironment,\r\n//     detectWalletsWithRetry,\r\n//     disconnectWallet,\r\n//     sendNativeTransaction,\r\n//     sendTokenTransaction,\r\n//     sendERC20Transaction,\r\n//     getTokenConfig,\r\n//     coinleyConnect\r\n// };\r\n\r\n\r\n\r\n\r\n\r\n// coinley-sdk/src/services/walletService.js - Updated with new networks\r\nimport CoinleyConnectClient from './coinleyConnectClient';\r\n\r\n// ✅ UPDATED: Extended wallet types and network types\r\nexport const WALLET_TYPES = {\r\n  METAMASK: 'metamask',\r\n  PHANTOM: 'phantom',\r\n  TRONLINK: 'tronlink',\r\n  TRUST_WALLET: 'trustwallet',\r\n  LUTE: 'lute'\r\n};\r\n\r\n// ✅ UPDATED: Added new network types\r\nexport const NETWORK_TYPES = {\r\n  ETHEREUM: 'ethereum',\r\n  BSC: 'bsc',\r\n  TRON: 'tron',\r\n  ALGORAND: 'algorand',\r\n  SOLANA: 'solana',\r\n  // New networks\r\n  OPTIMISM: 'optimism',\r\n  ARBITRUM: 'arbitrum',\r\n  POLYGON: 'polygon',\r\n  AVALANCHE: 'avalanche',\r\n  CELO: 'celo'\r\n};\r\n\r\n// ✅ UPDATED: Extended network configuration\r\nexport const NETWORK_CONFIG = {\r\n  [NETWORK_TYPES.ETHEREUM]: {\r\n    name: 'Ethereum Mainnet',\r\n    chainId: 1,\r\n    symbol: 'ETH',\r\n    decimals: 18,\r\n    rpcUrl: 'https://mainnet.infura.io/v3/your-infura-key',\r\n    blockExplorerUrl: 'https://etherscan.io'\r\n  },\r\n  [NETWORK_TYPES.BSC]: {\r\n    name: 'Binance Smart Chain',\r\n    chainId: 56,\r\n    symbol: 'BNB',\r\n    decimals: 18,\r\n    rpcUrl: 'https://bsc-dataseed.binance.org/',\r\n    blockExplorerUrl: 'https://bscscan.com'\r\n  },\r\n  [NETWORK_TYPES.TRON]: {\r\n    name: 'TRON Mainnet',\r\n    symbol: 'TRX',\r\n    decimals: 6,\r\n    rpcUrl: 'https://api.trongrid.io',\r\n    blockExplorerUrl: 'https://tronscan.org'\r\n  },\r\n  [NETWORK_TYPES.ALGORAND]: {\r\n    name: 'Algorand Mainnet',\r\n    symbol: 'ALGO',\r\n    decimals: 6,\r\n    rpcUrl: 'https://mainnet-api.algonode.cloud',\r\n    blockExplorerUrl: 'https://algoexplorer.io'\r\n  },\r\n  [NETWORK_TYPES.SOLANA]: {\r\n    name: 'Solana Mainnet',\r\n    symbol: 'SOL',\r\n    decimals: 9,\r\n    rpcUrl: 'https://rpc.ankr.com/solana',\r\n    blockExplorerUrl: 'https://explorer.solana.com'\r\n  },\r\n  // ✅ NEW: Additional network configurations\r\n  [NETWORK_TYPES.OPTIMISM]: {\r\n    name: 'Optimism',\r\n    chainId: 10,\r\n    symbol: 'ETH',\r\n    decimals: 18,\r\n    rpcUrl: 'https://mainnet.optimism.io',\r\n    blockExplorerUrl: 'https://optimistic.etherscan.io'\r\n  },\r\n  [NETWORK_TYPES.ARBITRUM]: {\r\n    name: 'Arbitrum One',\r\n    chainId: 42161,\r\n    symbol: 'ETH',\r\n    decimals: 18,\r\n    rpcUrl: 'https://arb1.arbitrum.io/rpc',\r\n    blockExplorerUrl: 'https://arbiscan.io'\r\n  },\r\n  [NETWORK_TYPES.POLYGON]: {\r\n    name: 'Polygon',\r\n    chainId: 137,\r\n    symbol: 'MATIC',\r\n    decimals: 18,\r\n    rpcUrl: 'https://polygon-rpc.com',\r\n    blockExplorerUrl: 'https://polygonscan.com'\r\n  },\r\n  [NETWORK_TYPES.AVALANCHE]: {\r\n    name: 'Avalanche C-Chain',\r\n    chainId: 43114,\r\n    symbol: 'AVAX',\r\n    decimals: 18,\r\n    rpcUrl: 'https://api.avax.network/ext/bc/C/rpc',\r\n    blockExplorerUrl: 'https://snowtrace.io'\r\n  },\r\n  [NETWORK_TYPES.CELO]: {\r\n    name: 'Celo',\r\n    chainId: 42220,\r\n    symbol: 'CELO',\r\n    decimals: 18,\r\n    rpcUrl: 'https://forno.celo.org',\r\n    blockExplorerUrl: 'https://celoscan.io'\r\n  }\r\n};\r\n\r\n// ✅ UPDATED: Extended token configurations\r\nexport const TOKEN_CONFIG = {\r\n  USDT: {\r\n    ethereum: {\r\n      contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    bsc: {\r\n      contractAddress: '0x55d398326f99059fF775485246999027B3197955',\r\n      decimals: 18,\r\n      symbol: 'USDT'\r\n    },\r\n    tron: {\r\n      contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    algorand: {\r\n      assetId: 312769,\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    solana: {\r\n      contractAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    // ✅ NEW: USDT on new networks\r\n    optimism: {\r\n      contractAddress: '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    arbitrum: {\r\n      contractAddress: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    polygon: {\r\n      contractAddress: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    avalanche: {\r\n      contractAddress: '0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    },\r\n    celo: {\r\n      contractAddress: '0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e',\r\n      decimals: 6,\r\n      symbol: 'USDT'\r\n    }\r\n  },\r\n  USDC: {\r\n    ethereum: {\r\n      contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    bsc: {\r\n      contractAddress: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\r\n      decimals: 18,\r\n      symbol: 'USDC'\r\n    },\r\n    tron: {\r\n      contractAddress: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    algorand: {\r\n      assetId: 31566704,\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    solana: {\r\n      contractAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    // ✅ NEW: USDC on new networks\r\n    optimism: {\r\n      contractAddress: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    arbitrum: {\r\n      contractAddress: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    polygon: {\r\n      contractAddress: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    avalanche: {\r\n      contractAddress: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    },\r\n    celo: {\r\n      contractAddress: '0xcebA9300f2b948710d2653dD7B07f33A8B32118C',\r\n      decimals: 6,\r\n      symbol: 'USDC'\r\n    }\r\n  },\r\n  DAI: {\r\n    ethereum: {\r\n      contractAddress: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\r\n      decimals: 18,\r\n      symbol: 'DAI'\r\n    },\r\n    // ✅ NEW: DAI on new networks\r\n    optimism: {\r\n      contractAddress: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\r\n      decimals: 18,\r\n      symbol: 'DAI'\r\n    },\r\n    arbitrum: {\r\n      contractAddress: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\r\n      decimals: 18,\r\n      symbol: 'DAI'\r\n    },\r\n    polygon: {\r\n      contractAddress: '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063',\r\n      decimals: 18,\r\n      symbol: 'DAI'\r\n    },\r\n    avalanche: {\r\n      contractAddress: '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70',\r\n      decimals: 18,\r\n      symbol: 'DAI'\r\n    }\r\n  }\r\n};\r\n\r\n// ✅ UPDATED: Extended network to wallet mapping\r\nexport const NETWORK_WALLET_MAP = {\r\n  // Existing networks\r\n  [NETWORK_TYPES.ETHEREUM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.BSC]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.TRON]: [WALLET_TYPES.TRONLINK, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.ALGORAND]: [WALLET_TYPES.LUTE],\r\n  [NETWORK_TYPES.SOLANA]: [WALLET_TYPES.PHANTOM, WALLET_TYPES.TRUST_WALLET],\r\n  \r\n  // ✅ NEW: New network wallet mappings (all EVM-compatible use MetaMask)\r\n  [NETWORK_TYPES.OPTIMISM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.ARBITRUM]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.POLYGON]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.AVALANCHE]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET],\r\n  [NETWORK_TYPES.CELO]: [WALLET_TYPES.METAMASK, WALLET_TYPES.TRUST_WALLET]\r\n};\r\n\r\n// Get Coinley Connect configuration\r\nconst getConnectConfig = () => {\r\n  if (typeof window !== 'undefined') {\r\n    return {\r\n      apiUrl: window.COINLEY_CONNECT_API_URL || 'http://localhost:3001/api',\r\n      walletInterfaceUrl: window.COINLEY_CONNECT_URL || 'http://localhost:3001',\r\n      debug: window.NODE_ENV === 'development' || false\r\n    };\r\n  }\r\n  \r\n  return {\r\n    apiUrl: process.env.COINLEY_CONNECT_API_URL || 'http://localhost:3001/api',\r\n    walletInterfaceUrl: process.env.COINLEY_CONNECT_URL || 'http://localhost:3001',\r\n    debug: process.env.NODE_ENV === 'development' || false\r\n  };\r\n};\r\n\r\n// Initialize Coinley Connect client\r\nconst coinleyConnect = new CoinleyConnectClient(getConnectConfig());\r\n\r\n// ✅ UPDATED: Enhanced chain ID mapping for new networks\r\nconst getChainIdForNetwork = (network) => {\r\n  const chainIds = {\r\n    'ethereum': 1,\r\n    'bsc': 56,\r\n    'optimism': 10,\r\n    'arbitrum': 42161,\r\n    'polygon': 137,\r\n    'avalanche': 43114,\r\n    'celo': 42220\r\n  };\r\n  return chainIds[network] || 1;\r\n};\r\n\r\n// ✅ UPDATED: Enhanced address validation for new networks\r\nconst validateAddressFormat = (address, network) => {\r\n  if (!address || typeof address !== 'string') return false;\r\n  \r\n  const trimmedAddress = address.trim();\r\n  \r\n  switch (network.toLowerCase()) {\r\n    case 'ethereum':\r\n    case 'bsc':\r\n    case 'optimism':\r\n    case 'arbitrum':\r\n    case 'polygon':\r\n    case 'avalanche':\r\n    case 'celo':\r\n      // All EVM-compatible networks use same address format\r\n      return /^0x[a-fA-F0-9]{40}$/.test(trimmedAddress);\r\n    case 'tron':\r\n      return /^T[a-zA-Z0-9]{33}$/.test(trimmedAddress);\r\n    case 'solana':\r\n      return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(trimmedAddress);\r\n    case 'algorand':\r\n      return /^[A-Z2-7]{58}$/.test(trimmedAddress);\r\n    default:\r\n      return true; // Unknown network, skip validation\r\n  }\r\n};\r\n\r\n// ✅ MAIN WALLET CONNECTION FUNCTION - Uses Coinley Connect\r\nexport const connectWallet = async (walletType, network) => {\r\n    console.log(`🔗 Connecting to ${walletType} via Coinley Connect for ${network}`);\r\n    \r\n    try {\r\n        // Use Coinley Connect service to handle wallet connection\r\n        const connection = await coinleyConnect.connectWallet(walletType, network, {\r\n            debug: getConnectConfig().debug\r\n        });\r\n        \r\n        console.log('✅ Wallet connected via Coinley Connect:', connection);\r\n        \r\n        return {\r\n            walletType: connection.walletType,\r\n            address: connection.address,\r\n            network: connection.network,\r\n            sessionId: connection.sessionId,\r\n            isConnected: connection.isConnected,\r\n            provider: connection.provider || null\r\n        };\r\n        \r\n    } catch (error) {\r\n        console.error('❌ Coinley Connect wallet connection failed:', error);\r\n        \r\n        // ✅ FALLBACK: Try direct browser connection if Coinley Connect fails\r\n        console.log('🔄 Attempting fallback direct connection...');\r\n        return await connectWalletDirectly(walletType, network);\r\n    }\r\n};\r\n\r\n// ✅ FALLBACK: Direct browser wallet connection\r\nconst connectWalletDirectly = async (walletType, network) => {\r\n    try {\r\n        switch (walletType) {\r\n            case WALLET_TYPES.METAMASK:\r\n                return await connectMetaMaskDirectly(network);\r\n            case WALLET_TYPES.PHANTOM:\r\n                return await connectPhantomDirectly(network);\r\n            case WALLET_TYPES.TRONLINK:\r\n                return await connectTronLinkDirectly(network);\r\n            default:\r\n                throw new Error(`Direct connection not implemented for ${walletType}`);\r\n        }\r\n    } catch (error) {\r\n        console.error(`❌ Direct connection failed for ${walletType}:`, error);\r\n        throw error;\r\n    }\r\n};\r\n\r\n// ✅ UPDATED: Enhanced MetaMask connection with network switching for new chains\r\nconst connectMetaMaskDirectly = async (network) => {\r\n    if (typeof window.ethereum === 'undefined') {\r\n        throw new Error('MetaMask is not installed');\r\n    }\r\n\r\n    try {\r\n        const accounts = await window.ethereum.request({\r\n            method: 'eth_requestAccounts'\r\n        });\r\n\r\n        if (!accounts || accounts.length === 0) {\r\n            throw new Error('No accounts available');\r\n        }\r\n\r\n        const chainId = await window.ethereum.request({\r\n            method: 'eth_chainId'\r\n        });\r\n\r\n        const requiredChainId = getChainIdForNetwork(network);\r\n        if (parseInt(chainId, 16) !== requiredChainId) {\r\n            await switchMetaMaskNetwork(requiredChainId, network);\r\n        }\r\n\r\n        console.log('✅ MetaMask connected directly:', {\r\n            address: accounts[0],\r\n            chainId: parseInt(chainId, 16),\r\n            network\r\n        });\r\n\r\n        return {\r\n            walletType: WALLET_TYPES.METAMASK,\r\n            address: accounts[0],\r\n            network: network,\r\n            chainId: parseInt(chainId, 16),\r\n            isConnected: true,\r\n            provider: window.ethereum,\r\n            sessionId: null\r\n        };\r\n\r\n    } catch (error) {\r\n        console.error('MetaMask direct connection error:', error);\r\n        throw error;\r\n    }\r\n};\r\n\r\n// ✅ UPDATED: Enhanced network switching with support for new networks\r\nconst switchMetaMaskNetwork = async (chainId, network) => {\r\n    try {\r\n        await window.ethereum.request({\r\n            method: 'wallet_switchEthereumChain',\r\n            params: [{ chainId: `0x${chainId.toString(16)}` }]\r\n        });\r\n    } catch (switchError) {\r\n        // If the network doesn't exist, add it\r\n        if (switchError.code === 4902) {\r\n            try {\r\n                await addNetworkToMetaMask(network, chainId);\r\n            } catch (addError) {\r\n                console.error('Failed to add network:', addError);\r\n                throw addError;\r\n            }\r\n        } else {\r\n            console.error('Failed to switch network:', switchError);\r\n            throw switchError;\r\n        }\r\n    }\r\n};\r\n\r\n// ✅ NEW: Add network to MetaMask for new networks\r\nconst addNetworkToMetaMask = async (network, chainId) => {\r\n    const networkConfig = NETWORK_CONFIG[network];\r\n    if (!networkConfig) {\r\n        throw new Error(`Network configuration not found for ${network}`);\r\n    }\r\n\r\n    const params = {\r\n        chainId: `0x${chainId.toString(16)}`,\r\n        chainName: networkConfig.name,\r\n        rpcUrls: [networkConfig.rpcUrl],\r\n        nativeCurrency: {\r\n            name: networkConfig.symbol,\r\n            symbol: networkConfig.symbol,\r\n            decimals: networkConfig.decimals\r\n        },\r\n        blockExplorerUrls: [networkConfig.blockExplorerUrl]\r\n    };\r\n\r\n    await window.ethereum.request({\r\n        method: 'wallet_addEthereumChain',\r\n        params: [params]\r\n    });\r\n};\r\n\r\n// Keep existing functions (connectPhantomDirectly, connectTronLinkDirectly, etc.)\r\nconst connectPhantomDirectly = async (network) => {\r\n    if (typeof window.solana === 'undefined' || !window.solana.isPhantom) {\r\n        throw new Error('Phantom wallet is not installed');\r\n    }\r\n\r\n    try {\r\n        const response = await window.solana.connect();\r\n        \r\n        console.log('✅ Phantom connected directly:', {\r\n            address: response.publicKey.toString(),\r\n            network\r\n        });\r\n\r\n        return {\r\n            walletType: WALLET_TYPES.PHANTOM,\r\n            address: response.publicKey.toString(),\r\n            network: network,\r\n            chainId: null,\r\n            isConnected: true,\r\n            provider: window.solana,\r\n            sessionId: null\r\n        };\r\n\r\n    } catch (error) {\r\n        console.error('Phantom direct connection error:', error);\r\n        throw error;\r\n    }\r\n};\r\n\r\nconst connectTronLinkDirectly = async (network) => {\r\n    if (typeof window.tronWeb === 'undefined') {\r\n        throw new Error('TronLink is not installed');\r\n    }\r\n\r\n    try {\r\n        const accounts = await window.tronWeb.request({\r\n            method: 'tron_requestAccounts'\r\n        });\r\n\r\n        if (!accounts || accounts.length === 0) {\r\n            throw new Error('No accounts available');\r\n        }\r\n\r\n        console.log('✅ TronLink connected directly:', {\r\n            address: accounts[0],\r\n            network\r\n        });\r\n\r\n        return {\r\n            walletType: WALLET_TYPES.TRONLINK,\r\n            address: accounts[0],\r\n            network: network,\r\n            chainId: null,\r\n            isConnected: true,\r\n            provider: window.tronWeb,\r\n            sessionId: null\r\n        };\r\n\r\n    } catch (error) {\r\n        console.error('TronLink direct connection error:', error);\r\n        throw error;\r\n    }\r\n};\r\n\r\n// ✅ Send transaction via Coinley Connect or direct\r\nexport const sendTransaction = async (walletConnection, transactionDetails) => {\r\n    try {\r\n        console.log('🚀 Sending transaction:', transactionDetails);\r\n        \r\n        const { to, amount, currency, network, tokenAddress, tokenDecimals } = transactionDetails;\r\n        \r\n        // If we have a Coinley Connect session ID, use the service\r\n        if (walletConnection.sessionId) {\r\n            console.log('📡 Using Coinley Connect service for transaction...');\r\n            \r\n            const txHash = await coinleyConnect.sendTransaction(walletConnection.sessionId, {\r\n                to,\r\n                amount: amount.toString(),\r\n                currency,\r\n                network,\r\n                tokenAddress,\r\n                tokenDecimals\r\n            });\r\n            \r\n            console.log('✅ Transaction sent via Coinley Connect:', txHash);\r\n            return txHash;\r\n        }\r\n        \r\n        // Fallback to direct transaction if we have a provider\r\n        if (walletConnection.provider) {\r\n            console.log('🔄 Using direct wallet provider for transaction...');\r\n            return await sendTransactionDirectly(walletConnection, transactionDetails);\r\n        }\r\n        \r\n        throw new Error('No transaction method available');\r\n        \r\n    } catch (error) {\r\n        console.error('❌ Transaction failed:', error);\r\n        throw error;\r\n    }\r\n};\r\n\r\n// Send transaction directly through wallet provider\r\nconst sendTransactionDirectly = async (walletConnection, transactionDetails) => {\r\n    const { walletType, provider } = walletConnection;\r\n    \r\n    try {\r\n        switch (walletType) {\r\n            case WALLET_TYPES.METAMASK:\r\n                return await sendMetaMaskTransaction(provider, walletConnection, transactionDetails);\r\n            case WALLET_TYPES.PHANTOM:\r\n                return await sendPhantomTransaction(provider, transactionDetails);\r\n            case WALLET_TYPES.TRONLINK:\r\n                return await sendTronLinkTransaction(provider, transactionDetails);\r\n            default:\r\n                throw new Error(`Direct transaction not implemented for ${walletType}`);\r\n        }\r\n    } catch (error) {\r\n        console.error(`Direct transaction failed for ${walletType}:`, error);\r\n        throw error;\r\n    }\r\n};\r\n\r\nconst sendMetaMaskTransaction = async (provider, walletConnection, transactionDetails) => {\r\n    const { to, amount, tokenAddress } = transactionDetails;\r\n    \r\n    try {\r\n        if (tokenAddress && tokenAddress !== '0x0000000000000000000000000000000000000000') {\r\n            throw new Error('ERC20 transactions require additional setup - use Coinley Connect service');\r\n        } else {\r\n            // Native token transaction\r\n            const amountWei = (parseFloat(amount) * 1e18).toString(16);\r\n            \r\n            const tx = await provider.request({\r\n                method: 'eth_sendTransaction',\r\n                params: [{\r\n                    from: walletConnection.address,\r\n                    to: to,\r\n                    value: `0x${amountWei}`\r\n                }]\r\n            });\r\n            \r\n            console.log('✅ MetaMask transaction sent:', tx);\r\n            return tx;\r\n        }\r\n    } catch (error) {\r\n        console.error('MetaMask transaction error:', error);\r\n        throw error;\r\n    }\r\n};\r\n\r\nconst sendPhantomTransaction = async (provider, transactionDetails) => {\r\n    console.warn('Phantom direct transactions require @solana/web3.js - use Coinley Connect service');\r\n    throw new Error('Use Coinley Connect service for Phantom transactions');\r\n};\r\n\r\nconst sendTronLinkTransaction = async (provider, transactionDetails) => {\r\n    console.warn('TronLink direct transactions require TronWeb setup - use Coinley Connect service');\r\n    throw new Error('Use Coinley Connect service for TronLink transactions');\r\n};\r\n\r\n// ✅ Detect available wallets\r\nexport const detectWallets = async () => {\r\n    const detected = {\r\n        [WALLET_TYPES.METAMASK]: false,\r\n        [WALLET_TYPES.PHANTOM]: false,\r\n        [WALLET_TYPES.TRONLINK]: false,\r\n        [WALLET_TYPES.TRUST_WALLET]: false,\r\n        [WALLET_TYPES.LUTE]: false\r\n    };\r\n    \r\n    // Detect MetaMask\r\n    if (typeof window.ethereum !== 'undefined') {\r\n        if (window.ethereum.isMetaMask) {\r\n            detected[WALLET_TYPES.METAMASK] = true;\r\n        }\r\n        if (window.ethereum.isTrust) {\r\n            detected[WALLET_TYPES.TRUST_WALLET] = true;\r\n        }\r\n    }\r\n    \r\n    // Detect Phantom\r\n    if (typeof window.solana !== 'undefined' && window.solana.isPhantom) {\r\n        detected[WALLET_TYPES.PHANTOM] = true;\r\n    }\r\n    \r\n    // Detect TronLink\r\n    if (typeof window.tronWeb !== 'undefined') {\r\n        detected[WALLET_TYPES.TRONLINK] = true;\r\n    }\r\n    \r\n    // Detect Lute/AlgoSigner\r\n    if (typeof window.AlgoSigner !== 'undefined') {\r\n        detected[WALLET_TYPES.LUTE] = true;\r\n    }\r\n    \r\n    console.log('🔍 Detected wallets:', detected);\r\n    return detected;\r\n};\r\n\r\n// Export all utility functions\r\nexport const getAvailableWallets = async (network = null) => {\r\n    try {\r\n        const wallets = await coinleyConnect.getSupportedWallets(network);\r\n        const detectedWallets = await detectWallets();\r\n        \r\n        const walletsWithStatus = wallets.map(wallet => ({\r\n            ...wallet,\r\n            isInstalled: detectedWallets[wallet.type] || false,\r\n            status: detectedWallets[wallet.type] ? 'installed' : 'not_installed'\r\n        }));\r\n        \r\n        walletsWithStatus.sort((a, b) => {\r\n            if (a.isInstalled && !b.isInstalled) return -1;\r\n            if (!a.isInstalled && b.isInstalled) return 1;\r\n            return 0;\r\n        });\r\n        \r\n        return walletsWithStatus;\r\n        \r\n    } catch (error) {\r\n        console.error('Error getting available wallets:', error);\r\n        \r\n        const detected = await detectWallets();\r\n        return [\r\n            {\r\n                type: WALLET_TYPES.METAMASK,\r\n                name: 'MetaMask',\r\n                icon: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3ymr3UNKopfI0NmUY95Dr-0589vG-91KuAA&s',\r\n                description: 'Connect using browser extension',\r\n                isInstalled: detected[WALLET_TYPES.METAMASK],\r\n                status: detected[WALLET_TYPES.METAMASK] ? 'installed' : 'not_installed'\r\n            },\r\n            {\r\n                type: WALLET_TYPES.PHANTOM,\r\n                name: 'Phantom',\r\n                icon: 'https://coinlaunch.space/media/images/4/8/5/0/4850.sp3ow1.192x192.png',\r\n                description: 'Connect using Phantom wallet',\r\n                isInstalled: detected[WALLET_TYPES.PHANTOM],\r\n                status: detected[WALLET_TYPES.PHANTOM] ? 'installed' : 'not_installed'\r\n            }\r\n        ];\r\n    }\r\n};\r\n\r\nexport const getWalletInstallUrl = (walletType) => {\r\n    const urls = {\r\n        [WALLET_TYPES.METAMASK]: 'https://metamask.io/download/',\r\n        [WALLET_TYPES.PHANTOM]: 'https://phantom.app/download',\r\n        [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/download/',\r\n        [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/download/',\r\n        [WALLET_TYPES.LUTE]: 'https://lute.app/download/'\r\n    };\r\n    return urls[walletType] || '';\r\n};\r\n\r\nexport const getSupportedWalletsForNetwork = (network) => {\r\n    return NETWORK_WALLET_MAP[network] || [];\r\n};\r\n\r\nexport const disconnectWallet = async (walletConnection) => {\r\n    try {\r\n        if (walletConnection.sessionId) {\r\n            await coinleyConnect.disconnectWallet(walletConnection.sessionId);\r\n        }\r\n        return true;\r\n    } catch (error) {\r\n        console.error('Error disconnecting wallet:', error);\r\n        return false;\r\n    }\r\n};\r\n\r\nexport const getTokenConfig = (currency, network) => {\r\n    if (!currency || !network) return null;\r\n    \r\n    const tokenConfig = TOKEN_CONFIG[currency.toUpperCase()];\r\n    if (!tokenConfig) return null;\r\n    \r\n    return tokenConfig[network.toLowerCase()];\r\n};\r\n\r\nexport const validateWalletAddress = (address, network) => {\r\n    return { valid: validateAddressFormat(address, network) };\r\n};\r\n\r\nexport const debugWalletEnvironment = () => {\r\n    const environment = {\r\n        hasMetaMask: typeof window.ethereum !== 'undefined',\r\n        hasPhantom: typeof window.solana !== 'undefined',\r\n        hasTronLink: typeof window.tronWeb !== 'undefined',\r\n        coinleyConnectUrl: getConnectConfig().walletInterfaceUrl,\r\n        availableWallets: Object.keys(WALLET_TYPES),\r\n        supportedNetworks: Object.keys(NETWORK_TYPES)\r\n    };\r\n    \r\n    console.log('🔍 Wallet Environment Debug:', environment);\r\n    return environment;\r\n};\r\n\r\nexport const generateMockTransactionHash = (network = 'ethereum') => {\r\n    const prefixes = {\r\n        ethereum: '0x', bsc: '0x', optimism: '0x', arbitrum: '0x', \r\n        polygon: '0x', avalanche: '0x', celo: '0x',\r\n        tron: '', algorand: '', solana: ''\r\n    };\r\n    \r\n    const prefix = prefixes[network] || '0x';\r\n    const hash = Array.from({length: 64}, () => \r\n        Math.floor(Math.random() * 16).toString(16)).join('');\r\n        \r\n    return `${prefix}${hash}`;\r\n};\r\n\r\n// Legacy function exports for backward compatibility\r\nexport const sendTokenTransaction = async (walletConnection, tokenConfig, toAddress, amount) => {\r\n    return sendTransaction(walletConnection, {\r\n        to: toAddress,\r\n        amount: amount,\r\n        currency: tokenConfig.symbol,\r\n        network: walletConnection.network,\r\n        tokenAddress: tokenConfig.contractAddress || tokenConfig.address,\r\n        tokenDecimals: tokenConfig.decimals\r\n    });\r\n};\r\n\r\nexport const sendERC20Transaction = sendTokenTransaction;\r\nexport const sendNativeTransaction = async (walletConnection, toAddress, amount) => {\r\n    return sendTransaction(walletConnection, {\r\n        to: toAddress,\r\n        amount: amount,\r\n        currency: 'ETH',\r\n        network: walletConnection.network || 'ethereum'\r\n    });\r\n};\r\n\r\nexport const detectWalletsWithRetry = detectWallets;\r\n\r\n// Export the client for advanced usage\r\nexport { coinleyConnect };\r\n\r\n// Default export\r\nexport default {\r\n    WALLET_TYPES,\r\n    NETWORK_TYPES,\r\n    NETWORK_CONFIG,\r\n    TOKEN_CONFIG,\r\n    NETWORK_WALLET_MAP,\r\n    connectWallet,\r\n    sendTransaction,\r\n    detectWallets,\r\n    getAvailableWallets,\r\n    getWalletInstallUrl,\r\n    getSupportedWalletsForNetwork,\r\n    debugWalletEnvironment,\r\n    disconnectWallet,\r\n    getTokenConfig,\r\n    validateWalletAddress,\r\n    generateMockTransactionHash,\r\n    coinleyConnect\r\n};","// // src/services/api.js\r\n// let apiConfig = {\r\n//   apiKey: null,\r\n//   apiSecret: null,\r\n//   // apiUrl: 'https://coinleyserver-production.up.railway.app',\r\n//   // apiUrl: 'https://hub.coinley.io',\r\n//   apiUrl: 'http://localhost:9000',\r\n//   merchantWalletAddresses: {},\r\n//   authToken: null,\r\n//   merchantFeePercentage: null,\r\n//   merchantNetworks: [], // Add this to store merchant's configured networks\r\n//   merchantTokens: [] // Add this to store merchant's supported tokens\r\n// };\r\n\r\n// /**\r\n//  * Initialize the API with configuration\r\n//  */\r\n// export const initializeApi = async (config) => {\r\n//   apiConfig = { ...apiConfig, ...config };\r\n//   console.log('API initialized with:', {\r\n//     apiUrl: apiConfig.apiUrl,\r\n//     apiKey: apiConfig.apiKey ? `${apiConfig.apiKey.substring(0, 6)}...` : null,\r\n//     hasWalletAddresses: Object.keys(apiConfig.merchantWalletAddresses || {}).length > 0\r\n//   });\r\n\r\n//   // Authenticate and fetch merchant data immediately\r\n//   try {\r\n//     await authenticateAndFetchMerchantData();\r\n//   } catch (error) {\r\n//     console.error('Failed to fetch merchant data during initialization:', error);\r\n//   }\r\n// };\r\n\r\n// /**\r\n//  * Authenticate with the API and fetch all merchant data (wallets, networks, tokens, fee)\r\n//  */\r\n// const authenticateAndFetchMerchantData = async () => {\r\n//   try {\r\n//     console.log('Authenticating and fetching merchant data...');\r\n    \r\n//     // Create a temporary auth token for API calls\r\n//     const tempToken = btoa(`${apiConfig.apiKey}:${apiConfig.apiSecret}`);\r\n    \r\n//     // Fetch merchant networks and tokens from the new endpoint\r\n//     const networksResponse = await fetch(`${apiConfig.apiUrl}/api/merchants/networks-and-tokens`, {\r\n//       method: 'GET',\r\n//       headers: {\r\n//         'Content-Type': 'application/json',\r\n//         'Authorization': `Bearer ${tempToken}`,\r\n//         'x-api-key': apiConfig.apiKey,\r\n//         'x-api-secret': apiConfig.apiSecret\r\n//       }\r\n//     });\r\n\r\n//     if (networksResponse.ok) {\r\n//       const networksData = await networksResponse.json();\r\n//       console.log('Merchant networks and tokens received:', networksData);\r\n      \r\n//       if (networksData.success) {\r\n//         // Store merchant's configured networks and tokens with deduplication\r\n//         const rawNetworks = networksData.networks || [];\r\n//         const rawTokens = networksData.tokens || [];\r\n        \r\n//         console.log('Raw networks from backend:', rawNetworks);\r\n//         console.log('Raw tokens from backend:', rawTokens);\r\n        \r\n//         // Remove duplicate networks based on shortName\r\n//         const uniqueNetworks = rawNetworks.filter((network, index, self) => \r\n//           index === self.findIndex(n => n.shortName === network.shortName)\r\n//         );\r\n        \r\n//         // Remove duplicate tokens based on symbol + networkId combination\r\n//         const uniqueTokens = rawTokens.filter((token, index, self) => \r\n//           index === self.findIndex(t => \r\n//             t.symbol === token.symbol && \r\n//             t.networkId === token.networkId\r\n//           )\r\n//         );\r\n        \r\n//         console.log('Deduplicated networks:', uniqueNetworks);\r\n//         console.log('Deduplicated tokens:', uniqueTokens);\r\n        \r\n//         apiConfig.merchantNetworks = uniqueNetworks;\r\n//         apiConfig.merchantTokens = uniqueTokens;\r\n//         apiConfig.merchantWalletAddresses = networksData.merchantWallets || {};\r\n        \r\n//         console.log('Merchant configured networks:', apiConfig.merchantNetworks.map(n => n.name));\r\n//         console.log('Merchant supported tokens:', apiConfig.merchantTokens.map(t => `${t.symbol} (${t.Network?.name})`));\r\n//         console.log('Merchant wallet addresses:', apiConfig.merchantWalletAddresses);\r\n//       }\r\n//     } else {\r\n//       console.error('Failed to fetch merchant networks and tokens:', networksResponse.status);\r\n//     }\r\n\r\n//     // Also fetch merchant dashboard for fee percentage and other info\r\n//     const dashboardResponse = await fetch(`${apiConfig.apiUrl}/api/merchants/dashboard`, {\r\n//       method: 'GET',\r\n//       headers: {\r\n//         'Content-Type': 'application/json',\r\n//         'Authorization': `Bearer ${tempToken}`,\r\n//         'x-api-key': apiConfig.apiKey,\r\n//         'x-api-secret': apiConfig.apiSecret\r\n//       }\r\n//     });\r\n\r\n//     if (dashboardResponse.ok) {\r\n//       const dashboardData = await dashboardResponse.json();\r\n//       console.log('Merchant dashboard data received:', dashboardData);\r\n      \r\n//       if (dashboardData.merchant) {\r\n//         // Get custom fee percentage\r\n//         const customFeePercentage = dashboardData.merchant.customFeePercentage || 0.0175;\r\n//         apiConfig.merchantFeePercentage = customFeePercentage;\r\n        \r\n//         console.log('Merchant fee percentage:', customFeePercentage);\r\n        \r\n//         // Merge any additional wallet addresses from dashboard\r\n//         if (dashboardData.merchant.walletAddress) {\r\n//           apiConfig.merchantWalletAddresses.ethereum = dashboardData.merchant.walletAddress;\r\n//         }\r\n        \r\n//         if (dashboardData.merchant.solWalletAddress) {\r\n//           apiConfig.merchantWalletAddresses.solana = dashboardData.merchant.solWalletAddress;\r\n//         }\r\n        \r\n//         if (dashboardData.merchant.merchantWallets) {\r\n//           Object.assign(apiConfig.merchantWalletAddresses, dashboardData.merchant.merchantWallets);\r\n//         }\r\n//       }\r\n//     }\r\n    \r\n//     return {\r\n//       networks: apiConfig.merchantNetworks,\r\n//       tokens: apiConfig.merchantTokens,\r\n//       walletAddresses: apiConfig.merchantWalletAddresses,\r\n//       feePercentage: apiConfig.merchantFeePercentage\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Error fetching merchant data:', error);\r\n//     return {\r\n//       networks: [],\r\n//       tokens: [],\r\n//       walletAddresses: {},\r\n//       feePercentage: 0.0175\r\n//     };\r\n//   }\r\n// };\r\n\r\n// /**\r\n//  * Get merchant's configured networks\r\n//  */\r\n// export const getMerchantNetworks = async () => {\r\n//   // If we don't have networks, try to fetch them\r\n//   if (apiConfig.merchantNetworks.length === 0) {\r\n//     await authenticateAndFetchMerchantData();\r\n//   }\r\n  \r\n//   return apiConfig.merchantNetworks;\r\n// };\r\n\r\n// /**\r\n//  * Get merchant's supported tokens (optionally filtered by network)\r\n//  */\r\n// export const getMerchantTokens = async (networkShortName = null) => {\r\n//   // If we don't have tokens, try to fetch them\r\n//   if (apiConfig.merchantTokens.length === 0) {\r\n//     await authenticateAndFetchMerchantData();\r\n//   }\r\n  \r\n//   // Filter by network if specified\r\n//   if (networkShortName) {\r\n//     return apiConfig.merchantTokens.filter(token => \r\n//       token.Network && token.Network.shortName === networkShortName\r\n//     );\r\n//   }\r\n  \r\n//   return apiConfig.merchantTokens;\r\n// };\r\n\r\n// /**\r\n//  * Get merchant wallet addresses (with fresh fetch if needed)\r\n//  */\r\n// export const getMerchantWallets = async () => {\r\n//   // If we don't have wallet addresses, try to fetch them\r\n//   if (Object.keys(apiConfig.merchantWalletAddresses).length === 0) {\r\n//     await authenticateAndFetchMerchantData();\r\n//   }\r\n  \r\n//   return apiConfig.merchantWalletAddresses;\r\n// };\r\n\r\n// /**\r\n//  * Get merchant fee percentage\r\n//  */\r\n// export const getMerchantFeePercentage = async () => {\r\n//   // If we don't have fee percentage, try to fetch it\r\n//   if (apiConfig.merchantFeePercentage === null) {\r\n//     const result = await authenticateAndFetchMerchantData();\r\n//     return result.feePercentage;\r\n//   }\r\n  \r\n//   return apiConfig.merchantFeePercentage;\r\n// };\r\n\r\n// /**\r\n//  * Check if a network is supported by the merchant\r\n//  */\r\n// export const isMerchantNetworkSupported = async (networkShortName) => {\r\n//   const networks = await getMerchantNetworks();\r\n//   return networks.some(network => network.shortName === networkShortName);\r\n// };\r\n\r\n// /**\r\n//  * Check if a token is supported by the merchant on a specific network\r\n//  */\r\n// export const isMerchantTokenSupported = async (tokenSymbol, networkShortName) => {\r\n//   const tokens = await getMerchantTokens(networkShortName);\r\n//   return tokens.some(token => \r\n//     token.symbol === tokenSymbol && \r\n//     token.Network && \r\n//     token.Network.shortName === networkShortName\r\n//   );\r\n// };\r\n\r\n// /**\r\n//  * Generate headers with authentication\r\n//  */\r\n// const getHeaders = () => {\r\n//   return {\r\n//     'Content-Type': 'application/json',\r\n//     'x-api-key': apiConfig.apiKey,\r\n//     'x-api-secret': apiConfig.apiSecret,\r\n//     'Authorization': apiConfig.authToken ? `Bearer ${apiConfig.authToken}` : undefined\r\n//   };\r\n// };\r\n\r\n// /**\r\n//  * Create a new payment with proper wallet address resolution\r\n//  */\r\n// export const createPayment = async (paymentData) => {\r\n//   try {\r\n//     console.log('Creating payment with data:', paymentData);\r\n    \r\n//     if (!paymentData.amount) {\r\n//       throw new Error('Payment amount is required');\r\n//     }\r\n\r\n//     // Ensure we have merchant data\r\n//     const merchantWallets = await getMerchantWallets();\r\n//     console.log('Using merchant wallets:', merchantWallets);\r\n    \r\n//     // Validate that the network and currency are supported by the merchant\r\n//     const isNetworkSupported = await isMerchantNetworkSupported(paymentData.network);\r\n//     if (!isNetworkSupported) {\r\n//       throw new Error(`Network ${paymentData.network} is not configured for this merchant`);\r\n//     }\r\n    \r\n//     const isTokenSupported = await isMerchantTokenSupported(paymentData.currency, paymentData.network);\r\n//     if (!isTokenSupported) {\r\n//       throw new Error(`Token ${paymentData.currency} is not supported on ${paymentData.network} network for this merchant`);\r\n//     }\r\n    \r\n//     // Enhance payment data with merchant wallet addresses\r\n//     const enhancedPaymentData = { \r\n//       ...paymentData,\r\n//       merchantWalletAddresses: {\r\n//         ...merchantWallets,\r\n//         ...paymentData.merchantWalletAddresses\r\n//       }\r\n//     };\r\n    \r\n//     console.log('Enhanced payment data:', enhancedPaymentData);\r\n    \r\n//     const response = await fetch(`${apiConfig.apiUrl}/api/payments/create`, {\r\n//       method: 'POST',\r\n//       headers: getHeaders(),\r\n//       body: JSON.stringify(enhancedPaymentData)\r\n//     });\r\n\r\n//     console.log('Create payment response status:', response.status);\r\n    \r\n//     if (!response.ok) {\r\n//       let errorData;\r\n//       try {\r\n//         errorData = await response.json();\r\n//       } catch (e) {\r\n//         throw new Error(`Failed to create payment: ${response.status} ${response.statusText}`);\r\n//       }\r\n      \r\n//       console.error('Error creating payment:', errorData);\r\n//       throw new Error(errorData.error || `Failed to create payment: ${response.status}`);\r\n//     }\r\n\r\n//     const data = await response.json();\r\n//     console.log('Payment created successfully:', data);\r\n    \r\n//     return data;\r\n//   } catch (error) {\r\n//     console.error('Create payment error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// /**\r\n//  * Get payment details by ID\r\n//  */\r\n// export const getPayment = async (paymentId) => {\r\n//   try {\r\n//     console.log('Getting payment:', paymentId);\r\n    \r\n//     if (!paymentId) {\r\n//       throw new Error('Payment ID is required');\r\n//     }\r\n    \r\n//     const response = await fetch(`${apiConfig.apiUrl}/api/payments/${paymentId}`, {\r\n//       method: 'GET',\r\n//       headers: getHeaders()\r\n//     });\r\n\r\n//     if (!response.ok) {\r\n//       let errorData;\r\n//       try {\r\n//         errorData = await response.json();\r\n//       } catch (e) {\r\n//         throw new Error(`Failed to get payment: ${response.status} ${response.statusText}`);\r\n//       }\r\n      \r\n//       console.error('Error getting payment:', errorData);\r\n//       throw new Error(errorData.error || `Failed to get payment: ${response.status}`);\r\n//     }\r\n\r\n//     const data = await response.json();\r\n//     console.log('Get payment response:', data);\r\n    \r\n//     return data;\r\n//   } catch (error) {\r\n//     console.error('Get payment error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// /**\r\n//  * Process a payment\r\n//  */\r\n// export const processPayment = async (processData) => {\r\n//   try {\r\n//     console.log('Processing payment with data:', processData);\r\n    \r\n//     if (!processData.paymentId) {\r\n//       throw new Error('Payment ID is required');\r\n//     }\r\n    \r\n//     if (!processData.transactionHash) {\r\n//       throw new Error('Transaction hash is required');\r\n//     }\r\n    \r\n//     const response = await fetch(`${apiConfig.apiUrl}/api/payments/process`, {\r\n//       method: 'POST',\r\n//       headers: getHeaders(),\r\n//       body: JSON.stringify(processData)\r\n//     });\r\n\r\n//     console.log('Process payment response status:', response.status);\r\n    \r\n//     if (!response.ok) {\r\n//       let errorData;\r\n//       try {\r\n//         errorData = await response.json();\r\n//       } catch (e) {\r\n//         throw new Error(`Failed to process payment: ${response.status} ${response.statusText}`);\r\n//       }\r\n      \r\n//       console.error('Error processing payment:', errorData);\r\n//       throw new Error(errorData.error || `Failed to process payment: ${response.status}`);\r\n//     }\r\n\r\n//     const data = await response.json();\r\n//     console.log('Process payment response data:', data);\r\n//     return data;\r\n//   } catch (error) {\r\n//     console.error('Process payment error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// /**\r\n//  * Get supported networks and tokens (returns only merchant's configured ones)\r\n//  */\r\n// export const getSupportedNetworks = async () => {\r\n//   try {\r\n//     const networks = await getMerchantNetworks();\r\n//     const tokens = await getMerchantTokens();\r\n    \r\n//     return {\r\n//       success: true,\r\n//       networks: networks,\r\n//       tokens: tokens\r\n//     };\r\n//   } catch (error) {\r\n//     console.error('Get supported networks error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// /**\r\n//  * Get merchant payments with filters\r\n//  */\r\n// export const getMerchantPayments = async (options = {}) => {\r\n//   try {\r\n//     const queryParams = new URLSearchParams();\r\n    \r\n//     Object.entries(options).forEach(([key, value]) => {\r\n//       if (value !== null && value !== undefined) {\r\n//         queryParams.append(key, value);\r\n//       }\r\n//     });\r\n    \r\n//     const response = await fetch(`${apiConfig.apiUrl}/api/payments?${queryParams}`, {\r\n//       method: 'GET',\r\n//       headers: getHeaders()\r\n//     });\r\n    \r\n//     if (!response.ok) {\r\n//       let errorData;\r\n//       try {\r\n//         errorData = await response.json();\r\n//       } catch (e) {\r\n//         throw new Error(`Failed to get payments: ${response.status} ${response.statusText}`);\r\n//       }\r\n      \r\n//       throw new Error(errorData.error || `Failed to get payments: ${response.status}`);\r\n//     }\r\n    \r\n//     const data = await response.json();\r\n//     return data;\r\n//   } catch (error) {\r\n//     console.error('Get merchant payments error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// /**\r\n//  * Get payment statistics\r\n//  */\r\n// export const getMerchantPaymentStats = async () => {\r\n//   try {\r\n//     const response = await fetch(`${apiConfig.apiUrl}/api/payments/stats`, {\r\n//       method: 'GET',\r\n//       headers: getHeaders()\r\n//     });\r\n    \r\n//     if (!response.ok) {\r\n//       let errorData;\r\n//       try {\r\n//         errorData = await response.json();\r\n//       } catch (e) {\r\n//         throw new Error(`Failed to get payment stats: ${response.status} ${response.statusText}`);\r\n//       }\r\n      \r\n//       throw new Error(errorData.error || `Failed to get payment stats: ${response.status}`);\r\n//     }\r\n    \r\n//     const data = await response.json();\r\n//     return data;\r\n//   } catch (error) {\r\n//     console.error('Get payment stats error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// /**\r\n//  * Validate wallet address for specific network\r\n//  */\r\n// export const validateWalletAddress = async (address, network) => {\r\n//   try {\r\n//     const response = await fetch(`${apiConfig.apiUrl}/api/wallets/validate`, {\r\n//       method: 'POST',\r\n//       headers: getHeaders(),\r\n//       body: JSON.stringify({ address, network })\r\n//     });\r\n    \r\n//     if (!response.ok) {\r\n//       let errorData;\r\n//       try {\r\n//         errorData = await response.json();\r\n//       } catch (e) {\r\n//         throw new Error(`Failed to validate address: ${response.status} ${response.statusText}`);\r\n//       }\r\n      \r\n//       throw new Error(errorData.error || `Failed to validate address: ${response.status}`);\r\n//     }\r\n    \r\n//     const data = await response.json();\r\n//     return data;\r\n//   } catch (error) {\r\n//     console.error('Validate wallet address error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// /**\r\n//  * Generate mock transaction hash for testing\r\n//  */\r\n// export const generateMockTransactionHash = (network = 'ethereum') => {\r\n//   const prefixes = {\r\n//     ethereum: '0x',\r\n//     bsc: '0x',\r\n//     tron: '',\r\n//     algorand: ''\r\n//   };\r\n  \r\n//   const prefix = prefixes[network] || '0x';\r\n//   const hash = Array.from({length: 64}, () => \r\n//     Math.floor(Math.random() * 16).toString(16)).join('');\r\n    \r\n//   return `${prefix}${hash}`;\r\n// };\r\n\r\n\r\n\r\n\r\n// /**\r\n//  * Verify QR code payment by checking blockchain for transactions\r\n//  */\r\n// export const verifyQRPayment = async (paymentId) => {\r\n//   try {\r\n//     console.log('Verifying QR payment:', paymentId);\r\n    \r\n//     if (!paymentId) {\r\n//       throw new Error('Payment ID is required');\r\n//     }\r\n    \r\n//     const response = await fetch(`${apiConfig.apiUrl}/api/payments/verify-qr`, {\r\n//       method: 'POST',\r\n//       headers: getHeaders(),\r\n//       body: JSON.stringify({ paymentId })\r\n//     });\r\n\r\n//     console.log('Verify QR payment response status:', response.status);\r\n    \r\n//     if (!response.ok) {\r\n//       let errorData;\r\n//       try {\r\n//         errorData = await response.json();\r\n//       } catch (e) {\r\n//         throw new Error(`Failed to verify payment: ${response.status} ${response.statusText}`);\r\n//       }\r\n      \r\n//       console.error('Error verifying QR payment:', errorData);\r\n//       throw new Error(errorData.error || `Failed to verify payment: ${response.status}`);\r\n//     }\r\n\r\n//     const data = await response.json();\r\n//     console.log('QR payment verification response:', data);\r\n    \r\n//     return data;\r\n//   } catch (error) {\r\n//     console.error('QR payment verification error:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // Export the current config for debugging\r\n// export const getApiConfig = () => apiConfig;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// src/services/api.js - Fixed version with better error handling\r\nlet apiConfig = {\r\n  apiKey: null,\r\n  apiSecret: null,\r\n  apiUrl: 'https://hub.coinley.io',\r\n  merchantWalletAddresses: {},\r\n  authToken: null,\r\n  merchantFeePercentage: null,\r\n  merchantNetworks: [],\r\n  merchantTokens: []\r\n};\r\n\r\n/**\r\n * Initialize the API with configuration\r\n */\r\nexport const initializeApi = async (config) => {\r\n  apiConfig = { ...apiConfig, ...config };\r\n  console.log('API initialized with:', {\r\n    apiUrl: apiConfig.apiUrl,\r\n    apiKey: apiConfig.apiKey ? `${apiConfig.apiKey.substring(0, 6)}...` : null,\r\n    hasWalletAddresses: Object.keys(apiConfig.merchantWalletAddresses || {}).length > 0\r\n  });\r\n\r\n  // Authenticate and fetch merchant data immediately\r\n  try {\r\n    await authenticateAndFetchMerchantData();\r\n  } catch (error) {\r\n    console.error('Failed to fetch merchant data during initialization:', error);\r\n    // Don't throw error here - allow SDK to continue with fallback data\r\n  }\r\n};\r\n\r\n/**\r\n * Enhanced authentication with better error handling and fallbacks\r\n */\r\nconst authenticateAndFetchMerchantData = async () => {\r\n  try {\r\n    console.log('🔍 Authenticating and fetching merchant data...');\r\n    \r\n    // Create a temporary auth token for API calls\r\n    const tempToken = btoa(`${apiConfig.apiKey}:${apiConfig.apiSecret}`);\r\n    \r\n    // 1. First try the combined endpoint\r\n    try {\r\n      const networksResponse = await fetch(`${apiConfig.apiUrl}/api/merchants/networks-and-tokens`, {\r\n        method: 'GET',\r\n        headers: {\r\n          'Content-Type': 'application/json',\r\n          'Authorization': `Bearer ${tempToken}`,\r\n          'x-api-key': apiConfig.apiKey,\r\n          'x-api-secret': apiConfig.apiSecret\r\n        }\r\n      });\r\n\r\n      if (networksResponse.ok) {\r\n        const networksData = await networksResponse.json();\r\n        console.log('✅ Merchant networks and tokens received:', networksData);\r\n        \r\n        if (networksData.success) {\r\n          const rawNetworks = networksData.networks || [];\r\n          const rawTokens = networksData.tokens || [];\r\n          \r\n          // Remove duplicates and filter out RLUSD\r\n          const uniqueNetworks = rawNetworks.filter((network, index, self) => \r\n            index === self.findIndex(n => n.shortName === network.shortName)\r\n          );\r\n          \r\n          const uniqueTokens = rawTokens.filter((token, index, self) => {\r\n            // Filter out RLUSD tokens\r\n            const isRLUSD = token.symbol?.toUpperCase() === 'RLUSD' ||\r\n              token.name?.toLowerCase().includes('raft locked');\r\n            \r\n            return !isRLUSD && index === self.findIndex(t => \r\n              t.symbol === token.symbol && t.networkId === token.networkId\r\n            );\r\n          });\r\n          \r\n          apiConfig.merchantNetworks = uniqueNetworks;\r\n          apiConfig.merchantTokens = uniqueTokens;\r\n          apiConfig.merchantWalletAddresses = networksData.merchantWallets || {};\r\n          \r\n          console.log('✅ Successfully configured:', {\r\n            networks: uniqueNetworks.length,\r\n            tokens: uniqueTokens.length,\r\n            wallets: Object.keys(networksData.merchantWallets || {}).length\r\n          });\r\n        }\r\n      } else {\r\n        console.warn('⚠️ Networks endpoint failed, trying fallback approach...');\r\n        await fetchDataWithFallback(tempToken);\r\n      }\r\n    } catch (error) {\r\n      console.warn('⚠️ Primary endpoint failed, trying fallback approach...', error.message);\r\n      await fetchDataWithFallback(tempToken);\r\n    }\r\n\r\n    // 2. Also fetch merchant dashboard for fee percentage\r\n    try {\r\n      const dashboardResponse = await fetch(`${apiConfig.apiUrl}/api/merchants/dashboard`, {\r\n        method: 'GET',\r\n        headers: {\r\n          'Content-Type': 'application/json',\r\n          'Authorization': `Bearer ${tempToken}`,\r\n          'x-api-key': apiConfig.apiKey,\r\n          'x-api-secret': apiConfig.apiSecret\r\n        }\r\n      });\r\n\r\n      if (dashboardResponse.ok) {\r\n        const dashboardData = await dashboardResponse.json();\r\n        console.log('✅ Merchant dashboard data received');\r\n        \r\n        if (dashboardData.merchant) {\r\n          // Get custom fee percentage\r\n          const customFeePercentage = dashboardData.merchant.customFeePercentage || 0.0175;\r\n          apiConfig.merchantFeePercentage = customFeePercentage;\r\n          \r\n          // Merge wallet addresses\r\n          if (dashboardData.merchant.walletAddress) {\r\n            apiConfig.merchantWalletAddresses.ethereum = dashboardData.merchant.walletAddress;\r\n          }\r\n          \r\n          if (dashboardData.merchant.solWalletAddress) {\r\n            apiConfig.merchantWalletAddresses.solana = dashboardData.merchant.solWalletAddress;\r\n          }\r\n          \r\n          if (dashboardData.merchant.merchantWallets) {\r\n            Object.assign(apiConfig.merchantWalletAddresses, dashboardData.merchant.merchantWallets);\r\n          }\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.warn('⚠️ Dashboard endpoint failed:', error.message);\r\n    }\r\n    \r\n    return {\r\n      networks: apiConfig.merchantNetworks,\r\n      tokens: apiConfig.merchantTokens,\r\n      walletAddresses: apiConfig.merchantWalletAddresses,\r\n      feePercentage: apiConfig.merchantFeePercentage\r\n    };\r\n  } catch (error) {\r\n    console.error('❌ Error fetching merchant data:', error);\r\n    return {\r\n      networks: [],\r\n      tokens: [],\r\n      walletAddresses: {},\r\n      feePercentage: 0.0175\r\n    };\r\n  }\r\n};\r\n\r\n/**\r\n * Fallback method to fetch data from individual endpoints\r\n */\r\nconst fetchDataWithFallback = async (tempToken) => {\r\n  try {\r\n    console.log('🔄 Using fallback data fetching...');\r\n    \r\n    // Try to get networks from general endpoint\r\n    const networksResponse = await fetch(`${apiConfig.apiUrl}/api/networks`, {\r\n      method: 'GET',\r\n      headers: {\r\n        'Content-Type': 'application/json'\r\n      }\r\n    });\r\n    \r\n    if (networksResponse.ok) {\r\n      const networksData = await networksResponse.json();\r\n      console.log('✅ Got networks from fallback endpoint:', networksData.networks?.length);\r\n      \r\n      // Use all available networks as fallback\r\n      apiConfig.merchantNetworks = networksData.networks || [];\r\n      \r\n      // For each network, try to get tokens\r\n      const allTokens = [];\r\n      for (const network of apiConfig.merchantNetworks) {\r\n        try {\r\n          const tokensResponse = await fetch(`${apiConfig.apiUrl}/api/networks/${network.id}/tokens`, {\r\n            method: 'GET',\r\n            headers: {\r\n              'Content-Type': 'application/json'\r\n            }\r\n          });\r\n          \r\n          if (tokensResponse.ok) {\r\n            const tokensData = await tokensResponse.json();\r\n            const tokensWithNetwork = (tokensData.tokens || []).map(token => ({\r\n              ...token,\r\n              Network: network,\r\n              networkId: network.id\r\n            }));\r\n            allTokens.push(...tokensWithNetwork);\r\n          }\r\n        } catch (error) {\r\n          console.warn(`⚠️ Failed to get tokens for network ${network.name}:`, error.message);\r\n        }\r\n      }\r\n      \r\n      // Filter out RLUSD tokens\r\n      apiConfig.merchantTokens = allTokens.filter(token => {\r\n        const isRLUSD = token.symbol?.toUpperCase() === 'RLUSD' ||\r\n          token.name?.toLowerCase().includes('raft locked');\r\n        return !isRLUSD;\r\n      });\r\n      \r\n      console.log('✅ Fallback data configured:', {\r\n        networks: apiConfig.merchantNetworks.length,\r\n        tokens: apiConfig.merchantTokens.length\r\n      });\r\n    }\r\n  } catch (error) {\r\n    console.error('❌ Fallback data fetching also failed:', error);\r\n    // Provide minimal default configuration\r\n    apiConfig.merchantNetworks = [\r\n      { id: 1, name: 'Ethereum', shortName: 'ethereum', type: 'ethereum' },\r\n      { id: 2, name: 'BSC', shortName: 'bsc', type: 'ethereum' }\r\n    ];\r\n    apiConfig.merchantTokens = [\r\n      { \r\n        id: 1, \r\n        symbol: 'USDT', \r\n        name: 'Tether USD', \r\n        Network: { shortName: 'ethereum', name: 'Ethereum' },\r\n        networkId: 1,\r\n        isStablecoin: true\r\n      },\r\n      { \r\n        id: 2, \r\n        symbol: 'USDC', \r\n        name: 'USD Coin', \r\n        Network: { shortName: 'ethereum', name: 'Ethereum' },\r\n        networkId: 1,\r\n        isStablecoin: true\r\n      }\r\n    ];\r\n  }\r\n};\r\n\r\n/**\r\n * Get merchant's configured networks with better error handling\r\n */\r\nexport const getMerchantNetworks = async () => {\r\n  // If we don't have networks, try to fetch them\r\n  if (apiConfig.merchantNetworks.length === 0) {\r\n    console.log('🔄 No networks cached, fetching...');\r\n    await authenticateAndFetchMerchantData();\r\n  }\r\n  \r\n  // If still no networks, return at least basic ones\r\n  if (apiConfig.merchantNetworks.length === 0) {\r\n    console.warn('⚠️ No networks available, returning defaults');\r\n    return [\r\n      { id: 1, name: 'Ethereum', shortName: 'ethereum', type: 'ethereum' },\r\n      { id: 2, name: 'BSC', shortName: 'bsc', type: 'ethereum' }\r\n    ];\r\n  }\r\n  \r\n  return apiConfig.merchantNetworks;\r\n};\r\n\r\n/**\r\n * Get merchant's supported tokens with better error handling\r\n */\r\nexport const getMerchantTokens = async (networkShortName = null) => {\r\n  // If we don't have tokens, try to fetch them\r\n  if (apiConfig.merchantTokens.length === 0) {\r\n    console.log('🔄 No tokens cached, fetching...');\r\n    await authenticateAndFetchMerchantData();\r\n  }\r\n  \r\n  // If still no tokens, return at least basic ones\r\n  if (apiConfig.merchantTokens.length === 0) {\r\n    console.warn('⚠️ No tokens available, returning defaults');\r\n    const defaultTokens = [\r\n      { \r\n        id: 1, \r\n        symbol: 'USDT', \r\n        name: 'Tether USD', \r\n        Network: { shortName: 'ethereum', name: 'Ethereum' },\r\n        networkId: 1,\r\n        isStablecoin: true\r\n      },\r\n      { \r\n        id: 2, \r\n        symbol: 'USDC', \r\n        name: 'USD Coin', \r\n        Network: { shortName: 'ethereum', name: 'Ethereum' },\r\n        networkId: 1,\r\n        isStablecoin: true\r\n      }\r\n    ];\r\n    \r\n    // Filter by network if specified\r\n    if (networkShortName) {\r\n      return defaultTokens.filter(token => \r\n        token.Network && token.Network.shortName === networkShortName\r\n      );\r\n    }\r\n    \r\n    return defaultTokens;\r\n  }\r\n  \r\n  // Filter by network if specified\r\n  if (networkShortName) {\r\n    return apiConfig.merchantTokens.filter(token => \r\n      token.Network && token.Network.shortName === networkShortName\r\n    );\r\n  }\r\n  \r\n  return apiConfig.merchantTokens;\r\n};\r\n\r\n// Keep all other existing functions unchanged...\r\nexport const getMerchantWallets = async () => {\r\n  if (Object.keys(apiConfig.merchantWalletAddresses).length === 0) {\r\n    await authenticateAndFetchMerchantData();\r\n  }\r\n  \r\n  return apiConfig.merchantWalletAddresses;\r\n};\r\n\r\nexport const getMerchantFeePercentage = async () => {\r\n  if (apiConfig.merchantFeePercentage === null) {\r\n    const result = await authenticateAndFetchMerchantData();\r\n    return result.feePercentage;\r\n  }\r\n  \r\n  return apiConfig.merchantFeePercentage;\r\n};\r\n\r\n// ... rest of the existing functions remain the same\r\nexport const isMerchantNetworkSupported = async (networkShortName) => {\r\n  const networks = await getMerchantNetworks();\r\n  return networks.some(network => network.shortName === networkShortName);\r\n};\r\n\r\nexport const isMerchantTokenSupported = async (tokenSymbol, networkShortName) => {\r\n  const tokens = await getMerchantTokens(networkShortName);\r\n  return tokens.some(token => \r\n    token.symbol === tokenSymbol && \r\n    token.Network && \r\n    token.Network.shortName === networkShortName\r\n  );\r\n};\r\n\r\nconst getHeaders = () => {\r\n  return {\r\n    'Content-Type': 'application/json',\r\n    'x-api-key': apiConfig.apiKey,\r\n    'x-api-secret': apiConfig.apiSecret,\r\n    'Authorization': apiConfig.authToken ? `Bearer ${apiConfig.authToken}` : undefined\r\n  };\r\n};\r\n\r\nexport const createPayment = async (paymentData) => {\r\n  try {\r\n    console.log('Creating payment with data:', paymentData);\r\n    \r\n    if (!paymentData.amount) {\r\n      throw new Error('Payment amount is required');\r\n    }\r\n\r\n    // Ensure we have merchant data\r\n    const merchantWallets = await getMerchantWallets();\r\n    console.log('Using merchant wallets:', merchantWallets);\r\n    \r\n    // Validate that the network and currency are supported by the merchant\r\n    const isNetworkSupported = await isMerchantNetworkSupported(paymentData.network);\r\n    if (!isNetworkSupported) {\r\n      throw new Error(`Network ${paymentData.network} is not configured for this merchant`);\r\n    }\r\n    \r\n    const isTokenSupported = await isMerchantTokenSupported(paymentData.currency, paymentData.network);\r\n    if (!isTokenSupported) {\r\n      throw new Error(`Token ${paymentData.currency} is not supported on ${paymentData.network} network for this merchant`);\r\n    }\r\n    \r\n    // Enhance payment data with merchant wallet addresses\r\n    const enhancedPaymentData = { \r\n      ...paymentData,\r\n      merchantWalletAddresses: {\r\n        ...merchantWallets,\r\n        ...paymentData.merchantWalletAddresses\r\n      }\r\n    };\r\n    \r\n    console.log('Enhanced payment data:', enhancedPaymentData);\r\n    \r\n    const response = await fetch(`${apiConfig.apiUrl}/api/payments/create`, {\r\n      method: 'POST',\r\n      headers: getHeaders(),\r\n      body: JSON.stringify(enhancedPaymentData)\r\n    });\r\n\r\n    console.log('Create payment response status:', response.status);\r\n    \r\n    if (!response.ok) {\r\n      let errorData;\r\n      try {\r\n        errorData = await response.json();\r\n      } catch (e) {\r\n        throw new Error(`Failed to create payment: ${response.status} ${response.statusText}`);\r\n      }\r\n      \r\n      console.error('Error creating payment:', errorData);\r\n      throw new Error(errorData.error || `Failed to create payment: ${response.status}`);\r\n    }\r\n\r\n    const data = await response.json();\r\n    console.log('Payment created successfully:', data);\r\n    \r\n    return data;\r\n  } catch (error) {\r\n    console.error('Create payment error:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n// Keep all other existing functions...\r\nexport const getPayment = async (paymentId) => {\r\n  try {\r\n    console.log('Getting payment:', paymentId);\r\n    \r\n    if (!paymentId) {\r\n      throw new Error('Payment ID is required');\r\n    }\r\n    \r\n    const response = await fetch(`${apiConfig.apiUrl}/api/payments/${paymentId}`, {\r\n      method: 'GET',\r\n      headers: getHeaders()\r\n    });\r\n\r\n    if (!response.ok) {\r\n      let errorData;\r\n      try {\r\n        errorData = await response.json();\r\n      } catch (e) {\r\n        throw new Error(`Failed to get payment: ${response.status} ${response.statusText}`);\r\n      }\r\n      \r\n      console.error('Error getting payment:', errorData);\r\n      throw new Error(errorData.error || `Failed to get payment: ${response.status}`);\r\n    }\r\n\r\n    const data = await response.json();\r\n    console.log('Get payment response:', data);\r\n    \r\n    return data;\r\n  } catch (error) {\r\n    console.error('Get payment error:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\nexport const processPayment = async (processData) => {\r\n  try {\r\n    console.log('Processing payment with data:', processData);\r\n    \r\n    if (!processData.paymentId) {\r\n      throw new Error('Payment ID is required');\r\n    }\r\n    \r\n    if (!processData.transactionHash) {\r\n      throw new Error('Transaction hash is required');\r\n    }\r\n    \r\n    const response = await fetch(`${apiConfig.apiUrl}/api/payments/process`, {\r\n      method: 'POST',\r\n      headers: getHeaders(),\r\n      body: JSON.stringify(processData)\r\n    });\r\n\r\n    console.log('Process payment response status:', response.status);\r\n    \r\n    if (!response.ok) {\r\n      let errorData;\r\n      try {\r\n        errorData = await response.json();\r\n      } catch (e) {\r\n        throw new Error(`Failed to process payment: ${response.status} ${response.statusText}`);\r\n      }\r\n      \r\n      console.error('Error processing payment:', errorData);\r\n      throw new Error(errorData.error || `Failed to process payment: ${response.status}`);\r\n    }\r\n\r\n    const data = await response.json();\r\n    console.log('Process payment response data:', data);\r\n    return data;\r\n  } catch (error) {\r\n    console.error('Process payment error:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\nexport const verifyQRPayment = async (paymentId) => {\r\n  try {\r\n    console.log('Verifying QR payment:', paymentId);\r\n    \r\n    if (!paymentId) {\r\n      throw new Error('Payment ID is required');\r\n    }\r\n    \r\n    const response = await fetch(`${apiConfig.apiUrl}/api/payments/verify-qr`, {\r\n      method: 'POST',\r\n      headers: getHeaders(),\r\n      body: JSON.stringify({ paymentId })\r\n    });\r\n\r\n    console.log('Verify QR payment response status:', response.status);\r\n    \r\n    if (!response.ok) {\r\n      let errorData;\r\n      try {\r\n        errorData = await response.json();\r\n      } catch (e) {\r\n        throw new Error(`Failed to verify payment: ${response.status} ${response.statusText}`);\r\n      }\r\n      \r\n      console.error('Error verifying QR payment:', errorData);\r\n      throw new Error(errorData.error || `Failed to verify payment: ${response.status}`);\r\n    }\r\n\r\n    const data = await response.json();\r\n    console.log('QR payment verification response:', data);\r\n    \r\n    return data;\r\n  } catch (error) {\r\n    console.error('QR payment verification error:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\nexport const getSupportedNetworks = async () => {\r\n  try {\r\n    const networks = await getMerchantNetworks();\r\n    const tokens = await getMerchantTokens();\r\n    \r\n    return {\r\n      success: true,\r\n      networks: networks,\r\n      tokens: tokens\r\n    };\r\n  } catch (error) {\r\n    console.error('Get supported networks error:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n// Export the current config for debugging\r\nexport const getApiConfig = () => apiConfig;\r\n\r\n// ✅ ADDED: Missing functions that were referenced in index.js\r\nexport const validateWalletAddress = async (address, network) => {\r\n  try {\r\n    const response = await fetch(`${apiConfig.apiUrl}/api/wallets/validate`, {\r\n      method: 'POST',\r\n      headers: getHeaders(),\r\n      body: JSON.stringify({ address, network })\r\n    });\r\n    \r\n    if (!response.ok) {\r\n      let errorData;\r\n      try {\r\n        errorData = await response.json();\r\n      } catch (e) {\r\n        throw new Error(`Failed to validate address: ${response.status} ${response.statusText}`);\r\n      }\r\n      \r\n      throw new Error(errorData.error || `Failed to validate address: ${response.status}`);\r\n    }\r\n    \r\n    const data = await response.json();\r\n    return data;\r\n  } catch (error) {\r\n    console.error('Validate wallet address error:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\nexport const generateMockTransactionHash = (network = 'ethereum') => {\r\n  const prefixes = {\r\n    ethereum: '0x',\r\n    bsc: '0x',\r\n    tron: '',\r\n    algorand: ''\r\n  };\r\n  \r\n  const prefix = prefixes[network] || '0x';\r\n  const hash = Array.from({length: 64}, () => \r\n    Math.floor(Math.random() * 16).toString(16)).join('');\r\n    \r\n  return `${prefix}${hash}`;\r\n};\r\n\r\nexport const getMerchantPayments = async (options = {}) => {\r\n  try {\r\n    const queryParams = new URLSearchParams();\r\n    \r\n    Object.entries(options).forEach(([key, value]) => {\r\n      if (value !== null && value !== undefined) {\r\n        queryParams.append(key, value);\r\n      }\r\n    });\r\n    \r\n    const response = await fetch(`${apiConfig.apiUrl}/api/payments?${queryParams}`, {\r\n      method: 'GET',\r\n      headers: getHeaders()\r\n    });\r\n    \r\n    if (!response.ok) {\r\n      let errorData;\r\n      try {\r\n        errorData = await response.json();\r\n      } catch (e) {\r\n        throw new Error(`Failed to get payments: ${response.status} ${response.statusText}`);\r\n      }\r\n      \r\n      throw new Error(errorData.error || `Failed to get payments: ${response.status}`);\r\n    }\r\n    \r\n    const data = await response.json();\r\n    return data;\r\n  } catch (error) {\r\n    console.error('Get merchant payments error:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\nexport const getMerchantPaymentStats = async () => {\r\n  try {\r\n    const response = await fetch(`${apiConfig.apiUrl}/api/payments/stats`, {\r\n      method: 'GET',\r\n      headers: getHeaders()\r\n    });\r\n    \r\n    if (!response.ok) {\r\n      let errorData;\r\n      try {\r\n        errorData = await response.json();\r\n      } catch (e) {\r\n        throw new Error(`Failed to get payment stats: ${response.status} ${response.statusText}`);\r\n      }\r\n      \r\n      throw new Error(errorData.error || `Failed to get payment stats: ${response.status}`);\r\n    }\r\n    \r\n    const data = await response.json();\r\n    return data;\r\n  } catch (error) {\r\n    console.error('Get payment stats error:', error);\r\n    throw error;\r\n  }\r\n};","// src/context/ThemeContext.jsx\r\nimport React, { createContext, useState, useContext, useEffect } from 'react';\r\n\r\nconst ThemeContext = createContext();\r\n\r\nexport const useTheme = () => useContext(ThemeContext);\r\n\r\nexport const ThemeProvider = ({ initialTheme = 'light', children }) => {\r\n  const [theme, setTheme] = useState(initialTheme);\r\n\r\n  const toggleTheme = () => {\r\n    setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');\r\n  };\r\n\r\n  useEffect(() => {\r\n    document.documentElement.classList.remove('light', 'dark');\r\n    document.documentElement.classList.add(theme);\r\n  }, [theme]);\r\n\r\n  return (\r\n    <ThemeContext.Provider value={{ theme, setTheme, toggleTheme }}>\r\n      {children}\r\n    </ThemeContext.Provider>\r\n  );\r\n};\r\n","// src/context/CoinleyContext.jsx - Updated with wallet-connect-core integration\r\nimport React, { createContext, useContext, useState, useEffect } from 'react';\r\nimport { initializeApi, getMerchantWallets } from '../services/api';\r\nimport { \r\n  CoinleyWalletProvider, \r\n  WalletModal,\r\n  initializeWalletCore \r\n} from '../services/walletCoreService';\r\n\r\n// Import shared styles\r\nimport '../styles/theme.css';\r\n\r\nconst CoinleyContext = createContext();\r\n\r\nexport const useCoinley = () => useContext(CoinleyContext);\r\n\r\nexport const CoinleyProvider = ({\r\n  apiKey,\r\n  apiSecret,\r\n  apiUrl = 'https://coinleyserver-production.up.railway.app',\r\n  merchantWalletAddress = null, // Legacy prop for backward compatibility\r\n  merchantSolWalletAddress = null, // Legacy prop for backward compatibility\r\n  debug = false,\r\n  // New wallet core configuration options\r\n  walletConfig = {},\r\n  projectId = null, // WalletConnect project ID (optional)\r\n  enableWalletModal = true,\r\n  children\r\n}) => {\r\n  const [isInitialized, setIsInitialized] = useState(false);\r\n  const [error, setError] = useState(null);\r\n  const [paymentData, setPaymentData] = useState(null);\r\n  const [merchantWallets, setMerchantWallets] = useState({});\r\n  const [walletCoreConfig, setWalletCoreConfig] = useState(null);\r\n\r\n  useEffect(() => {\r\n    if (!apiKey || !apiSecret) {\r\n      setError('API key and secret are required');\r\n      return;\r\n    }\r\n\r\n    const initializeSDK = async () => {\r\n      try {\r\n        // Initialize the API service\r\n        await initializeApi({\r\n          apiKey,\r\n          apiSecret,\r\n          apiUrl,\r\n          debug\r\n        });\r\n\r\n        // Initialize wallet core configuration\r\n        const coreConfig = initializeWalletCore({\r\n          appName: 'Coinley Checkout',\r\n          appDescription: 'Secure cryptocurrency payment processing',\r\n          projectId, // WalletConnect project ID (optional)\r\n          theme: 'auto',\r\n          enableAnalytics: false,\r\n          ...walletConfig\r\n        });\r\n        \r\n        setWalletCoreConfig(coreConfig);\r\n\r\n        // Fetch merchant wallet addresses\r\n        const wallets = await getMerchantWallets();\r\n        \r\n        // Merge with legacy props if provided\r\n        const allWallets = {\r\n          ...wallets,\r\n          ...(merchantWalletAddress && { ethereum: merchantWalletAddress }),\r\n          ...(merchantSolWalletAddress && { solana: merchantSolWalletAddress })\r\n        };\r\n\r\n        setMerchantWallets(allWallets);\r\n        setIsInitialized(true);\r\n\r\n      } catch (err) {\r\n        setError(err.message);\r\n        if (debug) {\r\n          console.error('Coinley SDK initialization error:', err);\r\n        }\r\n      }\r\n    };\r\n\r\n    initializeSDK();\r\n  }, [apiKey, apiSecret, apiUrl, merchantWalletAddress, merchantSolWalletAddress, debug, walletConfig, projectId]);\r\n\r\n  // Method to refresh merchant wallets\r\n  const refreshMerchantWallets = async () => {\r\n    try {\r\n      const wallets = await getMerchantWallets();\r\n      setMerchantWallets(wallets);\r\n      return wallets;\r\n    } catch (err) {\r\n      console.error('Failed to refresh merchant wallets:', err);\r\n      return merchantWallets;\r\n    }\r\n  };\r\n\r\n  // Method to store payment data from responses for easy context access\r\n  const storePaymentData = (data) => {\r\n    setPaymentData(data);\r\n    return data;\r\n  };\r\n\r\n  const value = {\r\n    apiKey,\r\n    apiSecret,\r\n    apiUrl,\r\n    merchantWalletAddress, // Legacy\r\n    merchantSolWalletAddress, // Legacy\r\n    merchantWallets, // New: All merchant wallets\r\n    isInitialized,\r\n    error,\r\n    debug,\r\n    paymentData,\r\n    storePaymentData,\r\n    refreshMerchantWallets,\r\n    // New wallet core properties\r\n    walletCoreConfig,\r\n    projectId,\r\n    enableWalletModal\r\n  };\r\n\r\n  if (!walletCoreConfig) {\r\n    return null\r\n  }\r\n\r\n  return (\r\n    <CoinleyContext.Provider value={value}>\r\n      <CoinleyWalletProvider \r\n        config={walletCoreConfig}\r\n        walletConfig={{\r\n          appName: 'Coinley Checkout',\r\n          theme: walletConfig.theme || 'auto'\r\n        }}\r\n      >\r\n        {children}\r\n        {enableWalletModal && <WalletModal />}\r\n      </CoinleyWalletProvider>\r\n    </CoinleyContext.Provider>\r\n  );\r\n};","var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp.call(b, prop))\n      __defNormalProp(a, prop, b[prop]);\n  if (__getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(b)) {\n      if (__propIsEnum.call(b, prop))\n        __defNormalProp(a, prop, b[prop]);\n    }\n  return a;\n};\nvar __objRest = (source, exclude) => {\n  var target = {};\n  for (var prop in source)\n    if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n      target[prop] = source[prop];\n  if (source != null && __getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(source)) {\n      if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n        target[prop] = source[prop];\n    }\n  return target;\n};\n\n// src/index.tsx\nimport React from \"react\";\n\n// src/third-party/qrcodegen/index.ts\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n  const _QrCode = class _QrCode {\n    /*-- Constructor (low level) and fields --*/\n    // Creates a new QR Code with the given version number,\n    // error correction level, data codeword bytes, and mask number.\n    // This is a low-level API that most users should not use directly.\n    // A mid-level API is the encodeSegments() function.\n    constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n      this.version = version;\n      this.errorCorrectionLevel = errorCorrectionLevel;\n      // The modules of this QR Code (false = light, true = dark).\n      // Immutable after constructor finishes. Accessed through getModule().\n      this.modules = [];\n      // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n      this.isFunction = [];\n      if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n        throw new RangeError(\"Version value out of range\");\n      if (msk < -1 || msk > 7)\n        throw new RangeError(\"Mask value out of range\");\n      this.size = version * 4 + 17;\n      let row = [];\n      for (let i = 0; i < this.size; i++)\n        row.push(false);\n      for (let i = 0; i < this.size; i++) {\n        this.modules.push(row.slice());\n        this.isFunction.push(row.slice());\n      }\n      this.drawFunctionPatterns();\n      const allCodewords = this.addEccAndInterleave(dataCodewords);\n      this.drawCodewords(allCodewords);\n      if (msk == -1) {\n        let minPenalty = 1e9;\n        for (let i = 0; i < 8; i++) {\n          this.applyMask(i);\n          this.drawFormatBits(i);\n          const penalty = this.getPenaltyScore();\n          if (penalty < minPenalty) {\n            msk = i;\n            minPenalty = penalty;\n          }\n          this.applyMask(i);\n        }\n      }\n      assert(0 <= msk && msk <= 7);\n      this.mask = msk;\n      this.applyMask(msk);\n      this.drawFormatBits(msk);\n      this.isFunction = [];\n    }\n    /*-- Static factory functions (high level) --*/\n    // Returns a QR Code representing the given Unicode text string at the given error correction level.\n    // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n    // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n    // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n    // ecl argument if it can be done without increasing the version.\n    static encodeText(text, ecl) {\n      const segs = qrcodegen2.QrSegment.makeSegments(text);\n      return _QrCode.encodeSegments(segs, ecl);\n    }\n    // Returns a QR Code representing the given binary data at the given error correction level.\n    // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n    // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n    // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n    static encodeBinary(data, ecl) {\n      const seg = qrcodegen2.QrSegment.makeBytes(data);\n      return _QrCode.encodeSegments([seg], ecl);\n    }\n    /*-- Static factory functions (mid level) --*/\n    // Returns a QR Code representing the given segments with the given encoding parameters.\n    // The smallest possible QR Code version within the given range is automatically\n    // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n    // may be higher than the ecl argument if it can be done without increasing the\n    // version. The mask number is either between 0 to 7 (inclusive) to force that\n    // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n    // This function allows the user to create a custom sequence of segments that switches\n    // between modes (such as alphanumeric and byte) to encode text in less space.\n    // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n    static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n      if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n        throw new RangeError(\"Invalid value\");\n      let version;\n      let dataUsedBits;\n      for (version = minVersion; ; version++) {\n        const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n        const usedBits = QrSegment.getTotalBits(segs, version);\n        if (usedBits <= dataCapacityBits2) {\n          dataUsedBits = usedBits;\n          break;\n        }\n        if (version >= maxVersion)\n          throw new RangeError(\"Data too long\");\n      }\n      for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n        if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n          ecl = newEcl;\n      }\n      let bb = [];\n      for (const seg of segs) {\n        appendBits(seg.mode.modeBits, 4, bb);\n        appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n        for (const b of seg.getData())\n          bb.push(b);\n      }\n      assert(bb.length == dataUsedBits);\n      const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n      assert(bb.length <= dataCapacityBits);\n      appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n      appendBits(0, (8 - bb.length % 8) % 8, bb);\n      assert(bb.length % 8 == 0);\n      for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n        appendBits(padByte, 8, bb);\n      let dataCodewords = [];\n      while (dataCodewords.length * 8 < bb.length)\n        dataCodewords.push(0);\n      bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n      return new _QrCode(version, ecl, dataCodewords, mask);\n    }\n    /*-- Accessor methods --*/\n    // Returns the color of the module (pixel) at the given coordinates, which is false\n    // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n    // If the given coordinates are out of bounds, then false (light) is returned.\n    getModule(x, y) {\n      return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n    }\n    // Modified to expose modules for easy access\n    getModules() {\n      return this.modules;\n    }\n    /*-- Private helper methods for constructor: Drawing function modules --*/\n    // Reads this object's version field, and draws and marks all function modules.\n    drawFunctionPatterns() {\n      for (let i = 0; i < this.size; i++) {\n        this.setFunctionModule(6, i, i % 2 == 0);\n        this.setFunctionModule(i, 6, i % 2 == 0);\n      }\n      this.drawFinderPattern(3, 3);\n      this.drawFinderPattern(this.size - 4, 3);\n      this.drawFinderPattern(3, this.size - 4);\n      const alignPatPos = this.getAlignmentPatternPositions();\n      const numAlign = alignPatPos.length;\n      for (let i = 0; i < numAlign; i++) {\n        for (let j = 0; j < numAlign; j++) {\n          if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n            this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n        }\n      }\n      this.drawFormatBits(0);\n      this.drawVersion();\n    }\n    // Draws two copies of the format bits (with its own error correction code)\n    // based on the given mask and this object's error correction level field.\n    drawFormatBits(mask) {\n      const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n      let rem = data;\n      for (let i = 0; i < 10; i++)\n        rem = rem << 1 ^ (rem >>> 9) * 1335;\n      const bits = (data << 10 | rem) ^ 21522;\n      assert(bits >>> 15 == 0);\n      for (let i = 0; i <= 5; i++)\n        this.setFunctionModule(8, i, getBit(bits, i));\n      this.setFunctionModule(8, 7, getBit(bits, 6));\n      this.setFunctionModule(8, 8, getBit(bits, 7));\n      this.setFunctionModule(7, 8, getBit(bits, 8));\n      for (let i = 9; i < 15; i++)\n        this.setFunctionModule(14 - i, 8, getBit(bits, i));\n      for (let i = 0; i < 8; i++)\n        this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n      for (let i = 8; i < 15; i++)\n        this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n      this.setFunctionModule(8, this.size - 8, true);\n    }\n    // Draws two copies of the version bits (with its own error correction code),\n    // based on this object's version field, iff 7 <= version <= 40.\n    drawVersion() {\n      if (this.version < 7)\n        return;\n      let rem = this.version;\n      for (let i = 0; i < 12; i++)\n        rem = rem << 1 ^ (rem >>> 11) * 7973;\n      const bits = this.version << 12 | rem;\n      assert(bits >>> 18 == 0);\n      for (let i = 0; i < 18; i++) {\n        const color = getBit(bits, i);\n        const a = this.size - 11 + i % 3;\n        const b = Math.floor(i / 3);\n        this.setFunctionModule(a, b, color);\n        this.setFunctionModule(b, a, color);\n      }\n    }\n    // Draws a 9*9 finder pattern including the border separator,\n    // with the center module at (x, y). Modules can be out of bounds.\n    drawFinderPattern(x, y) {\n      for (let dy = -4; dy <= 4; dy++) {\n        for (let dx = -4; dx <= 4; dx++) {\n          const dist = Math.max(Math.abs(dx), Math.abs(dy));\n          const xx = x + dx;\n          const yy = y + dy;\n          if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n            this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n        }\n      }\n    }\n    // Draws a 5*5 alignment pattern, with the center module\n    // at (x, y). All modules must be in bounds.\n    drawAlignmentPattern(x, y) {\n      for (let dy = -2; dy <= 2; dy++) {\n        for (let dx = -2; dx <= 2; dx++)\n          this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n      }\n    }\n    // Sets the color of a module and marks it as a function module.\n    // Only used by the constructor. Coordinates must be in bounds.\n    setFunctionModule(x, y, isDark) {\n      this.modules[y][x] = isDark;\n      this.isFunction[y][x] = true;\n    }\n    /*-- Private helper methods for constructor: Codewords and masking --*/\n    // Returns a new byte string representing the given data with the appropriate error correction\n    // codewords appended to it, based on this object's version and error correction level.\n    addEccAndInterleave(data) {\n      const ver = this.version;\n      const ecl = this.errorCorrectionLevel;\n      if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n        throw new RangeError(\"Invalid argument\");\n      const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n      const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n      const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n      const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n      const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n      let blocks = [];\n      const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n      for (let i = 0, k = 0; i < numBlocks; i++) {\n        let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n        k += dat.length;\n        const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n        if (i < numShortBlocks)\n          dat.push(0);\n        blocks.push(dat.concat(ecc));\n      }\n      let result = [];\n      for (let i = 0; i < blocks[0].length; i++) {\n        blocks.forEach((block, j) => {\n          if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n            result.push(block[i]);\n        });\n      }\n      assert(result.length == rawCodewords);\n      return result;\n    }\n    // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n    // data area of this QR Code. Function modules need to be marked off before this is called.\n    drawCodewords(data) {\n      if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n        throw new RangeError(\"Invalid argument\");\n      let i = 0;\n      for (let right = this.size - 1; right >= 1; right -= 2) {\n        if (right == 6)\n          right = 5;\n        for (let vert = 0; vert < this.size; vert++) {\n          for (let j = 0; j < 2; j++) {\n            const x = right - j;\n            const upward = (right + 1 & 2) == 0;\n            const y = upward ? this.size - 1 - vert : vert;\n            if (!this.isFunction[y][x] && i < data.length * 8) {\n              this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n              i++;\n            }\n          }\n        }\n      }\n      assert(i == data.length * 8);\n    }\n    // XORs the codeword modules in this QR Code with the given mask pattern.\n    // The function modules must be marked and the codeword bits must be drawn\n    // before masking. Due to the arithmetic of XOR, calling applyMask() with\n    // the same mask value a second time will undo the mask. A final well-formed\n    // QR Code needs exactly one (not zero, two, etc.) mask applied.\n    applyMask(mask) {\n      if (mask < 0 || mask > 7)\n        throw new RangeError(\"Mask value out of range\");\n      for (let y = 0; y < this.size; y++) {\n        for (let x = 0; x < this.size; x++) {\n          let invert;\n          switch (mask) {\n            case 0:\n              invert = (x + y) % 2 == 0;\n              break;\n            case 1:\n              invert = y % 2 == 0;\n              break;\n            case 2:\n              invert = x % 3 == 0;\n              break;\n            case 3:\n              invert = (x + y) % 3 == 0;\n              break;\n            case 4:\n              invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n              break;\n            case 5:\n              invert = x * y % 2 + x * y % 3 == 0;\n              break;\n            case 6:\n              invert = (x * y % 2 + x * y % 3) % 2 == 0;\n              break;\n            case 7:\n              invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n              break;\n            default:\n              throw new Error(\"Unreachable\");\n          }\n          if (!this.isFunction[y][x] && invert)\n            this.modules[y][x] = !this.modules[y][x];\n        }\n      }\n    }\n    // Calculates and returns the penalty score based on state of this QR Code's current modules.\n    // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n    getPenaltyScore() {\n      let result = 0;\n      for (let y = 0; y < this.size; y++) {\n        let runColor = false;\n        let runX = 0;\n        let runHistory = [0, 0, 0, 0, 0, 0, 0];\n        for (let x = 0; x < this.size; x++) {\n          if (this.modules[y][x] == runColor) {\n            runX++;\n            if (runX == 5)\n              result += _QrCode.PENALTY_N1;\n            else if (runX > 5)\n              result++;\n          } else {\n            this.finderPenaltyAddHistory(runX, runHistory);\n            if (!runColor)\n              result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n            runColor = this.modules[y][x];\n            runX = 1;\n          }\n        }\n        result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n      }\n      for (let x = 0; x < this.size; x++) {\n        let runColor = false;\n        let runY = 0;\n        let runHistory = [0, 0, 0, 0, 0, 0, 0];\n        for (let y = 0; y < this.size; y++) {\n          if (this.modules[y][x] == runColor) {\n            runY++;\n            if (runY == 5)\n              result += _QrCode.PENALTY_N1;\n            else if (runY > 5)\n              result++;\n          } else {\n            this.finderPenaltyAddHistory(runY, runHistory);\n            if (!runColor)\n              result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n            runColor = this.modules[y][x];\n            runY = 1;\n          }\n        }\n        result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n      }\n      for (let y = 0; y < this.size - 1; y++) {\n        for (let x = 0; x < this.size - 1; x++) {\n          const color = this.modules[y][x];\n          if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n            result += _QrCode.PENALTY_N2;\n        }\n      }\n      let dark = 0;\n      for (const row of this.modules)\n        dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n      const total = this.size * this.size;\n      const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n      assert(0 <= k && k <= 9);\n      result += k * _QrCode.PENALTY_N4;\n      assert(0 <= result && result <= 2568888);\n      return result;\n    }\n    /*-- Private helper functions --*/\n    // Returns an ascending list of positions of alignment patterns for this version number.\n    // Each position is in the range [0,177), and are used on both the x and y axes.\n    // This could be implemented as lookup table of 40 variable-length lists of integers.\n    getAlignmentPatternPositions() {\n      if (this.version == 1)\n        return [];\n      else {\n        const numAlign = Math.floor(this.version / 7) + 2;\n        const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n        let result = [6];\n        for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n          result.splice(1, 0, pos);\n        return result;\n      }\n    }\n    // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n    // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n    // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n    static getNumRawDataModules(ver) {\n      if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n        throw new RangeError(\"Version number out of range\");\n      let result = (16 * ver + 128) * ver + 64;\n      if (ver >= 2) {\n        const numAlign = Math.floor(ver / 7) + 2;\n        result -= (25 * numAlign - 10) * numAlign - 55;\n        if (ver >= 7)\n          result -= 36;\n      }\n      assert(208 <= result && result <= 29648);\n      return result;\n    }\n    // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n    // QR Code of the given version number and error correction level, with remainder bits discarded.\n    // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n    static getNumDataCodewords(ver, ecl) {\n      return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n    }\n    // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n    // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n    static reedSolomonComputeDivisor(degree) {\n      if (degree < 1 || degree > 255)\n        throw new RangeError(\"Degree out of range\");\n      let result = [];\n      for (let i = 0; i < degree - 1; i++)\n        result.push(0);\n      result.push(1);\n      let root = 1;\n      for (let i = 0; i < degree; i++) {\n        for (let j = 0; j < result.length; j++) {\n          result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n          if (j + 1 < result.length)\n            result[j] ^= result[j + 1];\n        }\n        root = _QrCode.reedSolomonMultiply(root, 2);\n      }\n      return result;\n    }\n    // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n    static reedSolomonComputeRemainder(data, divisor) {\n      let result = divisor.map((_) => 0);\n      for (const b of data) {\n        const factor = b ^ result.shift();\n        result.push(0);\n        divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n      }\n      return result;\n    }\n    // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n    // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n    static reedSolomonMultiply(x, y) {\n      if (x >>> 8 != 0 || y >>> 8 != 0)\n        throw new RangeError(\"Byte out of range\");\n      let z = 0;\n      for (let i = 7; i >= 0; i--) {\n        z = z << 1 ^ (z >>> 7) * 285;\n        z ^= (y >>> i & 1) * x;\n      }\n      assert(z >>> 8 == 0);\n      return z;\n    }\n    // Can only be called immediately after a light run is added, and\n    // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n    finderPenaltyCountPatterns(runHistory) {\n      const n = runHistory[1];\n      assert(n <= this.size * 3);\n      const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n      return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n    }\n    // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n    finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n      if (currentRunColor) {\n        this.finderPenaltyAddHistory(currentRunLength, runHistory);\n        currentRunLength = 0;\n      }\n      currentRunLength += this.size;\n      this.finderPenaltyAddHistory(currentRunLength, runHistory);\n      return this.finderPenaltyCountPatterns(runHistory);\n    }\n    // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n    finderPenaltyAddHistory(currentRunLength, runHistory) {\n      if (runHistory[0] == 0)\n        currentRunLength += this.size;\n      runHistory.pop();\n      runHistory.unshift(currentRunLength);\n    }\n  };\n  /*-- Constants and tables --*/\n  // The minimum version number supported in the QR Code Model 2 standard.\n  _QrCode.MIN_VERSION = 1;\n  // The maximum version number supported in the QR Code Model 2 standard.\n  _QrCode.MAX_VERSION = 40;\n  // For use in getPenaltyScore(), when evaluating which mask is best.\n  _QrCode.PENALTY_N1 = 3;\n  _QrCode.PENALTY_N2 = 3;\n  _QrCode.PENALTY_N3 = 40;\n  _QrCode.PENALTY_N4 = 10;\n  _QrCode.ECC_CODEWORDS_PER_BLOCK = [\n    // Version: (note that index 0 is for padding, and is set to an illegal value)\n    //0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40    Error correction level\n    [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n    // Low\n    [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n    // Medium\n    [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n    // Quartile\n    [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n    // High\n  ];\n  _QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n    // Version: (note that index 0 is for padding, and is set to an illegal value)\n    //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40    Error correction level\n    [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n    // Low\n    [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n    // Medium\n    [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n    // Quartile\n    [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n    // High\n  ];\n  let QrCode = _QrCode;\n  qrcodegen2.QrCode = _QrCode;\n  function appendBits(val, len, bb) {\n    if (len < 0 || len > 31 || val >>> len != 0)\n      throw new RangeError(\"Value out of range\");\n    for (let i = len - 1; i >= 0; i--)\n      bb.push(val >>> i & 1);\n  }\n  function getBit(x, i) {\n    return (x >>> i & 1) != 0;\n  }\n  function assert(cond) {\n    if (!cond)\n      throw new Error(\"Assertion error\");\n  }\n  const _QrSegment = class _QrSegment {\n    /*-- Constructor (low level) and fields --*/\n    // Creates a new QR Code segment with the given attributes and data.\n    // The character count (numChars) must agree with the mode and the bit buffer length,\n    // but the constraint isn't checked. The given bit buffer is cloned and stored.\n    constructor(mode, numChars, bitData) {\n      this.mode = mode;\n      this.numChars = numChars;\n      this.bitData = bitData;\n      if (numChars < 0)\n        throw new RangeError(\"Invalid argument\");\n      this.bitData = bitData.slice();\n    }\n    /*-- Static factory functions (mid level) --*/\n    // Returns a segment representing the given binary data encoded in\n    // byte mode. All input byte arrays are acceptable. Any text string\n    // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n    static makeBytes(data) {\n      let bb = [];\n      for (const b of data)\n        appendBits(b, 8, bb);\n      return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n    }\n    // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n    static makeNumeric(digits) {\n      if (!_QrSegment.isNumeric(digits))\n        throw new RangeError(\"String contains non-numeric characters\");\n      let bb = [];\n      for (let i = 0; i < digits.length; ) {\n        const n = Math.min(digits.length - i, 3);\n        appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n        i += n;\n      }\n      return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n    }\n    // Returns a segment representing the given text string encoded in alphanumeric mode.\n    // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n    // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n    static makeAlphanumeric(text) {\n      if (!_QrSegment.isAlphanumeric(text))\n        throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n      let bb = [];\n      let i;\n      for (i = 0; i + 2 <= text.length; i += 2) {\n        let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n        temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n        appendBits(temp, 11, bb);\n      }\n      if (i < text.length)\n        appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n      return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n    }\n    // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n    // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n    static makeSegments(text) {\n      if (text == \"\")\n        return [];\n      else if (_QrSegment.isNumeric(text))\n        return [_QrSegment.makeNumeric(text)];\n      else if (_QrSegment.isAlphanumeric(text))\n        return [_QrSegment.makeAlphanumeric(text)];\n      else\n        return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n    }\n    // Returns a segment representing an Extended Channel Interpretation\n    // (ECI) designator with the given assignment value.\n    static makeEci(assignVal) {\n      let bb = [];\n      if (assignVal < 0)\n        throw new RangeError(\"ECI assignment value out of range\");\n      else if (assignVal < 1 << 7)\n        appendBits(assignVal, 8, bb);\n      else if (assignVal < 1 << 14) {\n        appendBits(2, 2, bb);\n        appendBits(assignVal, 14, bb);\n      } else if (assignVal < 1e6) {\n        appendBits(6, 3, bb);\n        appendBits(assignVal, 21, bb);\n      } else\n        throw new RangeError(\"ECI assignment value out of range\");\n      return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n    }\n    // Tests whether the given string can be encoded as a segment in numeric mode.\n    // A string is encodable iff each character is in the range 0 to 9.\n    static isNumeric(text) {\n      return _QrSegment.NUMERIC_REGEX.test(text);\n    }\n    // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n    // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n    // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n    static isAlphanumeric(text) {\n      return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n    }\n    /*-- Methods --*/\n    // Returns a new copy of the data bits of this segment.\n    getData() {\n      return this.bitData.slice();\n    }\n    // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n    // the given version. The result is infinity if a segment has too many characters to fit its length field.\n    static getTotalBits(segs, version) {\n      let result = 0;\n      for (const seg of segs) {\n        const ccbits = seg.mode.numCharCountBits(version);\n        if (seg.numChars >= 1 << ccbits)\n          return Infinity;\n        result += 4 + ccbits + seg.bitData.length;\n      }\n      return result;\n    }\n    // Returns a new array of bytes representing the given string encoded in UTF-8.\n    static toUtf8ByteArray(str) {\n      str = encodeURI(str);\n      let result = [];\n      for (let i = 0; i < str.length; i++) {\n        if (str.charAt(i) != \"%\")\n          result.push(str.charCodeAt(i));\n        else {\n          result.push(parseInt(str.substring(i + 1, i + 3), 16));\n          i += 2;\n        }\n      }\n      return result;\n    }\n  };\n  /*-- Constants --*/\n  // Describes precisely all strings that are encodable in numeric mode.\n  _QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n  // Describes precisely all strings that are encodable in alphanumeric mode.\n  _QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n  // The set of all legal characters in alphanumeric mode,\n  // where each character value maps to the index in the string.\n  _QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n  let QrSegment = _QrSegment;\n  qrcodegen2.QrSegment = _QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n  let QrCode;\n  ((QrCode2) => {\n    const _Ecc = class _Ecc {\n      // The QR Code can tolerate about 30% erroneous codewords\n      /*-- Constructor and fields --*/\n      constructor(ordinal, formatBits) {\n        this.ordinal = ordinal;\n        this.formatBits = formatBits;\n      }\n    };\n    /*-- Constants --*/\n    _Ecc.LOW = new _Ecc(0, 1);\n    // The QR Code can tolerate about  7% erroneous codewords\n    _Ecc.MEDIUM = new _Ecc(1, 0);\n    // The QR Code can tolerate about 15% erroneous codewords\n    _Ecc.QUARTILE = new _Ecc(2, 3);\n    // The QR Code can tolerate about 25% erroneous codewords\n    _Ecc.HIGH = new _Ecc(3, 2);\n    let Ecc = _Ecc;\n    QrCode2.Ecc = _Ecc;\n  })(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n  let QrSegment;\n  ((QrSegment2) => {\n    const _Mode = class _Mode {\n      /*-- Constructor and fields --*/\n      constructor(modeBits, numBitsCharCount) {\n        this.modeBits = modeBits;\n        this.numBitsCharCount = numBitsCharCount;\n      }\n      /*-- Method --*/\n      // (Package-private) Returns the bit width of the character count field for a segment in\n      // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n      numCharCountBits(ver) {\n        return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n      }\n    };\n    /*-- Constants --*/\n    _Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n    _Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n    _Mode.BYTE = new _Mode(4, [8, 16, 16]);\n    _Mode.KANJI = new _Mode(8, [8, 10, 12]);\n    _Mode.ECI = new _Mode(7, [0, 0, 0]);\n    let Mode = _Mode;\n    QrSegment2.Mode = _Mode;\n  })(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n\n// src/index.tsx\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n  L: qrcodegen_default.QrCode.Ecc.LOW,\n  M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n  Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n  H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar DEFAULT_MINVERSION = 1;\nvar SPEC_MARGIN_SIZE = 4;\nvar DEFAULT_MARGIN_SIZE = 0;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n  const ops = [];\n  modules.forEach(function(row, y) {\n    let start = null;\n    row.forEach(function(cell, x) {\n      if (!cell && start !== null) {\n        ops.push(\n          `M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`\n        );\n        start = null;\n        return;\n      }\n      if (x === row.length - 1) {\n        if (!cell) {\n          return;\n        }\n        if (start === null) {\n          ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n        } else {\n          ops.push(\n            `M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`\n          );\n        }\n        return;\n      }\n      if (cell && start === null) {\n        start = x;\n      }\n    });\n  });\n  return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n  return modules.slice().map((row, y) => {\n    if (y < excavation.y || y >= excavation.y + excavation.h) {\n      return row;\n    }\n    return row.map((cell, x) => {\n      if (x < excavation.x || x >= excavation.x + excavation.w) {\n        return cell;\n      }\n      return false;\n    });\n  });\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n  if (imageSettings == null) {\n    return null;\n  }\n  const numCells = cells.length + margin * 2;\n  const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n  const scale = numCells / size;\n  const w = (imageSettings.width || defaultSize) * scale;\n  const h = (imageSettings.height || defaultSize) * scale;\n  const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n  const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n  const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;\n  let excavation = null;\n  if (imageSettings.excavate) {\n    let floorX = Math.floor(x);\n    let floorY = Math.floor(y);\n    let ceilW = Math.ceil(w + x - floorX);\n    let ceilH = Math.ceil(h + y - floorY);\n    excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n  }\n  const crossOrigin = imageSettings.crossOrigin;\n  return { x, y, h, w, excavation, opacity, crossOrigin };\n}\nfunction getMarginSize(includeMargin, marginSize) {\n  if (marginSize != null) {\n    return Math.max(Math.floor(marginSize), 0);\n  }\n  return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;\n}\nfunction useQRCode({\n  value,\n  level,\n  minVersion,\n  includeMargin,\n  marginSize,\n  imageSettings,\n  size,\n  boostLevel\n}) {\n  let qrcode = React.useMemo(() => {\n    const values = Array.isArray(value) ? value : [value];\n    const segments = values.reduce((accum, v) => {\n      accum.push(...qrcodegen_default.QrSegment.makeSegments(v));\n      return accum;\n    }, []);\n    return qrcodegen_default.QrCode.encodeSegments(\n      segments,\n      ERROR_LEVEL_MAP[level],\n      minVersion,\n      void 0,\n      void 0,\n      boostLevel\n    );\n  }, [value, level, minVersion, boostLevel]);\n  const { cells, margin, numCells, calculatedImageSettings } = React.useMemo(() => {\n    let cells2 = qrcode.getModules();\n    const margin2 = getMarginSize(includeMargin, marginSize);\n    const numCells2 = cells2.length + margin2 * 2;\n    const calculatedImageSettings2 = getImageSettings(\n      cells2,\n      size,\n      margin2,\n      imageSettings\n    );\n    return {\n      cells: cells2,\n      margin: margin2,\n      numCells: numCells2,\n      calculatedImageSettings: calculatedImageSettings2\n    };\n  }, [qrcode, size, imageSettings, includeMargin, marginSize]);\n  return {\n    qrcode,\n    margin,\n    cells,\n    numCells,\n    calculatedImageSettings\n  };\n}\nvar SUPPORTS_PATH2D = function() {\n  try {\n    new Path2D().addPath(new Path2D());\n  } catch (e) {\n    return false;\n  }\n  return true;\n}();\nvar QRCodeCanvas = React.forwardRef(\n  function QRCodeCanvas2(props, forwardedRef) {\n    const _a = props, {\n      value,\n      size = DEFAULT_SIZE,\n      level = DEFAULT_LEVEL,\n      bgColor = DEFAULT_BGCOLOR,\n      fgColor = DEFAULT_FGCOLOR,\n      includeMargin = DEFAULT_INCLUDEMARGIN,\n      minVersion = DEFAULT_MINVERSION,\n      boostLevel,\n      marginSize,\n      imageSettings\n    } = _a, extraProps = __objRest(_a, [\n      \"value\",\n      \"size\",\n      \"level\",\n      \"bgColor\",\n      \"fgColor\",\n      \"includeMargin\",\n      \"minVersion\",\n      \"boostLevel\",\n      \"marginSize\",\n      \"imageSettings\"\n    ]);\n    const _b = extraProps, { style } = _b, otherProps = __objRest(_b, [\"style\"]);\n    const imgSrc = imageSettings == null ? void 0 : imageSettings.src;\n    const _canvas = React.useRef(null);\n    const _image = React.useRef(null);\n    const setCanvasRef = React.useCallback(\n      (node) => {\n        _canvas.current = node;\n        if (typeof forwardedRef === \"function\") {\n          forwardedRef(node);\n        } else if (forwardedRef) {\n          forwardedRef.current = node;\n        }\n      },\n      [forwardedRef]\n    );\n    const [isImgLoaded, setIsImageLoaded] = React.useState(false);\n    const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n      value,\n      level,\n      minVersion,\n      boostLevel,\n      includeMargin,\n      marginSize,\n      imageSettings,\n      size\n    });\n    React.useEffect(() => {\n      if (_canvas.current != null) {\n        const canvas = _canvas.current;\n        const ctx = canvas.getContext(\"2d\");\n        if (!ctx) {\n          return;\n        }\n        let cellsToDraw = cells;\n        const image = _image.current;\n        const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;\n        if (haveImageToRender) {\n          if (calculatedImageSettings.excavation != null) {\n            cellsToDraw = excavateModules(\n              cells,\n              calculatedImageSettings.excavation\n            );\n          }\n        }\n        const pixelRatio = window.devicePixelRatio || 1;\n        canvas.height = canvas.width = size * pixelRatio;\n        const scale = size / numCells * pixelRatio;\n        ctx.scale(scale, scale);\n        ctx.fillStyle = bgColor;\n        ctx.fillRect(0, 0, numCells, numCells);\n        ctx.fillStyle = fgColor;\n        if (SUPPORTS_PATH2D) {\n          ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));\n        } else {\n          cells.forEach(function(row, rdx) {\n            row.forEach(function(cell, cdx) {\n              if (cell) {\n                ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n              }\n            });\n          });\n        }\n        if (calculatedImageSettings) {\n          ctx.globalAlpha = calculatedImageSettings.opacity;\n        }\n        if (haveImageToRender) {\n          ctx.drawImage(\n            image,\n            calculatedImageSettings.x + margin,\n            calculatedImageSettings.y + margin,\n            calculatedImageSettings.w,\n            calculatedImageSettings.h\n          );\n        }\n      }\n    });\n    React.useEffect(() => {\n      setIsImageLoaded(false);\n    }, [imgSrc]);\n    const canvasStyle = __spreadValues({ height: size, width: size }, style);\n    let img = null;\n    if (imgSrc != null) {\n      img = /* @__PURE__ */ React.createElement(\n        \"img\",\n        {\n          src: imgSrc,\n          key: imgSrc,\n          style: { display: \"none\" },\n          onLoad: () => {\n            setIsImageLoaded(true);\n          },\n          ref: _image,\n          crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin\n        }\n      );\n    }\n    return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\n      \"canvas\",\n      __spreadValues({\n        style: canvasStyle,\n        height: size,\n        width: size,\n        ref: setCanvasRef,\n        role: \"img\"\n      }, otherProps)\n    ), img);\n  }\n);\nQRCodeCanvas.displayName = \"QRCodeCanvas\";\nvar QRCodeSVG = React.forwardRef(\n  function QRCodeSVG2(props, forwardedRef) {\n    const _a = props, {\n      value,\n      size = DEFAULT_SIZE,\n      level = DEFAULT_LEVEL,\n      bgColor = DEFAULT_BGCOLOR,\n      fgColor = DEFAULT_FGCOLOR,\n      includeMargin = DEFAULT_INCLUDEMARGIN,\n      minVersion = DEFAULT_MINVERSION,\n      boostLevel,\n      title,\n      marginSize,\n      imageSettings\n    } = _a, otherProps = __objRest(_a, [\n      \"value\",\n      \"size\",\n      \"level\",\n      \"bgColor\",\n      \"fgColor\",\n      \"includeMargin\",\n      \"minVersion\",\n      \"boostLevel\",\n      \"title\",\n      \"marginSize\",\n      \"imageSettings\"\n    ]);\n    const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n      value,\n      level,\n      minVersion,\n      boostLevel,\n      includeMargin,\n      marginSize,\n      imageSettings,\n      size\n    });\n    let cellsToDraw = cells;\n    let image = null;\n    if (imageSettings != null && calculatedImageSettings != null) {\n      if (calculatedImageSettings.excavation != null) {\n        cellsToDraw = excavateModules(\n          cells,\n          calculatedImageSettings.excavation\n        );\n      }\n      image = /* @__PURE__ */ React.createElement(\n        \"image\",\n        {\n          href: imageSettings.src,\n          height: calculatedImageSettings.h,\n          width: calculatedImageSettings.w,\n          x: calculatedImageSettings.x + margin,\n          y: calculatedImageSettings.y + margin,\n          preserveAspectRatio: \"none\",\n          opacity: calculatedImageSettings.opacity,\n          crossOrigin: calculatedImageSettings.crossOrigin\n        }\n      );\n    }\n    const fgPath = generatePath(cellsToDraw, margin);\n    return /* @__PURE__ */ React.createElement(\n      \"svg\",\n      __spreadValues({\n        height: size,\n        width: size,\n        viewBox: `0 0 ${numCells} ${numCells}`,\n        ref: forwardedRef,\n        role: \"img\"\n      }, otherProps),\n      !!title && /* @__PURE__ */ React.createElement(\"title\", null, title),\n      /* @__PURE__ */ React.createElement(\n        \"path\",\n        {\n          fill: bgColor,\n          d: `M0,0 h${numCells}v${numCells}H0z`,\n          shapeRendering: \"crispEdges\"\n        }\n      ),\n      /* @__PURE__ */ React.createElement(\"path\", { fill: fgColor, d: fgPath, shapeRendering: \"crispEdges\" }),\n      image\n    );\n  }\n);\nQRCodeSVG.displayName = \"QRCodeSVG\";\nexport {\n  QRCodeCanvas,\n  QRCodeSVG\n};\n","\r\n// // src/components/QRCode.jsx \r\n// import React, { useEffect, useState } from 'react';\r\n// import { QRCodeSVG } from 'qrcode.react';\r\n\r\n// /**\r\n//  * Enhanced QR Code component that generates network-specific payment QR codes\r\n//  * Now includes Phantom/Solana support\r\n//  */\r\n// const QRCode = ({ \r\n//   walletAddress, \r\n//   amount, \r\n//   currency, \r\n//   network,\r\n//   theme = 'light',\r\n//   size = 200 \r\n// }) => {\r\n//   const [qrData, setQrData] = useState('');\r\n//   const [qrError, setQrError] = useState(null);\r\n//   const [isGenerating, setIsGenerating] = useState(true);\r\n  \r\n//   useEffect(() => {\r\n//     generatePaymentQRData();\r\n//   }, [walletAddress, amount, currency, network]);\r\n\r\n//   const generatePaymentQRData = () => {\r\n//     if (!walletAddress || walletAddress === 'No address configured') {\r\n//       setQrError('No wallet address configured for this network');\r\n//       setIsGenerating(false);\r\n//       return;\r\n//     }\r\n    \r\n//     try {\r\n//       setIsGenerating(true);\r\n//       let paymentData;\r\n      \r\n//       // Format QR code data based on network and currency\r\n//       switch (network.toLowerCase()) {\r\n//         case 'algorand':\r\n//           paymentData = generateAlgorandQR(walletAddress, amount, currency);\r\n//           break;\r\n          \r\n//         case 'tron':\r\n//           paymentData = generateTronQR(walletAddress, amount, currency);\r\n//           break;\r\n          \r\n//         case 'bsc':\r\n//           paymentData = generateBSCQR(walletAddress, amount, currency);\r\n//           break;\r\n          \r\n//         case 'solana':\r\n//           paymentData = generateSolanaQR(walletAddress, amount, currency);\r\n//           break;\r\n          \r\n//         case 'ethereum':\r\n//         default:\r\n//           paymentData = generateEthereumQR(walletAddress, amount, currency);\r\n//           break;\r\n//       }\r\n      \r\n//       setQrData(paymentData);\r\n//       setQrError(null);\r\n//       setIsGenerating(false);\r\n      \r\n//       // Debug logging to see what QR code is generated\r\n//       console.log('=== QR CODE DEBUG ===');\r\n//       console.log('Network:', network);\r\n//       console.log('Currency:', currency);\r\n//       console.log('Amount:', amount);\r\n//       console.log('Wallet Address:', walletAddress);\r\n//       console.log('Generated QR Data:', paymentData);\r\n//       console.log('QR Data Length:', paymentData.length);\r\n//       console.log('=== END QR DEBUG ===');\r\n//     } catch (err) {\r\n//       console.error('Error generating QR code:', err);\r\n//       setQrError('Error generating payment QR code');\r\n//       setIsGenerating(false);\r\n//     }\r\n//   };\r\n\r\n//   // Generate Ethereum QR code\r\n//   const generateEthereumQR = (address, amount, currency) => {\r\n//     const amountFloat = parseFloat(amount);\r\n    \r\n//     if (currency === 'ETH') {\r\n//       // Native ETH transfer\r\n//       const amountWei = (amountFloat * 1e18).toString();\r\n//       return `ethereum:${address}@1?value=${amountWei}`;\r\n//     } else {\r\n//       // ERC20 token transfer\r\n//       const tokenConfig = getTokenConfigForCurrency(currency, 'ethereum');\r\n//       if (tokenConfig && tokenConfig.contractAddress) {\r\n//         const decimals = tokenConfig.decimals || 18;\r\n//         const amountInSmallestUnit = (amountFloat * Math.pow(10, decimals)).toString();\r\n//         return `ethereum:${tokenConfig.contractAddress}/transfer?address=${address}&uint256=${amountInSmallestUnit}`;\r\n//       } else {\r\n//         // Fallback to just the address\r\n//         return address;\r\n//       }\r\n//     }\r\n//   };\r\n\r\n//   // Generate BSC QR code\r\n//   const generateBSCQR = (address, amount, currency) => {\r\n//     const amountFloat = parseFloat(amount);\r\n    \r\n//     if (currency === 'BNB') {\r\n//       // Native BNB transfer\r\n//       const amountWei = (amountFloat * 1e18).toString();\r\n//       return `ethereum:${address}@56?value=${amountWei}`;\r\n//     } else {\r\n//       // BEP20 token transfer\r\n//       const tokenConfig = getTokenConfigForCurrency(currency, 'bsc');\r\n//       if (tokenConfig && tokenConfig.contractAddress) {\r\n//         const decimals = tokenConfig.decimals || 18;\r\n//         const amountInSmallestUnit = (amountFloat * Math.pow(10, decimals)).toString();\r\n//         return `ethereum:${tokenConfig.contractAddress}/transfer?address=${address}&uint256=${amountInSmallestUnit}@56`;\r\n//       } else {\r\n//         return address;\r\n//       }\r\n//     }\r\n//   };\r\n\r\n//   // Generate TRON QR code\r\n//   const generateTronQR = (address, amount, currency) => {\r\n//     const amountFloat = parseFloat(amount);\r\n    \r\n//     if (currency === 'TRX') {\r\n//       // Native TRX transfer\r\n//       const amountSun = (amountFloat * 1e6).toString();\r\n//       return `tronlink://transfer?to=${address}&amount=${amountSun}`;\r\n//     } else {\r\n//       // TRC20 token transfer\r\n//       const tokenConfig = getTokenConfigForCurrency(currency, 'tron');\r\n//       if (tokenConfig && tokenConfig.contractAddress) {\r\n//         const decimals = tokenConfig.decimals || 6;\r\n//         const amountInSmallestUnit = (amountFloat * Math.pow(10, decimals)).toString();\r\n//         return `tronlink://token-transfer?contract=${tokenConfig.contractAddress}&to=${address}&amount=${amountInSmallestUnit}`;\r\n//       } else {\r\n//         // Just return the address for manual entry\r\n//         return address;\r\n//       }\r\n//     }\r\n//   };\r\n\r\n//   // Generate Algorand QR code compatible with Pera Wallet\r\n//   const generateAlgorandQR = (address, amount, currency) => {\r\n//     try {\r\n//       const amountFloat = parseFloat(amount);\r\n      \r\n//       if (currency === 'ALGO') {\r\n//         // Native ALGO transfer\r\n//         const microAlgos = Math.floor(amountFloat * 1000000);\r\n//         return `algorand://${address}?amount=${microAlgos}&note=Payment`;\r\n//       } else {\r\n//         // ASA transfers (USDC, USDT)\r\n//         const tokenConfig = getTokenConfigForCurrency(currency, 'algorand');\r\n//         if (tokenConfig && tokenConfig.assetId) {\r\n//           const assetAmount = Math.floor(amountFloat * Math.pow(10, tokenConfig.decimals));\r\n//           return `algorand://${address}?amount=${assetAmount}&asset=${tokenConfig.assetId}&note=Payment`;\r\n//         } else {\r\n//           // Just return the address for manual entry\r\n//           console.warn(`Token config not found for ${currency} on Algorand`);\r\n//           return address;\r\n//         }\r\n//       }\r\n//     } catch (error) {\r\n//       console.error('Error generating Algorand QR:', error);\r\n//       return address; // Fallback to address only\r\n//     }\r\n//   };\r\n\r\n//   // NEW: Generate Solana QR code compatible with Phantom and other Solana wallets\r\n//   const generateSolanaQR = (address, amount, currency) => {\r\n//     try {\r\n//       const amountFloat = parseFloat(amount);\r\n      \r\n//       console.log('Generating Solana QR code:', {\r\n//         address,\r\n//         amount,\r\n//         currency,\r\n//         amountFloat\r\n//       });\r\n      \r\n//       if (currency === 'SOL') {\r\n//         // Native SOL transfer - use the amount as-is since Phantom handles the conversion to lamports\r\n//         // Solana Pay format doesn't require lamports conversion in QR code\r\n//         return `solana:${address}?amount=${amountFloat}&label=Payment`;\r\n//       } else {\r\n//         // SPL token transfer\r\n//         const tokenConfig = getTokenConfigForCurrency(currency, 'solana');\r\n//         if (tokenConfig && tokenConfig.contractAddress) {\r\n//           // For SPL tokens in QR codes, we also use the human-readable amount\r\n//           // The wallet app will handle the decimal conversion\r\n//           return `solana:${address}?amount=${amountFloat}&spl-token=${tokenConfig.contractAddress}&label=Payment`;\r\n//         } else {\r\n//           // Just return the address for manual entry\r\n//           console.warn(`Token config not found for ${currency} on Solana`);\r\n//           return address;\r\n//         }\r\n//       }\r\n//     } catch (error) {\r\n//       console.error('Error generating Solana QR:', error);\r\n//       return address; // Fallback to address only\r\n//     }\r\n//   };\r\n  \r\n//   // Get token configuration for currency and network\r\n//   const getTokenConfigForCurrency = (currency, network) => {\r\n//     const tokenConfigs = {\r\n//       ethereum: {\r\n//         'USDT': { contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', decimals: 6 },\r\n//         'USDC': { contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', decimals: 6 },\r\n//         'DAI': { contractAddress: '0x6B175474E89094C44Da98b954EedeAC495271d0F', decimals: 18 },\r\n//         'PYUSD': { contractAddress: '0x6c3ea9036406852006290770BEdFcAbA0e23A0e8', decimals: 6 },\r\n//         'USDP': { contractAddress: '0x8E870D67F660D95d5be530380D0eC0bd388289E1', decimals: 18 },\r\n//         'FRAX': { contractAddress: '0x853d955aCEf822Db058eb8505911ED77F175b99e', decimals: 18 }\r\n//       },\r\n//       bsc: {\r\n//         'USDT': { contractAddress: '0x55d398326f99059fF775485246999027B3197955', decimals: 18 },\r\n//         'USDC': { contractAddress: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', decimals: 18 },\r\n//         'BUSD': { contractAddress: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56', decimals: 18 },\r\n//         'FRAX': { contractAddress: '0x90C97F71E18723b0Cf0dfa30ee176Ab653E89F40', decimals: 18 }\r\n//       },\r\n//       tron: {\r\n//         'USDT': { contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t', decimals: 6 },\r\n//         'USDC': { contractAddress: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8', decimals: 6 },\r\n//         'USDJ': { contractAddress: 'TMwFHYXLJaRUPeW6421aqXL4ZEzPRFGkGT', decimals: 18 }\r\n//       },\r\n//       algorand: {\r\n//         'USDC': { assetId: 31566704, decimals: 6 },\r\n//         'USDT': { assetId: 312769, decimals: 6 },\r\n//         'ALGO': { decimals: 6, isNative: true }\r\n//       },\r\n//       solana: {\r\n//         'USDC': { contractAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', decimals: 6 },\r\n//         'USDT': { contractAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', decimals: 6 },\r\n//         'SOL': { decimals: 9, isNative: true }\r\n//       }\r\n//     };\r\n    \r\n//     return tokenConfigs[network]?.[currency.toUpperCase()];\r\n//   };\r\n\r\n//   // Get network display name\r\n//   const getNetworkDisplayName = (network) => {\r\n//     const names = {\r\n//       ethereum: 'Ethereum',\r\n//       bsc: 'BSC',\r\n//       tron: 'TRON',\r\n//       algorand: 'Algorand',\r\n//       solana: 'Solana'\r\n//     };\r\n//     return names[network.toLowerCase()] || network;\r\n//   };\r\n\r\n//   // Get wallet app suggestions based on network\r\n//   const getWalletSuggestions = (network) => {\r\n//     const suggestions = {\r\n//       ethereum: ['MetaMask', 'Trust Wallet', 'Coinbase Wallet'],\r\n//       bsc: ['MetaMask', 'Trust Wallet', 'SafePal'],\r\n//       tron: ['TronLink', 'Trust Wallet'],\r\n//       algorand: ['Pera Wallet', 'MyAlgo Wallet'],\r\n//       solana: ['Phantom', 'Solflare', 'Sollet']\r\n//     };\r\n//     return suggestions[network.toLowerCase()] || ['MetaMask', 'Trust Wallet'];\r\n//   };\r\n\r\n//   // Copy to clipboard function\r\n//   const copyToClipboard = async (text) => {\r\n//     try {\r\n//       await navigator.clipboard.writeText(text);\r\n//       // You can add a toast notification here if you have one\r\n// //     } catch (err) {\r\n//       console.error('Failed to copy to clipboard:', err);\r\n//     }\r\n//   };\r\n\r\n//   // Format wallet address for display\r\n//   const formatWalletAddress = (address) => {\r\n//     if (!address || address.length <= 16) return address;\r\n//     return `${address.slice(0, 6)}...${address.slice(-4)}`;\r\n//   };\r\n\r\n//   return (\r\n//     <div className=\"flex flex-col items-center\">\r\n//       {qrError ? (\r\n//         <div className=\"p-4 rounded-lg bg-red-100 mb-3 text-red-700 text-center\">\r\n//           <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//             <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n//           </svg>\r\n//           <p className=\"font-medium\">{qrError}</p>\r\n//         </div>\r\n//       ) : (\r\n//         <div className=\"p-4 rounded-lg bg-white mb-3 shadow-sm border\">\r\n//           {isGenerating ? (\r\n//             <div className={`flex items-center justify-center`} style={{ width: size, height: size }}>\r\n//               <div className=\"text-center\">\r\n//                 <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600 mx-auto mb-2\"></div>\r\n//                 <div className=\"text-sm text-gray-600\">Generating QR Code...</div>\r\n//               </div>\r\n//             </div>\r\n//           ) : qrData ? (\r\n//             <QRCodeSVG\r\n//               value={qrData}\r\n//               size={size}\r\n//               bgColor={theme === 'dark' ? '#374151' : '#FFFFFF'}\r\n//               fgColor={theme === 'dark' ? '#FFFFFF' : '#000000'}\r\n//               level=\"H\"\r\n//               includeMargin={true}\r\n//             />\r\n//           ) : null}\r\n//         </div>\r\n//       )}\r\n      \r\n//       <div className=\"text-center text-sm text-gray-700 mb-4\">\r\n//         <p className='font-semibold text-gray-800 flex items-center justify-center'>\r\n//           <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//             <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h-4.01M12 12V8.01\" />\r\n//           </svg>\r\n//           Scan to Pay with {currency}\r\n//         </p>\r\n//         <p className=\"text-xs text-gray-500 mt-1\">\r\n//           Scan with your {getNetworkDisplayName(network)} wallet app\r\n//         </p>\r\n//       </div>\r\n      \r\n//       {/* Payment Amount Display */}\r\n//       <div className=\"w-full mb-4 p-3 bg-gray-50 rounded-lg\">\r\n//         <div className=\"flex justify-between items-center\">\r\n//           <span className=\"text-sm font-medium text-gray-700\">Amount to Pay:</span>\r\n//           <span className=\"text-lg font-bold text-[#7042D2]\">{amount} {currency}</span>\r\n//         </div>\r\n//         <div className=\"flex justify-between items-center mt-1\">\r\n//           <span className=\"text-xs text-gray-500\">Network:</span>\r\n//           <span className=\"text-xs font-medium text-gray-700\">{getNetworkDisplayName(network)}</span>\r\n//         </div>\r\n//         <div className=\"flex justify-between items-center mt-1\">\r\n//           <span className=\"text-xs text-gray-500\">Recipient:</span>\r\n//           <span className=\"text-xs font-mono text-gray-700\">{formatWalletAddress(walletAddress)}</span>\r\n//         </div>\r\n//       </div>\r\n\r\n\r\n//       {/* Copy Payment URI Button (for advanced users) */}\r\n//       {qrData && qrData !== walletAddress && (\r\n//         <div className=\"w-full mb-4\">\r\n//           <button\r\n//             onClick={() => copyToClipboard(qrData)}\r\n//             className=\"w-full p-2 bg-blue-100 hover:bg-blue-200 text-blue-800 rounded-lg transition-colors flex items-center justify-center gap-2 text-sm\"\r\n//           >\r\n//             <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//               <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.103m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\r\n//             </svg>\r\n//             Copy Payment URI\r\n//           </button>\r\n//         </div>\r\n//       )}\r\n      \r\n//       {/* Instructions */}\r\n//       <div className=\"w-full\">\r\n//         <div className=\"p-3 rounded bg-blue-50 border border-blue-200\">\r\n//           <h4 className=\"text-sm font-medium mb-2 text-blue-800 flex items-center\">\r\n//             <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//               <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n//             </svg>\r\n//             Payment Instructions\r\n//           </h4>\r\n//           <ol className=\"text-xs space-y-1 text-blue-700\">\r\n//             <li>1. Open your crypto wallet app ({getWalletSuggestions(network).join(', ')})</li>\r\n//             <li>2. Scan the QR code above or copy the wallet address</li>\r\n//             <li>3. Send exactly <strong>{amount} {currency}</strong> on {getNetworkDisplayName(network)} network</li>\r\n//             <li>4. Click \"I have sent the payment\" button below after sending</li>\r\n//           </ol>\r\n          \r\n//           <div className=\"mt-3 p-2 bg-yellow-50 border border-yellow-200 rounded\">\r\n//             <p className=\"text-xs text-yellow-800\">\r\n//               <strong>Important:</strong> Make sure you're sending on the correct network ({getNetworkDisplayName(network)}) \r\n//               and using the exact amount shown above.\r\n//             </p>\r\n//           </div>\r\n\r\n         \r\n//         </div>\r\n//       </div>\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// export default QRCode;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// src/components/QRCode.jsx \r\nimport React, { useEffect, useState } from 'react';\r\nimport { QRCodeSVG } from 'qrcode.react';\r\n\r\n/**\r\n * Enhanced QR Code component that generates network-specific payment QR codes\r\n * Now includes Trust Wallet support for all networks\r\n */\r\nconst QRCode = ({ \r\n  walletAddress, \r\n  amount, \r\n  currency, \r\n  network,\r\n  theme = 'light',\r\n  size = 200 \r\n}) => {\r\n  const [qrData, setQrData] = useState('');\r\n  const [qrError, setQrError] = useState(null);\r\n  const [isGenerating, setIsGenerating] = useState(true);\r\n  \r\n  useEffect(() => {\r\n    generatePaymentQRData();\r\n  }, [walletAddress, amount, currency, network]);\r\n\r\n  const generatePaymentQRData = () => {\r\n    if (!walletAddress || walletAddress === 'No address configured') {\r\n      setQrError('No wallet address configured for this network');\r\n      setIsGenerating(false);\r\n      return;\r\n    }\r\n    \r\n    try {\r\n      setIsGenerating(true);\r\n      let paymentData;\r\n      \r\n      // Format QR code data based on network and currency\r\n      switch (network.toLowerCase()) {\r\n        case 'algorand':\r\n          paymentData = generateAlgorandQR(walletAddress, amount, currency);\r\n          break;\r\n          \r\n        case 'tron':\r\n          paymentData = generateTronQR(walletAddress, amount, currency);\r\n          break;\r\n          \r\n        case 'bsc':\r\n          paymentData = generateBSCQR(walletAddress, amount, currency);\r\n          break;\r\n          \r\n        case 'solana':\r\n          paymentData = generateSolanaQR(walletAddress, amount, currency);\r\n          break;\r\n          \r\n        case 'ethereum':\r\n        default:\r\n          paymentData = generateEthereumQR(walletAddress, amount, currency);\r\n          break;\r\n      }\r\n      \r\n      setQrData(paymentData);\r\n      setQrError(null);\r\n      setIsGenerating(false);\r\n      \r\n    } catch (err) {\r\n      console.error('Error generating QR code:', err);\r\n      setQrError('Error generating payment QR code');\r\n      setIsGenerating(false);\r\n    }\r\n  };\r\n\r\n  // Generate Ethereum QR code\r\n  const generateEthereumQR = (address, amount, currency) => {\r\n    const amountFloat = parseFloat(amount);\r\n    \r\n    if (currency === 'ETH') {\r\n      // Native ETH transfer\r\n      const amountWei = (amountFloat * 1e18).toString();\r\n      return `ethereum:${address}@1?value=${amountWei}`;\r\n    } else {\r\n      // ERC20 token transfer\r\n      const tokenConfig = getTokenConfigForCurrency(currency, 'ethereum');\r\n      if (tokenConfig && tokenConfig.contractAddress) {\r\n        const decimals = tokenConfig.decimals || 18;\r\n        const amountInSmallestUnit = (amountFloat * Math.pow(10, decimals)).toString();\r\n        return `ethereum:${tokenConfig.contractAddress}/transfer?address=${address}&uint256=${amountInSmallestUnit}`;\r\n      } else {\r\n        // Fallback to just the address\r\n        return address;\r\n      }\r\n    }\r\n  };\r\n\r\n  // Generate BSC QR code\r\n  const generateBSCQR = (address, amount, currency) => {\r\n    const amountFloat = parseFloat(amount);\r\n    \r\n    if (currency === 'BNB') {\r\n      // Native BNB transfer\r\n      const amountWei = (amountFloat * 1e18).toString();\r\n      return `ethereum:${address}@56?value=${amountWei}`;\r\n    } else {\r\n      // BEP20 token transfer\r\n      const tokenConfig = getTokenConfigForCurrency(currency, 'bsc');\r\n      if (tokenConfig && tokenConfig.contractAddress) {\r\n        const decimals = tokenConfig.decimals || 18;\r\n        const amountInSmallestUnit = (amountFloat * Math.pow(10, decimals)).toString();\r\n        return `ethereum:${tokenConfig.contractAddress}/transfer?address=${address}&uint256=${amountInSmallestUnit}@56`;\r\n      } else {\r\n        return address;\r\n      }\r\n    }\r\n  };\r\n\r\n  // Generate TRON QR code - Enhanced for Trust Wallet\r\n  const generateTronQR = (address, amount, currency) => {\r\n    const amountFloat = parseFloat(amount);\r\n    \r\n    if (currency === 'TRX') {\r\n      // Native TRX transfer - Support both TronLink and Trust Wallet formats\r\n      const amountSun = (amountFloat * 1e6).toString();\r\n      \r\n      // TronLink format (primary)\r\n      const tronLinkFormat = `tronlink://transfer?to=${address}&amount=${amountSun}`;\r\n      \r\n      // Trust Wallet also supports TronLink format, but we can add additional compatibility\r\n      // Trust Wallet format as fallback (they support the same URI scheme)\r\n      const trustWalletFormat = `tron:${address}?amount=${amountSun}`;\r\n      \r\n      // Return TronLink format as it's more widely supported and Trust Wallet supports it\r\n      return tronLinkFormat;\r\n    } else {\r\n      // TRC20 token transfer\r\n      const tokenConfig = getTokenConfigForCurrency(currency, 'tron');\r\n      if (tokenConfig && tokenConfig.contractAddress) {\r\n        const decimals = tokenConfig.decimals || 6;\r\n        const amountInSmallestUnit = (amountFloat * Math.pow(10, decimals)).toString();\r\n        \r\n        // TronLink format for tokens\r\n        return `tronlink://token-transfer?contract=${tokenConfig.contractAddress}&to=${address}&amount=${amountInSmallestUnit}`;\r\n      } else {\r\n        // Just return the address for manual entry\r\n        return address;\r\n      }\r\n    }\r\n  };\r\n\r\n  // Generate Algorand QR code compatible with Pera Wallet\r\n  const generateAlgorandQR = (address, amount, currency) => {\r\n    try {\r\n      const amountFloat = parseFloat(amount);\r\n      \r\n      if (currency === 'ALGO') {\r\n        // Native ALGO transfer\r\n        const microAlgos = Math.floor(amountFloat * 1000000);\r\n        return `algorand://${address}?amount=${microAlgos}&note=Payment`;\r\n      } else {\r\n        // ASA transfers (USDC, USDT)\r\n        const tokenConfig = getTokenConfigForCurrency(currency, 'algorand');\r\n        if (tokenConfig && tokenConfig.assetId) {\r\n          const assetAmount = Math.floor(amountFloat * Math.pow(10, tokenConfig.decimals));\r\n          return `algorand://${address}?amount=${assetAmount}&asset=${tokenConfig.assetId}&note=Payment`;\r\n        } else {\r\n          // Just return the address for manual entry\r\n          console.warn(`Token config not found for ${currency} on Algorand`);\r\n          return address;\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.error('Error generating Algorand QR:', error);\r\n      return address; // Fallback to address only\r\n    }\r\n  };\r\n\r\n  // Enhanced Solana QR code compatible with Phantom and Trust Wallet\r\n  const generateSolanaQR = (address, amount, currency) => {\r\n    try {\r\n      const amountFloat = parseFloat(amount);\r\n      \r\n      \r\n      if (currency === 'SOL') {\r\n        // Native SOL transfer - Compatible with both Phantom and Trust Wallet\r\n        // Both wallets support the Solana Pay standard format\r\n        return `solana:${address}?amount=${amountFloat}&label=Payment`;\r\n      } else {\r\n        // SPL token transfer\r\n        const tokenConfig = getTokenConfigForCurrency(currency, 'solana');\r\n        if (tokenConfig && tokenConfig.contractAddress) {\r\n          // For SPL tokens, both Phantom and Trust Wallet support this format\r\n          return `solana:${address}?amount=${amountFloat}&spl-token=${tokenConfig.contractAddress}&label=Payment`;\r\n        } else {\r\n          // Just return the address for manual entry\r\n          console.warn(`Token config not found for ${currency} on Solana`);\r\n          return address;\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.error('Error generating Solana QR:', error);\r\n      return address; // Fallback to address only\r\n    }\r\n  };\r\n  \r\n  // Get token configuration for currency and network\r\n  const getTokenConfigForCurrency = (currency, network) => {\r\n    const tokenConfigs = {\r\n      ethereum: {\r\n        'USDT': { contractAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', decimals: 6 },\r\n        'USDC': { contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', decimals: 6 },\r\n        'DAI': { contractAddress: '0x6B175474E89094C44Da98b954EedeAC495271d0F', decimals: 18 },\r\n        'PYUSD': { contractAddress: '0x6c3ea9036406852006290770BEdFcAbA0e23A0e8', decimals: 6 },\r\n        'USDP': { contractAddress: '0x8E870D67F660D95d5be530380D0eC0bd388289E1', decimals: 18 },\r\n        'FRAX': { contractAddress: '0x853d955aCEf822Db058eb8505911ED77F175b99e', decimals: 18 }\r\n      },\r\n      bsc: {\r\n        'USDT': { contractAddress: '0x55d398326f99059fF775485246999027B3197955', decimals: 18 },\r\n        'USDC': { contractAddress: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', decimals: 18 },\r\n        'BUSD': { contractAddress: '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56', decimals: 18 },\r\n        'FRAX': { contractAddress: '0x90C97F71E18723b0Cf0dfa30ee176Ab653E89F40', decimals: 18 }\r\n      },\r\n      tron: {\r\n        'USDT': { contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t', decimals: 6 },\r\n        'USDC': { contractAddress: 'TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8', decimals: 6 },\r\n        'USDJ': { contractAddress: 'TMwFHYXLJaRUPeW6421aqXL4ZEzPRFGkGT', decimals: 18 }\r\n      },\r\n      algorand: {\r\n        'USDC': { assetId: 31566704, decimals: 6 },\r\n        'USDT': { assetId: 312769, decimals: 6 },\r\n        'ALGO': { decimals: 6, isNative: true }\r\n      },\r\n      solana: {\r\n        'USDC': { contractAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', decimals: 6 },\r\n        'USDT': { contractAddress: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', decimals: 6 },\r\n        'SOL': { decimals: 9, isNative: true }\r\n      }\r\n    };\r\n    \r\n    return tokenConfigs[network]?.[currency.toUpperCase()];\r\n  };\r\n\r\n  // Get network display name\r\n  const getNetworkDisplayName = (network) => {\r\n    const names = {\r\n      ethereum: 'Ethereum',\r\n      bsc: 'BSC',\r\n      tron: 'TRON',\r\n      algorand: 'Algorand',\r\n      solana: 'Solana'\r\n    };\r\n    return names[network.toLowerCase()] || network;\r\n  };\r\n\r\n  // Enhanced wallet app suggestions including Trust Wallet for all supported networks\r\n  const getWalletSuggestions = (network) => {\r\n    const suggestions = {\r\n      ethereum: ['MetaMask', 'Trust Wallet', 'Coinbase Wallet'],\r\n      bsc: ['MetaMask', 'Trust Wallet', 'SafePal'],\r\n      tron: ['TronLink', 'Trust Wallet'], // Trust Wallet now supports TRON\r\n      algorand: ['Pera Wallet', 'MyAlgo Wallet'],\r\n      solana: ['Phantom', 'Trust Wallet', 'Solflare'] // Trust Wallet now supports Solana\r\n    };\r\n    return suggestions[network.toLowerCase()] || ['MetaMask', 'Trust Wallet'];\r\n  };\r\n\r\n  // Copy to clipboard function\r\n  const copyToClipboard = async (text) => {\r\n    try {\r\n      await navigator.clipboard.writeText(text);\r\n      // You can add a toast notification here if you have one\r\n    } catch (err) {\r\n      console.error('Failed to copy to clipboard:', err);\r\n    }\r\n  };\r\n\r\n  // Format wallet address for display\r\n  const formatWalletAddress = (address) => {\r\n    if (!address || address.length <= 16) return address;\r\n    return `${address.slice(0, 6)}...${address.slice(-4)}`;\r\n  };\r\n\r\n  return (\r\n    <div className=\"flex flex-col items-center\">\r\n      {qrError ? (\r\n        <div className=\"p-4 rounded-lg bg-red-100 mb-3 text-red-700 text-center\">\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n            <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n          </svg>\r\n          <p className=\"font-medium\">{qrError}</p>\r\n        </div>\r\n      ) : (\r\n        <div className=\"p-4 rounded-lg bg-white mb-3 shadow-sm border\">\r\n          {isGenerating ? (\r\n            <div className={`flex items-center justify-center`} style={{ width: size, height: size }}>\r\n              <div className=\"text-center\">\r\n                <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600 mx-auto mb-2\"></div>\r\n                <div className=\"text-sm text-gray-600\">Generating QR Code...</div>\r\n              </div>\r\n            </div>\r\n          ) : qrData ? (\r\n            <QRCodeSVG\r\n              value={qrData}\r\n              size={size}\r\n              bgColor={theme === 'dark' ? '#374151' : '#FFFFFF'}\r\n              fgColor={theme === 'dark' ? '#FFFFFF' : '#000000'}\r\n              level=\"H\"\r\n              includeMargin={true}\r\n            />\r\n          ) : null}\r\n        </div>\r\n      )}\r\n      \r\n      <div className=\"text-center text-sm text-gray-700 mb-4\">\r\n        <p className='font-semibold text-gray-800 flex items-center justify-center'>\r\n          <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n            <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h-4.01M12 12V8.01\" />\r\n          </svg>\r\n          Scan to Pay with {currency}\r\n        </p>\r\n        <p className=\"text-xs text-gray-500 mt-1\">\r\n          Scan with your {getNetworkDisplayName(network)} wallet app\r\n        </p>\r\n      </div>\r\n      \r\n      {/* Payment Amount Display */}\r\n      <div className=\"w-full mb-4 p-3 bg-gray-50 rounded-lg\">\r\n        <div className=\"flex justify-between items-center\">\r\n          <span className=\"text-sm font-medium text-gray-700\">Amount to Pay:</span>\r\n          <span className=\"text-lg font-bold text-[#7042D2]\">{amount} {currency}</span>\r\n        </div>\r\n        <div className=\"flex justify-between items-center mt-1\">\r\n          <span className=\"text-xs text-gray-500\">Network:</span>\r\n          <span className=\"text-xs font-medium text-gray-700\">{getNetworkDisplayName(network)}</span>\r\n        </div>\r\n        <div className=\"flex justify-between items-center mt-1\">\r\n          <span className=\"text-xs text-gray-500\">Recipient:</span>\r\n          <span className=\"text-xs font-mono text-gray-700\">{formatWalletAddress(walletAddress)}</span>\r\n        </div>\r\n      </div>\r\n\r\n\r\n      {/* Copy Payment URI Button (for advanced users) */}\r\n      {qrData && qrData !== walletAddress && (\r\n        <div className=\"w-full mb-4\">\r\n          <button\r\n            onClick={() => copyToClipboard(qrData)}\r\n            className=\"w-full p-2 bg-blue-100 hover:bg-blue-200 text-blue-800 rounded-lg transition-colors flex items-center justify-center gap-2 text-sm\"\r\n          >\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n              <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.103m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\r\n            </svg>\r\n            Copy Payment URI\r\n          </button>\r\n        </div>\r\n      )}\r\n      \r\n      {/* Instructions - Enhanced for Trust Wallet */}\r\n      <div className=\"w-full\">\r\n        <div className=\"p-3 rounded bg-blue-50 border border-blue-200\">\r\n          <h4 className=\"text-sm font-medium mb-2 text-blue-800 flex items-center\">\r\n            <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 mr-1\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n              <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n            </svg>\r\n            Payment Instructions\r\n          </h4>\r\n          <ol className=\"text-xs space-y-1 text-blue-700\">\r\n            <li>1. Open your crypto wallet app ({getWalletSuggestions(network).join(', ')})</li>\r\n            <li>2. Scan the QR code above or copy the wallet address</li>\r\n            <li>3. Send exactly <strong>{amount} {currency}</strong> on {getNetworkDisplayName(network)} network</li>\r\n            <li>4. Click \"I have sent the payment\" button below after sending</li>\r\n          </ol>\r\n          \r\n          <div className=\"mt-3 p-2 bg-yellow-50 border border-yellow-200 rounded\">\r\n            <p className=\"text-xs text-yellow-800\">\r\n              <strong>Important:</strong> Make sure you're sending on the correct network ({getNetworkDisplayName(network)}) \r\n              and using the exact amount shown above.\r\n            </p>\r\n          </div>\r\n\r\n          {/* Enhanced Trust Wallet specific note */}\r\n          {getWalletSuggestions(network).includes('Trust Wallet') && (\r\n            <div className=\"mt-2 p-2 bg-green-50 border border-green-200 rounded\">\r\n              <p className=\"text-xs text-green-800\">\r\n                <strong>Trust Wallet users:</strong> Trust Wallet supports {getNetworkDisplayName(network)} payments. \r\n                Make sure you have the correct network selected in your Trust Wallet app.\r\n              </p>\r\n            </div>\r\n          )}\r\n         \r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default QRCode;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import React, { useState, useEffect } from 'react';\r\n\r\n/**\r\n * Enhanced PaymentStatus component optimized for immediate success display\r\n */\r\nconst PaymentStatus = ({ \r\n  status, \r\n  message, \r\n  theme = 'light',\r\n  // Props for success screen\r\n  payment = null,\r\n  transactionHash = null,\r\n  selectedPaymentMethod = null,\r\n  merchantName = 'Merchant',\r\n  onClose = null, // The onClose prop for the close button\r\n  // Processing info\r\n  processingStartTime = null,\r\n  paymentNetwork = null,\r\n  pendingBackendConfirmation = false // New prop to show backend confirmation status\r\n}) => {\r\n  const [copiedHash, setCopiedHash] = useState(false);\r\n  const [processingSeconds, setProcessingSeconds] = useState(0);\r\n  const [showEarlySuccessOption, setShowEarlySuccessOption] = useState(false);\r\n  const [progressStage, setProgressStage] = useState(1); // 1: Submitted, 2: Detected, 3: Confirming\r\n\r\n  // Handle processing timer and stages\r\n  useEffect(() => {\r\n    let timer;\r\n    if (status === 'processing' && processingStartTime) {\r\n      // Update processing time every second\r\n      timer = setInterval(() => {\r\n        const elapsed = Math.floor((Date.now() - processingStartTime) / 1000);\r\n        setProcessingSeconds(elapsed);\r\n        \r\n        // Update progress stages based on time\r\n        if (elapsed >= 5 && progressStage === 1) {\r\n          setProgressStage(2); // Transaction detected\r\n        }\r\n        if (elapsed >= 15 && progressStage === 2) {\r\n          setProgressStage(3); // Confirming transaction\r\n        }\r\n        \r\n        // Show early success option after 30 seconds\r\n        if (elapsed >= 30 && !showEarlySuccessOption) {\r\n          setShowEarlySuccessOption(true);\r\n        }\r\n      }, 1000);\r\n    }\r\n    \r\n    return () => clearInterval(timer);\r\n  }, [status, processingStartTime, progressStage, showEarlySuccessOption]);\r\n\r\n  // Copy transaction hash to clipboard\r\n  const copyTransactionHash = async () => {\r\n    if (transactionHash) {\r\n      try {\r\n        await navigator.clipboard.writeText(transactionHash);\r\n        setCopiedHash(true);\r\n        setTimeout(() => setCopiedHash(false), 2000);\r\n      } catch (err) {\r\n        console.error('Failed to copy transaction hash:', err);\r\n      }\r\n    }\r\n  };\r\n\r\n  // Handle close button click\r\n  const handleClose = () => {\r\n    if (onClose) {\r\n      onClose();\r\n    }\r\n  };\r\n\r\n  // Format transaction hash for display\r\n  const formatTransactionHash = (hash) => {\r\n    if (!hash) return '';\r\n    if (hash.length <= 16) return hash;\r\n    return `${hash.slice(0, 8)}...${hash.slice(-8)}`;\r\n  };\r\n\r\n  // Get network display name\r\n  const getNetworkDisplayName = (network) => {\r\n    const names = {\r\n      ethereum: 'Ethereum',\r\n      bsc: 'BSC',\r\n      tron: 'TRON',\r\n      algorand: 'Algorand'\r\n    };\r\n    return names[network] || network;\r\n  };\r\n\r\n  // Format recipient address\r\n  const formatRecipientAddress = (address) => {\r\n    if (!address) return 'N/A';\r\n    if (address.length <= 16) return address;\r\n    return `${address.slice(0, 6)}...${address.slice(-4)}`;\r\n  };\r\n\r\n  // Render different icons based on status\r\n  const renderIcon = () => {\r\n    switch (status) {\r\n      case 'processing':\r\n        return (\r\n          <div className=\"animate-spin rounded-full h-12 w-12 border-4 border-t-purple-600 border-blue-500/20\"></div>\r\n        );\r\n      case 'success':\r\n        return (\r\n          <div className=\"rounded-full h-16 w-16 bg-green-500 flex items-center justify-center\">\r\n            <svg\r\n              xmlns=\"http://www.w3.org/2000/svg\"\r\n              className=\"h-10 w-10 text-white\"\r\n              fill=\"none\"\r\n              viewBox=\"0 0 24 24\"\r\n              stroke=\"currentColor\"\r\n              strokeWidth={3}\r\n            >\r\n              <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n            </svg>\r\n          </div>\r\n        );\r\n      case 'error':\r\n        return (\r\n          <div className=\"rounded-full h-12 w-12 bg-red-100 flex items-center justify-center\">\r\n            <svg\r\n              xmlns=\"http://www.w3.org/2000/svg\"\r\n              className=\"h-8 w-8 text-red-500\"\r\n              fill=\"none\"\r\n              viewBox=\"0 0 24 24\"\r\n              stroke=\"currentColor\"\r\n              strokeWidth={2}\r\n            >\r\n              <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\r\n            </svg>\r\n          </div>\r\n        );\r\n      default:\r\n        return null;\r\n    }\r\n  };\r\n\r\n  // Get status title\r\n  const getStatusTitle = () => {\r\n    switch (status) {\r\n      case 'processing':\r\n        return 'Processing Payment';\r\n      case 'success':\r\n        return 'Payment Successful!';\r\n      case 'error':\r\n        return 'Payment Failed';\r\n      default:\r\n        return 'Unknown Status';\r\n    }\r\n  };\r\n\r\n  // Get appropriate text color for message\r\n  const getMessageClasses = () => {\r\n    switch (status) {\r\n      case 'processing':\r\n        return theme === 'dark' ? 'text-blue-300' : 'text-blue-600';\r\n      case 'success':\r\n        return theme === 'dark' ? 'text-green-300' : 'text-green-600';\r\n      case 'error':\r\n        return theme === 'dark' ? 'text-red-300' : 'text-red-600';\r\n      default:\r\n        return theme === 'dark' ? 'text-gray-300' : 'text-gray-600';\r\n    }\r\n  };\r\n\r\n  // Enhanced success screen\r\n  if (status === 'success') {\r\n    return (\r\n      <div className=\"flex flex-col items-center justify-center py-6 px-4\">\r\n        <div className=\"mb-6\">{renderIcon()}</div>\r\n        \r\n        <h3 className={`text-2xl font-bold mb-3 ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n          Payment Successful!\r\n        </h3>\r\n        \r\n        {payment && selectedPaymentMethod && (\r\n          <p className={`text-center max-w-[235px] mb-6 ${theme === 'dark' ? 'text-gray-300' : 'text-gray-600'}`}>\r\n            Your payment of <span className='text-[#7042D2] font-semibold'>{payment.totalAmount || payment.amount} {selectedPaymentMethod.currency}</span> has been completed.\r\n          </p>\r\n        )}\r\n\r\n        {/* Subtle backend confirmation indicator */}\r\n        {pendingBackendConfirmation && (\r\n          <div className=\"flex items-center justify-center mb-4 text-xs text-gray-500 bg-gray-50 rounded-full px-3 py-1\">\r\n            <svg className=\"animate-spin -ml-1 mr-2 h-3 w-3 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n              <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\r\n              <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\r\n            </svg>\r\n            Verifying on blockchain\r\n          </div>\r\n        )}\r\n\r\n        {/* Transaction Hash */}\r\n        {transactionHash && (\r\n          <div className=\"w-full mb-6 px-4\">\r\n            <p className={`text-sm font-medium mb-2 ${theme === 'dark' ? 'text-gray-300' : 'text-gray-700'}`}>\r\n              Transaction Hash:\r\n            </p>\r\n            <div \r\n              className={`flex items-center justify-between p-3 rounded-lg border cursor-pointer transition-colors ${\r\n                theme === 'dark' \r\n                  ? 'bg-gray-700 border-gray-600 hover:bg-gray-600' \r\n                  : 'bg-gray-50 border-gray-200 hover:bg-gray-100'\r\n              }`}\r\n              onClick={copyTransactionHash}\r\n            >\r\n              <span className={`font-mono text-sm ${theme === 'dark' ? 'text-gray-300' : 'text-gray-700'}`}>\r\n                {formatTransactionHash(transactionHash)}\r\n              </span>\r\n              <div className=\"flex items-center\">\r\n                {copiedHash ? (\r\n                  <span className=\"text-green-500 text-xs font-medium mr-2\">Copied!</span>\r\n                ) : null}\r\n                <svg \r\n                  xmlns=\"http://www.w3.org/2000/svg\" \r\n                  className={`h-4 w-4 ${theme === 'dark' ? 'text-gray-400' : 'text-gray-500'}`}\r\n                  fill=\"none\" \r\n                  viewBox=\"0 0 24 24\" \r\n                  stroke=\"currentColor\"\r\n                >\r\n                  <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\r\n                </svg>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        )}\r\n\r\n        {/* Payment Details Box */}\r\n        <div className={`w-full p-4 rounded-lg border mb-6 ${\r\n          theme === 'dark' \r\n            ? 'bg-gray-700 border-gray-600' \r\n            : 'bg-gray-50 border-gray-200'\r\n        }`}>\r\n          <div className=\"grid grid-cols-2 gap-4\">\r\n            <div>\r\n              <p className={`text-xs font-medium mb-1 ${theme === 'dark' ? 'text-gray-400' : 'text-gray-500'}`}>\r\n                Merchant ID:\r\n              </p>\r\n              <p className={`text-sm font-medium ${theme === 'dark' ? 'text-gray-300' : 'text-gray-700'}`}>\r\n                {merchantName}\r\n              </p>\r\n            </div>\r\n            <div>\r\n              <p className={`text-xs font-medium mb-1 ${theme === 'dark' ? 'text-gray-400' : 'text-gray-500'}`}>\r\n                Network:\r\n              </p>\r\n              <p className={`text-sm font-medium ${theme === 'dark' ? 'text-gray-300' : 'text-gray-700'}`}>\r\n                {selectedPaymentMethod ? getNetworkDisplayName(selectedPaymentMethod.network) : 'N/A'}\r\n              </p>\r\n            </div>\r\n            <div className=\"col-span-2\">\r\n              <p className={`text-xs font-medium mb-1 ${theme === 'dark' ? 'text-gray-400' : 'text-gray-500'}`}>\r\n                Recipient:\r\n              </p>\r\n              <p className={`text-sm font-mono ${theme === 'dark' ? 'text-gray-300' : 'text-gray-700'}`}>\r\n                {payment?.recipientWallet ? formatRecipientAddress(payment.recipientWallet) : 'N/A'}\r\n              </p>\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        {/* Close Button - Ensure it calls onClose */}\r\n        {onClose && (\r\n          <button\r\n            onClick={handleClose}\r\n            className=\"w-full py-3 px-4 bg-[#7042D2] text-white font-medium rounded-2xl text-lg shadow-md hover:bg-[#5b34b1] transition-colors\"\r\n            style={{ borderRadius: '1.5rem' }}\r\n          >\r\n            Close\r\n          </button>\r\n        )}\r\n      </div>\r\n    );\r\n  }\r\n\r\n  // Error screen\r\n  if (status === 'error') {\r\n    return (\r\n      <div className=\"flex flex-col items-center justify-center py-6\">\r\n        <div className=\"mb-4\">{renderIcon()}</div>\r\n        <h3 className={`text-xl font-bold mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n          Payment Failed\r\n        </h3>\r\n        <p className={`text-center ${getMessageClasses()}`}>{message}</p>\r\n\r\n        <div className={`mt-4 p-2 rounded ${theme === 'dark' ? 'bg-gray-700' : 'bg-gray-100'}`}>\r\n          <p className={`text-xs ${theme === 'dark' ? 'text-gray-300' : 'text-gray-600'}`}>\r\n            Please try again or contact support if the problem persists.\r\n          </p>\r\n        </div>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  // Default fallback for processing or other states\r\n  return (\r\n    <div className=\"flex flex-col items-center justify-center py-6\">\r\n      <div className=\"mb-4\">{renderIcon()}</div>\r\n      <h3 className={`text-xl font-bold mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-900'}`}>\r\n        {getStatusTitle()}\r\n      </h3>\r\n      <p className={`text-center ${getMessageClasses()}`}>{message}</p>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default PaymentStatus;","import React from 'react';\r\n\r\nexport const EthIcon = ({ size = 24 }) => (\r\n  <svg width={size} height={size} viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <g clipPath=\"url(#clip0_2786_457)\">\r\n      <path d=\"M15.9979 5L15.845 5.52398V20.7287L15.9979 20.8826L22.9958 16.7107L15.9979 5Z\" fill=\"#343434\"/>\r\n      <path d=\"M15.9979 5L9 16.7107L15.9979 20.8826V13.5027V5Z\" fill=\"#8C8C8C\"/>\r\n      <path d=\"M15.9979 22.2186L15.9117 22.3245V27.7408L15.9979 27.9945L23 18.0488L15.9979 22.2186Z\" fill=\"#3C3C3B\"/>\r\n      <path d=\"M15.9979 27.9945V22.2186L9 18.0488L15.9979 27.9945Z\" fill=\"#8C8C8C\"/>\r\n      <path d=\"M15.9979 20.8818L22.9957 16.7099L15.9979 13.502V20.8818Z\" fill=\"#141414\"/>\r\n      <path d=\"M9.00006 16.7099L15.9979 20.8818V13.502L9.00006 16.7099Z\" fill=\"#393939\"/>\r\n    </g>\r\n    <defs>\r\n      <clipPath id=\"clip0_2786_457\">\r\n        <rect width=\"14\" height=\"23\" fill=\"white\" transform=\"translate(9 5)\"/>\r\n      </clipPath>\r\n    </defs>\r\n  </svg>\r\n);\r\n\r\nexport const TronIcon = ({ size = 32 }) => (\r\n  <svg width={size} height={size+1} viewBox=\"0 0 32 33\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M8.42 8.68534C8.48853 8.61041 8.57583 8.55514 8.67287 8.52525C8.76992 8.49536 8.87319 8.49194 8.972 8.51534L20.875 11.4293C20.947 11.445 21.0146 11.4765 21.073 11.5213L23.495 13.2883C23.6127 13.3751 23.6923 13.5039 23.7173 13.6479C23.7422 13.792 23.7106 13.9401 23.629 14.0613L15.297 26.2523C15.2385 26.3388 15.1571 26.4074 15.0619 26.4503C14.9667 26.4932 14.8614 26.5088 14.7579 26.4953C14.6543 26.4818 14.5566 26.4398 14.4755 26.3739C14.3945 26.308 14.3334 26.2209 14.299 26.1223L8.306 9.25234C8.27276 9.15648 8.2657 9.05348 8.28557 8.95398C8.30543 8.85448 8.3515 8.76209 8.419 8.68634M10.383 11.7293L14.543 23.4413L15.227 17.3723L10.383 11.7293ZM16.341 17.5673L15.646 23.7423L21.529 15.1323L16.341 17.5673ZM22.06 13.6373L18.269 15.4173L20.809 12.7263L22.06 13.6373ZM19.664 12.2943L10.411 10.0303L15.836 16.3483L19.664 12.2943Z\" fill=\"black\"/>\r\n  </svg>\r\n);\r\n\r\nexport const AlgorandIcon = ({ size = 32 }) => (\r\n  <svg width={size} height={size+1} viewBox=\"0 0 32 33\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M17.2512 9.5H19.7036L20.7785 13.4753H23.3083L21.5804 16.4753L24 25.4973H21.4916L19.8625 19.446L16.3592 25.4987H13.5597L18.9725 16.1313L18.1018 12.8793L10.8022 25.5H8L17.2512 9.5Z\" fill=\"black\"/>\r\n  </svg>\r\n);\r\n\r\nexport const SolanaIcon = ({ size = 32 }) => (\r\n  <svg width={size} height={size+1} viewBox=\"0 0 32 33\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M9.52513 16.0195H20.7032C20.843 16.0195 20.9713 16.0794 21.0762 16.1873L22.8479 18.0574C23.1742 18.4051 22.9411 18.9925 22.4749 18.9925H11.2968C11.157 18.9925 11.0287 18.9326 10.9238 18.8247L9.15214 16.9545C8.82577 16.6069 9.05889 16.0195 9.52513 16.0195ZM9.15214 13.538L10.9238 11.6678C11.0171 11.5599 11.157 11.5 11.2968 11.5H22.4632C22.9295 11.5 23.1626 12.0874 22.8362 12.4351L21.0762 14.3052C20.9829 14.4131 20.843 14.473 20.7032 14.473H9.52513C9.05889 14.473 8.82577 13.8856 9.15214 13.538ZM22.8362 21.462L21.0645 23.3322C20.9596 23.4401 20.8314 23.5 20.6915 23.5H9.52513C9.05889 23.5 8.82577 22.9126 9.15214 22.5649L10.9238 20.6948C11.0171 20.5869 11.157 20.527 11.2968 20.527H22.4632C22.9295 20.527 23.1626 21.1144 22.8362 21.462Z\" fill=\"black\"/>\r\n  </svg>\r\n);\r\n\r\nexport const BscIcon = ({ size = 32 }) => (\r\n  <svg width={size} height={size+1} viewBox=\"0 0 32 33\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M19.0827 18.7809L20.8947 20.5933L15.9927 25.5L11.0907 20.594L12.902 18.7809L15.9927 21.8905L19.0827 18.7809ZM22.174 15.6873L24 17.4997L22.19 19.3121L20.3787 17.4997L22.174 15.6873ZM15.9927 15.6873L17.8033 17.4837L15.992 19.2967L14.1813 17.4997L15.9927 15.6873ZM9.81067 15.6873L11.6067 17.4997L9.812 19.2961L8 17.4997L9.81067 15.6873ZM15.9933 9.5L20.8933 14.39L19.082 16.2018L15.9933 13.1088L12.9027 16.2184L11.0913 14.406L15.9933 9.5Z\" fill=\"black\"/>\r\n  </svg>\r\n);\r\n\r\nexport const PyusdIcon = ({ size = 32 }) => (\r\n  <svg width={size-4} height={size-4} viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M8.36266 4.256C8.38876 4.0477 8.48986 3.85605 8.64705 3.7169C8.80423 3.57775 9.00673 3.50064 9.21666 3.5H17.0847C17.9472 3.55674 18.7895 3.78654 19.5613 4.1757C20.3331 4.56486 21.0187 5.10541 21.5772 5.76515C22.1357 6.42489 22.5557 7.19031 22.8121 8.0158C23.0685 8.84129 23.1561 9.70994 23.0697 10.57C22.6847 15.659 18.6737 17.5 16.5807 17.5H13.8367L12.6677 23.786C12.6333 23.987 12.5285 24.1693 12.372 24.3001C12.2156 24.431 12.0176 24.5018 11.8137 24.5H6.61966C6.49561 24.4979 6.3734 24.4696 6.26099 24.4171C6.14859 24.3646 6.04851 24.289 5.96728 24.1952C5.88604 24.1014 5.82548 23.9916 5.78954 23.8728C5.75359 23.7541 5.74307 23.6291 5.75866 23.506L7.05366 14H5.76566C5.65113 13.9998 5.53775 13.9771 5.43205 13.933C5.32635 13.8888 5.23041 13.8243 5.14975 13.743C5.06909 13.6616 5.00529 13.5652 4.96203 13.4591C4.91877 13.3531 4.89689 13.2395 4.89766 13.125C4.89766 12.642 5.28266 12.25 5.76566 12.25H7.29166L7.76066 8.75H5.76566C5.65113 8.74985 5.53775 8.72706 5.43205 8.68295C5.32635 8.63884 5.23041 8.57427 5.14975 8.49296C5.06909 8.41164 5.00529 8.31519 4.96203 8.20914C4.91877 8.10309 4.89689 7.98953 4.89766 7.875C4.89612 7.76084 4.91723 7.64751 4.95978 7.54157C5.00233 7.43563 5.06547 7.33918 5.14554 7.2578C5.22562 7.17643 5.32104 7.11174 5.42628 7.06749C5.53152 7.02324 5.6445 7.0003 5.75866 7H7.99166L8.36266 4.256ZM9.50366 8.75L9.02766 12.25H15.2787C15.51 12.2579 15.7404 12.218 15.9555 12.1326C16.1707 12.0473 16.3659 11.9185 16.5289 11.7541C16.6919 11.5898 16.8191 11.3936 16.9027 11.1778C16.9863 10.962 17.0244 10.7312 17.0147 10.5C17.0244 10.2688 16.9863 10.038 16.9027 9.82219C16.8191 9.60638 16.6919 9.41017 16.5289 9.24586C16.3659 9.08155 16.1707 8.95269 15.9555 8.86736C15.7404 8.78203 15.51 8.74208 15.2787 8.75H9.50366ZM8.79666 14H15.2787C15.738 14.0048 16.1936 13.9173 16.6184 13.7426C17.0433 13.568 17.4287 13.3098 17.7519 12.9833C18.0751 12.6569 18.3294 12.2689 18.4998 11.8423C18.6701 11.4157 18.7531 10.9593 18.7437 10.5C18.7437 8.54 17.2457 7 15.2787 7H9.74166L9.97266 5.25H16.9727C17.6045 5.28987 18.2218 5.45727 18.7872 5.74209C19.3527 6.02692 19.8546 6.42329 20.2627 6.90731C20.6709 7.39132 20.9768 7.95297 21.1621 8.55839C21.3473 9.16381 21.4081 9.80047 21.3407 10.43C21.0397 14.441 17.9457 15.75 16.5807 15.75H13.1157C12.9126 15.7514 12.7163 15.8234 12.5605 15.9537C12.4047 16.084 12.299 16.2644 12.2617 16.464L11.0997 22.75H7.61366L8.79666 14Z\" fill=\"#3B6FEF\"/>\r\n  </svg>\r\n);\r\n\r\nexport const UsdpIcon = ({ size = 32 }) => (\r\n  <svg width={size-5} height={size-5} viewBox=\"0 0 27 27\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n    <path d=\"M13.5 27C20.9558 27 27 20.9558 27 13.5C27 6.04416 20.9558 0 13.5 0C6.04416 0 0 6.04416 0 13.5C0 20.9558 6.04416 27 13.5 27Z\" fill=\"#398260\"/>\r\n    <path d=\"M15.6963 5.83207C17.1627 6.86735 18.6899 6.98294 20.6432 7.34238C22.4201 7.67229 22.7973 9.48719 21.9856 11.7974C21.9365 11.7143 21.8859 11.6322 21.8337 11.551L21.9856 11.7974C23.2234 13.9 23.2141 16.1773 20.5352 17.3425C15.7655 19.4181 15.4811 23.5061 10.973 21.3056C10.3338 20.991 9.75978 20.5585 9.28125 20.0307L9.10575 19.8307L8.9429 19.8029C5.91722 19.2671 3.93103 17.6269 5.76872 13.4419C7.39462 9.74369 5.94253 6.1046 10.9291 6.2666H10.9308C12.3044 4.97819 13.8881 4.55885 15.6954 5.83207H15.6963ZM11.0497 9.57157C8.95894 11.0726 8.27044 13.8679 9.66262 16.0389C9.99149 16.5546 10.4192 17 10.921 17.3496C11.4228 17.6992 11.9889 17.946 12.5866 18.0758C13.1842 18.2056 13.8017 18.2159 14.4033 18.1059C15.0049 17.996 15.5789 17.7681 16.092 17.4353C18.2503 16.0347 18.5456 13.3178 17.4791 10.9663C16.3865 8.55569 13.3869 7.89335 11.0497 9.57157Z\" fill=\"white\"/>\r\n  </svg>\r\n); ","// // src/components/PaymentMethods.jsx \r\n// import React, { useState, useEffect, useRef } from 'react';\r\n// import { NETWORK_TYPES, TOKEN_CONFIG, detectWallets, WALLET_TYPES } from '../services/walletService';\r\n// import { getMerchantNetworks, getMerchantTokens } from '../services/api';\r\n// import { EthIcon, TronIcon, AlgorandIcon, SolanaIcon, BscIcon, PyusdIcon, UsdpIcon } from './icons';\r\n\r\n// /**\r\n//  * Payment methods component with network dropdown and currency dropdown\r\n//  * Now uses merchant's configured networks and tokens only\r\n//  */\r\n// const PaymentMethods = ({ onSelect, selected, theme = 'light', supportedNetworks = [] }) => {\r\n//   const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n//   const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n//   const [availableWallets, setAvailableWallets] = useState({});\r\n//   const [searchQuery, setSearchQuery] = useState('');\r\n\r\n//   // New state for merchant's configured data\r\n//   const [merchantNetworks, setMerchantNetworks] = useState([]);\r\n//   const [merchantTokens, setMerchantTokens] = useState([]);\r\n//   const [loading, setLoading] = useState(true);\r\n//   const [error, setError] = useState(null);\r\n\r\n//   // Custom dropdown state for networks\r\n//   const [networkDropdownOpen, setNetworkDropdownOpen] = useState(false);\r\n//   const networkDropdownRef = useRef(null);\r\n\r\n//   // Custom dropdown state for currencies\r\n//   const [currencyDropdownOpen, setCurrencyDropdownOpen] = useState(false);\r\n//   const currencyDropdownRef = useRef(null);\r\n\r\n//   // Load merchant's configured networks and tokens\r\n//   useEffect(() => {\r\n//     const loadMerchantData = async () => {\r\n//       try {\r\n//         setLoading(true);\r\n// \r\n//         const [networks, tokens] = await Promise.all([\r\n//           getMerchantNetworks(),\r\n//           getMerchantTokens()\r\n//         ]);\r\n\r\n//         console.log('Raw merchant networks from API:', networks);\r\n//         console.log('Raw merchant tokens from API:', tokens);\r\n\r\n//         // Remove duplicates from networks based on shortName\r\n//         const uniqueNetworks = networks.filter((network, index, self) => \r\n//           index === self.findIndex(n => n.shortName === network.shortName)\r\n//         );\r\n\r\n//         // Remove duplicates from tokens based on symbol + networkId combination\r\n//         const uniqueTokens = tokens.filter((token, index, self) => \r\n//           index === self.findIndex(t => \r\n//             t.symbol === token.symbol && \r\n//             t.networkId === token.networkId\r\n//           )\r\n//         );\r\n\r\n//         console.log('Unique merchant networks after deduplication:', uniqueNetworks);\r\n//         console.log('Unique merchant tokens after deduplication:', uniqueTokens);\r\n\r\n//         setMerchantNetworks(uniqueNetworks);\r\n//         setMerchantTokens(uniqueTokens);\r\n\r\n//         // Auto-select first available network if none selected\r\n//         if (uniqueNetworks.length > 0 && !selectedNetwork) {\r\n//           setSelectedNetwork(uniqueNetworks[0].shortName);\r\n//         }\r\n\r\n//         setError(null);\r\n//       } catch (err) {\r\n//         console.error('Failed to load merchant data:', err);\r\n//         setError(err.message);\r\n//       } finally {\r\n//         setLoading(false);\r\n//       }\r\n//     };\r\n\r\n//     loadMerchantData();\r\n//   }, []);\r\n\r\n//   // Close dropdowns on outside click\r\n//   useEffect(() => {\r\n//     function handleClickOutside(event) {\r\n//       if (networkDropdownRef.current && !networkDropdownRef.current.contains(event.target)) {\r\n//         setNetworkDropdownOpen(false);\r\n//       }\r\n//       if (currencyDropdownRef.current && !currencyDropdownRef.current.contains(event.target)) {\r\n//         setCurrencyDropdownOpen(false);\r\n//       }\r\n//     }\r\n//     if (networkDropdownOpen || currencyDropdownOpen) {\r\n//       document.addEventListener('mousedown', handleClickOutside);\r\n//     } else {\r\n//       document.removeEventListener('mousedown', handleClickOutside);\r\n//     }\r\n//     return () => document.removeEventListener('mousedown', handleClickOutside);\r\n//   }, [networkDropdownOpen, currencyDropdownOpen]);\r\n\r\n//   useEffect(() => {\r\n//     setAvailableWallets(detectWallets());\r\n//   }, []);\r\n\r\n//   // Get network icon component by shortName\r\n//   const getNetworkIcon = (shortName) => {\r\n//     const iconMap = {\r\n//       'ethereum': EthIcon,\r\n//       'bsc': BscIcon,\r\n//       'tron': TronIcon,\r\n//       'algorand': AlgorandIcon,\r\n//       'solana': SolanaIcon\r\n//     };\r\n//     return iconMap[shortName] || EthIcon;\r\n//   };\r\n\r\n//   // FIXED: Get token icon - returns object with type and value\r\n// const getTokenIcon = (token) => {\r\n//   console.log('🔍 getTokenIcon called with token:', token);\r\n//   console.log('🔍 Token symbol:', token.symbol);\r\n//   console.log('🔍 Token logo from backend:', token.logo);\r\n\r\n//   // Reliable fallback images from CoinMarketCap\r\n//   const fallbackImages = {\r\n//     // Stablecoins\r\n//     'USDT': 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png',\r\n//     'USDC': 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png',\r\n//     'DAI': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4943.png',\r\n//     'BUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4687.png',\r\n//     'USDP': 'https://s2.coinmarketcap.com/static/img/coins/64x64/6958.png',\r\n//     'PYUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/28134.png',\r\n//     'FRAX': 'https://s2.coinmarketcap.com/static/img/coins/64x64/6952.png',\r\n//     'USDJ': 'https://s2.coinmarketcap.com/static/img/coins/64x64/5446.png',\r\n//     'TUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/2563.png',\r\n\r\n//     // Native Cryptocurrencies\r\n//     'ETH': 'https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png',\r\n//     'BNB': 'https://s2.coinmarketcap.com/static/img/coins/64x64/1839.png',\r\n//     'TRX': 'https://s2.coinmarketcap.com/static/img/coins/64x64/1958.png',\r\n//     'ALGO': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4030.png',\r\n//     'SOL': 'https://s2.coinmarketcap.com/static/img/coins/64x64/5426.png',\r\n//     'AVAX': 'https://s2.coinmarketcap.com/static/img/coins/64x64/5805.png',\r\n//     'MATIC': 'https://s2.coinmarketcap.com/static/img/coins/64x64/3890.png'\r\n//   };\r\n\r\n//   // ALWAYS prioritize fallback images first for reliability\r\n//   const tokenSymbol = token.symbol?.toUpperCase();\r\n//   const fallbackUrl = fallbackImages[tokenSymbol];\r\n\r\n//   if (fallbackUrl) {\r\n//     console.log('✅ Using CoinMarketCap image for', tokenSymbol, ':', fallbackUrl);\r\n//     return { type: 'image', value: fallbackUrl };\r\n//   }\r\n\r\n//   // Special component cases (only if no fallback exists)\r\n//   if (tokenSymbol === 'PYUSD') {\r\n//     console.log('✅ Using PYUSD component');\r\n//     return { type: 'component', value: PyusdIcon };\r\n//   }\r\n//   if (tokenSymbol === 'USDP') {\r\n//     console.log('✅ Using USDP component');\r\n//     return { type: 'component', value: UsdpIcon };\r\n//   }\r\n\r\n//   // Backend logo as last resort\r\n//   if (token.logo && token.logo !== '' && !token.logo.includes('placeholder')) {\r\n//     console.log('✅ Using backend logo:', token.logo);\r\n//     return { type: 'image', value: token.logo };\r\n//   }\r\n\r\n//   // Final fallback\r\n//   const placeholder = `https://via.placeholder.com/64x64/6366f1/ffffff?text=${encodeURIComponent(tokenSymbol || '?')}`;\r\n//   console.log('⚠️ Using placeholder for', tokenSymbol, ':', placeholder);\r\n//   return { type: 'image', value: placeholder };\r\n// };\r\n\r\n//   // FIXED: Render token icon based on type\r\n//  const renderTokenIcon = (tokenIconData, size = 32, className = \"rounded-full\") => {\r\n//   console.log('🎨 renderTokenIcon called with:', tokenIconData);\r\n//   console.log('🎨 Icon type:', tokenIconData.type);\r\n//   console.log('🎨 Icon value:', tokenIconData.value);\r\n\r\n//   if (tokenIconData.type === 'component') {\r\n//     const IconComponent = tokenIconData.value;\r\n//     console.log('🎨 Rendering component:', IconComponent);\r\n//     return <IconComponent size={size} />;\r\n//   } else {\r\n//     console.log('🎨 Rendering image with URL:', tokenIconData.value);\r\n//     return (\r\n//       <img \r\n//         src={tokenIconData.value} \r\n//         alt=\"Token\" \r\n//         className={className}\r\n//         style={{ \r\n//           height: `${size}px`, \r\n//           width: `${size}px`,\r\n//           objectFit: 'cover',\r\n//           display: 'block',\r\n//           flexShrink: 0\r\n//         }}\r\n//         onLoad={() => console.log('✅ Image loaded successfully:', tokenIconData.value)}\r\n//         onError={(e) => {\r\n//           console.error('❌ Image failed to load:', tokenIconData.value);\r\n//           console.error('❌ Error details:', e.target.src);\r\n//           // Fallback to a simple colored placeholder\r\n//           e.target.src = `https://via.placeholder.com/${size}x${size}/6366f1/ffffff?text=${encodeURIComponent('?')}`;\r\n//         }}\r\n//       />\r\n//     );\r\n//   }\r\n// };\r\n\r\n// // DEBUGGING: Add this function to test image loading\r\n// const testImageLoad = (url) => {\r\n//   return new Promise((resolve, reject) => {\r\n//     const img = new Image();\r\n//     img.onload = () => {\r\n//       console.log('✅ Test image loaded:', url);\r\n//       resolve(true);\r\n//     };\r\n//     img.onerror = () => {\r\n//       console.error('❌ Test image failed:', url);\r\n//       reject(false);\r\n//     };\r\n//     img.src = url;\r\n//   });\r\n// };\r\n\r\n// // DEBUGGING: Test all fallback images (call this in useEffect for debugging)\r\n// const testAllImages = async () => {\r\n//   const fallbackImages = {\r\n//     'USDT': 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png',\r\n//     'USDC': 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png',\r\n//     'DAI': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4943.png',\r\n//     'BUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4687.png',\r\n//     'USDP': 'https://s2.coinmarketcap.com/static/img/coins/64x64/6958.png',\r\n//     'PYUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/28134.png'\r\n//   };\r\n\r\n//   console.log('🧪 Testing all fallback images...');\r\n//   for (const [symbol, url] of Object.entries(fallbackImages)) {\r\n//     try {\r\n//       await testImageLoad(url);\r\n//       console.log(`✅ ${symbol}: Working`);\r\n//     } catch {\r\n//       console.log(`❌ ${symbol}: Failed`);\r\n//     }\r\n//   }\r\n// };\r\n\r\n//   // Filter merchant tokens for selected network and remove duplicates\r\n//   const getPaymentMethodsForNetwork = (networkShortName) => {\r\n//     if (!networkShortName) return [];\r\n\r\n//     const tokensForNetwork = merchantTokens.filter(token => \r\n//       token.Network && token.Network.shortName === networkShortName\r\n//     );\r\n\r\n//     // Remove duplicates based on symbol\r\n//     const uniqueTokens = tokensForNetwork.filter((token, index, self) => \r\n//       index === self.findIndex(t => t.symbol === token.symbol)\r\n//     );\r\n\r\n//     console.log(`Tokens for ${networkShortName} (after deduplication):`, uniqueTokens);\r\n\r\n//     return uniqueTokens;\r\n//   };\r\n\r\n//   const handleNetworkChange = (networkShortName) => {\r\n//     setSelectedNetwork(networkShortName);\r\n//     setSelectedPaymentMethod(null); // Reset payment method selection\r\n//   };\r\n\r\n//   const handleSelectPaymentMethod = (token) => {\r\n//     const tokenIconData = getTokenIcon(token);\r\n\r\n//     const paymentMethodData = {\r\n//       currency: token.symbol,\r\n//       network: selectedNetwork,\r\n//       tokenConfig: {\r\n//         contractAddress: token.contractAddress,\r\n//         decimals: token.decimals,\r\n//         symbol: token.symbol,\r\n//         ...(token.Network.type === 'algorand' && { assetId: token.contractAddress })\r\n//       },\r\n//       method: {\r\n//         id: token.symbol,\r\n//         name: token.symbol,\r\n//         description: token.name,\r\n//         logo: tokenIconData, // Store the icon data object\r\n//         network: selectedNetwork,\r\n//         isStablecoin: token.isStablecoin\r\n//       }\r\n//     };\r\n//     setSelectedPaymentMethod(paymentMethodData);\r\n//   };\r\n\r\n//   const handleProceed = () => {\r\n//     if (selectedPaymentMethod) {\r\n//       onSelect(selectedPaymentMethod);\r\n//     }\r\n//   };\r\n\r\n//   // Helper functions with correct wallet constants\r\n//   function getRequiredWallet(networkShortName) {\r\n//     switch (networkShortName) {\r\n//       case 'ethereum':\r\n//       case 'bsc':\r\n//         return WALLET_TYPES.METAMASK;\r\n//       case 'tron':\r\n//         return WALLET_TYPES.TRONLINK;\r\n//       case 'algorand':\r\n//         return WALLET_TYPES.LUTE;\r\n//       default:\r\n//         return WALLET_TYPES.METAMASK;\r\n//     }\r\n//   }\r\n\r\n//   function getNetworkRequirement(networkShortName) {\r\n//     const wallet = getRequiredWallet(networkShortName);\r\n//     const isAvailable = availableWallets[wallet];\r\n\r\n//     const walletNames = {\r\n//       [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n//       [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n//       [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n//       [WALLET_TYPES.LUTE]: 'Lute Wallet'\r\n//     };\r\n\r\n//     return isAvailable \r\n//       ? `${walletNames[wallet]} detected - Ready to pay`\r\n//       : `${walletNames[wallet]} required - Please install to continue`;\r\n//   }\r\n\r\n//   // Show loading state\r\n//   if (loading) {\r\n//     return (\r\n//       <div className=\"flex items-center justify-center py-8\">\r\n//         <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600\"></div>\r\n//         <span className=\"ml-2 text-gray-600\">Loading payment options...</span>\r\n//       </div>\r\n//     );\r\n//   }\r\n\r\n//   // Show error state\r\n//   if (error) {\r\n//     return (\r\n//       <div className=\"p-4 rounded-lg bg-red-100 mb-4 text-red-700 text-center\">\r\n//         <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//           <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n//         </svg>\r\n//         <p className=\"font-medium\">Unable to load payment options</p>\r\n//         <p className=\"text-sm mt-1\">{error}</p>\r\n//       </div>\r\n//     );\r\n//   }\r\n\r\n//   // Show message if no networks configured\r\n//   if (merchantNetworks.length === 0) {\r\n//     return (\r\n//       <div className=\"p-4 rounded-lg bg-yellow-100 mb-4 text-yellow-700 text-center\">\r\n//         <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//           <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n//         </svg>\r\n//         <p className=\"font-medium\">No Payment Networks Configured</p>\r\n//         <p className=\"text-sm mt-1\">Please configure your wallet addresses in the merchant dashboard first.</p>\r\n//       </div>\r\n//     );\r\n//   }\r\n\r\n//   const availableTokensForNetwork = getPaymentMethodsForNetwork(selectedNetwork);\r\n\r\n//   return (\r\n//     <div className=\"\">\r\n//       {/* Blockchain Network Custom Dropdown */}\r\n//       <div className=\"mb-6\">\r\n//         <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n//           Blockchain Network\r\n//         </label>\r\n//         <div className=\"relative\" ref={networkDropdownRef}>\r\n//           <button\r\n//             type=\"button\"\r\n//             className=\"w-full flex items-center justify-between py-4 bg-white rounded-2xl shadow border border-gray-200 text-gray-900 text-base font-normal focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50 transition\"\r\n//             onClick={() => setNetworkDropdownOpen((open) => !open)}\r\n//             style={{ minHeight: '56px', padding: '0.5rem' }}\r\n//           >\r\n//             <span className=\"flex items-center gap-3\">\r\n//               {selectedNetwork ? (\r\n//                 <>\r\n//                   {(() => {\r\n//                     const network = merchantNetworks.find(n => n.shortName === selectedNetwork);\r\n//                     const IconComponent = getNetworkIcon(selectedNetwork);\r\n//                     return <IconComponent size={32} />;\r\n//                   })()}\r\n//                   <span className=\"text-base font-normal\">\r\n//                     {merchantNetworks.find(n => n.shortName === selectedNetwork)?.name || selectedNetwork}\r\n//                   </span>\r\n//                 </>\r\n//               ) : (\r\n//                 <span className=\"text-gray-500\">Select a network...</span>\r\n//               )}\r\n//             </span>\r\n//             <svg className={`w-5 h-5 ml-2 transition-transform ${networkDropdownOpen ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n//               <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\r\n//             </svg>\r\n//           </button>\r\n//           {networkDropdownOpen && (\r\n//             <div className=\"absolute left-0 mt-2 px-2 w-full bg-white rounded-2xl shadow-lg border border-gray-100 z-20\" style={{ minWidth: '100%' }}>\r\n//               {merchantNetworks.map((network) => {\r\n//                 const IconComponent = getNetworkIcon(network.shortName);\r\n//                 return (\r\n//                   <button\r\n//                     key={network.id}\r\n//                     type=\"button\"\r\n//                     className={`w-full flex items-center gap-3 mt-1 mb-1 px-2 py-2 text-gray-900 text-base font-normal rounded-2xl transition hover:bg-gray-100 ${selectedNetwork === network.shortName ? 'bg-gray-50' : ''}`}\r\n//                     onClick={() => {\r\n//                       setNetworkDropdownOpen(false);\r\n//                       handleNetworkChange(network.shortName);\r\n//                     }}\r\n//                     style={{ minHeight: '48px' }}\r\n//                   >\r\n//                     <IconComponent size={32} />\r\n//                     <span>{network.name}</span>\r\n//                   </button>\r\n//                 );\r\n//               })}\r\n//             </div>\r\n//           )}\r\n//         </div>\r\n//       </div>\r\n\r\n//       {/* Stablecoins/Tokens Dropdown */}\r\n//       {selectedNetwork && (\r\n//         <div className=\"mb-4\">\r\n//           <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n//             Choose Token\r\n//           </label>\r\n\r\n//           <div className=\"relative\" ref={currencyDropdownRef}>\r\n//             <button\r\n//               type=\"button\"\r\n//               className=\"w-full flex items-center justify-between py-2 px-3 bg-white rounded-2xl shadow border border-gray-200 text-gray-900 text-base font-normal focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50 transition\"\r\n//               onClick={() => setCurrencyDropdownOpen((open) => !open)}\r\n//               style={{ minHeight: '56px' }}\r\n//             >\r\n//               <span className=\"flex items-center gap-3\">\r\n//                 {selectedPaymentMethod ? (\r\n//                   <>\r\n//                     {renderTokenIcon(selectedPaymentMethod.method.logo, 32)}\r\n//                     <span className=\"text-base font-normal\">{selectedPaymentMethod.method.description} ({selectedPaymentMethod.method.name})</span>\r\n//                   </>\r\n//                 ) : (\r\n//                   <span className=\"text-gray-500\">Choose a token...</span>\r\n//                 )}\r\n//               </span>\r\n//               <svg className={`w-5 h-5 ml-2 transition-transform ${currencyDropdownOpen ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n//                 <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\r\n//               </svg>\r\n//             </button>\r\n\r\n//             {currencyDropdownOpen && (\r\n//               <div className=\"absolute left-0 mt-2 px-2 w-full bg-white rounded-2xl shadow-lg border border-gray-100 z-20\" style={{ minWidth: '100%' }}>\r\n//                 {/* Search Input */}\r\n//                 <div className=\"sticky top-0 bg-white pt-2 pb-2 px-2 border-b border-gray-100\">\r\n//                   <div className=\"relative\">\r\n//                     <input\r\n//                       type=\"text\"\r\n//                       placeholder=\"Search tokens...\"\r\n//                       className=\"w-full py-2 px-3 text-sm border border-gray-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50\"\r\n//                       value={searchQuery}\r\n//                       onChange={(e) => setSearchQuery(e.target.value)}\r\n//                       onClick={(e) => e.stopPropagation()}\r\n//                     />\r\n//                   </div>\r\n//                 </div>\r\n\r\n//                 {/* Filtered Token List */}\r\n//                 <div className=\"max-h-60 overflow-y-auto py-2\">\r\n//                   {availableTokensForNetwork\r\n//                     .filter(token => \r\n//                       token.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n//                       token.symbol.toLowerCase().includes(searchQuery.toLowerCase())\r\n//                     )\r\n//                     .map((token) => {\r\n//                       const tokenIconData = getTokenIcon(token);\r\n//                       return (\r\n//                         <button\r\n//                           key={`${token.id}-${token.Network.shortName}`}\r\n//                           type=\"button\"\r\n//                           className={`w-full flex items-center gap-3 mt-1 mb-1 px-2 py-2 text-gray-900 text-base font-normal rounded-2xl transition hover:bg-gray-100 ${\r\n//                             selectedPaymentMethod?.currency === token.symbol ? 'bg-gray-50' : ''\r\n//                           }`}\r\n//                           onClick={() => {\r\n//                             setCurrencyDropdownOpen(false);\r\n//                             handleSelectPaymentMethod(token);\r\n//                           }}\r\n//                           style={{ minHeight: '48px' }}\r\n//                         >\r\n//                           {renderTokenIcon(tokenIconData, 32)}\r\n//                           <span>{token.name} ({token.symbol})</span>\r\n//                           {token.isStablecoin && (\r\n//                             <span className=\"ml-auto text-xs text-green-600 bg-green-100 px-2 py-1 rounded-full\">\r\n//                               Stablecoin\r\n//                             </span>\r\n//                           )}\r\n//                         </button>\r\n//                       );\r\n//                     })}\r\n\r\n//                   {/* No results message */}\r\n//                   {availableTokensForNetwork.filter(token => \r\n//                     token.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n//                     token.symbol.toLowerCase().includes(searchQuery.toLowerCase())\r\n//                   ).length === 0 && (\r\n//                     <div className=\"text-center py-4 text-gray-500 text-sm\">\r\n//                       {searchQuery ? `No tokens found matching \"${searchQuery}\"` : 'No tokens configured for this network'}\r\n//                     </div>\r\n//                   )}\r\n//                 </div>\r\n//               </div>\r\n//             )}\r\n//           </div>\r\n//         </div>\r\n//       )}\r\n\r\n//       {/* Network Info */}\r\n//       {selectedNetwork && (\r\n//         <div className={`p-3 rounded-lg text-sm mb-6 ${\r\n//           theme === 'dark' ? 'bg-gray-800 text-gray-300' : 'bg-gray-50 text-gray-600'\r\n//         }`}>\r\n//           <div className=\"flex items-center\">\r\n//             <div className={`w-2 h-2 rounded-full mr-2 ${\r\n//               availableWallets[getRequiredWallet(selectedNetwork)] ? 'bg-green-500' : 'bg-red-500'\r\n//             }`}></div>\r\n//             <span className=\"text-xs\">\r\n//               {getNetworkRequirement(selectedNetwork)}\r\n//             </span>\r\n//           </div>\r\n//         </div>\r\n//       )}\r\n\r\n//       {/* Proceed Button */}\r\n//       <button\r\n//         onClick={handleProceed}\r\n//         disabled={!selectedPaymentMethod}\r\n//         className={`w-full py-3 px-4 font-medium rounded-2xl text-lg shadow-md transition-colors ${\r\n//           selectedPaymentMethod\r\n//             ? 'bg-[#7042D2] text-white hover:bg-[#5b34b1]'\r\n//             : 'bg-gray-300 text-gray-500 cursor-not-allowed'\r\n//         }`}\r\n//         style={{ borderRadius: '1.5rem' }}\r\n//       >\r\n//         Proceed\r\n//       </button>\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// export default PaymentMethods;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // src/components/PaymentMethods.jsx - Updated with Solana icon\r\n// import React, { useState, useEffect, useRef } from 'react';\r\n// import { NETWORK_TYPES, TOKEN_CONFIG, detectWallets, WALLET_TYPES } from '../services/walletService';\r\n// import { getMerchantNetworks, getMerchantTokens } from '../services/api';\r\n// import { EthIcon, TronIcon, AlgorandIcon, SolanaIcon, BscIcon, PyusdIcon, UsdpIcon } from './icons';\r\n\r\n// /**\r\n//  * Payment methods component with network dropdown and currency dropdown\r\n//  * Now uses merchant's configured networks and tokens only\r\n//  */\r\n// const PaymentMethods = ({ onSelect, selected, theme = 'light', supportedNetworks = [] }) => {\r\n//   const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n//   const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n//   const [availableWallets, setAvailableWallets] = useState({});\r\n//   const [searchQuery, setSearchQuery] = useState('');\r\n\r\n//   // New state for merchant's configured data\r\n//   const [merchantNetworks, setMerchantNetworks] = useState([]);\r\n//   const [merchantTokens, setMerchantTokens] = useState([]);\r\n//   const [loading, setLoading] = useState(true);\r\n//   const [error, setError] = useState(null);\r\n\r\n//   // Custom dropdown state for networks\r\n//   const [networkDropdownOpen, setNetworkDropdownOpen] = useState(false);\r\n//   const networkDropdownRef = useRef(null);\r\n\r\n//   // Custom dropdown state for currencies\r\n//   const [currencyDropdownOpen, setCurrencyDropdownOpen] = useState(false);\r\n//   const currencyDropdownRef = useRef(null);\r\n\r\n//   // Load merchant's configured networks and tokens\r\n//   useEffect(() => {\r\n//     const loadMerchantData = async () => {\r\n//       try {\r\n//         setLoading(true);\r\n// \r\n//         const [networks, tokens] = await Promise.all([\r\n//           getMerchantNetworks(),\r\n//           getMerchantTokens()\r\n//         ]);\r\n\r\n//         console.log('Raw merchant networks from API:', networks);\r\n//         console.log('Raw merchant tokens from API:', tokens);\r\n\r\n//         // Remove duplicates from networks based on shortName\r\n//         const uniqueNetworks = networks.filter((network, index, self) => \r\n//           index === self.findIndex(n => n.shortName === network.shortName)\r\n//         );\r\n\r\n//         // Remove duplicates from tokens based on symbol + networkId combination\r\n//         const uniqueTokens = tokens.filter((token, index, self) => \r\n//           index === self.findIndex(t => \r\n//             t.symbol === token.symbol && \r\n//             t.networkId === token.networkId\r\n//           )\r\n//         );\r\n\r\n//         console.log('Unique merchant networks after deduplication:', uniqueNetworks);\r\n//         console.log('Unique merchant tokens after deduplication:', uniqueTokens);\r\n\r\n//         setMerchantNetworks(uniqueNetworks);\r\n//         setMerchantTokens(uniqueTokens);\r\n\r\n//         // Auto-select first available network if none selected\r\n//         if (uniqueNetworks.length > 0 && !selectedNetwork) {\r\n//           setSelectedNetwork(uniqueNetworks[0].shortName);\r\n//         }\r\n\r\n//         setError(null);\r\n//       } catch (err) {\r\n//         console.error('Failed to load merchant data:', err);\r\n//         setError(err.message);\r\n//       } finally {\r\n//         setLoading(false);\r\n//       }\r\n//     };\r\n\r\n//     loadMerchantData();\r\n//   }, []);\r\n\r\n//   // Close dropdowns on outside click\r\n//   useEffect(() => {\r\n//     function handleClickOutside(event) {\r\n//       if (networkDropdownRef.current && !networkDropdownRef.current.contains(event.target)) {\r\n//         setNetworkDropdownOpen(false);\r\n//       }\r\n//       if (currencyDropdownRef.current && !currencyDropdownRef.current.contains(event.target)) {\r\n//         setCurrencyDropdownOpen(false);\r\n//       }\r\n//     }\r\n//     if (networkDropdownOpen || currencyDropdownOpen) {\r\n//       document.addEventListener('mousedown', handleClickOutside);\r\n//     } else {\r\n//       document.removeEventListener('mousedown', handleClickOutside);\r\n//     }\r\n//     return () => document.removeEventListener('mousedown', handleClickOutside);\r\n//   }, [networkDropdownOpen, currencyDropdownOpen]);\r\n\r\n//   useEffect(() => {\r\n//     setAvailableWallets(detectWallets());\r\n//   }, []);\r\n\r\n//   // Get network icon component by shortName - Added Solana\r\n//   const getNetworkIcon = (shortName) => {\r\n//     const iconMap = {\r\n//       'ethereum': EthIcon,\r\n//       'bsc': BscIcon,\r\n//       'tron': TronIcon,\r\n//       'algorand': AlgorandIcon,\r\n//       'solana': SolanaIcon\r\n//     };\r\n//     return iconMap[shortName] || EthIcon;\r\n//   };\r\n\r\n//   // Get token icon - returns object with type and value\r\n//   const getTokenIcon = (token) => {\r\n// //     console.log('🔍 Token symbol:', token.symbol);\r\n//     console.log('🔍 Token logo from backend:', token.logo);\r\n\r\n//     // Reliable fallback images from CoinMarketCap\r\n//     const fallbackImages = {\r\n//       // Stablecoins\r\n//       'USDT': 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png',\r\n//       'USDC': 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png',\r\n//       'DAI': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4943.png',\r\n//       'BUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4687.png',\r\n//       'USDP': 'https://s2.coinmarketcap.com/static/img/coins/64x64/6958.png',\r\n//       'PYUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/28134.png',\r\n//       'FRAX': 'https://s2.coinmarketcap.com/static/img/coins/64x64/6952.png',\r\n//       'USDJ': 'https://s2.coinmarketcap.com/static/img/coins/64x64/5446.png',\r\n//       'TUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/2563.png',\r\n\r\n//       // Native Cryptocurrencies\r\n//       'ETH': 'https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png',\r\n//       'BNB': 'https://s2.coinmarketcap.com/static/img/coins/64x64/1839.png',\r\n//       'TRX': 'https://s2.coinmarketcap.com/static/img/coins/64x64/1958.png',\r\n//       'ALGO': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4030.png',\r\n//       'SOL': 'https://s2.coinmarketcap.com/static/img/coins/64x64/5426.png',\r\n//       'AVAX': 'https://s2.coinmarketcap.com/static/img/coins/64x64/5805.png',\r\n//       'MATIC': 'https://s2.coinmarketcap.com/static/img/coins/64x64/3890.png'\r\n//     };\r\n\r\n//     // ALWAYS prioritize fallback images first for reliability\r\n//     const tokenSymbol = token.symbol?.toUpperCase();\r\n//     const fallbackUrl = fallbackImages[tokenSymbol];\r\n\r\n//     if (fallbackUrl) {\r\n// //       return { type: 'image', value: fallbackUrl };\r\n//     }\r\n\r\n//     // Special component cases (only if no fallback exists)\r\n//     if (tokenSymbol === 'PYUSD') {\r\n// //       return { type: 'component', value: PyusdIcon };\r\n//     }\r\n//     if (tokenSymbol === 'USDP') {\r\n// //       return { type: 'component', value: UsdpIcon };\r\n//     }\r\n\r\n//     // Backend logo as last resort\r\n//     if (token.logo && token.logo !== '' && !token.logo.includes('placeholder')) {\r\n// //       return { type: 'image', value: token.logo };\r\n//     }\r\n\r\n//     // Final fallback\r\n//     const placeholder = `https://via.placeholder.com/64x64/6366f1/ffffff?text=${encodeURIComponent(tokenSymbol || '?')}`;\r\n// //     return { type: 'image', value: placeholder };\r\n//   };\r\n\r\n//   // Render token icon based on type\r\n//   const renderTokenIcon = (tokenIconData, size = 32, className = \"rounded-full\") => {\r\n// //     console.log('🎨 Icon type:', tokenIconData.type);\r\n//     console.log('🎨 Icon value:', tokenIconData.value);\r\n\r\n//     if (tokenIconData.type === 'component') {\r\n//       const IconComponent = tokenIconData.value;\r\n// //       return <IconComponent size={size} />;\r\n//     } else {\r\n// //       return (\r\n//         <img \r\n//           src={tokenIconData.value} \r\n//           alt=\"Token\" \r\n//           className={className}\r\n//           style={{ \r\n//             height: `${size}px`, \r\n//             width: `${size}px`,\r\n//             objectFit: 'cover',\r\n//             display: 'block',\r\n//             flexShrink: 0\r\n//           }}\r\n//           onLoad={() => {}}\r\n//           onError={(e) => {\r\n//             console.error('❌ Image failed to load:', tokenIconData.value);\r\n//             console.error('❌ Error details:', e.target.src);\r\n//             // Fallback to a simple colored placeholder\r\n//             e.target.src = `https://via.placeholder.com/${size}x${size}/6366f1/ffffff?text=${encodeURIComponent('?')}`;\r\n//           }}\r\n//         />\r\n//       );\r\n//     }\r\n//   };\r\n\r\n//   // Filter merchant tokens for selected network and remove duplicates\r\n//   const getPaymentMethodsForNetwork = (networkShortName) => {\r\n//     if (!networkShortName) return [];\r\n\r\n//     const tokensForNetwork = merchantTokens.filter(token => \r\n//       token.Network && token.Network.shortName === networkShortName\r\n//     );\r\n\r\n//     // Remove duplicates based on symbol\r\n//     const uniqueTokens = tokensForNetwork.filter((token, index, self) => \r\n//       index === self.findIndex(t => t.symbol === token.symbol)\r\n//     );\r\n\r\n//     console.log(`Tokens for ${networkShortName} (after deduplication):`, uniqueTokens);\r\n\r\n//     return uniqueTokens;\r\n//   };\r\n\r\n//   const handleNetworkChange = (networkShortName) => {\r\n//     setSelectedNetwork(networkShortName);\r\n//     setSelectedPaymentMethod(null); // Reset payment method selection\r\n//   };\r\n\r\n//   // const handleSelectPaymentMethod = (token) => {\r\n//   //   const tokenIconData = getTokenIcon(token);\r\n\r\n\r\n\r\n//   //   const paymentMethodData = {\r\n//   //     currency: token.symbol,\r\n//   //     network: selectedNetwork,\r\n//   //     tokenConfig: {\r\n//   //       contractAddress: token.contractAddress,\r\n//   //       decimals: token.decimals,\r\n//   //       symbol: token.symbol,\r\n//   //       ...(token.Network.type === 'algorand' && { assetId: token.contractAddress })\r\n//   //     },\r\n//   //     method: {\r\n//   //       id: token.symbol,\r\n//   //       name: token.symbol,\r\n//   //       description: token.name,\r\n//   //       logo: tokenIconData, // Store the icon data object\r\n//   //       network: selectedNetwork,\r\n//   //       isStablecoin: token.isStablecoin\r\n//   //     }\r\n//   //   };\r\n//   //   setSelectedPaymentMethod(paymentMethodData);\r\n//   // };\r\n\r\n// const handleSelectPaymentMethod = (token) => {\r\n//   const tokenIconData = getTokenIcon(token);\r\n\r\n//   console.log('=== PAYMENT METHOD SELECTION DEBUG ===');\r\n//   console.log('Selected token:', token);\r\n//   console.log('Selected network:', selectedNetwork);\r\n//   console.log('Token network:', token.Network?.shortName);\r\n\r\n//   const paymentMethodData = {\r\n//     currency: token.symbol,\r\n//     network: selectedNetwork, // ✅ Use the selectedNetwork state, not token.Network.shortName\r\n//     tokenConfig: {\r\n//       contractAddress: token.contractAddress,\r\n//       decimals: token.decimals,\r\n//       symbol: token.symbol,\r\n//       ...(token.Network.type === 'algorand' && { assetId: token.contractAddress })\r\n//     },\r\n//     method: {\r\n//       id: token.symbol,\r\n//       name: token.symbol,\r\n//       description: token.name,\r\n//       logo: tokenIconData, // Store the icon data object\r\n//       network: selectedNetwork, // ✅ Use selectedNetwork here too\r\n//       isStablecoin: token.isStablecoin\r\n//     }\r\n//   };\r\n\r\n//   console.log('🎯 FINAL PAYMENT METHOD DATA:', paymentMethodData);\r\n//   console.log('🎯 Network being set:', paymentMethodData.network);\r\n//   console.log('=== END PAYMENT METHOD SELECTION DEBUG ===');\r\n\r\n//   setSelectedPaymentMethod(paymentMethodData);\r\n// };\r\n\r\n//   const handleProceed = () => {\r\n//     if (selectedPaymentMethod) {\r\n//       onSelect(selectedPaymentMethod);\r\n//     }\r\n//   };\r\n\r\n//   // Helper functions with correct wallet constants - Added Phantom\r\n//   function getRequiredWallet(networkShortName) {\r\n//     switch (networkShortName) {\r\n//       case 'ethereum':\r\n//       case 'bsc':\r\n//         return WALLET_TYPES.METAMASK;\r\n//       case 'tron':\r\n//         return WALLET_TYPES.TRONLINK;\r\n//       case 'algorand':\r\n//         return WALLET_TYPES.LUTE;\r\n//       case 'solana':\r\n//         return WALLET_TYPES.PHANTOM;\r\n//       default:\r\n//         return WALLET_TYPES.METAMASK;\r\n//     }\r\n//   }\r\n\r\n//   function getNetworkRequirement(networkShortName) {\r\n//     const wallet = getRequiredWallet(networkShortName);\r\n//     const isAvailable = availableWallets[wallet];\r\n\r\n//     const walletNames = {\r\n//       [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n//       [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n//       [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n//       [WALLET_TYPES.LUTE]: 'Lute Wallet',\r\n//       [WALLET_TYPES.PHANTOM]: 'Phantom'\r\n//     };\r\n\r\n//     return isAvailable \r\n//       ? `${walletNames[wallet]} detected - Ready to pay`\r\n//       : `${walletNames[wallet]} required - Please install to continue`;\r\n//   }\r\n\r\n//   // Show loading state\r\n//   if (loading) {\r\n//     return (\r\n//       <div className=\"flex items-center justify-center py-8\">\r\n//         <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600\"></div>\r\n//         <span className=\"ml-2 text-gray-600\">Loading payment options...</span>\r\n//       </div>\r\n//     );\r\n//   }\r\n\r\n//   // Show error state\r\n//   if (error) {\r\n//     return (\r\n//       <div className=\"p-4 rounded-lg bg-red-100 mb-4 text-red-700 text-center\">\r\n//         <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//           <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n//         </svg>\r\n//         <p className=\"font-medium\">Unable to load payment options</p>\r\n//         <p className=\"text-sm mt-1\">{error}</p>\r\n//       </div>\r\n//     );\r\n//   }\r\n\r\n//   // Show message if no networks configured\r\n//   if (merchantNetworks.length === 0) {\r\n//     return (\r\n//       <div className=\"p-4 rounded-lg bg-yellow-100 mb-4 text-yellow-700 text-center\">\r\n//         <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//           <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n//         </svg>\r\n//         <p className=\"font-medium\">No Payment Networks Configured</p>\r\n//         <p className=\"text-sm mt-1\">Please configure your wallet addresses in the merchant dashboard first.</p>\r\n//       </div>\r\n//     );\r\n//   }\r\n\r\n//   const availableTokensForNetwork = getPaymentMethodsForNetwork(selectedNetwork);\r\n\r\n//   return (\r\n//     <div className=\"\">\r\n//       {/* Blockchain Network Custom Dropdown */}\r\n//       <div className=\"mb-6\">\r\n//         <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n//           Blockchain Network\r\n//         </label>\r\n//         <div className=\"relative\" ref={networkDropdownRef}>\r\n//           <button\r\n//             type=\"button\"\r\n//             className=\"w-full flex items-center justify-between py-4 bg-white rounded-2xl shadow border border-gray-200 text-gray-900 text-base font-normal focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50 transition\"\r\n//             onClick={() => setNetworkDropdownOpen((open) => !open)}\r\n//             style={{ minHeight: '56px', padding: '0.5rem' }}\r\n//           >\r\n//             <span className=\"flex items-center gap-3\">\r\n//               {selectedNetwork ? (\r\n//                 <>\r\n//                   {(() => {\r\n//                     const network = merchantNetworks.find(n => n.shortName === selectedNetwork);\r\n//                     const IconComponent = getNetworkIcon(selectedNetwork);\r\n//                     return <IconComponent size={32} />;\r\n//                   })()}\r\n//                   <span className=\"text-base font-normal\">\r\n//                     {merchantNetworks.find(n => n.shortName === selectedNetwork)?.name || selectedNetwork}\r\n//                   </span>\r\n//                 </>\r\n//               ) : (\r\n//                 <span className=\"text-gray-500\">Select a network...</span>\r\n//               )}\r\n//             </span>\r\n//             <svg className={`w-5 h-5 ml-2 transition-transform ${networkDropdownOpen ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n//               <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\r\n//             </svg>\r\n//           </button>\r\n//           {networkDropdownOpen && (\r\n//             <div className=\"absolute left-0 mt-2 px-2 w-full bg-white rounded-2xl shadow-lg border border-gray-100 z-20\" style={{ minWidth: '100%' }}>\r\n//               {merchantNetworks.map((network) => {\r\n//                 const IconComponent = getNetworkIcon(network.shortName);\r\n//                 return (\r\n//                   <button\r\n//                     key={network.id}\r\n//                     type=\"button\"\r\n//                     className={`w-full flex items-center gap-3 mt-1 mb-1 px-2 py-2 text-gray-900 text-base font-normal rounded-2xl transition hover:bg-gray-100 ${selectedNetwork === network.shortName ? 'bg-gray-50' : ''}`}\r\n//                     onClick={() => {\r\n//                       setNetworkDropdownOpen(false);\r\n//                       handleNetworkChange(network.shortName);\r\n//                     }}\r\n//                     style={{ minHeight: '48px' }}\r\n//                   >\r\n//                     <IconComponent size={32} />\r\n//                     <span>{network.name}</span>\r\n//                   </button>\r\n//                 );\r\n//               })}\r\n//             </div>\r\n//           )}\r\n//         </div>\r\n//       </div>\r\n\r\n//       {/* Stablecoins/Tokens Dropdown */}\r\n//       {selectedNetwork && (\r\n//         <div className=\"mb-4\">\r\n//           <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n//             Choose Token\r\n//           </label>\r\n\r\n//           <div className=\"relative\" ref={currencyDropdownRef}>\r\n//             <button\r\n//               type=\"button\"\r\n//               className=\"w-full flex items-center justify-between py-2 px-3 bg-white rounded-2xl shadow border border-gray-200 text-gray-900 text-base font-normal focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50 transition\"\r\n//               onClick={() => setCurrencyDropdownOpen((open) => !open)}\r\n//               style={{ minHeight: '56px' }}\r\n//             >\r\n//               <span className=\"flex items-center gap-3\">\r\n//                 {selectedPaymentMethod ? (\r\n//                   <>\r\n//                     {renderTokenIcon(selectedPaymentMethod.method.logo, 32)}\r\n//                     <span className=\"text-base font-normal\">{selectedPaymentMethod.method.description} ({selectedPaymentMethod.method.name})</span>\r\n//                   </>\r\n//                 ) : (\r\n//                   <span className=\"text-gray-500\">Choose a token...</span>\r\n//                 )}\r\n//               </span>\r\n//               <svg className={`w-5 h-5 ml-2 transition-transform ${currencyDropdownOpen ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n//                 <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\r\n//               </svg>\r\n//             </button>\r\n\r\n//             {currencyDropdownOpen && (\r\n//               <div className=\"absolute left-0 mt-2 px-2 w-full bg-white rounded-2xl shadow-lg border border-gray-100 z-20\" style={{ minWidth: '100%' }}>\r\n//                 {/* Search Input */}\r\n//                 <div className=\"sticky top-0 bg-white pt-2 pb-2 px-2 border-b border-gray-100\">\r\n//                   <div className=\"relative\">\r\n//                     <input\r\n//                       type=\"text\"\r\n//                       placeholder=\"Search tokens...\"\r\n//                       className=\"w-full py-2 px-3 text-sm border border-gray-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50\"\r\n//                       value={searchQuery}\r\n//                       onChange={(e) => setSearchQuery(e.target.value)}\r\n//                       onClick={(e) => e.stopPropagation()}\r\n//                     />\r\n//                   </div>\r\n//                 </div>\r\n\r\n//                 {/* Filtered Token List */}\r\n//                 <div className=\"max-h-60 overflow-y-auto py-2\">\r\n//                   {availableTokensForNetwork\r\n//                     .filter(token => \r\n//                       token.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n//                       token.symbol.toLowerCase().includes(searchQuery.toLowerCase())\r\n//                     )\r\n//                     .map((token) => {\r\n//                       const tokenIconData = getTokenIcon(token);\r\n//                       return (\r\n//                         <button\r\n//                           key={`${token.id}-${token.Network.shortName}`}\r\n//                           type=\"button\"\r\n//                           className={`w-full flex items-center gap-3 mt-1 mb-1 px-2 py-2 text-gray-900 text-base font-normal rounded-2xl transition hover:bg-gray-100 ${\r\n//                             selectedPaymentMethod?.currency === token.symbol ? 'bg-gray-50' : ''\r\n//                           }`}\r\n//                           onClick={() => {\r\n//                             setCurrencyDropdownOpen(false);\r\n//                             handleSelectPaymentMethod(token);\r\n//                           }}\r\n//                           style={{ minHeight: '48px' }}\r\n//                         >\r\n//                           {renderTokenIcon(tokenIconData, 32)}\r\n//                           <span>{token.name} ({token.symbol})</span>\r\n//                           {token.isStablecoin && (\r\n//                             <span className=\"ml-auto text-xs text-green-600 bg-green-100 px-2 py-1 rounded-full\">\r\n//                               Stablecoin\r\n//                             </span>\r\n//                           )}\r\n//                         </button>\r\n//                       );\r\n//                     })}\r\n\r\n//                   {/* No results message */}\r\n//                   {availableTokensForNetwork.filter(token => \r\n//                     token.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n//                     token.symbol.toLowerCase().includes(searchQuery.toLowerCase())\r\n//                   ).length === 0 && (\r\n//                     <div className=\"text-center py-4 text-gray-500 text-sm\">\r\n//                       {searchQuery ? `No tokens found matching \"${searchQuery}\"` : 'No tokens configured for this network'}\r\n//                     </div>\r\n//                   )}\r\n//                 </div>\r\n//               </div>\r\n//             )}\r\n//           </div>\r\n//         </div>\r\n//       )}\r\n\r\n//       {/* Network Info */}\r\n//       {selectedNetwork && (\r\n//         <div className={`p-3 rounded-lg text-sm mb-6 ${\r\n//           theme === 'dark' ? 'bg-gray-800 text-gray-300' : 'bg-gray-50 text-gray-600'\r\n//         }`}>\r\n//           <div className=\"flex items-center\">\r\n//             <div className={`w-2 h-2 rounded-full mr-2 ${\r\n//               availableWallets[getRequiredWallet(selectedNetwork)] ? 'bg-green-500' : 'bg-red-500'\r\n//             }`}></div>\r\n//             <span className=\"text-xs\">\r\n//               {getNetworkRequirement(selectedNetwork)}\r\n//             </span>\r\n//           </div>\r\n//         </div>\r\n//       )}\r\n\r\n//       {/* Proceed Button */}\r\n//       <button\r\n//         onClick={handleProceed}\r\n//         disabled={!selectedPaymentMethod}\r\n//         className={`w-full py-3 px-4 font-medium rounded-2xl text-lg shadow-md transition-colors ${\r\n//           selectedPaymentMethod\r\n//             ? 'bg-[#7042D2] text-white hover:bg-[#5b34b1]'\r\n//             : 'bg-gray-300 text-gray-500 cursor-not-allowed'\r\n//         }`}\r\n//         style={{ borderRadius: '1.5rem' }}\r\n//       >\r\n//         Proceed\r\n//       </button>\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// export default PaymentMethods;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// src/components/PaymentMethods.jsx - Fixed dropdown height and RLUSD filtering\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport { \r\n  NETWORK_TYPES, \r\n  TOKEN_CONFIG, \r\n  detectWallets, \r\n  WALLET_TYPES,\r\n  useWalletDetection,\r\n  isEvmNetwork\r\n} from '../services/walletCoreService';\r\nimport { getMerchantNetworks, getMerchantTokens } from '../services/api';\r\nimport { EthIcon, TronIcon, AlgorandIcon, SolanaIcon, BscIcon, PyusdIcon, UsdpIcon } from './icons';\r\n\r\n/**\r\n * Payment methods component with network dropdown and currency dropdown\r\n * Now uses merchant's configured networks and tokens only\r\n */\r\nconst PaymentMethods = ({ onSelect, selected, theme = 'light', supportedNetworks = [] }) => {\r\n  const [selectedNetwork, setSelectedNetwork] = useState(null);\r\n  const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n  const [availableWallets, setAvailableWallets] = useState({});\r\n  const [searchQuery, setSearchQuery] = useState('');\r\n  \r\n  // Modern wallet detection hook\r\n  const { detectedWallets } = useWalletDetection();\r\n\r\n  // New state for merchant's configured data\r\n  const [merchantNetworks, setMerchantNetworks] = useState([]);\r\n  const [merchantTokens, setMerchantTokens] = useState([]);\r\n  const [loading, setLoading] = useState(true);\r\n  const [error, setError] = useState(null);\r\n\r\n  // Custom dropdown state for networks\r\n  const [networkDropdownOpen, setNetworkDropdownOpen] = useState(false);\r\n  const networkDropdownRef = useRef(null);\r\n\r\n  // Custom dropdown state for currencies\r\n  const [currencyDropdownOpen, setCurrencyDropdownOpen] = useState(false);\r\n  const currencyDropdownRef = useRef(null);\r\n\r\n  // 🔧 NEW: Filter function to remove RLUSD tokens\r\n  const filterOutRLUSD = (tokens) => {\r\n    return tokens.filter(token => {\r\n      // Remove RLUSD (Raft Locked USDC) tokens\r\n      const isRLUSD = token.symbol?.toUpperCase() === 'RLUSD' ||\r\n        token.name?.toLowerCase().includes('raft locked') ||\r\n        token.name?.toLowerCase().includes('rlusd');\r\n\r\n      if (isRLUSD) {\r\n      }\r\n\r\n      return !isRLUSD;\r\n    });\r\n  };\r\n\r\n  // Load merchant's configured networks and tokens\r\n  useEffect(() => {\r\n    const loadMerchantData = async () => {\r\n      try {\r\n        setLoading(true);\r\n\r\n        const [networks, tokens] = await Promise.all([\r\n          getMerchantNetworks(),\r\n          getMerchantTokens()\r\n        ]);\r\n\r\n\r\n        // 🚫 FILTER OUT RLUSD TOKENS\r\n        const filteredTokens = tokens.filter(token => {\r\n          const symbol = token.symbol?.toUpperCase();\r\n          const name = token.name?.toLowerCase();\r\n\r\n          // Remove RLUSD and any Raft Locked tokens\r\n          const isRLUSD = symbol === 'RLUSD' ||\r\n            name?.includes('raft locked') ||\r\n            name?.includes('rlusd');\r\n\r\n          if (isRLUSD) {\r\n              }\r\n\r\n          return !isRLUSD;\r\n        });\r\n\r\n\r\n        // Remove duplicates from networks based on shortName\r\n        const uniqueNetworks = networks.filter((network, index, self) =>\r\n          index === self.findIndex(n => n.shortName === network.shortName)\r\n        );\r\n\r\n        // Remove duplicates from tokens based on symbol + networkId combination\r\n        const uniqueTokens = filteredTokens.filter((token, index, self) =>\r\n          index === self.findIndex(t =>\r\n            t.symbol === token.symbol &&\r\n            t.networkId === token.networkId\r\n          )\r\n        );\r\n\r\n\r\n        setMerchantNetworks(uniqueNetworks);\r\n        setMerchantTokens(uniqueTokens);\r\n\r\n        // Auto-select first available network if none selected\r\n        if (uniqueNetworks.length > 0 && !selectedNetwork) {\r\n          setSelectedNetwork(uniqueNetworks[0].shortName);\r\n        }\r\n\r\n        setError(null);\r\n      } catch (err) {\r\n        console.error('Failed to load merchant data:', err);\r\n        setError(err.message);\r\n      } finally {\r\n        setLoading(false);\r\n      }\r\n    };\r\n\r\n    loadMerchantData();\r\n  }, []);\r\n\r\n  // Close dropdowns on outside click\r\n  useEffect(() => {\r\n    function handleClickOutside(event) {\r\n      if (networkDropdownRef.current && !networkDropdownRef.current.contains(event.target)) {\r\n        setNetworkDropdownOpen(false);\r\n      }\r\n      if (currencyDropdownRef.current && !currencyDropdownRef.current.contains(event.target)) {\r\n        setCurrencyDropdownOpen(false);\r\n      }\r\n    }\r\n    if (networkDropdownOpen || currencyDropdownOpen) {\r\n      document.addEventListener('mousedown', handleClickOutside);\r\n    } else {\r\n      document.removeEventListener('mousedown', handleClickOutside);\r\n    }\r\n    return () => document.removeEventListener('mousedown', handleClickOutside);\r\n  }, [networkDropdownOpen, currencyDropdownOpen]);\r\n\r\n  // ✅ ENHANCED: Modern wallet detection with wallet-connect-core integration\r\n  useEffect(() => {\r\n    const detectWalletsEnhanced = async () => {\r\n      try {\r\n        \r\n        // Combine modern detection (EVM wallets) with legacy detection (non-EVM)\r\n        const [modernWallets, legacyWallets] = await Promise.allSettled([\r\n          // Modern detection from wallet-connect-core\r\n          Promise.resolve(detectedWallets || []),\r\n          // Legacy detection for non-EVM wallets\r\n          detectWallets()\r\n        ]);\r\n        \r\n        // Convert modern detected wallets to the expected format\r\n        const evmWallets = {};\r\n        if (modernWallets.status === 'fulfilled' && modernWallets.value) {\r\n          modernWallets.value.forEach(wallet => {\r\n            if (wallet.name.toLowerCase().includes('metamask')) {\r\n              evmWallets[WALLET_TYPES.METAMASK] = true;\r\n            } else if (wallet.name.toLowerCase().includes('coinbase')) {\r\n              evmWallets[WALLET_TYPES.COINBASE_WALLET] = true;\r\n            } else if (wallet.name.toLowerCase().includes('trust')) {\r\n              evmWallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n            }\r\n          });\r\n        }\r\n        \r\n        // Merge with legacy detection results\r\n        const legacyResult = legacyWallets.status === 'fulfilled' ? legacyWallets.value : {};\r\n        \r\n        const allWallets = {\r\n          ...legacyResult,\r\n          ...evmWallets\r\n        };\r\n        \r\n        setAvailableWallets(allWallets);\r\n        \r\n      } catch (error) {\r\n        console.error('PaymentMethods: Error detecting wallets:', error);\r\n        // Fallback to basic detection\r\n        const fallbackWallets = {\r\n          [WALLET_TYPES.METAMASK]: typeof window.ethereum !== 'undefined',\r\n          [WALLET_TYPES.PHANTOM]: typeof window.solana !== 'undefined',\r\n          [WALLET_TYPES.TRONLINK]: typeof window.tronWeb !== 'undefined',\r\n          [WALLET_TYPES.TRUST_WALLET]: false,\r\n          [WALLET_TYPES.LUTE]: false\r\n        };\r\n        setAvailableWallets(fallbackWallets);\r\n      }\r\n    };\r\n    \r\n    detectWalletsEnhanced();\r\n  }, [detectedWallets]);\r\n\r\n  // Get network icon component by shortName - Added Solana\r\n  const getNetworkIcon = (shortName) => {\r\n    const iconMap = {\r\n      'ethereum': EthIcon,\r\n      'bsc': BscIcon,\r\n      'tron': TronIcon,\r\n      'algorand': AlgorandIcon,\r\n      'solana': SolanaIcon\r\n    };\r\n    return iconMap[shortName] || EthIcon;\r\n  };\r\n\r\n  // Get token icon - returns object with type and value\r\n  const getTokenIcon = (token) => {\r\n\r\n    // Reliable fallback images from CoinMarketCap\r\n    const fallbackImages = {\r\n      // Stablecoins\r\n      'USDT': 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png',\r\n      'USDC': 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png',\r\n      'DAI': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4943.png',\r\n      'BUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4687.png',\r\n      'USDP': 'https://s2.coinmarketcap.com/static/img/coins/64x64/6958.png',\r\n      'PYUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/28134.png',\r\n      'FRAX': 'https://s2.coinmarketcap.com/static/img/coins/64x64/6952.png',\r\n      'USDJ': 'https://s2.coinmarketcap.com/static/img/coins/64x64/5446.png',\r\n      'TUSD': 'https://s2.coinmarketcap.com/static/img/coins/64x64/2563.png',\r\n\r\n      // Native Cryptocurrencies\r\n      'ETH': 'https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png',\r\n      'BNB': 'https://s2.coinmarketcap.com/static/img/coins/64x64/1839.png',\r\n      'TRX': 'https://s2.coinmarketcap.com/static/img/coins/64x64/1958.png',\r\n      'ALGO': 'https://s2.coinmarketcap.com/static/img/coins/64x64/4030.png',\r\n      'SOL': 'https://s2.coinmarketcap.com/static/img/coins/64x64/5426.png',\r\n      'AVAX': 'https://s2.coinmarketcap.com/static/img/coins/64x64/5805.png',\r\n      'MATIC': 'https://s2.coinmarketcap.com/static/img/coins/64x64/3890.png'\r\n    };\r\n\r\n    // ALWAYS prioritize fallback images first for reliability\r\n    const tokenSymbol = token.symbol?.toUpperCase();\r\n    const fallbackUrl = fallbackImages[tokenSymbol];\r\n\r\n    if (fallbackUrl) {\r\n      return { type: 'image', value: fallbackUrl };\r\n    }\r\n\r\n    // Special component cases (only if no fallback exists)\r\n    if (tokenSymbol === 'PYUSD') {\r\n      return { type: 'component', value: PyusdIcon };\r\n    }\r\n    if (tokenSymbol === 'USDP') {\r\n      return { type: 'component', value: UsdpIcon };\r\n    }\r\n\r\n    // Backend logo as last resort\r\n    if (token.logo && token.logo !== '' && !token.logo.includes('placeholder')) {\r\n      return { type: 'image', value: token.logo };\r\n    }\r\n\r\n    // Final fallback\r\n    const placeholder = `https://via.placeholder.com/64x64/6366f1/ffffff?text=${encodeURIComponent(tokenSymbol || '?')}`;\r\n    return { type: 'image', value: placeholder };\r\n  };\r\n\r\n  // Render token icon based on type\r\n  const renderTokenIcon = (tokenIconData, size = 32, className = \"rounded-full\") => {\r\n\r\n    if (tokenIconData.type === 'component') {\r\n      const IconComponent = tokenIconData.value;\r\n      return <IconComponent size={size} />;\r\n    } else {\r\n      return (\r\n        <img\r\n          src={tokenIconData.value}\r\n          alt=\"Token\"\r\n          className={className}\r\n          style={{\r\n            height: `${size}px`,\r\n            width: `${size}px`,\r\n            objectFit: 'cover',\r\n            display: 'block',\r\n            flexShrink: 0\r\n          }}\r\n          onLoad={() => {}}\r\n          onError={(e) => {\r\n            console.error('❌ Image failed to load:', tokenIconData.value);\r\n            console.error('❌ Error details:', e.target.src);\r\n            // Fallback to a simple colored placeholder\r\n            e.target.src = `https://via.placeholder.com/${size}x${size}/6366f1/ffffff?text=${encodeURIComponent('?')}`;\r\n          }}\r\n        />\r\n      );\r\n    }\r\n  };\r\n\r\n  // Filter merchant tokens for selected network and remove duplicates (with RLUSD already filtered out)\r\n  const getPaymentMethodsForNetwork = (networkShortName) => {\r\n    if (!networkShortName) return [];\r\n\r\n    const tokensForNetwork = merchantTokens.filter(token =>\r\n      token.Network && token.Network.shortName === networkShortName\r\n    );\r\n\r\n    // Remove duplicates based on symbol\r\n    const uniqueTokens = tokensForNetwork.filter((token, index, self) =>\r\n      index === self.findIndex(t => t.symbol === token.symbol)\r\n    );\r\n\r\n\r\n    return uniqueTokens;\r\n  };\r\n\r\n  const handleNetworkChange = (networkShortName) => {\r\n    setSelectedNetwork(networkShortName);\r\n    setSelectedPaymentMethod(null); // Reset payment method selection\r\n  };\r\n\r\n  const handleSelectPaymentMethod = (token) => {\r\n    const tokenIconData = getTokenIcon(token);\r\n\r\n\r\n    const paymentMethodData = {\r\n      currency: token.symbol,\r\n      network: selectedNetwork, // ✅ Use the selectedNetwork state, not token.Network.shortName\r\n      tokenConfig: {\r\n        contractAddress: token.contractAddress,\r\n        decimals: token.decimals,\r\n        symbol: token.symbol,\r\n        ...(token.Network.type === 'algorand' && { assetId: token.contractAddress })\r\n      },\r\n      method: {\r\n        id: token.symbol,\r\n        name: token.symbol,\r\n        description: token.name,\r\n        logo: tokenIconData, // Store the icon data object\r\n        network: selectedNetwork, // ✅ Use selectedNetwork here too\r\n        isStablecoin: token.isStablecoin\r\n      }\r\n    };\r\n\r\n\r\n    setSelectedPaymentMethod(paymentMethodData);\r\n  };\r\n\r\n  const handleProceed = () => {\r\n    if (selectedPaymentMethod) {\r\n      onSelect(selectedPaymentMethod);\r\n    }\r\n  };\r\n\r\n  // Helper functions with correct wallet constants - Added Phantom\r\n  function getRequiredWallet(networkShortName) {\r\n    switch (networkShortName) {\r\n      case 'ethereum':\r\n      case 'bsc':\r\n        return WALLET_TYPES.METAMASK;\r\n      case 'tron':\r\n        return WALLET_TYPES.TRONLINK;\r\n      case 'algorand':\r\n        return WALLET_TYPES.LUTE;\r\n      case 'solana':\r\n        return WALLET_TYPES.PHANTOM;\r\n      default:\r\n        return WALLET_TYPES.METAMASK;\r\n    }\r\n  }\r\n\r\n  function getNetworkRequirement(networkShortName) {\r\n    const wallet = getRequiredWallet(networkShortName);\r\n    const isAvailable = availableWallets[wallet];\r\n\r\n    const walletNames = {\r\n      [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n      [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n      [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n      [WALLET_TYPES.LUTE]: 'Lute Wallet',\r\n      [WALLET_TYPES.PHANTOM]: 'Phantom'\r\n    };\r\n\r\n    return isAvailable\r\n      ? `${walletNames[wallet]} detected - Ready to pay`\r\n      : `${walletNames[wallet]} required - Please install to continue`;\r\n  }\r\n\r\n  // Show loading state\r\n  if (loading) {\r\n    return (\r\n      <div className=\"flex items-center justify-center py-8\">\r\n        <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600\"></div>\r\n        <span className=\"ml-2 text-gray-600\">Loading payment options...</span>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  // Show error state\r\n  if (error) {\r\n    return (\r\n      <div className=\"p-4 rounded-lg bg-red-100 mb-4 text-red-700 text-center\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n          <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n        </svg>\r\n        <p className=\"font-medium\">Unable to load payment options</p>\r\n        <p className=\"text-sm mt-1\">{error}</p>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  // Show message if no networks configured\r\n  if (merchantNetworks.length === 0) {\r\n    return (\r\n      <div className=\"p-4 rounded-lg bg-yellow-100 mb-4 text-yellow-700 text-center\">\r\n        <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-8 w-8 mx-auto mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n          <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n        </svg>\r\n        <p className=\"font-medium\">No Payment Networks Configured</p>\r\n        <p className=\"text-sm mt-1\">Please configure your wallet addresses in the merchant dashboard first.</p>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  const availableTokensForNetwork = getPaymentMethodsForNetwork(selectedNetwork);\r\n\r\n  return (\r\n    <div className=\"\">\r\n      {/* Blockchain Network Custom Dropdown */}\r\n      <div className=\"mb-6\">\r\n        <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n          Blockchain Network\r\n        </label>\r\n        <div className=\"relative\" ref={networkDropdownRef}>\r\n          <button\r\n            type=\"button\"\r\n            className=\"w-full flex items-center justify-between py-4 bg-white rounded-2xl shadow border border-gray-200 text-gray-900 text-base font-normal focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50 transition\"\r\n            onClick={() => setNetworkDropdownOpen((open) => !open)}\r\n            style={{ minHeight: '56px', padding: '0.5rem' }}\r\n          >\r\n            <span className=\"flex items-center gap-3\">\r\n              {selectedNetwork ? (\r\n                <>\r\n                  {(() => {\r\n                    const network = merchantNetworks.find(n => n.shortName === selectedNetwork);\r\n                    const IconComponent = getNetworkIcon(selectedNetwork);\r\n                    return <IconComponent size={32} />;\r\n                  })()}\r\n                  <span className=\"text-base font-normal\">\r\n                    {merchantNetworks.find(n => n.shortName === selectedNetwork)?.name || selectedNetwork}\r\n                  </span>\r\n                </>\r\n              ) : (\r\n                <span className=\"text-gray-500\">Select a network...</span>\r\n              )}\r\n            </span>\r\n            <svg className={`w-5 h-5 ml-2 transition-transform ${networkDropdownOpen ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n              <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\r\n            </svg>\r\n          </button>\r\n          {networkDropdownOpen && (\r\n            <div className=\"absolute left-0 mt-2 px-2 w-full bg-white rounded-2xl shadow-lg border border-gray-100 z-20\" style={{ minWidth: '100%' }}>\r\n              {merchantNetworks.map((network) => {\r\n                const IconComponent = getNetworkIcon(network.shortName);\r\n                return (\r\n                  <button\r\n                    key={network.id}\r\n                    type=\"button\"\r\n                    className={`w-full flex items-center gap-3 mt-1 mb-1 px-2 py-2 text-gray-900 text-base font-normal rounded-2xl transition hover:bg-gray-100 ${selectedNetwork === network.shortName ? 'bg-gray-50' : ''}`}\r\n                    onClick={() => {\r\n                      setNetworkDropdownOpen(false);\r\n                      handleNetworkChange(network.shortName);\r\n                    }}\r\n                    style={{ minHeight: '48px' }}\r\n                  >\r\n                    <IconComponent size={32} />\r\n                    <span>{network.name}</span>\r\n                  </button>\r\n                );\r\n              })}\r\n            </div>\r\n          )}\r\n        </div>\r\n      </div>\r\n\r\n      {/* Stablecoins/Tokens Dropdown - FIXED HEIGHT ISSUE */}\r\n      {selectedNetwork && (\r\n        <div className=\"mb-4\">\r\n          <label className={`block text-sm font-medium mb-2 ${theme === 'dark' ? 'text-white' : 'text-gray-700'}`}>\r\n            Choose Token\r\n          </label>\r\n\r\n          <div className=\"relative\" ref={currencyDropdownRef}>\r\n            <button\r\n              type=\"button\"\r\n              className=\"w-full flex items-center justify-between py-2 px-3 bg-white rounded-2xl shadow border border-gray-200 text-gray-900 text-base font-normal focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50 transition\"\r\n              onClick={() => setCurrencyDropdownOpen((open) => !open)}\r\n              style={{ minHeight: '56px' }}\r\n            >\r\n              <span className=\"flex items-center gap-3\">\r\n                {selectedPaymentMethod ? (\r\n                  <>\r\n                    {renderTokenIcon(selectedPaymentMethod.method.logo, 32)}\r\n                    <span className=\"text-base font-normal\">{selectedPaymentMethod.method.description} ({selectedPaymentMethod.method.name})</span>\r\n                  </>\r\n                ) : (\r\n                  <span className=\"text-gray-500\">Choose a token...</span>\r\n                )}\r\n              </span>\r\n              <svg className={`w-5 h-5 ml-2 transition-transform ${currencyDropdownOpen ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n                <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\r\n              </svg>\r\n            </button>\r\n\r\n            {currencyDropdownOpen && (\r\n              <div className=\"absolute left-0 mt-2 px-2 w-full bg-white rounded-2xl shadow-lg border border-gray-100 z-20\" style={{ minWidth: '100%' }}>\r\n                {/* Search Input */}\r\n                <div className=\"sticky top-0 bg-white pt-2 pb-2 px-2 border-b border-gray-100\">\r\n                  <div className=\"relative\">\r\n                    <input\r\n                      type=\"text\"\r\n                      placeholder=\"Search tokens...\"\r\n                      className=\"w-full py-2 px-3 text-sm border border-gray-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50\"\r\n                      value={searchQuery}\r\n                      onChange={(e) => setSearchQuery(e.target.value)}\r\n                      onClick={(e) => e.stopPropagation()}\r\n                    />\r\n                  </div>\r\n                </div>\r\n\r\n                {/* 🔧 FIXED: Dynamic height container instead of max-h-60 */}\r\n\r\n                {/* Token List - WITH DUMMY SPACERS AND SCROLLING */}\r\n                <div\r\n                  className=\"py-2 overflow-y-auto\"\r\n                  style={{\r\n                    maxHeight: '240px',\r\n                    overflowX: 'hidden'\r\n                  }}\r\n                >\r\n                  {availableTokensForNetwork\r\n                    .filter(token =>\r\n                      token.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n                      token.symbol.toLowerCase().includes(searchQuery.toLowerCase())\r\n                    )\r\n                    .map((token) => {\r\n                      const tokenIconData = getTokenIcon(token);\r\n                      return (\r\n                        <button\r\n                          key={`${token.id}-${token.Network.shortName}`}\r\n                          type=\"button\"\r\n                          className={`w-full flex items-center gap-3 mt-1 mb-1 px-2 py-2 text-gray-900 text-base font-normal rounded-2xl transition hover:bg-gray-100 ${selectedPaymentMethod?.currency === token.symbol ? 'bg-gray-50' : ''\r\n                            }`}\r\n                          onClick={() => {\r\n                            setCurrencyDropdownOpen(false);\r\n                            handleSelectPaymentMethod(token);\r\n                          }}\r\n                          style={{ minHeight: '48px' }}\r\n                        >\r\n                          {renderTokenIcon(tokenIconData, 32)}\r\n                          <span>{token.name} ({token.symbol})</span>\r\n                          {token.isStablecoin && (\r\n                            <span className=\"ml-auto text-xs text-green-600 bg-green-100 px-2 py-1 rounded-full\">\r\n                              Stablecoin\r\n                            </span>\r\n                          )}\r\n                        </button>\r\n                      );\r\n                    })}\r\n\r\n                  {/* Dummy spacer tokens to push content up - ONLY if we have more than 3 tokens */}\r\n                  {availableTokensForNetwork.length > 3 && (\r\n                    <>\r\n                      <div style={{ height: '42px', visibility: 'hidden' }}></div>\r\n                      <div style={{ height: '42px', visibility: 'hidden' }}></div>\r\n                    </>\r\n                  )}\r\n\r\n                  {/* No results message */}\r\n                  {availableTokensForNetwork.filter(token =>\r\n                    token.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\r\n                    token.symbol.toLowerCase().includes(searchQuery.toLowerCase())\r\n                  ).length === 0 && (\r\n                      <div className=\"text-center py-4 text-gray-500 text-sm\">\r\n                        {searchQuery ? `No tokens found matching \"${searchQuery}\"` : 'No tokens configured for this network'}\r\n                      </div>\r\n                    )}\r\n                </div>\r\n\r\n\r\n              </div>\r\n            )}\r\n          </div>\r\n        </div>\r\n      )}\r\n\r\n      {/* Network Info */}\r\n      {selectedNetwork && (\r\n        <div className={`p-3 rounded-lg text-sm mb-6 ${theme === 'dark' ? 'bg-gray-800 text-gray-300' : 'bg-gray-50 text-gray-600'\r\n          }`}>\r\n          <div className=\"flex items-center\">\r\n            <div className={`w-2 h-2 rounded-full mr-2 ${availableWallets[getRequiredWallet(selectedNetwork)] ? 'bg-green-500' : 'bg-red-500'\r\n              }`}></div>\r\n            <span className=\"text-xs\">\r\n              {getNetworkRequirement(selectedNetwork)}\r\n            </span>\r\n          </div>\r\n        </div>\r\n      )}\r\n\r\n      {/* Proceed Button */}\r\n      <button\r\n        onClick={handleProceed}\r\n        disabled={!selectedPaymentMethod}\r\n        className={`w-full py-3 px-4 font-medium rounded-2xl text-lg shadow-md transition-colors ${selectedPaymentMethod\r\n            ? 'bg-[#7042D2] text-white hover:bg-[#5b34b1]'\r\n            : 'bg-gray-300 text-gray-500 cursor-not-allowed'\r\n          }`}\r\n        style={{ borderRadius: '1.5rem' }}\r\n      >\r\n        Proceed\r\n      </button>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default PaymentMethods;","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAbCAYAAABm409WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMFSURBVHgBpVZBVtswEJXk7JsjmAM0hF13dWDTHeEEhF13MScgOQHmBIQT1Oy6KXFPACEHIDdouux7WNM/kuxIdvJeXpj3iOSR9P9oRjODFHtIevp6y2P21LsO9MlzLFQ0x3SKtdm2s0rsJ0PGS08XaXg6usFvjL+vuw7uS+BE3sDqLs/cOLJ6+rvrRMf/sFdWQ6F1nhUnqw2uXAmiGLMurObbzEQUJYLqHasGDvZ1xkK/P4Y3kGqCn1uAvKWny5taT3rh7bLuIEpqjdYv1fQ6WY75PDYAK4pDAtIz72OC4N47gHyjpr4z5thp1rhtYSyHUaQoMzclWmVFLw8IzEYpC081YpJAL2XXEcVuT16BW6stKYwd8KQd5PL9gtkbJCPopw547YjsqMupid0GHDpxXcWwRYAFy05U+xVgY+eGK0HyzhkyBfjAAEWd+9pyKS7gmll9lIMCv6XGb+ZqeBGSHo3flRrh+9IQz4+PxA5JB4tnQOFseRW8PibA9f848C0iJ9nTZ3ZB19zsAIm+HH3/B6BvO9YTrMts3v8pDhSVPR1n8OURfP4g2EVN0UiyD4hsKtJkmQjlnqAu80NdExDY1OaAynNoEm8dAceT+9XLxYHS8Upu3L4PdLYkHEyg8IZ/CFty28K5oP3ycQgB6d9tYFEIrpj8tlX0jKf8VpXpbcINKT17HW5bq2LABawCWKHUXgapz6LLEzNGUcwxwZkE866b99mQKm9aBL64zM7CG6E2cfngWBEtkNVDZO8MJeSciTl7bbeT3Fozv7UGtYgDDvCJaN/zwTQiEyv5yVvh12faqMknQWx96veSRrEzIN2G9S84PAHw2JLRwpG6/JCXVXzsPibhXmJJGh1N9ENwBBuucTGKjU5LV2WrkQ1C+3RiSHSJkq9HHKdmR8vM02RgLsXz3sBksoo84rKwROUmN5TXPoUp+blrOOtOY4GtOhEt4TYpzY2qcszE6dmysIkYxKXCMvv2+7eFXFxIPAT6usvtSNS9CUw/pju/Uzkrba+uAr9F/gPbu3s2LSnvkAAAAABJRU5ErkJggg==\"","// // CoinleyModal.jsx \r\n// import React, { useState, useEffect, useRef } from 'react';\r\n// import PaymentMethods from './PaymentMethods';\r\n// import PaymentStatus from './PaymentStatus';\r\n// import QRCode from './QRCode';\r\n// import { WALLET_TYPES, getWalletInstallUrl, detectWallets, debugWalletEnvironment } from '../services/walletService';\r\n// import logo from '../assets/Logomark.png';\r\n\r\n// // Wallet Dropdown Component - Updated with Phantom\r\n// const WalletDropdown = ({\r\n//   supportedWallets,\r\n//   availableWallets,\r\n//   walletConnection,\r\n//   onConnectWallet,\r\n//   getWalletDisplayName,\r\n//   getWalletIcon,\r\n//   theme\r\n// }) => {\r\n//   const [walletDropdownOpen, setWalletDropdownOpen] = useState(false);\r\n//   const walletDropdownRef = useRef(null);\r\n\r\n//   // Close dropdown on outside click\r\n//   useEffect(() => {\r\n//     function handleClickOutside(event) {\r\n//       if (walletDropdownRef.current && !walletDropdownRef.current.contains(event.target)) {\r\n//         setWalletDropdownOpen(false);\r\n//       }\r\n//     }\r\n//     if (walletDropdownOpen) {\r\n//       document.addEventListener('mousedown', handleClickOutside);\r\n//     } else {\r\n//       document.removeEventListener('mousedown', handleClickOutside);\r\n//     }\r\n//     return () => document.removeEventListener('mousedown', handleClickOutside);\r\n//   }, [walletDropdownOpen]);\r\n\r\n//   // Sort wallets: connected first, then detected, then others\r\n//   const sortedWallets = [...supportedWallets].sort((a, b) => {\r\n//     const aConnected = walletConnection?.walletType === a;\r\n//     const bConnected = walletConnection?.walletType === b;\r\n//     const aDetected = availableWallets[a];\r\n//     const bDetected = availableWallets[b];\r\n\r\n//     if (aConnected && !bConnected) return -1;\r\n//     if (bConnected && !aConnected) return 1;\r\n//     if (aDetected && !bDetected) return -1;\r\n//     if (bDetected && !aDetected) return 1;\r\n//     return 0;\r\n//   });\r\n\r\n//   const getWalletStatus = (walletType) => {\r\n//     const isConnected = walletConnection?.walletType === walletType;\r\n//     const isDetected = availableWallets[walletType];\r\n\r\n//     if (isConnected) return { text: 'Connected', color: 'green' };\r\n//     if (isDetected) return { text: 'Detected', color: 'blue' };\r\n//     return { text: 'Not Installed', color: 'gray' };\r\n//   };\r\n\r\n//   const getSelectedWalletDisplay = () => {\r\n//     if (walletConnection) {\r\n//       const status = getWalletStatus(walletConnection.walletType);\r\n//       return (\r\n//         <div className=\"flex items-center gap-3\">\r\n//           <img\r\n//             src={getWalletIcon(walletConnection.walletType)}\r\n//             alt={getWalletDisplayName(walletConnection.walletType)}\r\n//             className=\"h-8 w-8\"\r\n//             onError={(e) => { e.target.style.display = 'none'; }}\r\n//           />\r\n//           <div className=\"flex flex-col\">\r\n//             <span className=\"text-base font-normal\">{getWalletDisplayName(walletConnection.walletType)}</span>\r\n//             <span className={`text-xs ${status.color === 'green' ? 'text-green-600' :\r\n//                 status.color === 'blue' ? 'text-blue-600' : 'text-gray-500'\r\n//               }`}>\r\n//               {status.text}\r\n//             </span>\r\n//           </div>\r\n//         </div>\r\n//       );\r\n//     }\r\n\r\n//     // Show first detected wallet as default suggestion\r\n//     const firstDetected = sortedWallets.find(wallet => availableWallets[wallet]);\r\n//     if (firstDetected) {\r\n//       return (\r\n//         <div className=\"flex items-center gap-3\">\r\n//           <img\r\n//             src={getWalletIcon(firstDetected)}\r\n//             alt={getWalletDisplayName(firstDetected)}\r\n//             className=\"h-8 w-8\"\r\n//             onError={(e) => { e.target.style.display = 'none'; }}\r\n//           />\r\n//           <span className=\"text-gray-500\">Select {getWalletDisplayName(firstDetected)}...</span>\r\n//         </div>\r\n//       );\r\n//     }\r\n\r\n//     return <span className=\"text-gray-500\">Choose a wallet...</span>;\r\n//   };\r\n\r\n//   return (\r\n//     <div className=\"px-4\">\r\n//       <label className=\"block text-sm font-medium mb-2 text-gray-700\">\r\n//         Select Wallet\r\n//       </label>\r\n\r\n//       <div className=\"relative\" ref={walletDropdownRef}>\r\n//         <button\r\n//           type=\"button\"\r\n//           className=\"w-full flex items-center justify-between py-4 bg-white rounded-2xl shadow border border-gray-200 text-gray-900 text-base font-normal focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50 transition\"\r\n//           onClick={() => setWalletDropdownOpen((open) => !open)}\r\n//           style={{ minHeight: '56px', padding: '0.5rem' }}\r\n//         >\r\n//           {getSelectedWalletDisplay()}\r\n//           <svg className={`w-5 h-5 ml-2 transition-transform ${walletDropdownOpen ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n//             <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\r\n//           </svg>\r\n//         </button>\r\n\r\n//         {walletDropdownOpen && (\r\n//           <div className=\"absolute left-0 mt-2 px-2 w-full bg-white rounded-2xl shadow-lg border border-gray-100 z-20\" style={{ minWidth: '100%' }}>\r\n//             {sortedWallets.map((walletType) => {\r\n//               const isConnected = walletConnection?.walletType === walletType;\r\n//               const isDetected = availableWallets[walletType];\r\n//               const status = getWalletStatus(walletType);\r\n\r\n//               return (\r\n//                 <div\r\n//                   key={walletType}\r\n//                   className={`flex items-center justify-between mt-1 mb-1 px-2 py-3 rounded-2xl transition ${isConnected ? 'bg-green-50' :\r\n//                       isDetected ? 'hover:bg-gray-100 cursor-pointer' :\r\n//                         'opacity-60 cursor-not-allowed'\r\n//                     }`}\r\n//                   style={{ minHeight: '56px' }}\r\n//                   onClick={() => {\r\n//                     if (isDetected && !isConnected) {\r\n//                       setWalletDropdownOpen(false);\r\n//                       onConnectWallet(walletType);\r\n//                     }\r\n//                   }}\r\n//                 >\r\n//                   <div className=\"flex items-center gap-3\">\r\n//                     <img\r\n//                       src={getWalletIcon(walletType)}\r\n//                       alt={getWalletDisplayName(walletType)}\r\n//                       className=\"h-8 w-8\"\r\n//                       onError={(e) => { e.target.style.display = 'none'; }}\r\n//                     />\r\n//                     <div className=\"flex flex-col\">\r\n//                       <span className={`text-base font-normal ${isConnected ? 'text-green-800' : 'text-gray-900'\r\n//                         }`}>\r\n//                         {getWalletDisplayName(walletType)}\r\n//                       </span>\r\n//                       <span className={`text-xs ${status.color === 'green' ? 'text-green-600' :\r\n//                           status.color === 'blue' ? 'text-blue-600' : 'text-gray-500'\r\n//                         }`}>\r\n//                         {status.text}\r\n//                       </span>\r\n//                     </div>\r\n//                   </div>\r\n\r\n//                   <div className=\"flex items-center\">\r\n//                     {isConnected ? (\r\n//                       <div className=\"flex items-center space-x-2\">\r\n//                         <div className=\"w-2 h-2 bg-green-500 rounded-full animate-pulse\"></div>\r\n//                         <span className=\"text-xs text-green-600 font-medium\">Ready</span>\r\n//                       </div>\r\n//                     ) : isDetected ? (\r\n//                       <span className=\"text-xs text-blue-600 font-medium\">Click to connect</span>\r\n//                     ) : (\r\n//                       <a\r\n//                         href={getWalletInstallUrl(walletType)}\r\n//                         target=\"_blank\"\r\n//                         rel=\"noopener noreferrer\"\r\n//                         className=\"text-xs text-gray-500 hover:text-gray-700 underline\"\r\n//                         onClick={(e) => e.stopPropagation()}\r\n//                       >\r\n//                         Install\r\n//                       </a>\r\n//                     )}\r\n//                   </div>\r\n//                 </div>\r\n//               );\r\n//             })}\r\n//           </div>\r\n//         )}\r\n//       </div>\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// // NEW: Screen transition wrapper component\r\n// const ScreenTransition = ({\r\n//   currentStep,\r\n//   targetStep,\r\n//   children,\r\n//   className = \"\",\r\n//   duration = 300\r\n// }) => {\r\n//   const [isVisible, setIsVisible] = useState(currentStep === targetStep);\r\n//   const [shouldRender, setShouldRender] = useState(currentStep === targetStep);\r\n\r\n//   useEffect(() => {\r\n//     if (currentStep === targetStep) {\r\n//       // Show the screen\r\n//       setShouldRender(true);\r\n//       // Small delay to ensure DOM is ready, then trigger animation\r\n//       setTimeout(() => setIsVisible(true), 10);\r\n//     } else {\r\n//       // Hide the screen\r\n//       setIsVisible(false);\r\n//       // Remove from DOM after animation completes\r\n//       setTimeout(() => setShouldRender(false), duration);\r\n//     }\r\n//   }, [currentStep, targetStep, duration]);\r\n\r\n//   if (!shouldRender) return null;\r\n\r\n//   return (\r\n//     <div\r\n//       className={`\r\n//         transition-all duration-300 ease-out\r\n//         ${isVisible\r\n//           ? 'transform translate-y-0 opacity-100'\r\n//           : 'transform translate-y-full opacity-0'\r\n//         }\r\n//         ${className}\r\n//       `}\r\n//       style={{\r\n//         transitionDuration: `${duration}ms`\r\n//       }}\r\n//     >\r\n//       {children}\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// const CoinleyModal = ({\r\n//   isOpen,\r\n//   onClose,\r\n//   payment,\r\n//   paymentStatus,\r\n//   selectedPaymentMethod,\r\n//   onPaymentMethodSelect,\r\n//   onPayment,\r\n//   onBack,\r\n//   error,\r\n//   theme = 'light',\r\n//   merchantName,\r\n//   transactionHash,\r\n//   walletConnection,\r\n//   onConnectWallet,\r\n//   testMode = false,\r\n//   supportedNetworks = [],\r\n//   availableWallets = {},\r\n//   supportedWallets = [],\r\n//   step = 'select-currency',\r\n//   merchantWalletAddresses = {},\r\n//   debug = false,\r\n//   processingStartTime = null,\r\n//   pendingBackendConfirmation = false,\r\n//   paymentNetwork = null,\r\n//   merchantFeePercentage = 0.0175\r\n// }) => {\r\n//   const [paymentType, setPaymentType] = useState('wallet');\r\n\r\n//   // Debug payment data\r\n//   useEffect(() => {\r\n//     if (payment && debug) {\r\n//       console.log('CoinleyModal - Payment data:', {\r\n//         amount: payment.amount,\r\n//         feeAmount: payment.feeAmount,\r\n//         totalAmount: payment.totalAmount,\r\n//         feeChargedTo: payment.feeChargedTo,\r\n//         originalAmount: payment.originalAmount,\r\n//         merchantFeePercentage: merchantFeePercentage,\r\n//         dynamicFeeDisplay: `${(merchantFeePercentage * 100).toFixed(2)}%`\r\n//       });\r\n//     }\r\n//   }, [payment, debug, merchantFeePercentage]);\r\n\r\n//   // Get wallet address for current network\r\n//   const getWalletAddressForNetwork = () => {\r\n//     if (!selectedPaymentMethod) return 'No network selected';\r\n\r\n//     const networkAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n//     if (networkAddress) {\r\n//       return networkAddress;\r\n//     }\r\n\r\n//     if (payment?.recipientWallet) {\r\n//       return payment.recipientWallet;\r\n//     }\r\n\r\n//     return 'No wallet address configured for this network';\r\n//   };\r\n\r\n//   // Handle close for success screen\r\n//   const handleSuccessClose = () => {\r\n//     console.log(\"Success screen close button clicked\");\r\n//     if (onClose) {\r\n//       onClose();\r\n//     }\r\n//   };\r\n\r\n//   // Utility functions\r\n//   const formatAmount = (amount) => {\r\n//     return parseFloat(amount).toFixed(2);\r\n//   };\r\n\r\n//   const formatTransactionHash = (hash) => {\r\n//     if (!hash) return '';\r\n//     if (hash.length <= 14) return hash;\r\n//     return `${hash.slice(0, 8)}...${hash.slice(-6)}`;\r\n//   };\r\n\r\n//   const getNetworkDisplayName = (network) => {\r\n//     const names = {\r\n//       ethereum: 'Ethereum',\r\n//       bsc: 'BSC',\r\n//       tron: 'Tron',\r\n//       algorand: 'Algorand',\r\n//       solana: 'Solana'\r\n//     };\r\n//     return names[network] || network;\r\n//   };\r\n\r\n//   // Updated wallet display names with Phantom\r\n//   const getWalletDisplayName = (walletType) => {\r\n//     const names = {\r\n//       [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n//       [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n//       [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n//       [WALLET_TYPES.LUTE]: 'Lute Wallet',\r\n//       [WALLET_TYPES.PHANTOM]: 'Phantom'\r\n//     };\r\n//     return names[walletType] || walletType;\r\n//   };\r\n\r\n//   // Updated wallet icons with Phantom\r\n//   const getWalletIcon = (walletType) => {\r\n//     const icons = {\r\n//       [WALLET_TYPES.METAMASK]: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3ymr3UNKopfI0NmUY95Dr-0589vG-91KuAA&s',\r\n//       [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/images/logo.png',\r\n//       [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/assets/images/trust_logotype.svg',\r\n//       [WALLET_TYPES.LUTE]: 'https://lute.app/logo.png',\r\n//       [WALLET_TYPES.PHANTOM]: 'https://phantom.app/img/phantom-logo.png'\r\n//     };\r\n//     return icons[walletType] || '';\r\n//   };\r\n\r\n//   // Helper to format the dynamic fee percentage\r\n//   const formatFeePercentage = () => {\r\n//     return (merchantFeePercentage * 100).toFixed(2);\r\n//   };\r\n\r\n//   if (!isOpen) return null;\r\n\r\n//   return (\r\n//     <div className=\"fixed inset-0 z-50\">\r\n//       <div className=\"fixed inset-0 bg-black bg-opacity-50 transition-opacity\" onClick={onClose} aria-hidden=\"true\" />\r\n//       <div className=\"fixed inset-0 overflow-y-auto\">\r\n//         <div className=\"flex min-h-screen items-center justify-center p-4\">\r\n//           <div className=\"coinley-modal relative pt-6 w-full max-w-md mx-auto shadow-xl bg-gray-100 rounded-3xl overflow-hidden\">\r\n//             {/* Header with Logo */}\r\n//             <div className=\"bg-white flex justify-between items-center mb-6 mr-3 ml-3 py-4 px-2 rounded-full\">\r\n//               <div className=\"flex-1 flex items-center gap-2 px-4\">\r\n//                 <img src={logo} className=\"w-auto h-auto\" alt=\"Coinley Logo\" />\r\n//                 <span className=\"text-lg font-semibold text-gray-800\">Payment Details</span>\r\n//               </div>\r\n//               {step !== 'success' && step !== 'processing' && (\r\n//                 <button\r\n//                   onClick={onClose}\r\n//                   className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\r\n//                 >\r\n//                   <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//                     <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n//                   </svg>\r\n//                 </button>\r\n//               )}\r\n//             </div>\r\n\r\n//             {/* Payment Summary */}\r\n//             {payment && step !== 'success' && (\r\n//               <div className=\"mb-6\">\r\n//                 <div className=\"text-center\">\r\n//                   <div className=\"text-sm text-gray-600\">\r\n//                     Total Amount\r\n//                   </div>\r\n//                   <div className=\"coinley-amount-display text-3xl md:text-9xl lg:text-9xl font-bold text-[#7042D2] mt-2 leading-tight tracking-tight\">\r\n//                     ${formatAmount(payment.totalAmount || payment.amount)}\r\n//                   </div>\r\n\r\n//                   {/* Show fee breakdown with dynamic percentage */}\r\n//                   {payment.feeChargedTo === 'customer' && payment.feeAmount > 0 && (\r\n//                     <div className=\"mt-2 text-sm text-gray-500\">\r\n//                       {/* Fee details removed for cleaner UI */}\r\n//                     </div>\r\n//                   )}\r\n\r\n//                   {/* Show different message when merchant pays fees */}\r\n//                   {payment.feeChargedTo === 'merchant' && (\r\n//                     <div className=\"mt-2 text-sm text-gray-500\">\r\n//                       No additional fees\r\n//                     </div>\r\n//                   )}\r\n\r\n//                   <div className=\"text-sm text-gray-600 mt-4\">Payment to:</div>\r\n//                   <div className=\"coinley-merchant-name text-base font-semibold mt-1 flex gap-2 items-center justify-center\">\r\n//                     <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n//                       <path d=\"M15.3 7.50065L15.8 10.0007H4.2L4.7 7.50065H15.3ZM16.6667 3.33398H3.33333V5.00065H16.6667V3.33398ZM16.6667 5.83398H3.33333L2.5 10.0007V11.6673H3.33333V16.6673H11.6667V11.6673H15V16.6673H16.6667V11.6673H17.5V10.0007L16.6667 5.83398ZM5 15.0007V11.6673H10V15.0007H5Z\" fill=\"#7042D2\" />\r\n//                     </svg>\r\n//                     {merchantName}\r\n//                   </div>\r\n//                 </div>\r\n//               </div>\r\n//             )}\r\n\r\n//             {/* Main Content Area with Slide Animations */}\r\n//             <div className=\"relative\">\r\n//               {/* Step: Select Currency */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"select-currency\">\r\n//                 <div className=\"pb-6 pt-6 px-6 bg-white rounded-t-2xl blockchain-network\">\r\n//                   <PaymentMethods\r\n//                     onSelect={onPaymentMethodSelect}\r\n//                     selected={selectedPaymentMethod}\r\n//                     theme={theme}\r\n//                     supportedNetworks={supportedNetworks}\r\n//                   />\r\n//                 </div>\r\n//               </ScreenTransition>\r\n\r\n//               {/* Step: Confirm Payment */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"confirm\">\r\n//                 {selectedPaymentMethod && payment && (\r\n//                   <div>\r\n//                     <div className=\"p-4 rounded-2xl mb-4 bg-white\">\r\n//                       <h3 className=\"text-lg font-medium mb-2 text-gray-800\">\r\n//                         Payment Details\r\n//                       </h3>\r\n//                       <div className=\"space-y-2 bg-[#EDE4FF] p-3 rounded-xl\">\r\n//                         <div className=\"flex justify-between\">\r\n//                           <span className=\"font-medium\">Currency:</span>\r\n//                           <span className=\"font-medium\">{selectedPaymentMethod.currency}</span>\r\n//                         </div>\r\n\r\n//                         <div className='border border-b border-gray-400'></div>\r\n\r\n//                         <div className=\"flex justify-between\">\r\n//                           <span className=\"font-medium\">Network:</span>\r\n//                           <span className=\"font-medium\">{getNetworkDisplayName(selectedPaymentMethod.network)}</span>\r\n//                         </div>\r\n\r\n//                         <div className='border border-b border-gray-400'></div>\r\n\r\n//                         {/* Fee info with dynamic percentage */}\r\n//                         {payment.feeChargedTo === 'customer' && payment.feeAmount > 0 ? (\r\n//                           <>\r\n//                             <div className=\"flex justify-between\">\r\n//                               <span className=\"font-medium\">Processing Fee:</span>\r\n//                               <span className=\"font-medium\">{formatFeePercentage()}%</span>\r\n//                             </div>\r\n\r\n//                             <div className='border border-b border-gray-400'></div>\r\n\r\n\r\n//                             <div className=\"flex justify-between border-t pt-2 mt-1\">\r\n//                               <span className=\"font-bold\">Total:</span>\r\n//                               <span className=\"font-bold text-lg\">${formatAmount(payment.totalAmount)}</span>\r\n//                             </div>\r\n//                           </>\r\n//                         ) : (\r\n//                           <>\r\n//                             <div className=\"flex justify-between\">\r\n//                               <span className=\"font-medium\">Processing Fee:</span>\r\n//                               <span className=\"font-medium\">Included by merchant</span>\r\n//                             </div>\r\n\r\n//                             <div className='border border-b border-gray-400'></div>\r\n\r\n//                                 <div className=\"\">\r\n//                               <div className=\"flex justify-between\">\r\n//                                 <span className=\"font-bold\">Total:</span>\r\n//                                 <span className=\"font-bold text-lg\">${formatAmount(payment.totalAmount)}</span>\r\n//                               </div>\r\n//                               <div className=\"text-xs text-gray-500 mt-1\">\r\n//                                 Processing fee is covered by the merchant\r\n//                               </div>\r\n//                             </div>\r\n//                           </>\r\n//                         )}\r\n//                       </div>\r\n//                     </div>\r\n\r\n//                     {/* Payment Method Tabs */}\r\n//                     <div className=\"mb-4 px-4\">\r\n//                       <div className=\"flex border-b border-gray-200\">\r\n//                         <button\r\n//                           onClick={() => setPaymentType('wallet')}\r\n//                           className={`py-2 px-4 text-sm font-medium ${paymentType === 'wallet'\r\n//                             ? 'border-b-2 border-purple-600 text-purple-600'\r\n//                             : 'text-gray-500 hover:text-gray-700'\r\n//                             }`}\r\n//                         >\r\n//                           Connect Wallet\r\n//                         </button>\r\n//                         <button\r\n//                           onClick={() => setPaymentType('qrcode')}\r\n//                           className={`py-2 px-4 text-sm font-medium ${paymentType === 'qrcode'\r\n//                             ? 'border-b-2 border-purple-600 text-purple-600'\r\n//                             : 'text-gray-500 hover:text-gray-700'\r\n//                             }`}\r\n//                         >\r\n//                           QR Code\r\n//                         </button>\r\n//                       </div>\r\n//                     </div>\r\n\r\n//                     {/* Payment options */}\r\n//                     {testMode ? (\r\n//                       <div className=\"p-4 rounded-lg mb-4 bg-blue-50\">\r\n//                         <div className=\"flex items-center\">\r\n//                           <div className=\"bg-purple-600 rounded-full p-2 mr-3\">\r\n//                             <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//                               <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\r\n//                             </svg>\r\n//                           </div>\r\n//                           <div>\r\n//                             <h3 className=\"font-medium text-gray-800\">Test Mode Payment</h3>\r\n//                             <p className=\"text-sm text-gray-600\">Click \"Pay Now\" to simulate a successful payment</p>\r\n//                           </div>\r\n//                         </div>\r\n//                       </div>\r\n//                     ) : paymentType === 'qrcode' ? (\r\n//                       <div className=\"mb-4\">\r\n//                         <QRCode\r\n//                           walletAddress={getWalletAddressForNetwork()}\r\n//                           amount={payment.totalAmount || payment.amount}\r\n//                           currency={selectedPaymentMethod.currency}\r\n//                           network={selectedPaymentMethod.network}\r\n//                           theme={theme}\r\n//                         />\r\n//                       </div>\r\n//                     ) : (\r\n//                       <div className=\"space-y-3 mb-4\">\r\n//                         {supportedWallets.length === 0 ? (\r\n//                           <div className=\"p-4 rounded-lg bg-yellow-50\">\r\n//                             <div className=\"flex items-center\">\r\n//                               <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-yellow-500 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//                                 <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n//                               </svg>\r\n//                               <div>\r\n//                                 <h3 className=\"font-medium text-gray-800\">No Compatible Wallets</h3>\r\n//                                 <p className=\"text-sm text-gray-600\">\r\n//                                   No wallets detected for {getNetworkDisplayName(selectedPaymentMethod.network)} network\r\n//                                 </p>\r\n//                               </div>\r\n//                             </div>\r\n//                           </div>\r\n//                         ) : (\r\n//                           <WalletDropdown\r\n//                             supportedWallets={supportedWallets}\r\n//                             availableWallets={availableWallets}\r\n//                             walletConnection={walletConnection}\r\n//                             onConnectWallet={onConnectWallet}\r\n//                             getWalletDisplayName={getWalletDisplayName}\r\n//                             getWalletIcon={getWalletIcon}\r\n//                             theme={theme}\r\n//                           />\r\n//                         )}\r\n//                       </div>\r\n//                     )}\r\n\r\n//                     {/* Display any errors */}\r\n//                     {error && (\r\n//                       <div className=\"p-3 rounded-lg bg-red-50 mb-4 text-red-600 text-sm\">\r\n//                         {error}\r\n//                       </div>\r\n//                     )}\r\n\r\n//                     {/* Navigation buttons */}\r\n//                     <div className=\"grid grid-cols-2 gap-3 mb-3 px-4\">\r\n//                       <button\r\n//                         type=\"button\"\r\n//                         onClick={onBack}\r\n//                         className=\"w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-purple-600 font-medium rounded-md\"\r\n//                       >\r\n//                         Back\r\n//                       </button>\r\n//                       <button\r\n//                         type=\"button\"\r\n//                         onClick={() => onPayment(paymentType === 'qrcode')}\r\n//                         className=\"bg-green-600 text-white w-full py-2 px-4 font-medium rounded-md\"\r\n//                         disabled={!testMode && paymentType === 'wallet' && !walletConnection}\r\n//                       >\r\n//                         {paymentType === 'qrcode' ? 'I have sent the payment' : 'Pay Now'}\r\n//                       </button>\r\n//                     </div>\r\n//                   </div>\r\n//                 )}\r\n//               </ScreenTransition>\r\n\r\n//               {/* Step: Processing */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"processing\">\r\n//                 <PaymentStatus\r\n//                   status=\"processing\"\r\n//                   theme={theme}\r\n//                   message=\"Processing your payment...\"\r\n//                   processingStartTime={processingStartTime}\r\n//                   paymentNetwork={paymentNetwork || selectedPaymentMethod?.network}\r\n//                   transactionHash={transactionHash}\r\n//                 />\r\n//               </ScreenTransition>\r\n\r\n//               {/* Step: Success */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"success\">\r\n//                 <PaymentStatus\r\n//                   status=\"success\"\r\n//                   theme={theme}\r\n//                   message=\"Payment successful!\"\r\n//                   payment={payment}\r\n//                   transactionHash={transactionHash}\r\n//                   selectedPaymentMethod={selectedPaymentMethod}\r\n//                   merchantName={merchantName}\r\n//                   onClose={handleSuccessClose}\r\n//                   pendingBackendConfirmation={pendingBackendConfirmation}\r\n//                 />\r\n//               </ScreenTransition>\r\n\r\n//               {/* Step: Error */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"error\">\r\n//                 <div>\r\n//                   <PaymentStatus\r\n//                     status=\"error\"\r\n//                     theme={theme}\r\n//                     message={error || \"An error occurred while processing your payment.\"}\r\n//                   />\r\n//                   <button\r\n//                     type=\"button\"\r\n//                     onClick={onBack}\r\n//                     className=\"mt-4 w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-gray-800 font-medium rounded-md\"\r\n//                   >\r\n//                     Try Again\r\n//                   </button>\r\n//                 </div>\r\n//               </ScreenTransition>\r\n//             </div>\r\n\r\n//             {/* Footer */}\r\n//             {step !== 'success' && (\r\n//               <div className=\"text-center text-xs text-gray-500 flex items-center justify-center gap-1 py-6 bg-white rounded-b-3xl\">\r\n//                 <p>Powered by <span className='text-purple-600'>Coinley</span> - Secure Cryptocurrency Payments</p>\r\n//                 <svg className=\"inline w-4 h-4 text-green-500 ml-1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n//                   <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" fill=\"none\" />\r\n//                   <path d=\"M9 12l2 2 4-4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n//                 </svg>\r\n//               </div>\r\n//             )}\r\n//           </div>\r\n//         </div>\r\n//       </div>\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// export default CoinleyModal;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // CoinleyModal.jsx \r\n// import React, { useState, useEffect, useRef } from 'react';\r\n// import PaymentMethods from './PaymentMethods';\r\n// import PaymentStatus from './PaymentStatus';\r\n// import QRCode from './QRCode';\r\n// import { WALLET_TYPES, getWalletInstallUrl, getAvailableWallets, detectWallets, debugWalletEnvironment } from '../services/walletService';\r\n// import logo from '../assets/Logomark.png';\r\n\r\n// // Wallet Dropdown Component - Enhanced with Trust Wallet\r\n// const WalletDropdown = ({\r\n//   supportedWallets,\r\n//   availableWallets,\r\n//   walletConnection,\r\n//   onConnectWallet,\r\n//   getWalletDisplayName,\r\n//   getWalletIcon,\r\n//   theme\r\n// }) => {\r\n//   const [walletDropdownOpen, setWalletDropdownOpen] = useState(false);\r\n//   const walletDropdownRef = useRef(null);\r\n\r\n//   // Close dropdown on outside click\r\n//   useEffect(() => {\r\n//     function handleClickOutside(event) {\r\n//       if (walletDropdownRef.current && !walletDropdownRef.current.contains(event.target)) {\r\n//         setWalletDropdownOpen(false);\r\n//       }\r\n//     }\r\n//     if (walletDropdownOpen) {\r\n//       document.addEventListener('mousedown', handleClickOutside);\r\n//     } else {\r\n//       document.removeEventListener('mousedown', handleClickOutside);\r\n//     }\r\n//     return () => document.removeEventListener('mousedown', handleClickOutside);\r\n//   }, [walletDropdownOpen]);\r\n\r\n//   // Sort wallets: connected first, then detected, then others\r\n//   const sortedWallets = [...supportedWallets].sort((a, b) => {\r\n//     const aConnected = walletConnection?.walletType === a;\r\n//     const bConnected = walletConnection?.walletType === b;\r\n//     const aDetected = availableWallets[a];\r\n//     const bDetected = availableWallets[b];\r\n\r\n//     if (aConnected && !bConnected) return -1;\r\n//     if (bConnected && !aConnected) return 1;\r\n//     if (aDetected && !bDetected) return -1;\r\n//     if (bDetected && !aDetected) return 1;\r\n//     return 0;\r\n//   });\r\n\r\n//   const getWalletStatus = (walletType) => {\r\n//     const isConnected = walletConnection?.walletType === walletType;\r\n//     const isDetected = availableWallets[walletType];\r\n\r\n//     if (isConnected) return { text: 'Connected', color: 'green' };\r\n//     if (isDetected) return { text: 'Detected', color: 'blue' };\r\n//     return { text: 'Not Installed', color: 'gray' };\r\n//   };\r\n\r\n//   const getSelectedWalletDisplay = () => {\r\n//     if (walletConnection) {\r\n//       const status = getWalletStatus(walletConnection.walletType);\r\n//       return (\r\n//         <div className=\"flex items-center gap-3\">\r\n//           <img\r\n//             src={getWalletIcon(walletConnection.walletType)}\r\n//             alt={getWalletDisplayName(walletConnection.walletType)}\r\n//             className=\"h-8 w-8\"\r\n//             onError={(e) => { e.target.style.display = 'none'; }}\r\n//           />\r\n//           <div className=\"flex flex-col\">\r\n//             <span className=\"text-base font-normal\">{getWalletDisplayName(walletConnection.walletType)}</span>\r\n//             <span className={`text-xs ${status.color === 'green' ? 'text-green-600' :\r\n//               status.color === 'blue' ? 'text-blue-600' : 'text-gray-500'\r\n//               }`}>\r\n//               {status.text}\r\n//             </span>\r\n//           </div>\r\n//         </div>\r\n//       );\r\n//     }\r\n\r\n//     // Show first detected wallet as default suggestion\r\n//     const firstDetected = sortedWallets.find(wallet => availableWallets[wallet]);\r\n//     if (firstDetected) {\r\n//       return (\r\n//         <div className=\"flex items-center gap-3\">\r\n//           <img\r\n//             src={getWalletIcon(firstDetected)}\r\n//             alt={getWalletDisplayName(firstDetected)}\r\n//             className=\"h-8 w-8\"\r\n//             onError={(e) => { e.target.style.display = 'none'; }}\r\n//           />\r\n//           <span className=\"text-gray-500\">Select {getWalletDisplayName(firstDetected)}...</span>\r\n//         </div>\r\n//       );\r\n//     }\r\n\r\n//     return <span className=\"text-gray-500\">Choose a wallet...</span>;\r\n//   };\r\n\r\n//   return (\r\n//     <div className=\"px-4\">\r\n//       <label className=\"block text-sm font-medium mb-2 text-gray-700\">\r\n//         Select Wallet\r\n//       </label>\r\n\r\n//       <div className=\"relative\" ref={walletDropdownRef}>\r\n//         <button\r\n//           type=\"button\"\r\n//           className=\"w-full flex items-center justify-between py-4 bg-white rounded-2xl shadow border border-gray-200 text-gray-900 text-base font-normal focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50 transition\"\r\n//           onClick={() => setWalletDropdownOpen((open) => !open)}\r\n//           style={{ minHeight: '56px', padding: '0.5rem' }}\r\n//         >\r\n//           {getSelectedWalletDisplay()}\r\n//           <svg className={`w-5 h-5 ml-2 transition-transform ${walletDropdownOpen ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n//             <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\r\n//           </svg>\r\n//         </button>\r\n\r\n//         {walletDropdownOpen && (\r\n//           <div className=\"absolute left-0 mt-2 px-2 w-full bg-white rounded-2xl shadow-lg border border-gray-100 z-20\" style={{ minWidth: '100%' }}>\r\n//             {sortedWallets.map((walletType) => {\r\n//               const isConnected = walletConnection?.walletType === walletType;\r\n//               const isDetected = availableWallets[walletType];\r\n//               const status = getWalletStatus(walletType);\r\n\r\n//               return (\r\n//                 <div\r\n//                   key={walletType}\r\n//                   className={`flex items-center justify-between mt-1 mb-1 px-2 py-3 rounded-2xl transition ${isConnected ? 'bg-green-50' :\r\n//                     isDetected ? 'hover:bg-gray-100 cursor-pointer' :\r\n//                       'opacity-60 cursor-not-allowed'\r\n//                     }`}\r\n//                   style={{ minHeight: '56px' }}\r\n//                   onClick={() => {\r\n//                     if (isDetected && !isConnected) {\r\n//                       setWalletDropdownOpen(false);\r\n//                       onConnectWallet(walletType);\r\n//                     }\r\n//                   }}\r\n//                 >\r\n//                   <div className=\"flex items-center gap-3\">\r\n//                     <img\r\n//                       src={getWalletIcon(walletType)}\r\n//                       alt={getWalletDisplayName(walletType)}\r\n//                       className=\"h-8 w-8\"\r\n//                       onError={(e) => { e.target.style.display = 'none'; }}\r\n//                     />\r\n//                     <div className=\"flex flex-col\">\r\n//                       <span className={`text-base font-normal ${isConnected ? 'text-green-800' : 'text-gray-900'\r\n//                         }`}>\r\n//                         {getWalletDisplayName(walletType)}\r\n//                       </span>\r\n//                       <span className={`text-xs ${status.color === 'green' ? 'text-green-600' :\r\n//                         status.color === 'blue' ? 'text-blue-600' : 'text-gray-500'\r\n//                         }`}>\r\n//                         {status.text}\r\n//                       </span>\r\n//                     </div>\r\n//                   </div>\r\n\r\n//                   <div className=\"flex items-center\">\r\n//                     {isConnected ? (\r\n//                       <div className=\"flex items-center space-x-2\">\r\n//                         <div className=\"w-2 h-2 bg-green-500 rounded-full animate-pulse\"></div>\r\n//                         <span className=\"text-xs text-green-600 font-medium\">Ready</span>\r\n//                       </div>\r\n//                     ) : isDetected ? (\r\n//                       <span className=\"text-xs text-blue-600 font-medium\">Click to connect</span>\r\n//                     ) : (\r\n//                       <a\r\n//                         href={getWalletInstallUrl(walletType)}\r\n//                         target=\"_blank\"\r\n//                         rel=\"noopener noreferrer\"\r\n//                         className=\"text-xs text-gray-500 hover:text-gray-700 underline\"\r\n//                         onClick={(e) => e.stopPropagation()}\r\n//                       >\r\n//                         Install\r\n//                       </a>\r\n//                     )}\r\n//                   </div>\r\n//                 </div>\r\n//               );\r\n//             })}\r\n//           </div>\r\n//         )}\r\n//       </div>\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// // Screen transition wrapper component\r\n// const ScreenTransition = ({\r\n//   currentStep,\r\n//   targetStep,\r\n//   children,\r\n//   className = \"\",\r\n//   duration = 300\r\n// }) => {\r\n//   const [isVisible, setIsVisible] = useState(currentStep === targetStep);\r\n//   const [shouldRender, setShouldRender] = useState(currentStep === targetStep);\r\n\r\n//   useEffect(() => {\r\n//     if (currentStep === targetStep) {\r\n//       setShouldRender(true);\r\n//       setTimeout(() => setIsVisible(true), 10);\r\n//     } else {\r\n//       setIsVisible(false);\r\n//       setTimeout(() => setShouldRender(false), duration);\r\n//     }\r\n//   }, [currentStep, targetStep, duration]);\r\n\r\n//   if (!shouldRender) return null;\r\n\r\n//   return (\r\n//     <div\r\n//       className={`\r\n//         transition-all duration-300 ease-out\r\n//         ${isVisible\r\n//           ? 'transform translate-y-0 opacity-100'\r\n//           : 'transform translate-y-full opacity-0'\r\n//         }\r\n//         ${className}\r\n//       `}\r\n//       style={{\r\n//         transitionDuration: `${duration}ms`\r\n//       }}\r\n//     >\r\n//       {children}\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// const CoinleyModal = ({\r\n//   isOpen,\r\n//   onClose,\r\n//   payment,\r\n//   paymentStatus,\r\n//   selectedPaymentMethod,\r\n//   onPaymentMethodSelect,\r\n//   onPayment,\r\n//   onBack,\r\n//   error,\r\n//   theme = 'light',\r\n//   merchantName,\r\n//   transactionHash,\r\n//   walletConnection,\r\n//   onConnectWallet,\r\n//   testMode = false,\r\n//   supportedNetworks = [],\r\n//   availableWallets = {},\r\n//   supportedWallets = [],\r\n//   step = 'select-currency',\r\n//   merchantWalletAddresses = {},\r\n//   debug = false,\r\n//   processingStartTime = null,\r\n//   pendingBackendConfirmation = false,\r\n//   paymentNetwork = null,\r\n//   merchantFeePercentage = 0.0175\r\n// }) => {\r\n//   const [paymentType, setPaymentType] = useState('wallet');\r\n\r\n//   // Debug payment data\r\n//   useEffect(() => {\r\n//     if (payment && debug) {\r\n//       console.log('CoinleyModal - Payment data:', {\r\n//         amount: payment.amount,\r\n//         feeAmount: payment.feeAmount,\r\n//         totalAmount: payment.totalAmount,\r\n//         feeChargedTo: payment.feeChargedTo,\r\n//         originalAmount: payment.originalAmount,\r\n//         merchantFeePercentage: merchantFeePercentage,\r\n//         dynamicFeeDisplay: `${(merchantFeePercentage * 100).toFixed(2)}%`\r\n//       });\r\n//     }\r\n//   }, [payment, debug, merchantFeePercentage]);\r\n\r\n//   // Get wallet address for current network\r\n//   const getWalletAddressForNetwork = () => {\r\n//     if (!selectedPaymentMethod) return 'No network selected';\r\n\r\n//     const networkAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n//     if (networkAddress) {\r\n//       return networkAddress;\r\n//     }\r\n\r\n//     if (payment?.recipientWallet) {\r\n//       return payment.recipientWallet;\r\n//     }\r\n\r\n//     return 'No wallet address configured for this network';\r\n//   };\r\n\r\n//   // Handle close for success screen\r\n//   const handleSuccessClose = () => {\r\n//     console.log(\"Success screen close button clicked\");\r\n//     if (onClose) {\r\n//       onClose();\r\n//     }\r\n//   };\r\n\r\n//   // Utility functions\r\n//   const formatAmount = (amount) => {\r\n//     return parseFloat(amount).toFixed(2);\r\n//   };\r\n\r\n//   const formatTransactionHash = (hash) => {\r\n//     if (!hash) return '';\r\n//     if (hash.length <= 14) return hash;\r\n//     return `${hash.slice(0, 8)}...${hash.slice(-6)}`;\r\n//   };\r\n\r\n//   const getNetworkDisplayName = (network) => {\r\n//     const names = {\r\n//       ethereum: 'Ethereum',\r\n//       bsc: 'BSC',\r\n//       tron: 'Tron',\r\n//       algorand: 'Algorand',\r\n//       solana: 'Solana'\r\n//     };\r\n//     return names[network] || network;\r\n//   };\r\n\r\n//   // Enhanced wallet display names with Trust Wallet\r\n//   const getWalletDisplayName = (walletType) => {\r\n//     const names = {\r\n//       [WALLET_TYPES.METAMASK]: 'MetaMask',\r\n//       [WALLET_TYPES.TRONLINK]: 'TronLink',\r\n//       [WALLET_TYPES.TRUST_WALLET]: 'Trust Wallet',\r\n//       [WALLET_TYPES.LUTE]: 'Lute Wallet',\r\n//       [WALLET_TYPES.PHANTOM]: 'Phantom'\r\n//     };\r\n//     return names[walletType] || walletType;\r\n//   };\r\n\r\n//   // Enhanced wallet icons with Trust Wallet\r\n//   const getWalletIcon = (walletType) => {\r\n//     const icons = {\r\n//       [WALLET_TYPES.METAMASK]: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3ymr3UNKopfI0NmUY95Dr-0589vG-91KuAA&s',\r\n//       [WALLET_TYPES.TRONLINK]: 'https://www.tronlink.org/images/logo.png',\r\n//       [WALLET_TYPES.TRUST_WALLET]: 'https://trustwallet.com/assets/images/media/trust_platform.svg',\r\n//       [WALLET_TYPES.LUTE]: 'https://lute.app/logo.png',\r\n//       [WALLET_TYPES.PHANTOM]: 'https://phantom.app/img/phantom-logo.png'\r\n//     };\r\n//     return icons[walletType] || '';\r\n//   };\r\n\r\n//   // Helper to format the dynamic fee percentage\r\n//   const formatFeePercentage = () => {\r\n//     return (merchantFeePercentage * 100).toFixed(2);\r\n//   };\r\n\r\n//   if (!isOpen) return null;\r\n\r\n//   return (\r\n//     <div className=\"fixed inset-0 z-50\">\r\n//       <div className=\"fixed inset-0 bg-black bg-opacity-50 transition-opacity\" onClick={onClose} aria-hidden=\"true\" />\r\n//       <div className=\"fixed inset-0 overflow-y-auto\">\r\n//         <div className=\"flex min-h-screen items-center justify-center p-4\">\r\n//           <div className=\"coinley-modal relative pt-6 w-full max-w-md mx-auto shadow-xl bg-gray-100 rounded-3xl overflow-hidden\">\r\n//             {/* Header with Logo */}\r\n//             <div className=\"bg-white flex justify-between items-center mb-6 mr-3 ml-3 py-4 px-2 rounded-full\">\r\n//               <div className=\"flex-1 flex items-center gap-2 px-4\">\r\n//                 <img src={logo} className=\"w-auto h-auto\" alt=\"Coinley Logo\" />\r\n//                 <span className=\"text-lg font-semibold text-gray-800\">Payment Details</span>\r\n//               </div>\r\n//               {step !== 'success' && step !== 'processing' && (\r\n//                 <button\r\n//                   onClick={onClose}\r\n//                   className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\r\n//                 >\r\n//                   <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//                     <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n//                   </svg>\r\n//                 </button>\r\n//               )}\r\n//             </div>\r\n\r\n//             {/* Payment Summary */}\r\n//             {payment && step !== 'success' && (\r\n//               <div className=\"mb-6\">\r\n//                 <div className=\"text-center\">\r\n//                   <div className=\"text-sm text-gray-600\">\r\n//                     Total Amount\r\n//                   </div>\r\n//                   <div className=\"coinley-amount-display text-3xl md:text-9xl lg:text-9xl font-bold text-[#7042D2] mt-2 leading-tight tracking-tight\">\r\n//                     ${formatAmount(payment.totalAmount || payment.amount)}\r\n//                   </div>\r\n\r\n//                   {/* Show fee breakdown with dynamic percentage */}\r\n//                   {payment.feeChargedTo === 'customer' && payment.feeAmount > 0 && (\r\n//                     <div className=\"mt-2 text-sm text-gray-500\">\r\n//                       {/* Fee details removed for cleaner UI */}\r\n//                     </div>\r\n//                   )}\r\n\r\n//                   {/* Show different message when merchant pays fees */}\r\n//                   {payment.feeChargedTo === 'merchant' && (\r\n//                     <div className=\"mt-2 text-sm text-gray-500\">\r\n//                       No additional fees\r\n//                     </div>\r\n//                   )}\r\n\r\n//                   <div className=\"text-sm text-gray-600 mt-4\">Payment to:</div>\r\n//                   <div className=\"coinley-merchant-name text-base font-semibold mt-1 flex gap-2 items-center justify-center\">\r\n//                     <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n//                       <path d=\"M15.3 7.50065L15.8 10.0007H4.2L4.7 7.50065H15.3ZM16.6667 3.33398H3.33333V5.00065H16.6667V3.33398ZM16.6667 5.83398H3.33333L2.5 10.0007V11.6673H3.33333V16.6673H11.6667V11.6673H15V16.6673H16.6667V11.6673H17.5V10.0007L16.6667 5.83398ZM5 15.0007V11.6673H10V15.0007H5Z\" fill=\"#7042D2\" />\r\n//                     </svg>\r\n//                     {merchantName}\r\n//                   </div>\r\n//                 </div>\r\n//               </div>\r\n//             )}\r\n\r\n//             {/* Main Content Area with Slide Animations */}\r\n//             <div className=\"relative\">\r\n//               {/* Step: Select Currency */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"select-currency\">\r\n//                 <div className=\"pb-6 pt-6 px-6 bg-white rounded-t-2xl blockchain-network\">\r\n//                   <PaymentMethods\r\n//                     onSelect={onPaymentMethodSelect}\r\n//                     selected={selectedPaymentMethod}\r\n//                     theme={theme}\r\n//                     supportedNetworks={supportedNetworks}\r\n//                   />\r\n//                 </div>\r\n//               </ScreenTransition>\r\n\r\n//               {/* Step: Confirm Payment */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"confirm\">\r\n//                 {selectedPaymentMethod && payment && (\r\n//                   <div>\r\n\r\n//                     {/* Payment Details - Hide when QR code is selected */}\r\n//                     {paymentType === 'wallet' && (\r\n//                       <div className=\"p-4 rounded-2xl mb-4 bg-white\">\r\n//                         <h3 className=\"text-lg font-medium mb-2 text-gray-800\">\r\n//                           Payment Details\r\n//                         </h3>\r\n//                         <div className=\"space-y-2 bg-[#EDE4FF] p-3 rounded-xl\">\r\n//                           <div className=\"flex justify-between\">\r\n//                             <span className=\"font-medium\">Currency:</span>\r\n//                             <span className=\"font-medium\">{selectedPaymentMethod.currency}</span>\r\n//                           </div>\r\n\r\n//                           <div className='border border-b border-gray-400'></div>\r\n\r\n//                           <div className=\"flex justify-between\">\r\n//                             <span className=\"font-medium\">Network:</span>\r\n//                             <span className=\"font-medium\">{getNetworkDisplayName(selectedPaymentMethod.network)}</span>\r\n//                           </div>\r\n\r\n//                           <div className='border border-b border-gray-400'></div>\r\n\r\n//                           {/* Fee info with dynamic percentage */}\r\n//                           {payment.feeChargedTo === 'customer' && payment.feeAmount > 0 ? (\r\n//                             <>\r\n//                               <div className=\"flex justify-between\">\r\n//                                 <span className=\"font-medium\">Processing Fee:</span>\r\n//                                 <span className=\"font-medium\">{formatFeePercentage()}%</span>\r\n//                               </div>\r\n\r\n//                               <div className='border border-b border-gray-400'></div>\r\n\r\n\r\n//                               <div className=\"flex justify-between border-t pt-2 mt-1\">\r\n//                                 <span className=\"font-bold\">Total:</span>\r\n//                                 <span className=\"font-bold text-lg\">${formatAmount(payment.totalAmount)}</span>\r\n//                               </div>\r\n//                             </>\r\n//                           ) : (\r\n//                             <>\r\n//                               <div className=\"flex justify-between\">\r\n//                                 <span className=\"font-medium\">Processing Fee:</span>\r\n//                                 <span className=\"font-medium\">Included by merchant</span>\r\n//                               </div>\r\n\r\n//                               <div className='border border-b border-gray-400'></div>\r\n\r\n//                               <div className=\"\">\r\n//                                 <div className=\"flex justify-between\">\r\n//                                   <span className=\"font-bold\">Total:</span>\r\n//                                   <span className=\"font-bold text-lg\">${formatAmount(payment.totalAmount)}</span>\r\n//                                 </div>\r\n//                                 <div className=\"text-xs text-gray-500 mt-1\">\r\n//                                   Processing fee is covered by the merchant\r\n//                                 </div>\r\n//                               </div>\r\n//                             </>\r\n//                           )}\r\n//                         </div>\r\n//                       </div>\r\n//                     )}\r\n\r\n//                     {/* Payment Method Tabs */}\r\n//                     <div className=\"mb-4 px-4\">\r\n//                       <div className=\"flex border-b border-gray-200\">\r\n//                         <button\r\n//                           onClick={() => setPaymentType('wallet')}\r\n//                           className={`py-2 px-4 text-sm font-medium ${paymentType === 'wallet'\r\n//                             ? 'border-b-2 border-purple-600 text-purple-600'\r\n//                             : 'text-gray-500 hover:text-gray-700'\r\n//                             }`}\r\n//                         >\r\n//                           Connect Wallet\r\n//                         </button>\r\n//                         <button\r\n//                           onClick={() => setPaymentType('qrcode')}\r\n//                           className={`py-2 px-4 text-sm font-medium ${paymentType === 'qrcode'\r\n//                             ? 'border-b-2 border-purple-600 text-purple-600'\r\n//                             : 'text-gray-500 hover:text-gray-700'\r\n//                             }`}\r\n//                         >\r\n//                           QR Code\r\n//                         </button>\r\n//                       </div>\r\n//                     </div>\r\n\r\n//                     {/* Payment options */}\r\n//                     {testMode ? (\r\n//                       <div className=\"p-4 rounded-lg mb-4 bg-blue-50\">\r\n//                         <div className=\"flex items-center\">\r\n//                           <div className=\"bg-purple-600 rounded-full p-2 mr-3\">\r\n//                             <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//                               <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\r\n//                             </svg>\r\n//                           </div>\r\n//                           <div>\r\n//                             <h3 className=\"font-medium text-gray-800\">Test Mode Payment</h3>\r\n//                             <p className=\"text-sm text-gray-600\">Click \"Pay Now\" to simulate a successful payment</p>\r\n//                           </div>\r\n//                         </div>\r\n//                       </div>\r\n//                     ) : paymentType === 'qrcode' ? (\r\n//                       <div className=\"mb-4\">\r\n//                         <QRCode\r\n//                           walletAddress={getWalletAddressForNetwork()}\r\n//                           amount={payment.totalAmount || payment.amount}\r\n//                           currency={selectedPaymentMethod.currency}\r\n//                           network={selectedPaymentMethod.network}\r\n//                           theme={theme}\r\n//                         />\r\n//                       </div>\r\n//                     ) : (\r\n//                       <div className=\"space-y-3 mb-4\">\r\n//                         {supportedWallets.length === 0 ? (\r\n//                           <div className=\"p-4 rounded-lg bg-yellow-50\">\r\n//                             <div className=\"flex items-center\">\r\n//                               <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-yellow-500 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n//                                 <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n//                               </svg>\r\n//                               <div>\r\n//                                 <h3 className=\"font-medium text-gray-800\">No Compatible Wallets</h3>\r\n//                                 <p className=\"text-sm text-gray-600\">\r\n//                                   No wallets detected for {getNetworkDisplayName(selectedPaymentMethod.network)} network\r\n//                                 </p>\r\n//                               </div>\r\n//                             </div>\r\n//                           </div>\r\n//                         ) : (\r\n//                           <WalletDropdown\r\n//                             supportedWallets={supportedWallets}\r\n//                             availableWallets={availableWallets}\r\n//                             walletConnection={walletConnection}\r\n//                             onConnectWallet={onConnectWallet}\r\n//                             getWalletDisplayName={getWalletDisplayName}\r\n//                             getWalletIcon={getWalletIcon}\r\n//                             theme={theme}\r\n//                           />\r\n//                         )}\r\n//                       </div>\r\n//                     )}\r\n\r\n//                     {/* Display any errors */}\r\n//                     {error && (\r\n//                       <div className=\"p-3 rounded-lg bg-red-50 mb-4 text-red-600 text-sm\">\r\n//                         {error}\r\n//                       </div>\r\n//                     )}\r\n\r\n//                     {/* Navigation buttons */}\r\n//                     <div className=\"grid grid-cols-2 gap-3 mb-3 px-4\">\r\n//                       <button\r\n//                         type=\"button\"\r\n//                         onClick={onBack}\r\n//                         className=\"w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-purple-600 font-medium rounded-md\"\r\n//                       >\r\n//                         Back\r\n//                       </button>\r\n//                       <button\r\n//                         type=\"button\"\r\n//                         onClick={() => onPayment(paymentType === 'qrcode')}\r\n//                         className=\"bg-green-600 text-white w-full py-2 px-4 font-medium rounded-md\"\r\n//                         disabled={!testMode && paymentType === 'wallet' && !walletConnection}\r\n//                       >\r\n//                         {paymentType === 'qrcode' ? 'I have sent the payment' : 'Pay Now'}\r\n//                       </button>\r\n//                     </div>\r\n//                   </div>\r\n//                 )}\r\n//               </ScreenTransition>\r\n\r\n//               {/* Step: Processing */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"processing\">\r\n//                 <PaymentStatus\r\n//                   status=\"processing\"\r\n//                   theme={theme}\r\n//                   message=\"Processing your payment...\"\r\n//                   processingStartTime={processingStartTime}\r\n//                   paymentNetwork={paymentNetwork || selectedPaymentMethod?.network}\r\n//                   transactionHash={transactionHash}\r\n//                 />\r\n//               </ScreenTransition>\r\n\r\n//               {/* Step: Success */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"success\">\r\n//                 <PaymentStatus\r\n//                   status=\"success\"\r\n//                   theme={theme}\r\n//                   message=\"Payment successful!\"\r\n//                   payment={payment}\r\n//                   transactionHash={transactionHash}\r\n//                   selectedPaymentMethod={selectedPaymentMethod}\r\n//                   merchantName={merchantName}\r\n//                   onClose={handleSuccessClose}\r\n//                   pendingBackendConfirmation={pendingBackendConfirmation}\r\n//                 />\r\n//               </ScreenTransition>\r\n\r\n//               {/* Step: Error */}\r\n//               <ScreenTransition currentStep={step} targetStep=\"error\">\r\n//                 <div>\r\n//                   <PaymentStatus\r\n//                     status=\"error\"\r\n//                     theme={theme}\r\n//                     message={error || \"An error occurred while processing your payment.\"}\r\n//                   />\r\n//                   <button\r\n//                     type=\"button\"\r\n//                     onClick={onBack}\r\n//                     className=\"mt-4 w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-gray-800 font-medium rounded-md\"\r\n//                   >\r\n//                     Try Again\r\n//                   </button>\r\n//                 </div>\r\n//               </ScreenTransition>\r\n//             </div>\r\n\r\n//             {/* Footer */}\r\n//             {step !== 'success' && (\r\n//               <div className=\"text-center text-xs text-gray-500 flex items-center justify-center gap-1 py-6 bg-white rounded-b-3xl\">\r\n//                 <p>Powered by <span className='text-purple-600'>Coinley</span> - Secure Cryptocurrency Payments</p>\r\n//                 <svg className=\"inline w-4 h-4 text-green-500 ml-1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n//                   <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" fill=\"none\" />\r\n//                   <path d=\"M9 12l2 2 4-4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n//                 </svg>\r\n//               </div>\r\n//             )}\r\n//           </div>\r\n//         </div>\r\n//       </div>\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// export default CoinleyModal;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // Updated WalletDropdown Component for CoinleyModal.jsx\r\n// import React, { useState, useEffect, useRef } from 'react';\r\n// import { getAvailableWallets } from '../services/walletService';\r\n\r\n// const WalletDropdown = ({\r\n//   selectedNetwork,\r\n//   walletConnection,\r\n//   onConnectWallet,\r\n//   theme\r\n// }) => {\r\n//   const [walletDropdownOpen, setWalletDropdownOpen] = useState(false);\r\n//   const [availableWallets, setAvailableWallets] = useState([]);\r\n//   const [loading, setLoading] = useState(true);\r\n//   const walletDropdownRef = useRef(null);\r\n\r\n//   // Load wallets from Coinley Connect when network changes\r\n//   useEffect(() => {\r\n//     const loadWallets = async () => {\r\n//       if (!selectedNetwork) return;\r\n      \r\n//       try {\r\n//         setLoading(true);\r\n//         console.log('🔍 Loading wallets for network:', selectedNetwork);\r\n        \r\n//         // Get wallets from Coinley Connect service\r\n//         const wallets = await getAvailableWallets(selectedNetwork);\r\n//         console.log('✅ Loaded wallets from Coinley Connect:', wallets);\r\n        \r\n//         setAvailableWallets(wallets);\r\n//       } catch (error) {\r\n//         console.error('❌ Failed to load wallets:', error);\r\n//         // Fallback wallets\r\n//         setAvailableWallets([\r\n//           {\r\n//             type: 'metamask',\r\n//             name: 'MetaMask',\r\n//             icon: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3ymr3UNKopfI0NmUY95Dr-0589vG-91KuAA&s',\r\n//             description: 'Connect using browser extension',\r\n//             isInstalled: typeof window.ethereum !== 'undefined',\r\n//             status: typeof window.ethereum !== 'undefined' ? 'installed' : 'not_installed',\r\n//             downloadUrl: 'https://metamask.io/download/'\r\n//           }\r\n//         ]);\r\n//       } finally {\r\n//         setLoading(false);\r\n//       }\r\n//     };\r\n\r\n//     loadWallets();\r\n//   }, [selectedNetwork]);\r\n\r\n//   // Close dropdown on outside click\r\n//   useEffect(() => {\r\n//     function handleClickOutside(event) {\r\n//       if (walletDropdownRef.current && !walletDropdownRef.current.contains(event.target)) {\r\n//         setWalletDropdownOpen(false);\r\n//       }\r\n//     }\r\n//     if (walletDropdownOpen) {\r\n//       document.addEventListener('mousedown', handleClickOutside);\r\n//     } else {\r\n//       document.removeEventListener('mousedown', handleClickOutside);\r\n//     }\r\n//     return () => document.removeEventListener('mousedown', handleClickOutside);\r\n//   }, [walletDropdownOpen]);\r\n\r\n//   const getWalletStatus = (wallet) => {\r\n//     const isConnected = walletConnection?.walletType === wallet.type;\r\n    \r\n//     if (isConnected) return { text: 'Connected', color: 'green' };\r\n//     if (wallet.isInstalled) return { text: 'Detected', color: 'blue' };\r\n//     return { text: 'Not Installed', color: 'gray' };\r\n//   };\r\n\r\n//   const getSelectedWalletDisplay = () => {\r\n//     if (walletConnection) {\r\n//       const connectedWallet = availableWallets.find(w => w.type === walletConnection.walletType);\r\n//       const status = getWalletStatus(connectedWallet || { type: walletConnection.walletType, isInstalled: true });\r\n      \r\n//       return (\r\n//         <div className=\"flex items-center gap-3\">\r\n//           <img\r\n//             src={connectedWallet?.icon || 'https://via.placeholder.com/32'}\r\n//             alt={connectedWallet?.name || 'Wallet'}\r\n//             className=\"h-8 w-8 rounded\"\r\n//             onError={(e) => { e.target.style.display = 'none'; }}\r\n//           />\r\n//           <div className=\"flex flex-col\">\r\n//             <span className=\"text-base font-normal\">{connectedWallet?.name || 'Connected Wallet'}</span>\r\n//             <span className={`text-xs ${status.color === 'green' ? 'text-green-600' :\r\n//               status.color === 'blue' ? 'text-blue-600' : 'text-gray-500'\r\n//               }`}>\r\n//               {status.text}\r\n//             </span>\r\n//           </div>\r\n//         </div>\r\n//       );\r\n//     }\r\n\r\n//     // Show loading or default state\r\n//     if (loading) {\r\n//       return (\r\n//         <div className=\"flex items-center gap-3\">\r\n//           <div className=\"h-8 w-8 bg-gray-200 rounded animate-pulse\"></div>\r\n//           <span className=\"text-gray-500\">Loading wallets...</span>\r\n//         </div>\r\n//       );\r\n//     }\r\n\r\n//     // Show first installed wallet as suggestion\r\n//     const firstInstalled = availableWallets.find(wallet => wallet.isInstalled);\r\n//     if (firstInstalled) {\r\n//       return (\r\n//         <div className=\"flex items-center gap-3\">\r\n//           <img\r\n//             src={firstInstalled.icon}\r\n//             alt={firstInstalled.name}\r\n//             className=\"h-8 w-8 rounded\"\r\n//             onError={(e) => { e.target.style.display = 'none'; }}\r\n//           />\r\n//           <span className=\"text-gray-500\">Select {firstInstalled.name}...</span>\r\n//         </div>\r\n//       );\r\n//     }\r\n\r\n//     return <span className=\"text-gray-500\">Choose a wallet...</span>;\r\n//   };\r\n\r\n//   if (!selectedNetwork) {\r\n//     return (\r\n//       <div className=\"px-4\">\r\n//         <label className=\"block text-sm font-medium mb-2 text-gray-700\">\r\n//           Select Wallet\r\n//         </label>\r\n//         <div className=\"w-full py-4 px-3 bg-gray-100 rounded-2xl text-gray-500 text-center\">\r\n//           Please select a network first\r\n//         </div>\r\n//       </div>\r\n//     );\r\n//   }\r\n\r\n//   return (\r\n//     <div className=\"px-4\">\r\n//       <label className=\"block text-sm font-medium mb-2 text-gray-700\">\r\n//         Select Wallet\r\n//       </label>\r\n\r\n//       <div className=\"relative\" ref={walletDropdownRef}>\r\n//         <button\r\n//           type=\"button\"\r\n//           className=\"w-full flex items-center justify-between py-4 bg-white rounded-2xl shadow border border-gray-200 text-gray-900 text-base font-normal focus:outline-none focus:ring-2 focus:ring-[#7042D2] focus:ring-opacity-50 transition\"\r\n//           onClick={() => setWalletDropdownOpen((open) => !open)}\r\n//           style={{ minHeight: '56px', padding: '0.5rem' }}\r\n//         >\r\n//           {getSelectedWalletDisplay()}\r\n//           <svg className={`w-5 h-5 ml-2 transition-transform ${walletDropdownOpen ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n//             <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\r\n//           </svg>\r\n//         </button>\r\n\r\n//         {walletDropdownOpen && (\r\n//           <div className=\"absolute left-0 mt-2 px-2 w-full bg-white rounded-2xl shadow-lg border border-gray-100 z-20\" style={{ minWidth: '100%' }}>\r\n//             {loading ? (\r\n//               <div className=\"text-center py-4 text-gray-500 text-sm\">\r\n//                 Loading wallets...\r\n//               </div>\r\n//             ) : availableWallets.length === 0 ? (\r\n//               <div className=\"text-center py-4 text-gray-500 text-sm\">\r\n//                 No wallets available for this network\r\n//               </div>\r\n//             ) : (\r\n//               availableWallets.map((wallet) => {\r\n//                 const isConnected = walletConnection?.walletType === wallet.type;\r\n//                 const status = getWalletStatus(wallet);\r\n\r\n//                 return (\r\n//                   <div\r\n//                     key={wallet.type}\r\n//                     className={`flex items-center justify-between mt-1 mb-1 px-2 py-3 rounded-2xl transition ${isConnected ? 'bg-green-50' :\r\n//                       wallet.isInstalled ? 'hover:bg-gray-100 cursor-pointer' :\r\n//                         'opacity-60 cursor-not-allowed'\r\n//                       }`}\r\n//                     style={{ minHeight: '56px' }}\r\n//                     onClick={() => {\r\n//                       if (wallet.isInstalled && !isConnected) {\r\n//                         setWalletDropdownOpen(false);\r\n//                         console.log('🔗 Connecting to wallet directly:', wallet.type);\r\n//                         onConnectWallet(wallet.type);\r\n//                       }\r\n//                     }}\r\n//                   >\r\n//                     <div className=\"flex items-center gap-3\">\r\n//                       <img\r\n//                         src={wallet.icon}\r\n//                         alt={wallet.name}\r\n//                         className=\"h-8 w-8 rounded\"\r\n//                         onError={(e) => { \r\n//                           e.target.src = 'https://via.placeholder.com/32'; \r\n//                         }}\r\n//                       />\r\n//                       <div className=\"flex flex-col\">\r\n//                         <span className={`text-base font-normal ${isConnected ? 'text-green-800' : 'text-gray-900'\r\n//                           }`}>\r\n//                           {wallet.name}\r\n//                         </span>\r\n//                         <span className=\"text-xs text-gray-500\">\r\n//                           {wallet.description}\r\n//                         </span>\r\n//                       </div>\r\n//                     </div>\r\n\r\n//                     <div className=\"flex items-center\">\r\n//                       {isConnected ? (\r\n//                         <div className=\"flex items-center space-x-2\">\r\n//                           <div className=\"w-2 h-2 bg-green-500 rounded-full animate-pulse\"></div>\r\n//                           <span className=\"text-xs text-green-600 font-medium\">Connected</span>\r\n//                         </div>\r\n//                       ) : wallet.isInstalled ? (\r\n//                         <span className=\"text-xs text-blue-600 font-medium\">Click to connect</span>\r\n//                       ) : (\r\n//                         <a\r\n//                           href={wallet.downloadUrl}\r\n//                           target=\"_blank\"\r\n//                           rel=\"noopener noreferrer\"\r\n//                           className=\"text-xs text-gray-500 hover:text-gray-700 underline\"\r\n//                           onClick={(e) => e.stopPropagation()}\r\n//                         >\r\n//                           Install\r\n//                         </a>\r\n//                       )}\r\n//                     </div>\r\n//                   </div>\r\n//                 );\r\n//               })\r\n//             )}\r\n            \r\n//             {/* Powered by Coinley Connect */}\r\n//             <div className=\"text-center py-2 border-t border-gray-100 mt-2\">\r\n//               <span className=\"text-xs text-gray-400\">\r\n//                 Powered by Coinley Connect\r\n//               </span>\r\n//             </div>\r\n//           </div>\r\n//         )}\r\n//       </div>\r\n//     </div>\r\n//   );\r\n// };\r\n\r\n// export default WalletDropdown;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// CoinleyModal.jsx - Complete rewrite with embedded wallet interface\r\nimport React, { useState, useEffect, useRef } from 'react';\r\nimport PaymentMethods from './PaymentMethods';\r\nimport PaymentStatus from './PaymentStatus';\r\nimport QRCode from './QRCode';\r\nimport logo from '../assets/Logomark.png';\r\n\r\n// Embedded Wallet Interface Component (Your Coinley Connect Design)\r\nconst EmbeddedWalletInterface = ({ onConnectWallet, selectedPaymentMethod }) => {\r\n  const [selectedWalletType, setSelectedWalletType] = useState(null);\r\n  const [isDropdownOpen, setIsDropdownOpen] = useState(false);\r\n  const [isConnecting, setIsConnecting] = useState(false);\r\n\r\n  const wallets = [\r\n    {\r\n      type: 'metamask',\r\n      name: 'MetaMask',\r\n      icon: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT3ymr3UNKopfI0NmUY95Dr-0589vG-91KuAA&s',\r\n      description: 'Connect using browser extension'\r\n    },\r\n    {\r\n      type: 'phantom',\r\n      name: 'Phantom',\r\n      icon: 'https://coinlaunch.space/media/images/4/8/5/0/4850.sp3ow1.192x192.png',\r\n      description: 'Connect using Phantom wallet'\r\n    }\r\n  ];\r\n\r\n  const selectWallet = (walletType) => {\r\n    setSelectedWalletType(walletType);\r\n    setIsDropdownOpen(false);\r\n  };\r\n\r\n  const connectWallet = async () => {\r\n    if (!selectedWalletType) return;\r\n    \r\n    setIsConnecting(true);\r\n    \r\n    try {\r\n      if (selectedWalletType === 'metamask') {\r\n        await connectMetaMask();\r\n      } else if (selectedWalletType === 'phantom') {\r\n        await connectPhantom();\r\n      }\r\n    } catch (error) {\r\n      console.error('Connection failed:', error);\r\n      alert('Failed to connect wallet. Please try again.');\r\n    } finally {\r\n      setIsConnecting(false);\r\n    }\r\n  };\r\n\r\n  const connectMetaMask = async () => {\r\n    if (typeof window.ethereum !== 'undefined') {\r\n      try {\r\n        const accounts = await window.ethereum.request({ \r\n          method: 'eth_requestAccounts' \r\n        });\r\n        onConnectWallet('metamask');\r\n      } catch (error) {\r\n        throw error;\r\n      }\r\n    } else {\r\n      alert('MetaMask is not installed. Please install MetaMask extension.');\r\n      throw new Error('MetaMask not found');\r\n    }\r\n  };\r\n\r\n  const connectPhantom = async () => {\r\n    if (window.solana && window.solana.isPhantom) {\r\n      try {\r\n        const response = await window.solana.connect();\r\n        onConnectWallet('phantom');\r\n      } catch (error) {\r\n        throw error;\r\n      }\r\n    } else {\r\n      alert('Phantom wallet is not installed. Please install Phantom extension.');\r\n      throw new Error('Phantom not found');\r\n    }\r\n  };\r\n\r\n  const selectedWallet = wallets.find(w => w.type === selectedWalletType);\r\n\r\n  return (\r\n    <div className=\"space-y-4 mb-4 px-4\">\r\n      {/* Your Coinley Connect wallet interface */}\r\n      <div style={{ position: 'relative', marginBottom: '20px' }}>\r\n        <button\r\n          style={{\r\n            width: '100%',\r\n            padding: '16px 20px',\r\n            background: 'white',\r\n            border: '2px solid #e5e7eb',\r\n            borderRadius: '12px',\r\n            fontSize: '16px',\r\n            fontWeight: '600',\r\n            color: '#374151',\r\n            cursor: 'pointer',\r\n            display: 'flex',\r\n            alignItems: 'center',\r\n            justifyContent: 'space-between',\r\n            transition: 'all 0.2s ease',\r\n            borderColor: isDropdownOpen ? '#3b82f6' : '#e5e7eb',\r\n            boxShadow: isDropdownOpen ? '0 4px 12px rgba(59, 130, 246, 0.15)' : 'none'\r\n          }}\r\n          onClick={() => setIsDropdownOpen(!isDropdownOpen)}\r\n          onMouseEnter={(e) => {\r\n            if (!isDropdownOpen) {\r\n              e.target.style.borderColor = '#3b82f6';\r\n              e.target.style.boxShadow = '0 4px 12px rgba(59, 130, 246, 0.15)';\r\n            }\r\n          }}\r\n          onMouseLeave={(e) => {\r\n            if (!isDropdownOpen) {\r\n              e.target.style.borderColor = '#e5e7eb';\r\n              e.target.style.boxShadow = 'none';\r\n            }\r\n          }}\r\n        >\r\n          <span>{selectedWallet ? selectedWallet.name : 'Select a wallet'}</span>\r\n          <span style={{\r\n            transition: 'transform 0.2s ease',\r\n            fontSize: '12px',\r\n            color: '#6b7280',\r\n            transform: isDropdownOpen ? 'rotate(180deg)' : 'rotate(0deg)'\r\n          }}>\r\n            ▼\r\n          </span>\r\n        </button>\r\n        \r\n        {isDropdownOpen && (\r\n          <div style={{\r\n            position: 'absolute',\r\n            top: '100%',\r\n            left: 0,\r\n            right: 0,\r\n            background: 'white',\r\n            border: '2px solid #e5e7eb',\r\n            borderTop: 'none',\r\n            borderRadius: '0 0 12px 12px',\r\n            boxShadow: '0 8px 25px rgba(0, 0, 0, 0.1)',\r\n            zIndex: 10\r\n          }}>\r\n            {wallets.map((wallet, index) => (\r\n              <div\r\n                key={wallet.type}\r\n                style={{\r\n                  padding: '16px 20px',\r\n                  display: 'flex',\r\n                  alignItems: 'center',\r\n                  cursor: 'pointer',\r\n                  transition: 'background-color 0.2s ease',\r\n                  borderBottom: index < wallets.length - 1 ? '1px solid #f3f4f6' : 'none'\r\n                }}\r\n                onClick={() => selectWallet(wallet.type)}\r\n                onMouseEnter={(e) => {\r\n                  e.currentTarget.style.backgroundColor = '#f8fafc';\r\n                }}\r\n                onMouseLeave={(e) => {\r\n                  e.currentTarget.style.backgroundColor = 'transparent';\r\n                }}\r\n              >\r\n                <div style={{\r\n                  width: '32px',\r\n                  height: '32px',\r\n                  borderRadius: '8px',\r\n                  marginRight: '12px',\r\n                  display: 'flex',\r\n                  alignItems: 'center',\r\n                  justifyContent: 'center'\r\n                }}>\r\n                  <img\r\n                    src={wallet.icon}\r\n                    alt={wallet.name}\r\n                    style={{\r\n                      width: '100%',\r\n                      height: '100%',\r\n                      objectFit: 'contain'\r\n                    }}\r\n                  />\r\n                </div>\r\n                <div>\r\n                  <div style={{\r\n                    fontWeight: '600',\r\n                    color: '#374151'\r\n                  }}>\r\n                    {wallet.name}\r\n                  </div>\r\n                  <div style={{\r\n                    fontSize: '12px',\r\n                    color: '#6b7280',\r\n                    marginTop: '2px'\r\n                  }}>\r\n                    {wallet.description}\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            ))}\r\n          </div>\r\n        )}\r\n      </div>\r\n      \r\n      <button\r\n        style={{\r\n          width: '100%',\r\n          padding: '16px',\r\n          background: selectedWalletType ? 'linear-gradient(135deg, #3b82f6, #8b5cf6)' : '#e5e7eb',\r\n          color: selectedWalletType ? 'white' : '#9ca3af',\r\n          border: 'none',\r\n          borderRadius: '12px',\r\n          fontSize: '16px',\r\n          fontWeight: '600',\r\n          cursor: selectedWalletType ? 'pointer' : 'not-allowed',\r\n          transition: 'all 0.2s ease',\r\n          opacity: selectedWalletType ? 1 : 0.5,\r\n          pointerEvents: selectedWalletType ? 'auto' : 'none'\r\n        }}\r\n        onClick={connectWallet}\r\n        disabled={!selectedWalletType || isConnecting}\r\n        onMouseEnter={(e) => {\r\n          if (selectedWalletType && !isConnecting) {\r\n            e.target.style.transform = 'translateY(-2px)';\r\n            e.target.style.boxShadow = '0 8px 25px rgba(59, 130, 246, 0.3)';\r\n          }\r\n        }}\r\n        onMouseLeave={(e) => {\r\n          if (selectedWalletType && !isConnecting) {\r\n            e.target.style.transform = 'translateY(0)';\r\n            e.target.style.boxShadow = 'none';\r\n          }\r\n        }}\r\n      >\r\n        {isConnecting ? 'Connecting...' : 'Connect Wallet'}\r\n      </button>\r\n    </div>\r\n  );\r\n};\r\n\r\n// Screen transition wrapper component\r\nconst ScreenTransition = ({\r\n  currentStep,\r\n  targetStep,\r\n  children,\r\n  className = \"\",\r\n  duration = 300\r\n}) => {\r\n  const [isVisible, setIsVisible] = useState(currentStep === targetStep);\r\n  const [shouldRender, setShouldRender] = useState(currentStep === targetStep);\r\n\r\n  useEffect(() => {\r\n    if (currentStep === targetStep) {\r\n      setShouldRender(true);\r\n      setTimeout(() => setIsVisible(true), 10);\r\n    } else {\r\n      setIsVisible(false);\r\n      setTimeout(() => setShouldRender(false), duration);\r\n    }\r\n  }, [currentStep, targetStep, duration]);\r\n\r\n  if (!shouldRender) return null;\r\n\r\n  return (\r\n    <div\r\n      className={`\r\n        transition-all duration-300 ease-out\r\n        ${isVisible\r\n          ? 'transform translate-y-0 opacity-100'\r\n          : 'transform translate-y-full opacity-0'\r\n        }\r\n        ${className}\r\n      `}\r\n      style={{\r\n        transitionDuration: `${duration}ms`\r\n      }}\r\n    >\r\n      {children}\r\n    </div>\r\n  );\r\n};\r\n\r\nconst CoinleyModal = ({\r\n  isOpen,\r\n  onClose,\r\n  payment,\r\n  paymentStatus,\r\n  selectedPaymentMethod,\r\n  onPaymentMethodSelect,\r\n  onPayment,\r\n  onBack,\r\n  error,\r\n  theme = 'light',\r\n  merchantName,\r\n  transactionHash,\r\n  walletConnection,\r\n  onConnectWallet,\r\n  testMode = false,\r\n  supportedNetworks = [],\r\n  availableWallets = {},\r\n  supportedWallets = [],\r\n  step = 'select-currency',\r\n  merchantWalletAddresses = {},\r\n  debug = false,\r\n  processingStartTime = null,\r\n  pendingBackendConfirmation = false,\r\n  paymentNetwork = null,\r\n  merchantFeePercentage = 0.0175\r\n}) => {\r\n  const [paymentType, setPaymentType] = useState('wallet');\r\n\r\n  // Debug payment data\r\n  useEffect(() => {\r\n    if (payment && debug) {\r\n      console.log('CoinleyModal - Payment data:', {\r\n        amount: payment.amount,\r\n        feeAmount: payment.feeAmount,\r\n        totalAmount: payment.totalAmount,\r\n        feeChargedTo: payment.feeChargedTo,\r\n        originalAmount: payment.originalAmount,\r\n        merchantFeePercentage: merchantFeePercentage,\r\n        dynamicFeeDisplay: `${(merchantFeePercentage * 100).toFixed(2)}%`\r\n      });\r\n    }\r\n  }, [payment, debug, merchantFeePercentage]);\r\n\r\n  // Get wallet address for current network\r\n  const getWalletAddressForNetwork = () => {\r\n    if (!selectedPaymentMethod) return 'No network selected';\r\n\r\n    const networkAddress = merchantWalletAddresses[selectedPaymentMethod.network];\r\n    if (networkAddress) {\r\n      return networkAddress;\r\n    }\r\n\r\n    if (payment?.recipientWallet) {\r\n      return payment.recipientWallet;\r\n    }\r\n\r\n    return 'No wallet address configured for this network';\r\n  };\r\n\r\n  // Handle close for success screen\r\n  const handleSuccessClose = () => {\r\n    if (onClose) {\r\n      onClose();\r\n    }\r\n  };\r\n\r\n  // Utility functions\r\n  const formatAmount = (amount) => {\r\n    return parseFloat(amount).toFixed(2);\r\n  };\r\n\r\n  const formatTransactionHash = (hash) => {\r\n    if (!hash) return '';\r\n    if (hash.length <= 14) return hash;\r\n    return `${hash.slice(0, 8)}...${hash.slice(-6)}`;\r\n  };\r\n\r\n  const getNetworkDisplayName = (network) => {\r\n    const names = {\r\n      ethereum: 'Ethereum',\r\n      bsc: 'BSC',\r\n      tron: 'Tron',\r\n      algorand: 'Algorand',\r\n      solana: 'Solana'\r\n    };\r\n    return names[network] || network;\r\n  };\r\n\r\n  // Format recipient address\r\n  const formatRecipientAddress = (address) => {\r\n    if (!address) return 'N/A';\r\n    if (address.length <= 16) return address;\r\n    return `${address.slice(0, 6)}...${address.slice(-4)}`;\r\n  };\r\n\r\n  // Helper to format the dynamic fee percentage\r\n  const formatFeePercentage = () => {\r\n    return (merchantFeePercentage * 100).toFixed(2);\r\n  };\r\n\r\n  if (!isOpen) return null;\r\n\r\n  return (\r\n    <div className=\"fixed inset-0 z-50\">\r\n      <div className=\"fixed inset-0 bg-black bg-opacity-50 transition-opacity\" onClick={onClose} aria-hidden=\"true\" />\r\n      <div className=\"fixed inset-0 overflow-y-auto\">\r\n        <div className=\"flex min-h-screen items-center justify-center p-4\">\r\n          <div className=\"coinley-modal relative pt-6 w-full max-w-md mx-auto shadow-xl bg-gray-100 rounded-3xl overflow-hidden\">\r\n            {/* Header with Logo */}\r\n            <div className=\"bg-white flex justify-between items-center mb-6 mr-3 ml-3 py-4 px-2 rounded-full\">\r\n              <div className=\"flex-1 flex items-center gap-2 px-4\">\r\n                <img src={logo} className=\"w-auto h-auto\" alt=\"Coinley Logo\" />\r\n                <span className=\"text-lg font-semibold text-gray-800\">Payment Details</span>\r\n              </div>\r\n              {step !== 'success' && step !== 'processing' && (\r\n                <button\r\n                  onClick={onClose}\r\n                  className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\r\n                >\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 mr-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n                    <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n                  </svg>\r\n                </button>\r\n              )}\r\n            </div>\r\n\r\n            {/* Payment Summary */}\r\n            {payment && step !== 'success' && (\r\n              <div className=\"mb-6\">\r\n                <div className=\"text-center\">\r\n                  <div className=\"text-sm text-gray-600\">\r\n                    Total Amount\r\n                  </div>\r\n                  <div className=\"coinley-amount-display text-3xl md:text-9xl lg:text-9xl font-bold text-[#7042D2] mt-2 leading-tight tracking-tight\">\r\n                    ${formatAmount(payment.totalAmount || payment.amount)}\r\n                  </div>\r\n\r\n                  {/* Show fee breakdown with dynamic percentage */}\r\n                  {payment.feeChargedTo === 'customer' && payment.feeAmount > 0 && (\r\n                    <div className=\"mt-2 text-sm text-gray-500\">\r\n                      {/* Fee details removed for cleaner UI */}\r\n                    </div>\r\n                  )}\r\n\r\n                  {/* Show different message when merchant pays fees */}\r\n                  {payment.feeChargedTo === 'merchant' && (\r\n                    <div className=\"mt-2 text-sm text-gray-500\">\r\n                      No additional fees\r\n                    </div>\r\n                  )}\r\n\r\n                  <div className=\"text-sm text-gray-600 mt-4\">Payment to:</div>\r\n                  <div className=\"coinley-merchant-name text-base font-semibold mt-1 flex gap-2 items-center justify-center\">\r\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                      <path d=\"M15.3 7.50065L15.8 10.0007H4.2L4.7 7.50065H15.3ZM16.6667 3.33398H3.33333V5.00065H16.6667V3.33398ZM16.6667 5.83398H3.33333L2.5 10.0007V11.6673H3.33333V16.6673H11.6667V11.6673H15V16.6673H16.6667V11.6673H17.5V10.0007L16.6667 5.83398ZM5 15.0007V11.6673H10V15.0007H5Z\" fill=\"#7042D2\" />\r\n                    </svg>\r\n                    {merchantName}\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            )}\r\n\r\n            {/* Main Content Area with Slide Animations */}\r\n            <div className=\"relative\">\r\n              {/* Step: Select Currency */}\r\n              <ScreenTransition currentStep={step} targetStep=\"select-currency\">\r\n                <div className=\"pb-6 pt-6 px-6 bg-white rounded-t-2xl blockchain-network\">\r\n                  <PaymentMethods\r\n                    onSelect={onPaymentMethodSelect}\r\n                    selected={selectedPaymentMethod}\r\n                    theme={theme}\r\n                    supportedNetworks={supportedNetworks}\r\n                  />\r\n                </div>\r\n              </ScreenTransition>\r\n\r\n              {/* Step: Confirm Payment */}\r\n              <ScreenTransition currentStep={step} targetStep=\"confirm\">\r\n                {selectedPaymentMethod && payment && (\r\n                  <div>\r\n                    {/* Payment Details - Hide when QR code is selected */}\r\n                    {paymentType === 'wallet' && (\r\n                      <div className=\"p-4 rounded-2xl mb-4 bg-white\">\r\n                        <h3 className=\"text-lg font-medium mb-2 text-gray-800\">\r\n                          Payment Details\r\n                        </h3>\r\n                        <div className=\"space-y-2 bg-[#EDE4FF] p-3 rounded-xl\">\r\n                          <div className=\"flex justify-between\">\r\n                            <span className=\"font-medium\">Currency:</span>\r\n                            <span className=\"font-medium\">{selectedPaymentMethod.currency}</span>\r\n                          </div>\r\n\r\n                          <div className='border border-b border-gray-400'></div>\r\n\r\n                          <div className=\"flex justify-between\">\r\n                            <span className=\"font-medium\">Network:</span>\r\n                            <span className=\"font-medium\">{getNetworkDisplayName(selectedPaymentMethod.network)}</span>\r\n                          </div>\r\n\r\n                          <div className='border border-b border-gray-400'></div>\r\n\r\n                          {/* Fee info with dynamic percentage */}\r\n                          {payment.feeChargedTo === 'customer' && payment.feeAmount > 0 ? (\r\n                            <>\r\n                              <div className=\"flex justify-between\">\r\n                                <span className=\"font-medium\">Processing Fee:</span>\r\n                                <span className=\"font-medium\">{formatFeePercentage()}%</span>\r\n                              </div>\r\n\r\n                              <div className='border border-b border-gray-400'></div>\r\n\r\n                              <div className=\"flex justify-between border-t pt-2 mt-1\">\r\n                                <span className=\"font-bold\">Total:</span>\r\n                                <span className=\"font-bold text-lg\">${formatAmount(payment.totalAmount)}</span>\r\n                              </div>\r\n                            </>\r\n                          ) : (\r\n                            <>\r\n                              <div className=\"flex justify-between\">\r\n                                <span className=\"font-medium\">Processing Fee:</span>\r\n                                <span className=\"font-medium\">Included by merchant</span>\r\n                              </div>\r\n\r\n                              <div className='border border-b border-gray-400'></div>\r\n\r\n                              <div className=\"\">\r\n                                <div className=\"flex justify-between\">\r\n                                  <span className=\"font-bold\">Total:</span>\r\n                                  <span className=\"font-bold text-lg\">${formatAmount(payment.totalAmount)}</span>\r\n                                </div>\r\n                                <div className=\"text-xs text-gray-500 mt-1\">\r\n                                  Processing fee is covered by the merchant\r\n                                </div>\r\n                              </div>\r\n                            </>\r\n                          )}\r\n                        </div>\r\n                      </div>\r\n                    )}\r\n\r\n                    {/* Payment Method Tabs */}\r\n                    <div className=\"mb-4 px-4\">\r\n                      <div className=\"flex border-b border-gray-200\">\r\n                        <button\r\n                          onClick={() => setPaymentType('wallet')}\r\n                          className={`py-2 px-4 text-sm font-medium ${paymentType === 'wallet'\r\n                            ? 'border-b-2 border-purple-600 text-purple-600'\r\n                            : 'text-gray-500 hover:text-gray-700'\r\n                            }`}\r\n                        >\r\n                          Connect Wallet\r\n                        </button>\r\n                        <button\r\n                          onClick={() => setPaymentType('qrcode')}\r\n                          className={`py-2 px-4 text-sm font-medium ${paymentType === 'qrcode'\r\n                            ? 'border-b-2 border-purple-600 text-purple-600'\r\n                            : 'text-gray-500 hover:text-gray-700'\r\n                            }`}\r\n                        >\r\n                          QR Code\r\n                        </button>\r\n                      </div>\r\n                    </div>\r\n\r\n                    {/* Payment options */}\r\n                    {testMode ? (\r\n                      <div className=\"p-4 rounded-lg mb-4 bg-blue-50\">\r\n                        <div className=\"flex items-center\">\r\n                          <div className=\"bg-purple-600 rounded-full p-2 mr-3\">\r\n                            <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-6 w-6 text-white\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n                              <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\r\n                            </svg>\r\n                          </div>\r\n                          <div>\r\n                            <h3 className=\"font-medium text-gray-800\">Test Mode Payment</h3>\r\n                            <p className=\"text-sm text-gray-600\">Click \"Pay Now\" to simulate a successful payment</p>\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                    ) : paymentType === 'qrcode' ? (\r\n                      <div className=\"mb-4\">\r\n                        <QRCode\r\n                          walletAddress={getWalletAddressForNetwork()}\r\n                          amount={payment.totalAmount || payment.amount}\r\n                          currency={selectedPaymentMethod.currency}\r\n                          network={selectedPaymentMethod.network}\r\n                          theme={theme}\r\n                        />\r\n                      </div>\r\n                    ) : (\r\n                      /* EMBEDDED WALLET INTERFACE - Replace the old wallet dropdown */\r\n                      <EmbeddedWalletInterface \r\n                        onConnectWallet={onConnectWallet}\r\n                        selectedPaymentMethod={selectedPaymentMethod}\r\n                      />\r\n                    )}\r\n\r\n                    {/* Display any errors */}\r\n                    {error && (\r\n                      <div className=\"p-3 rounded-lg bg-red-50 mb-4 text-red-600 text-sm\">\r\n                        {error}\r\n                      </div>\r\n                    )}\r\n\r\n                    {/* Navigation buttons */}\r\n                    <div className=\"grid grid-cols-2 gap-3 mb-3 px-4\">\r\n                      <button\r\n                        type=\"button\"\r\n                        onClick={onBack}\r\n                        className=\"w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-purple-600 font-medium rounded-md\"\r\n                      >\r\n                        Back\r\n                      </button>\r\n                      <button\r\n                        type=\"button\"\r\n                        onClick={() => onPayment(paymentType === 'qrcode')}\r\n                        className=\"bg-green-600 text-white w-full py-2 px-4 font-medium rounded-md\"\r\n                        disabled={!testMode && paymentType === 'wallet' && !walletConnection}\r\n                      >\r\n                        {paymentType === 'qrcode' ? 'I have sent the payment' : 'Pay Now'}\r\n                      </button>\r\n                    </div>\r\n                  </div>\r\n                )}\r\n              </ScreenTransition>\r\n\r\n              {/* Step: Processing */}\r\n              <ScreenTransition currentStep={step} targetStep=\"processing\">\r\n                <PaymentStatus\r\n                  status=\"processing\"\r\n                  theme={theme}\r\n                  message=\"Processing your payment...\"\r\n                  processingStartTime={processingStartTime}\r\n                  paymentNetwork={paymentNetwork || selectedPaymentMethod?.network}\r\n                  transactionHash={transactionHash}\r\n                />\r\n              </ScreenTransition>\r\n\r\n              {/* Step: Success */}\r\n              <ScreenTransition currentStep={step} targetStep=\"success\">\r\n                <PaymentStatus\r\n                  status=\"success\"\r\n                  theme={theme}\r\n                  message=\"Payment successful!\"\r\n                  payment={payment}\r\n                  transactionHash={transactionHash}\r\n                  selectedPaymentMethod={selectedPaymentMethod}\r\n                  merchantName={merchantName}\r\n                  onClose={handleSuccessClose}\r\n                  pendingBackendConfirmation={pendingBackendConfirmation}\r\n                />\r\n              </ScreenTransition>\r\n\r\n              {/* Step: Error */}\r\n              <ScreenTransition currentStep={step} targetStep=\"error\">\r\n                <div>\r\n                  <PaymentStatus\r\n                    status=\"error\"\r\n                    theme={theme}\r\n                    message={error || \"An error occurred while processing your payment.\"}\r\n                  />\r\n                  <button\r\n                    type=\"button\"\r\n                    onClick={onBack}\r\n                    className=\"mt-4 w-full py-2 px-4 bg-gray-200 hover:bg-gray-300 text-gray-800 font-medium rounded-md\"\r\n                  >\r\n                    Try Again\r\n                  </button>\r\n                </div>\r\n              </ScreenTransition>\r\n            </div>\r\n\r\n            {/* Footer */}\r\n            {step !== 'success' && (\r\n              <div className=\"text-center text-xs text-gray-500 flex items-center justify-center gap-1 py-6 bg-white rounded-b-3xl\">\r\n                <p>Powered by <span className='text-purple-600'>Coinley</span> - Secure Cryptocurrency Payments</p>\r\n                <svg className=\"inline w-4 h-4 text-green-500 ml-1\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" viewBox=\"0 0 24 24\">\r\n                  <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2\" fill=\"none\" />\r\n                  <path d=\"M9 12l2 2 4-4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n                </svg>\r\n              </div>\r\n            )}\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default CoinleyModal;","// // src/components/CoinleyCheckout.jsx - Updated with QR payment verification\r\n// import React, { forwardRef, useImperativeHandle, useState, useEffect, useRef } from 'react';\r\n// import { useCoinley } from '../context/CoinleyContext';\r\n// import { useTheme } from '../context/ThemeContext';\r\n// import CoinleyModal from './CoinleyModal';\r\n// import { \r\n//   createPayment, \r\n//   processPayment, \r\n//   verifyQRPayment, // Add this import\r\n//   getMerchantWallets, \r\n//   getMerchantFeePercentage,\r\n//   getMerchantNetworks,\r\n//   getMerchantTokens \r\n// } from '../services/api';\r\n// import { \r\n//   connectWallet, \r\n//   sendTransaction, \r\n//   detectWallets, \r\n//   detectWalletsWithRetry,\r\n//   getSupportedWalletsForNetwork,\r\n//   debugWalletEnvironment,\r\n//   NETWORK_TYPES,\r\n//   WALLET_TYPES \r\n// } from '../services/walletService';\r\n\r\n// /**\r\n//  * Optimized Coinley checkout with QR payment verification\r\n//  */\r\n// const CoinleyCheckout = forwardRef(({ \r\n//   apiKey,\r\n//   apiSecret,\r\n//   apiUrl,\r\n//   customerEmail,\r\n//   merchantName = 'Merchant',\r\n//   merchantWalletAddresses = {},\r\n//   onSuccess,\r\n//   onError,\r\n//   onClose,\r\n//   theme,\r\n//   autoOpen = false,\r\n//   debug = false,\r\n//   testMode = false,\r\n//   supportedNetworks = [],\r\n//   preferredNetwork = NETWORK_TYPES.ETHEREUM,\r\n//   preferredWallet = WALLET_TYPES.METAMASK,\r\n//   confirmations = 1,\r\n//   fastMode = true\r\n// }, ref) => {\r\n//   // Context\r\n//   const coinleyContext = useCoinley();\r\n//   const { theme: contextTheme } = useTheme();\r\n  \r\n//   // State\r\n//   const [isOpen, setIsOpen] = useState(autoOpen);\r\n//   const [payment, setPayment] = useState(null);\r\n//   const [paymentStatus, setPaymentStatus] = useState('idle');\r\n//   const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n//   const [error, setError] = useState(null);\r\n//   const [transactionHash, setTransactionHash] = useState(null);\r\n//   const [walletConnection, setWalletConnection] = useState(null);\r\n//   const [availableWallets, setAvailableWallets] = useState({});\r\n//   const [step, setStep] = useState('select-currency');\r\n//   const [actualMerchantWallets, setActualMerchantWallets] = useState({});\r\n//   const [merchantFeePercentage, setMerchantFeePercentage] = useState(0.0175);\r\n  \r\n//   // New state for merchant's configured networks and tokens\r\n//   const [merchantSupportedNetworks, setMerchantSupportedNetworks] = useState([]);\r\n//   const [merchantSupportedTokens, setMerchantSupportedTokens] = useState([]);\r\n  \r\n//   // Processing state\r\n//   const [processingStartTime, setProcessingStartTime] = useState(null);\r\n//   const [checkingInterval, setCheckingInterval] = useState(null);\r\n//   const processingTimerRef = useRef(null);\r\n//   const [pendingBackendConfirmation, setPendingBackendConfirmation] = useState(false);\r\n  \r\n//   // Use the component props or fallback to context values\r\n//   const effectiveApiKey = apiKey || coinleyContext?.apiKey;\r\n//   const effectiveApiSecret = apiSecret || coinleyContext?.apiSecret;\r\n//   const effectiveApiUrl = apiUrl || coinleyContext?.apiUrl;\r\n//   const effectiveTheme = theme || contextTheme;\r\n//   const effectiveDebug = debug || coinleyContext?.debug;\r\n\r\n//   // Debug logging helper\r\n//   const log = (message, data) => {\r\n//     if (effectiveDebug) {\r\n//       console.log(`[Coinley SDK] ${message}`, data);\r\n//     }\r\n//   };\r\n\r\n//   // Fetch merchant data on component mount\r\n//   useEffect(() => {\r\n//     const fetchMerchantData = async () => {\r\n//       try {\r\n//         log('Fetching merchant data from backend...');\r\n        \r\n//         const [wallets, feePercentage, networks, tokens] = await Promise.all([\r\n//           getMerchantWallets(),\r\n//           getMerchantFeePercentage(),\r\n//           getMerchantNetworks(),\r\n//           getMerchantTokens()\r\n//         ]);\r\n        \r\n//         setActualMerchantWallets(wallets);\r\n//         setMerchantFeePercentage(feePercentage);\r\n//         setMerchantSupportedNetworks(networks);\r\n//         setMerchantSupportedTokens(tokens);\r\n        \r\n//         log('Merchant data fetched successfully:', { \r\n//           wallets, \r\n//           feePercentage: `${(feePercentage * 100).toFixed(2)}%`,\r\n//           networksCount: networks.length,\r\n//           tokensCount: tokens.length\r\n//         });\r\n//       } catch (error) {\r\n//         console.error('Failed to fetch merchant data:', error);\r\n//         setActualMerchantWallets(merchantWalletAddresses);\r\n//         setMerchantFeePercentage(0.0175);\r\n//         setMerchantSupportedNetworks([]);\r\n//         setMerchantSupportedTokens([]);\r\n//       }\r\n//     };\r\n\r\n//     if (effectiveApiKey && effectiveApiSecret) {\r\n//       fetchMerchantData();\r\n//     }\r\n//   }, [effectiveApiKey, effectiveApiSecret, merchantWalletAddresses]);\r\n\r\n//   // Check available wallets on mount with retry\r\n//   useEffect(() => {\r\n//     if (typeof window !== 'undefined') {\r\n//       const detectWalletsAsync = async () => {\r\n//         const wallets = await detectWalletsWithRetry(3, 1000);\r\n//         setAvailableWallets(wallets);\r\n//         log('Available wallets detected:', wallets);\r\n//       };\r\n      \r\n//       detectWalletsAsync();\r\n//     }\r\n//   }, [effectiveDebug]);\r\n\r\n//   // Cleanup processing timers and intervals on unmount\r\n//   useEffect(() => {\r\n//     return () => {\r\n//       if (processingTimerRef.current) {\r\n//         clearTimeout(processingTimerRef.current);\r\n//       }\r\n//       if (checkingInterval) {\r\n//         clearInterval(checkingInterval);\r\n//       }\r\n//     };\r\n//   }, [checkingInterval]);\r\n\r\n//   // Backend confirmation function\r\n//   const processBackendConfirmationWithDebug = async (txHash) => {\r\n//     console.log('🔍 processBackendConfirmationWithDebug called with:', txHash);\r\n    \r\n//     if (!payment || !selectedPaymentMethod || !txHash) {\r\n//       console.error('❌ Missing required data for backend confirmation');\r\n//       return;\r\n//     }\r\n    \r\n//     try {\r\n//       const processResponse = await processPayment({\r\n//         paymentId: payment.id,\r\n//         transactionHash: txHash,\r\n//         network: selectedPaymentMethod.network,\r\n//         senderAddress: walletConnection?.address || 'QR_PAYMENT'\r\n//       });\r\n\r\n//       console.log('✅ Payment processed successfully with backend:', processResponse);\r\n//       setPendingBackendConfirmation(false);\r\n      \r\n//       setPaymentStatus('success');\r\n      \r\n//       if (onSuccess) {\r\n//         onSuccess(payment.id, txHash, {\r\n//           network: selectedPaymentMethod.network,\r\n//           currency: selectedPaymentMethod.currency,\r\n//           amount: payment.totalAmount || payment.amount,\r\n//           processResponse: processResponse\r\n//         });\r\n//       }\r\n//     } catch (processError) {\r\n//       console.error('❌ processBackendConfirmation failed:', processError);\r\n//       setPendingBackendConfirmation(true);\r\n      \r\n//       setTimeout(() => {\r\n//         console.log('🔄 Retrying processBackendConfirmation...');\r\n//         processBackendConfirmationWithDebug(txHash);\r\n//       }, 10000);\r\n//     }\r\n//   };\r\n\r\n//   // NEW: QR Payment verification function\r\n//   const handleQRPaymentVerification = async () => {\r\n//     if (!payment) {\r\n//       setError('Payment information is missing');\r\n//       return;\r\n//     }\r\n\r\n//     setPaymentStatus('loading');\r\n//     setStep('processing');\r\n//     setProcessingStartTime(Date.now());\r\n//     setError(null);\r\n\r\n//     try {\r\n//       log('Starting QR payment verification...');\r\n      \r\n//       const verificationResult = await verifyQRPayment(payment.id);\r\n      \r\n//       if (verificationResult.verified) {\r\n//         log('QR payment verified successfully:', verificationResult);\r\n        \r\n//         setTransactionHash(verificationResult.payment.transactionHash);\r\n//         setStep('success');\r\n//         setPaymentStatus('success');\r\n        \r\n//         if (onSuccess) {\r\n//           onSuccess(payment.id, verificationResult.payment.transactionHash, {\r\n//             network: selectedPaymentMethod.network,\r\n//             currency: selectedPaymentMethod.currency,\r\n//             amount: verificationResult.payment.amount,\r\n//             verificationType: 'QR_PAYMENT'\r\n//           });\r\n//         }\r\n//       } else {\r\n//         // Payment not found yet, show user-friendly message\r\n//         setError(verificationResult.message || 'Transaction not detected yet. Please wait a moment and try again.');\r\n//         setStep('confirm');\r\n//         setPaymentStatus('idle');\r\n//       }\r\n//     } catch (error) {\r\n//       log('QR payment verification error:', error);\r\n//       setError(error.message || 'Failed to verify payment. Please try again.');\r\n//       setStep('confirm');\r\n//       setPaymentStatus('error');\r\n//       if (onError) onError(error);\r\n//     }\r\n//   };\r\n\r\n//   // Expose methods via ref\r\n//   useImperativeHandle(ref, () => ({\r\n//     open: (paymentDetails) => {\r\n//       handleOpen(paymentDetails);\r\n//     },\r\n//     close: () => {\r\n//       handleClose();\r\n//     },\r\n//     getPayment: () => payment,\r\n//     getWalletConnection: () => walletConnection,\r\n//     debugWallets: () => debugWalletEnvironment(),\r\n//     getMerchantWallets: () => actualMerchantWallets,\r\n//     getMerchantFeePercentage: () => merchantFeePercentage,\r\n//     getMerchantSupportedNetworks: () => merchantSupportedNetworks,\r\n//     getMerchantSupportedTokens: () => merchantSupportedTokens\r\n//   }));\r\n\r\n//   // Handle opening the payment modal\r\n//   const handleOpen = async (paymentDetails) => {\r\n//     if (!paymentDetails || !paymentDetails.amount) {\r\n//       setError('Payment amount is required');\r\n//       if (onError) onError(new Error('Payment amount is required'));\r\n//       return;\r\n//     }\r\n\r\n//     setPaymentStatus('loading');\r\n//     setIsOpen(true);\r\n//     setStep('select-currency');\r\n\r\n//     try {\r\n//       log('Creating payment with details:', paymentDetails);\r\n      \r\n//       // Validate that the requested network is supported by merchant\r\n//       if (paymentDetails.network) {\r\n//         const isNetworkSupported = merchantSupportedNetworks.some(\r\n//           network => network.shortName === paymentDetails.network\r\n//         );\r\n        \r\n//         if (!isNetworkSupported) {\r\n//           throw new Error(`Network ${paymentDetails.network} is not configured for this merchant`);\r\n//         }\r\n//       }\r\n      \r\n//       // Validate that the requested currency is supported by merchant\r\n//       if (paymentDetails.currency && paymentDetails.network) {\r\n//         const isTokenSupported = merchantSupportedTokens.some(\r\n//           token => token.symbol === paymentDetails.currency && \r\n//                   token.Network && \r\n//                   token.Network.shortName === paymentDetails.network\r\n//         );\r\n        \r\n//         if (!isTokenSupported) {\r\n//           throw new Error(`Token ${paymentDetails.currency} is not supported on ${paymentDetails.network} network for this merchant`);\r\n//         }\r\n//       }\r\n      \r\n//       // Ensure we have the latest merchant wallet addresses\r\n//       let walletAddresses = actualMerchantWallets;\r\n//       if (Object.keys(walletAddresses).length === 0) {\r\n//         log('No wallet addresses found, fetching from backend...');\r\n//         walletAddresses = await getMerchantWallets();\r\n//         setActualMerchantWallets(walletAddresses);\r\n//       }\r\n\r\n//       log('Using wallet addresses:', walletAddresses);\r\n\r\n//       console.log('🚨 COINLEY CHECKOUT DEBUG:');\r\n// console.log('paymentDetails:', paymentDetails);\r\n// console.log('paymentDetails.network:', paymentDetails.network);\r\n// console.log('preferredNetwork:', preferredNetwork);\r\n// console.log('final network being sent:', paymentDetails.network || preferredNetwork);\r\n\r\n//       // Create a payment on the Coinley backend\r\n//       const paymentResponse = await createPayment({\r\n//         amount: paymentDetails.amount,\r\n//         currency: paymentDetails.currency || 'USDT',\r\n//         network: paymentDetails.network || preferredNetwork,\r\n//         customerEmail: paymentDetails.customerEmail || customerEmail,\r\n//         callbackUrl: paymentDetails.callbackUrl,\r\n//         metadata: {\r\n//           ...paymentDetails.metadata,\r\n//           merchantWalletAddresses: walletAddresses\r\n//         },\r\n//         merchantWalletAddresses: walletAddresses\r\n//       });\r\n\r\n//       log('Payment created:', paymentResponse);\r\n      \r\n//       // Use the fee percentage from the payment response\r\n//       if (paymentResponse.payment.customFeePercentage) {\r\n//         const feeFromPayment = parseFloat(paymentResponse.payment.customFeePercentage);\r\n//         setMerchantFeePercentage(feeFromPayment);\r\n//         log('Updated fee percentage from payment response:', `${(feeFromPayment * 100).toFixed(2)}%`);\r\n//       }\r\n      \r\n//       setPayment(paymentResponse.payment);\r\n//       setPaymentStatus('idle');\r\n//       setError(null);\r\n      \r\n//       log('Payment created and state updated');\r\n//     } catch (err) {\r\n//       log('Error creating payment:', err);\r\n//       setError(err.message || 'Failed to create payment');\r\n//       setPaymentStatus('error');\r\n//       if (onError) onError(err);\r\n//     }\r\n//   };\r\n\r\n//   // Handle closing the modal\r\n//   const handleClose = () => {\r\n//     if (checkingInterval) {\r\n//       clearInterval(checkingInterval);\r\n//       setCheckingInterval(null);\r\n//     }\r\n    \r\n//     if (processingTimerRef.current) {\r\n//       clearTimeout(processingTimerRef.current);\r\n//       processingTimerRef.current = null;\r\n//     }\r\n    \r\n//     setIsOpen(false);\r\n//     setTransactionHash(null);\r\n//     setWalletConnection(null);\r\n//     setSelectedPaymentMethod(null);\r\n//     setStep('select-currency');\r\n//     setProcessingStartTime(null);\r\n//     setPendingBackendConfirmation(false);\r\n    \r\n//     if (onClose) onClose();\r\n//   };\r\n\r\n//   // Handle payment method selection\r\n//   const handlePaymentMethodSelect = (paymentMethod) => {\r\n//     console.log('=== PAYMENT METHOD SELECTION DEBUG ===');\r\n//     console.log('1. Payment method selected:', paymentMethod);\r\n//     console.log('2. Current step before:', step);\r\n    \r\n//     log('Payment method selected:', paymentMethod);\r\n//     setSelectedPaymentMethod(paymentMethod);\r\n    \r\n//     setStep('confirm');\r\n    \r\n//     console.log('3. Step should now be: confirm');\r\n//     console.log('=== END PAYMENT METHOD SELECTION DEBUG ===');\r\n//   };\r\n\r\n//   // Handle back navigation\r\n//   const handleBack = () => {\r\n//     if (step === 'confirm') {\r\n//       setStep('select-currency');\r\n//       setWalletConnection(null);\r\n//     } else if (step === 'error') {\r\n//       setStep('confirm');\r\n//     }\r\n//   };\r\n\r\n//   // Enhanced wallet connection with retry and better debugging\r\n//   const handleConnectWallet = async (walletType) => {\r\n//     console.log('=== WALLET CONNECTION DEBUG ===');\r\n//     console.log('1. Wallet type requested:', walletType);\r\n//     console.log('2. Selected payment method:', selectedPaymentMethod);\r\n//     console.log('3. Available wallets:', availableWallets);\r\n//     console.log('4. Current step:', step);\r\n\r\n//     if (!selectedPaymentMethod) {\r\n//       console.error('No payment method selected');\r\n//       setError('Please select a payment method first');\r\n//       return;\r\n//     }\r\n\r\n//     try {\r\n//       console.log('5. Attempting to connect wallet...');\r\n//       setError(null);\r\n      \r\n//       log('Connecting wallet:', { walletType, network: selectedPaymentMethod.network });\r\n      \r\n//       const connection = await connectWallet(walletType, selectedPaymentMethod.network, 2);\r\n//       setWalletConnection(connection);\r\n//       setError(null);\r\n      \r\n//       console.log('6. Connection successful:', connection);\r\n//       log('Wallet connected successfully:', connection);\r\n//     } catch (err) {\r\n//       console.error('7. Connection failed:', err);\r\n//       log('Wallet connection error:', err);\r\n//       setError(err.message || 'Failed to connect wallet');\r\n//     }\r\n    \r\n//     console.log('=== END WALLET CONNECTION DEBUG ===');\r\n//   };\r\n\r\n//   // UPDATED: Handle payment submission with QR payment verification\r\n//   const handlePayment = async (isQRPayment = false) => {\r\n//     if (!payment || !selectedPaymentMethod) {\r\n//       setError('Missing payment information');\r\n//       return;\r\n//     }\r\n\r\n//     // NEW: Handle QR payment verification\r\n//     if (isQRPayment) {\r\n//       console.log('🔄 QR Payment - Starting verification process...');\r\n//       await handleQRPaymentVerification();\r\n//       return;\r\n//     }\r\n\r\n//     // Original wallet payment flow\r\n//     if (!walletConnection && !testMode) {\r\n//       setError('Please connect your wallet first');\r\n//       return;\r\n//     }\r\n\r\n//     log('Starting payment process...');\r\n//     setPaymentStatus('loading');\r\n//     setTransactionHash(null);\r\n//     setStep('processing');\r\n    \r\n//     setProcessingStartTime(Date.now());\r\n\r\n//     try {\r\n//       let txHash;\r\n\r\n//       if (testMode) {\r\n//         log('Test mode: Generating mock transaction...');\r\n//         txHash = `test_${Date.now().toString(16)}_${Math.random().toString(16).substring(2, 10)}`;\r\n        \r\n//         await new Promise(resolve => setTimeout(resolve, 1000));\r\n//       } else {\r\n//         let merchantAddress;\r\n        \r\n//         if (payment.recipientWallet) {\r\n//           merchantAddress = payment.recipientWallet;\r\n//         } else if (actualMerchantWallets[selectedPaymentMethod.network]) {\r\n//           merchantAddress = actualMerchantWallets[selectedPaymentMethod.network];\r\n//         } else {\r\n//           throw new Error(`No merchant wallet address found for ${selectedPaymentMethod.network} network`);\r\n//         }\r\n\r\n//         log('Using merchant address for payment:', merchantAddress);\r\n\r\n//         log('Sending transaction through wallet...');\r\n        \r\n//         txHash = await sendTransaction(walletConnection, {\r\n//           to: merchantAddress,\r\n//           amount: payment.totalAmount || payment.amount,\r\n//           tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n//           tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals,\r\n//           currency: selectedPaymentMethod.currency,\r\n//           network: selectedPaymentMethod.network\r\n//         });\r\n//       }\r\n\r\n//       console.log('🎉 TRANSACTION HASH OBTAINED:', txHash);\r\n//       setTransactionHash(txHash);\r\n      \r\n//       console.log('📺 Setting step to success...');\r\n//       setStep('success');\r\n//       setPaymentStatus('success');\r\n      \r\n//       console.log('🔄 About to call processBackendConfirmation...');\r\n      \r\n//       try {\r\n//         console.log('🚀 CALLING processBackendConfirmation...');\r\n//         await processBackendConfirmationWithDebug(txHash);\r\n//       } catch (processError) {\r\n//         console.error('❌ processBackendConfirmation failed:', processError);\r\n//       }\r\n      \r\n//     } catch (err) {\r\n//       log('Payment error:', err);\r\n//       setError(err.message || 'Failed to process payment');\r\n//       setPaymentStatus('error');\r\n//       setStep('error');\r\n//       if (onError) onError(err);\r\n//     }\r\n//   };\r\n\r\n//   // Get supported wallets for current network\r\n//   const getSupportedWallets = () => {\r\n//     if (!selectedPaymentMethod) return [];\r\n//     return getSupportedWalletsForNetwork(selectedPaymentMethod.network);\r\n//   };\r\n\r\n//   // Filter supported networks based on merchant configuration\r\n//   const getEffectiveSupportedNetworks = () => {\r\n//     if (merchantSupportedNetworks.length === 0) {\r\n//       // Fallback to provided supportedNetworks if merchant networks not loaded\r\n//       return supportedNetworks.length > 0 ? supportedNetworks : Object.values(NETWORK_TYPES);\r\n//     }\r\n    \r\n//     // Use merchant's configured networks\r\n//     return merchantSupportedNetworks.map(network => network.shortName);\r\n//   };\r\n\r\n//   return (\r\n//     <>\r\n//       {isOpen && (\r\n//         <CoinleyModal\r\n//           isOpen={isOpen}\r\n//           onClose={handleClose}\r\n//           payment={payment}\r\n//           paymentStatus={paymentStatus}\r\n//           selectedPaymentMethod={selectedPaymentMethod}\r\n//           onPaymentMethodSelect={handlePaymentMethodSelect}\r\n//           onPayment={handlePayment}\r\n//           onBack={handleBack}\r\n//           error={error}\r\n//           theme={effectiveTheme}\r\n//           merchantName={merchantName}\r\n//           transactionHash={transactionHash}\r\n//           walletConnection={walletConnection}\r\n//           onConnectWallet={handleConnectWallet}\r\n//           testMode={testMode}\r\n//           supportedNetworks={getEffectiveSupportedNetworks()}\r\n//           availableWallets={availableWallets}\r\n//           supportedWallets={getSupportedWallets()}\r\n//           step={step}\r\n//           merchantWalletAddresses={actualMerchantWallets}\r\n//           debug={effectiveDebug}\r\n//           // Processing info\r\n//           processingStartTime={processingStartTime}\r\n//           pendingBackendConfirmation={pendingBackendConfirmation}\r\n//           paymentNetwork={selectedPaymentMethod?.network}\r\n//           // Pass the dynamic fee percentage\r\n//           merchantFeePercentage={merchantFeePercentage}\r\n//         />\r\n//       )}\r\n//     </>\r\n//   );\r\n// });\r\n\r\n// CoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\n// export default CoinleyCheckout;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // src/components/CoinleyCheckout.jsx\r\n// import React, { forwardRef, useImperativeHandle, useState, useEffect, useRef } from 'react';\r\n// import { useCoinley } from '../context/CoinleyContext';\r\n// import { useTheme } from '../context/ThemeContext';\r\n// import CoinleyModal from './CoinleyModal';\r\n// import { \r\n//   createPayment, \r\n//   processPayment, \r\n//   verifyQRPayment,\r\n//   getMerchantWallets, \r\n//   getMerchantFeePercentage,\r\n//   getMerchantNetworks,\r\n//   getMerchantTokens \r\n// } from '../services/api';\r\n// import { \r\n//   connectWallet, \r\n//   sendTransaction, \r\n//   detectWallets, \r\n//   detectWalletsWithRetry,\r\n//   getSupportedWalletsForNetwork,\r\n//   debugWalletEnvironment,\r\n//   NETWORK_TYPES,\r\n//   WALLET_TYPES \r\n// } from '../services/walletService';\r\n\r\n// /**\r\n//  * Fixed Coinley checkout with proper payment flow\r\n//  */\r\n// const CoinleyCheckout = forwardRef(({ \r\n//   apiKey,\r\n//   apiSecret,\r\n//   apiUrl,\r\n//   customerEmail,\r\n//   merchantName = 'Merchant',\r\n//   merchantWalletAddresses = {},\r\n//   onSuccess,\r\n//   onError,\r\n//   onClose,\r\n//   theme,\r\n//   autoOpen = false,\r\n//   debug = false,\r\n//   testMode = false,\r\n//   supportedNetworks = [],\r\n//   preferredNetwork = NETWORK_TYPES.ETHEREUM,\r\n//   preferredWallet = WALLET_TYPES.METAMASK,\r\n//   confirmations = 1,\r\n//   fastMode = true\r\n// }, ref) => {\r\n//   // Context\r\n//   const coinleyContext = useCoinley();\r\n//   const { theme: contextTheme } = useTheme();\r\n  \r\n//   // State\r\n//   const [isOpen, setIsOpen] = useState(autoOpen);\r\n//   const [payment, setPayment] = useState(null);\r\n//   const [paymentStatus, setPaymentStatus] = useState('idle');\r\n//   const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n//   const [error, setError] = useState(null);\r\n//   const [transactionHash, setTransactionHash] = useState(null);\r\n//   const [walletConnection, setWalletConnection] = useState(null);\r\n//   const [availableWallets, setAvailableWallets] = useState({});\r\n//   const [step, setStep] = useState('select-currency');\r\n//   const [actualMerchantWallets, setActualMerchantWallets] = useState({});\r\n//   const [merchantFeePercentage, setMerchantFeePercentage] = useState(0.0175);\r\n  \r\n//   // ✅ NEW: Store original payment details\r\n//   const [storedPaymentDetails, setStoredPaymentDetails] = useState(null);\r\n  \r\n//   // New state for merchant's configured networks and tokens\r\n//   const [merchantSupportedNetworks, setMerchantSupportedNetworks] = useState([]);\r\n//   const [merchantSupportedTokens, setMerchantSupportedTokens] = useState([]);\r\n  \r\n//   // Processing state\r\n//   const [processingStartTime, setProcessingStartTime] = useState(null);\r\n//   const [checkingInterval, setCheckingInterval] = useState(null);\r\n//   const processingTimerRef = useRef(null);\r\n//   const [pendingBackendConfirmation, setPendingBackendConfirmation] = useState(false);\r\n  \r\n//   // Use the component props or fallback to context values\r\n//   const effectiveApiKey = apiKey || coinleyContext?.apiKey;\r\n//   const effectiveApiSecret = apiSecret || coinleyContext?.apiSecret;\r\n//   const effectiveApiUrl = apiUrl || coinleyContext?.apiUrl;\r\n//   const effectiveTheme = theme || contextTheme;\r\n//   const effectiveDebug = debug || coinleyContext?.debug;\r\n\r\n//   // Debug logging helper\r\n//   const log = (message, data) => {\r\n//     if (effectiveDebug) {\r\n//       console.log(`[Coinley SDK] ${message}`, data);\r\n//     }\r\n//   };\r\n\r\n//   // Fetch merchant data on component mount\r\n//   useEffect(() => {\r\n//     const fetchMerchantData = async () => {\r\n//       try {\r\n//         log('Fetching merchant data from backend...');\r\n        \r\n//         const [wallets, feePercentage, networks, tokens] = await Promise.all([\r\n//           getMerchantWallets(),\r\n//           getMerchantFeePercentage(),\r\n//           getMerchantNetworks(),\r\n//           getMerchantTokens()\r\n//         ]);\r\n        \r\n//         setActualMerchantWallets(wallets);\r\n//         setMerchantFeePercentage(feePercentage);\r\n//         setMerchantSupportedNetworks(networks);\r\n//         setMerchantSupportedTokens(tokens);\r\n        \r\n//         log('Merchant data fetched successfully:', { \r\n//           wallets, \r\n//           feePercentage: `${(feePercentage * 100).toFixed(2)}%`,\r\n//           networksCount: networks.length,\r\n//           tokensCount: tokens.length\r\n//         });\r\n//       } catch (error) {\r\n//         console.error('Failed to fetch merchant data:', error);\r\n//         setActualMerchantWallets(merchantWalletAddresses);\r\n//         setMerchantFeePercentage(0.0175);\r\n//         setMerchantSupportedNetworks([]);\r\n//         setMerchantSupportedTokens([]);\r\n//       }\r\n//     };\r\n\r\n//     if (effectiveApiKey && effectiveApiSecret) {\r\n//       fetchMerchantData();\r\n//     }\r\n//   }, [effectiveApiKey, effectiveApiSecret, merchantWalletAddresses]);\r\n\r\n//   // Check available wallets on mount with retry\r\n//   useEffect(() => {\r\n//     if (typeof window !== 'undefined') {\r\n//       const detectWalletsAsync = async () => {\r\n//         const wallets = await detectWalletsWithRetry(3, 1000);\r\n//         setAvailableWallets(wallets);\r\n//         log('Available wallets detected:', wallets);\r\n//       };\r\n      \r\n//       detectWalletsAsync();\r\n//     }\r\n//   }, [effectiveDebug]);\r\n\r\n//   // Cleanup processing timers and intervals on unmount\r\n//   useEffect(() => {\r\n//     return () => {\r\n//       if (processingTimerRef.current) {\r\n//         clearTimeout(processingTimerRef.current);\r\n//       }\r\n//       if (checkingInterval) {\r\n//         clearInterval(checkingInterval);\r\n//       }\r\n//     };\r\n//   }, [checkingInterval]);\r\n\r\n//   // Backend confirmation function\r\n//   const processBackendConfirmationWithDebug = async (txHash) => {\r\n//     console.log('🔍 processBackendConfirmationWithDebug called with:', txHash);\r\n    \r\n//     if (!payment || !selectedPaymentMethod || !txHash) {\r\n//       console.error('❌ Missing required data for backend confirmation');\r\n//       return;\r\n//     }\r\n    \r\n//     try {\r\n//       const processResponse = await processPayment({\r\n//         paymentId: payment.id,\r\n//         transactionHash: txHash,\r\n//         network: selectedPaymentMethod.network,\r\n//         senderAddress: walletConnection?.address || 'QR_PAYMENT'\r\n//       });\r\n\r\n//       console.log('✅ Payment processed successfully with backend:', processResponse);\r\n//       setPendingBackendConfirmation(false);\r\n      \r\n//       setPaymentStatus('success');\r\n      \r\n//       if (onSuccess) {\r\n//         onSuccess(payment.id, txHash, {\r\n//           network: selectedPaymentMethod.network,\r\n//           currency: selectedPaymentMethod.currency,\r\n//           amount: payment.totalAmount || payment.amount,\r\n//           processResponse: processResponse\r\n//         });\r\n//       }\r\n//     } catch (processError) {\r\n//       console.error('❌ processBackendConfirmation failed:', processError);\r\n//       setPendingBackendConfirmation(true);\r\n      \r\n//       setTimeout(() => {\r\n//         console.log('🔄 Retrying processBackendConfirmation...');\r\n//         processBackendConfirmationWithDebug(txHash);\r\n//       }, 10000);\r\n//     }\r\n//   };\r\n\r\n//   // QR Payment verification function\r\n//   const handleQRPaymentVerification = async () => {\r\n//     if (!payment) {\r\n//       setError('Payment information is missing');\r\n//       return;\r\n//     }\r\n\r\n//     setPaymentStatus('loading');\r\n//     setStep('processing');\r\n//     setProcessingStartTime(Date.now());\r\n//     setError(null);\r\n\r\n//     try {\r\n//       log('Starting QR payment verification...');\r\n      \r\n//       const verificationResult = await verifyQRPayment(payment.id);\r\n      \r\n//       if (verificationResult.verified) {\r\n//         log('QR payment verified successfully:', verificationResult);\r\n        \r\n//         setTransactionHash(verificationResult.payment.transactionHash);\r\n//         setStep('success');\r\n//         setPaymentStatus('success');\r\n        \r\n//         if (onSuccess) {\r\n//           onSuccess(payment.id, verificationResult.payment.transactionHash, {\r\n//             network: selectedPaymentMethod.network,\r\n//             currency: selectedPaymentMethod.currency,\r\n//             amount: verificationResult.payment.amount,\r\n//             verificationType: 'QR_PAYMENT'\r\n//           });\r\n//         }\r\n//       } else {\r\n//         // Payment not found yet, show user-friendly message\r\n//         setError(verificationResult.message || 'Transaction not detected yet. Please wait a moment and try again.');\r\n//         setStep('confirm');\r\n//         setPaymentStatus('idle');\r\n//       }\r\n//     } catch (error) {\r\n//       log('QR payment verification error:', error);\r\n//       setError(error.message || 'Failed to verify payment. Please try again.');\r\n//       setStep('confirm');\r\n//       setPaymentStatus('error');\r\n//       if (onError) onError(error);\r\n//     }\r\n//   };\r\n\r\n//   // Expose methods via ref\r\n//   useImperativeHandle(ref, () => ({\r\n//     open: (paymentDetails) => {\r\n//       handleOpen(paymentDetails);\r\n//     },\r\n//     close: () => {\r\n//       handleClose();\r\n//     },\r\n//     getPayment: () => payment,\r\n//     getWalletConnection: () => walletConnection,\r\n//     debugWallets: () => debugWalletEnvironment(),\r\n//     getMerchantWallets: () => actualMerchantWallets,\r\n//     getMerchantFeePercentage: () => merchantFeePercentage,\r\n//     getMerchantSupportedNetworks: () => merchantSupportedNetworks,\r\n//     getMerchantSupportedTokens: () => merchantSupportedTokens\r\n//   }));\r\n\r\n//   // ✅ FIXED: Handle opening the payment modal - DON'T create payment yet\r\n//   const handleOpen = async (paymentDetails) => {\r\n//     console.log('🚨 HANDLE OPEN DEBUG - START');\r\n//     console.log('paymentDetails received:', paymentDetails);\r\n    \r\n//     if (!paymentDetails || !paymentDetails.amount) {\r\n//       setError('Payment amount is required');\r\n//       if (onError) onError(new Error('Payment amount is required'));\r\n//       return;\r\n//     }\r\n\r\n//     // ✅ Store payment details for later use when user selects payment method\r\n//     setStoredPaymentDetails(paymentDetails);\r\n//     setPaymentStatus('idle');\r\n//     setIsOpen(true);\r\n//     setStep('select-currency');\r\n//     setError(null);\r\n    \r\n//     console.log('✅ Modal opened, waiting for user to select payment method');\r\n//   };\r\n\r\n//   // Handle closing the modal\r\n//   const handleClose = () => {\r\n//     if (checkingInterval) {\r\n//       clearInterval(checkingInterval);\r\n//       setCheckingInterval(null);\r\n//     }\r\n    \r\n//     if (processingTimerRef.current) {\r\n//       clearTimeout(processingTimerRef.current);\r\n//       processingTimerRef.current = null;\r\n//     }\r\n    \r\n//     setIsOpen(false);\r\n//     setTransactionHash(null);\r\n//     setWalletConnection(null);\r\n//     setSelectedPaymentMethod(null);\r\n//     setStoredPaymentDetails(null); // ✅ Clear stored details\r\n//     setPayment(null); // ✅ Clear payment\r\n//     setStep('select-currency');\r\n//     setProcessingStartTime(null);\r\n//     setPendingBackendConfirmation(false);\r\n    \r\n//     if (onClose) onClose();\r\n//   };\r\n\r\n//   // ✅ FIXED: Handle payment method selection - CREATE payment here\r\n//   const handlePaymentMethodSelect = async (paymentMethod) => {\r\n//     console.log('=== PAYMENT METHOD SELECTION DEBUG ===');\r\n//     console.log('1. Payment method selected:', paymentMethod);\r\n//     console.log('2. Stored payment details:', storedPaymentDetails);\r\n    \r\n//     if (!storedPaymentDetails) {\r\n//       setError('Payment details are missing');\r\n//       return;\r\n//     }\r\n    \r\n//     log('Payment method selected:', paymentMethod);\r\n//     setSelectedPaymentMethod(paymentMethod);\r\n    \r\n//     // 🚀 CREATE PAYMENT NOW with the selected network/currency\r\n//     try {\r\n//       setPaymentStatus('loading');\r\n      \r\n//       console.log('🚀 Creating payment with selected method:');\r\n//       console.log('Network:', paymentMethod.network);\r\n//       console.log('Currency:', paymentMethod.currency);\r\n      \r\n//       // Validate that the requested network is supported by merchant\r\n//       const isNetworkSupported = merchantSupportedNetworks.some(\r\n//         network => network.shortName === paymentMethod.network\r\n//       );\r\n      \r\n//       if (!isNetworkSupported) {\r\n//         throw new Error(`Network ${paymentMethod.network} is not configured for this merchant`);\r\n//       }\r\n      \r\n//       // Validate that the requested currency is supported by merchant\r\n//       const isTokenSupported = merchantSupportedTokens.some(\r\n//         token => token.symbol === paymentMethod.currency && \r\n//                 token.Network && \r\n//                 token.Network.shortName === paymentMethod.network\r\n//       );\r\n      \r\n//       if (!isTokenSupported) {\r\n//         throw new Error(`Token ${paymentMethod.currency} is not supported on ${paymentMethod.network} network for this merchant`);\r\n//       }\r\n      \r\n//       // Ensure we have the latest merchant wallet addresses\r\n//       let walletAddresses = actualMerchantWallets;\r\n//       if (Object.keys(walletAddresses).length === 0) {\r\n//         log('No wallet addresses found, fetching from backend...');\r\n//         walletAddresses = await getMerchantWallets();\r\n//         setActualMerchantWallets(walletAddresses);\r\n//       }\r\n\r\n//       log('Using wallet addresses:', walletAddresses);\r\n\r\n//       // ✅ Create payment with SELECTED network/currency\r\n//       const paymentResponse = await createPayment({\r\n//         amount: storedPaymentDetails.amount,\r\n//         currency: paymentMethod.currency, // ✅ Use selected currency\r\n//         network: paymentMethod.network,   // ✅ Use selected network\r\n//         customerEmail: storedPaymentDetails.customerEmail || customerEmail,\r\n//         callbackUrl: storedPaymentDetails.callbackUrl,\r\n//         metadata: {\r\n//           ...storedPaymentDetails.metadata,\r\n//           merchantWalletAddresses: walletAddresses\r\n//         },\r\n//         merchantWalletAddresses: walletAddresses\r\n//       });\r\n\r\n//       console.log('✅ Payment created with correct network:', paymentResponse.payment);\r\n      \r\n//       // Use the fee percentage from the payment response\r\n//       if (paymentResponse.payment.customFeePercentage) {\r\n//         const feeFromPayment = parseFloat(paymentResponse.payment.customFeePercentage);\r\n//         setMerchantFeePercentage(feeFromPayment);\r\n//         log('Updated fee percentage from payment response:', `${(feeFromPayment * 100).toFixed(2)}%`);\r\n//       }\r\n      \r\n//       setPayment(paymentResponse.payment);\r\n//       setPaymentStatus('idle');\r\n//       setError(null);\r\n      \r\n//       // Now proceed to confirm step\r\n//       setStep('confirm');\r\n      \r\n//       log('Payment created and proceeding to confirmation');\r\n//     } catch (err) {\r\n//       log('Error creating payment:', err);\r\n//       setError(err.message || 'Failed to create payment');\r\n//       setPaymentStatus('error');\r\n//       if (onError) onError(err);\r\n//     }\r\n    \r\n//     console.log('=== END PAYMENT METHOD SELECTION DEBUG ===');\r\n//   };\r\n\r\n//   // Handle back navigation\r\n//   const handleBack = () => {\r\n//     if (step === 'confirm') {\r\n//       setStep('select-currency');\r\n//       setWalletConnection(null);\r\n//       // ✅ Clear payment when going back to allow re-selection\r\n//       setPayment(null);\r\n//       setSelectedPaymentMethod(null);\r\n//     } else if (step === 'error') {\r\n//       setStep('confirm');\r\n//     }\r\n//   };\r\n\r\n//   // Enhanced wallet connection with retry and better debugging\r\n//   const handleConnectWallet = async (walletType) => {\r\n//     console.log('=== WALLET CONNECTION DEBUG ===');\r\n//     console.log('1. Wallet type requested:', walletType);\r\n//     console.log('2. Selected payment method:', selectedPaymentMethod);\r\n//     console.log('3. Available wallets:', availableWallets);\r\n//     console.log('4. Current step:', step);\r\n\r\n//     if (!selectedPaymentMethod) {\r\n//       console.error('No payment method selected');\r\n//       setError('Please select a payment method first');\r\n//       return;\r\n//     }\r\n\r\n//     try {\r\n//       console.log('5. Attempting to connect wallet...');\r\n//       setError(null);\r\n      \r\n//       log('Connecting wallet:', { walletType, network: selectedPaymentMethod.network });\r\n      \r\n//       const connection = await connectWallet(walletType, selectedPaymentMethod.network, 2);\r\n//       setWalletConnection(connection);\r\n//       setError(null);\r\n      \r\n//       console.log('6. Connection successful:', connection);\r\n//       log('Wallet connected successfully:', connection);\r\n//     } catch (err) {\r\n//       console.error('7. Connection failed:', err);\r\n//       log('Wallet connection error:', err);\r\n//       setError(err.message || 'Failed to connect wallet');\r\n//     }\r\n    \r\n//     console.log('=== END WALLET CONNECTION DEBUG ===');\r\n//   };\r\n\r\n//   // Handle payment submission with QR payment verification\r\n//   const handlePayment = async (isQRPayment = false) => {\r\n//     if (!payment || !selectedPaymentMethod) {\r\n//       setError('Missing payment information');\r\n//       return;\r\n//     }\r\n\r\n//     // Handle QR payment verification\r\n//     if (isQRPayment) {\r\n//       console.log('🔄 QR Payment - Starting verification process...');\r\n//       await handleQRPaymentVerification();\r\n//       return;\r\n//     }\r\n\r\n//     // Original wallet payment flow\r\n//     if (!walletConnection && !testMode) {\r\n//       setError('Please connect your wallet first');\r\n//       return;\r\n//     }\r\n\r\n//     log('Starting payment process...');\r\n//     setPaymentStatus('loading');\r\n//     setTransactionHash(null);\r\n//     setStep('processing');\r\n    \r\n//     setProcessingStartTime(Date.now());\r\n\r\n//     try {\r\n//       let txHash;\r\n\r\n//       if (testMode) {\r\n//         log('Test mode: Generating mock transaction...');\r\n//         txHash = `test_${Date.now().toString(16)}_${Math.random().toString(16).substring(2, 10)}`;\r\n        \r\n//         await new Promise(resolve => setTimeout(resolve, 1000));\r\n//       } else {\r\n//         let merchantAddress;\r\n        \r\n//         if (payment.recipientWallet) {\r\n//           merchantAddress = payment.recipientWallet;\r\n//         } else if (actualMerchantWallets[selectedPaymentMethod.network]) {\r\n//           merchantAddress = actualMerchantWallets[selectedPaymentMethod.network];\r\n//         } else {\r\n//           throw new Error(`No merchant wallet address found for ${selectedPaymentMethod.network} network`);\r\n//         }\r\n\r\n//         log('Using merchant address for payment:', merchantAddress);\r\n\r\n//         log('Sending transaction through wallet...');\r\n        \r\n//         txHash = await sendTransaction(walletConnection, {\r\n//           to: merchantAddress,\r\n//           amount: payment.totalAmount || payment.amount,\r\n//           tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n//           tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals,\r\n//           currency: selectedPaymentMethod.currency,\r\n//           network: selectedPaymentMethod.network\r\n//         });\r\n//       }\r\n\r\n//       console.log('🎉 TRANSACTION HASH OBTAINED:', txHash);\r\n//       setTransactionHash(txHash);\r\n      \r\n//       console.log('📺 Setting step to success...');\r\n//       setStep('success');\r\n//       setPaymentStatus('success');\r\n      \r\n//       console.log('🔄 About to call processBackendConfirmation...');\r\n      \r\n//       try {\r\n//         console.log('🚀 CALLING processBackendConfirmation...');\r\n//         await processBackendConfirmationWithDebug(txHash);\r\n//       } catch (processError) {\r\n//         console.error('❌ processBackendConfirmation failed:', processError);\r\n//       }\r\n      \r\n//     } catch (err) {\r\n//       log('Payment error:', err);\r\n//       setError(err.message || 'Failed to process payment');\r\n//       setPaymentStatus('error');\r\n//       setStep('error');\r\n//       if (onError) onError(err);\r\n//     }\r\n//   };\r\n\r\n//   // Get supported wallets for current network\r\n//   const getSupportedWallets = () => {\r\n//     if (!selectedPaymentMethod) return [];\r\n//     return getSupportedWalletsForNetwork(selectedPaymentMethod.network);\r\n//   };\r\n\r\n//   // Filter supported networks based on merchant configuration\r\n//   const getEffectiveSupportedNetworks = () => {\r\n//     if (merchantSupportedNetworks.length === 0) {\r\n//       // Fallback to provided supportedNetworks if merchant networks not loaded\r\n//       return supportedNetworks.length > 0 ? supportedNetworks : Object.values(NETWORK_TYPES);\r\n//     }\r\n    \r\n//     // Use merchant's configured networks\r\n//     return merchantSupportedNetworks.map(network => network.shortName);\r\n//   };\r\n\r\n//   return (\r\n//     <>\r\n//       {isOpen && (\r\n//         <CoinleyModal\r\n//           isOpen={isOpen}\r\n//           onClose={handleClose}\r\n//           payment={payment}\r\n//           paymentStatus={paymentStatus}\r\n//           selectedPaymentMethod={selectedPaymentMethod}\r\n//           onPaymentMethodSelect={handlePaymentMethodSelect}\r\n//           onPayment={handlePayment}\r\n//           onBack={handleBack}\r\n//           error={error}\r\n//           theme={effectiveTheme}\r\n//           merchantName={merchantName}\r\n//           transactionHash={transactionHash}\r\n//           walletConnection={walletConnection}\r\n//           onConnectWallet={handleConnectWallet}\r\n//           testMode={testMode}\r\n//           supportedNetworks={getEffectiveSupportedNetworks()}\r\n//           availableWallets={availableWallets}\r\n//           supportedWallets={getSupportedWallets()}\r\n//           step={step}\r\n//           merchantWalletAddresses={actualMerchantWallets}\r\n//           debug={effectiveDebug}\r\n//           // Processing info\r\n//           processingStartTime={processingStartTime}\r\n//           pendingBackendConfirmation={pendingBackendConfirmation}\r\n//           paymentNetwork={selectedPaymentMethod?.network}\r\n//           // Pass the dynamic fee percentage\r\n//           merchantFeePercentage={merchantFeePercentage}\r\n//         />\r\n//       )}\r\n//     </>\r\n//   );\r\n// });\r\n\r\n// CoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\n// export default CoinleyCheckout;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // src/components/CoinleyCheckout.jsx \r\n// import React, { forwardRef, useImperativeHandle, useState, useEffect, useRef } from 'react';\r\n// import { useCoinley } from '../context/CoinleyContext';\r\n// import { useTheme } from '../context/ThemeContext';\r\n// import CoinleyModal from './CoinleyModal';\r\n// import { \r\n//   createPayment, \r\n//   processPayment, \r\n//   verifyQRPayment,\r\n//   getMerchantWallets, \r\n//   getMerchantFeePercentage,\r\n//   getMerchantNetworks,\r\n//   getMerchantTokens \r\n// } from '../services/api';\r\n// import { \r\n//   connectWallet, \r\n//   sendTransaction, \r\n//   detectWallets, \r\n//   detectWalletsWithRetry,\r\n//   getSupportedWalletsForNetwork,\r\n//   debugWalletEnvironment,\r\n//   NETWORK_TYPES,\r\n//   WALLET_TYPES,\r\n//   detectWalletConflicts,\r\n//   resolveWalletConflicts\r\n// } from '../services/walletService';\r\n\r\n// /**\r\n//  * Enhanced Coinley checkout with advanced wallet conflict resolution\r\n//  */\r\n// const CoinleyCheckout = forwardRef(({ \r\n//   apiKey,\r\n//   apiSecret,\r\n//   apiUrl,\r\n//   customerEmail,\r\n//   merchantName = 'Merchant',\r\n//   merchantWalletAddresses = {},\r\n//   onSuccess,\r\n//   onError,\r\n//   onClose,\r\n//   theme,\r\n//   autoOpen = false,\r\n//   debug = false,\r\n//   testMode = false,\r\n//   supportedNetworks = [],\r\n//   preferredNetwork = NETWORK_TYPES.ETHEREUM,\r\n//   preferredWallet = WALLET_TYPES.METAMASK,\r\n//   confirmations = 1,\r\n//   fastMode = true\r\n// }, ref) => {\r\n//   // Context\r\n//   const coinleyContext = useCoinley();\r\n//   const { theme: contextTheme } = useTheme();\r\n  \r\n//   // State\r\n//   const [isOpen, setIsOpen] = useState(autoOpen);\r\n//   const [payment, setPayment] = useState(null);\r\n//   const [paymentStatus, setPaymentStatus] = useState('idle');\r\n//   const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n//   const [error, setError] = useState(null);\r\n//   const [transactionHash, setTransactionHash] = useState(null);\r\n//   const [walletConnection, setWalletConnection] = useState(null);\r\n//   const [availableWallets, setAvailableWallets] = useState({});\r\n//   const [step, setStep] = useState('select-currency');\r\n//   const [actualMerchantWallets, setActualMerchantWallets] = useState({});\r\n//   const [merchantFeePercentage, setMerchantFeePercentage] = useState(0.0175);\r\n  \r\n//   // Store original payment details\r\n//   const [storedPaymentDetails, setStoredPaymentDetails] = useState(null);\r\n  \r\n//   // New state for merchant's configured networks and tokens\r\n//   const [merchantSupportedNetworks, setMerchantSupportedNetworks] = useState([]);\r\n//   const [merchantSupportedTokens, setMerchantSupportedTokens] = useState([]);\r\n  \r\n//   // Processing state\r\n//   const [processingStartTime, setProcessingStartTime] = useState(null);\r\n//   const [checkingInterval, setCheckingInterval] = useState(null);\r\n//   const processingTimerRef = useRef(null);\r\n//   const [pendingBackendConfirmation, setPendingBackendConfirmation] = useState(false);\r\n  \r\n//   // 🚨 ENHANCED: Wallet conflict state\r\n//   const [walletConflicts, setWalletConflicts] = useState([]);\r\n//   const [conflictResolutionAttempted, setConflictResolutionAttempted] = useState(false);\r\n  \r\n//   // Use the component props or fallback to context values\r\n//   const effectiveApiKey = apiKey || coinleyContext?.apiKey;\r\n//   const effectiveApiSecret = apiSecret || coinleyContext?.apiSecret;\r\n//   const effectiveApiUrl = apiUrl || coinleyContext?.apiUrl;\r\n//   const effectiveTheme = theme || contextTheme;\r\n//   const effectiveDebug = debug || coinleyContext?.debug;\r\n\r\n//   // Debug logging helper\r\n//   const log = (message, data) => {\r\n//     if (effectiveDebug) {\r\n//       console.log(`[Coinley SDK] ${message}`, data);\r\n//     }\r\n//   };\r\n\r\n//   // 🚨 ENHANCED: Wallet conflict detection and resolution on mount\r\n//   useEffect(() => {\r\n//     if (typeof window !== 'undefined') {\r\n//       // Detect and resolve wallet conflicts immediately\r\n//       console.log('🔧 Initializing wallet conflict detection...');\r\n      \r\n//       const conflicts = resolveWalletConflicts();\r\n//       setWalletConflicts(conflicts);\r\n      \r\n//       if (conflicts.length > 0) {\r\n//         console.warn('🚨 Wallet conflicts detected on component mount:');\r\n//         conflicts.forEach(conflict => {\r\n//           console.warn(`- [${conflict.severity}] ${conflict.message}`);\r\n//           console.warn(`  Solution: ${conflict.solution}`);\r\n//         });\r\n        \r\n//         // Show user-friendly error for critical conflicts\r\n//         const criticalConflicts = conflicts.filter(c => c.severity === 'high');\r\n//         if (criticalConflicts.length > 0) {\r\n//           setError(`Wallet conflict detected: ${criticalConflicts[0].message}. ${criticalConflicts[0].solution}`);\r\n//         }\r\n//       }\r\n      \r\n//       setConflictResolutionAttempted(true);\r\n      \r\n//       // Enhanced wallet detection with conflict resolution\r\n//       const detectWalletsAsync = async () => {\r\n//         // Wait for all wallet injections and conflict resolution to complete\r\n//         await new Promise(resolve => setTimeout(resolve, 1500));\r\n        \r\n//         const wallets = await detectWalletsWithRetry(3, 1000);\r\n//         setAvailableWallets(wallets);\r\n        \r\n//         log('Available wallets detected after conflict resolution:', wallets);\r\n        \r\n//         // Debug wallet environment if debug mode is on\r\n//         if (effectiveDebug) {\r\n//           const debugInfo = debugWalletEnvironment();\r\n//           log('Wallet environment debug info:', debugInfo);\r\n//         }\r\n//       };\r\n      \r\n//       detectWalletsAsync();\r\n//     }\r\n//   }, [effectiveDebug]);\r\n\r\n//   // 🚨 ENHANCED: Error handling for wallet conflicts and connection issues\r\n//   useEffect(() => {\r\n//     const handleWalletError = (error) => {\r\n//       const errorMessage = error.message || error.reason?.message || 'Unknown error';\r\n      \r\n//       // Handle specific wallet conflict errors\r\n//       if (errorMessage.includes('phantom') || errorMessage.includes('Phantom')) {\r\n//         console.error('🚨 Phantom wallet conflict detected:', error);\r\n//         setError('Phantom wallet is interfering with other wallets. Please try disabling Phantom extension temporarily and refresh the page.');\r\n//         return;\r\n//       }\r\n      \r\n//       // Handle MetaMask hijacking\r\n//       if (errorMessage.includes('hijack') || errorMessage.includes('conflict')) {\r\n//         console.error('🚨 Wallet hijacking detected:', error);\r\n//         setError('Wallet conflict detected. Please disable conflicting wallet extensions and refresh the page.');\r\n//         return;\r\n//       }\r\n      \r\n//       // Handle connection rejections\r\n//       if (errorMessage.includes('rejected') || errorMessage.includes('denied')) {\r\n//         console.warn('⚠️ User rejected wallet connection:', error);\r\n//         setError('Connection rejected. Please approve the wallet connection to continue.');\r\n//         return;\r\n//       }\r\n      \r\n//       // Handle insufficient balance (but don't show to user - let wallet handle it)\r\n//       if (errorMessage.includes('Insufficient') && errorMessage.includes('balance')) {\r\n//         console.warn('⚠️ Balance check error (ignoring):', errorMessage);\r\n//         return; // Don't show balance errors to user\r\n//       }\r\n      \r\n//       // Handle timeout errors\r\n//       if (errorMessage.includes('timeout') || errorMessage.includes('took too long')) {\r\n//         console.error('🚨 Wallet timeout:', error);\r\n//         setError('Wallet connection timed out. Please make sure your wallet is unlocked and try again.');\r\n//         return;\r\n//       }\r\n      \r\n//       // Generic wallet errors\r\n//       if (errorMessage.includes('wallet') || errorMessage.includes('provider')) {\r\n//         console.error('🚨 Wallet error:', error);\r\n//         setError(`Wallet error: ${errorMessage}. Please try refreshing the page.`);\r\n//         return;\r\n//       }\r\n//     };\r\n\r\n//     // Listen for both error events and unhandled promise rejections\r\n//     window.addEventListener('error', (e) => handleWalletError(e.error));\r\n//     window.addEventListener('unhandledrejection', (e) => handleWalletError(e.reason));\r\n\r\n//     return () => {\r\n//       window.removeEventListener('error', handleWalletError);\r\n//       window.removeEventListener('unhandledrejection', handleWalletError);\r\n//     };\r\n//   }, []);\r\n\r\n//   // Fetch merchant data on component mount\r\n//   useEffect(() => {\r\n//     const fetchMerchantData = async () => {\r\n//       try {\r\n//         log('Fetching merchant data from backend...');\r\n        \r\n//         const [wallets, feePercentage, networks, tokens] = await Promise.all([\r\n//           getMerchantWallets(),\r\n//           getMerchantFeePercentage(),\r\n//           getMerchantNetworks(),\r\n//           getMerchantTokens()\r\n//         ]);\r\n        \r\n//         setActualMerchantWallets(wallets);\r\n//         setMerchantFeePercentage(feePercentage);\r\n//         setMerchantSupportedNetworks(networks);\r\n//         setMerchantSupportedTokens(tokens);\r\n        \r\n//         log('Merchant data fetched successfully:', { \r\n//           wallets, \r\n//           feePercentage: `${(feePercentage * 100).toFixed(2)}%`,\r\n//           networksCount: networks.length,\r\n//           tokensCount: tokens.length\r\n//         });\r\n//       } catch (error) {\r\n//         console.error('Failed to fetch merchant data:', error);\r\n//         setActualMerchantWallets(merchantWalletAddresses);\r\n//         setMerchantFeePercentage(0.0175);\r\n//         setMerchantSupportedNetworks([]);\r\n//         setMerchantSupportedTokens([]);\r\n//       }\r\n//     };\r\n\r\n//     if (effectiveApiKey && effectiveApiSecret) {\r\n//       fetchMerchantData();\r\n//     }\r\n//   }, [effectiveApiKey, effectiveApiSecret, merchantWalletAddresses]);\r\n\r\n//   // Cleanup processing timers and intervals on unmount\r\n//   useEffect(() => {\r\n//     return () => {\r\n//       if (processingTimerRef.current) {\r\n//         clearTimeout(processingTimerRef.current);\r\n//       }\r\n//       if (checkingInterval) {\r\n//         clearInterval(checkingInterval);\r\n//       }\r\n//     };\r\n//   }, [checkingInterval]);\r\n\r\n//   // Backend confirmation function\r\n//   const processBackendConfirmationWithDebug = async (txHash) => {\r\n//     console.log('🔍 processBackendConfirmationWithDebug called with:', txHash);\r\n    \r\n//     if (!payment || !selectedPaymentMethod || !txHash) {\r\n//       console.error('❌ Missing required data for backend confirmation');\r\n//       return;\r\n//     }\r\n    \r\n//     try {\r\n//       const processResponse = await processPayment({\r\n//         paymentId: payment.id,\r\n//         transactionHash: txHash,\r\n//         network: selectedPaymentMethod.network,\r\n//         senderAddress: walletConnection?.address || 'QR_PAYMENT'\r\n//       });\r\n\r\n//       console.log('✅ Payment processed successfully with backend:', processResponse);\r\n//       setPendingBackendConfirmation(false);\r\n      \r\n//       setPaymentStatus('success');\r\n      \r\n//       if (onSuccess) {\r\n//         onSuccess(payment.id, txHash, {\r\n//           network: selectedPaymentMethod.network,\r\n//           currency: selectedPaymentMethod.currency,\r\n//           amount: payment.totalAmount || payment.amount,\r\n//           processResponse: processResponse\r\n//         });\r\n//       }\r\n//     } catch (processError) {\r\n//       console.error('❌ processBackendConfirmation failed:', processError);\r\n//       setPendingBackendConfirmation(true);\r\n      \r\n//       setTimeout(() => {\r\n//         console.log('🔄 Retrying processBackendConfirmation...');\r\n//         processBackendConfirmationWithDebug(txHash);\r\n//       }, 10000);\r\n//     }\r\n//   };\r\n\r\n//   // QR Payment verification function\r\n//   const handleQRPaymentVerification = async () => {\r\n//     if (!payment) {\r\n//       setError('Payment information is missing');\r\n//       return;\r\n//     }\r\n\r\n//     setPaymentStatus('loading');\r\n//     setStep('processing');\r\n//     setProcessingStartTime(Date.now());\r\n//     setError(null);\r\n\r\n//     try {\r\n//       log('Starting QR payment verification...');\r\n      \r\n//       const verificationResult = await verifyQRPayment(payment.id);\r\n      \r\n//       if (verificationResult.verified) {\r\n//         log('QR payment verified successfully:', verificationResult);\r\n        \r\n//         setTransactionHash(verificationResult.payment.transactionHash);\r\n//         setStep('success');\r\n//         setPaymentStatus('success');\r\n        \r\n//         if (onSuccess) {\r\n//           onSuccess(payment.id, verificationResult.payment.transactionHash, {\r\n//             network: selectedPaymentMethod.network,\r\n//             currency: selectedPaymentMethod.currency,\r\n//             amount: verificationResult.payment.amount,\r\n//             verificationType: 'QR_PAYMENT'\r\n//           });\r\n//         }\r\n//       } else {\r\n//         setError(verificationResult.message || 'Transaction not detected yet. Please wait a moment and try again.');\r\n//         setStep('confirm');\r\n//         setPaymentStatus('idle');\r\n//       }\r\n//     } catch (error) {\r\n//       log('QR payment verification error:', error);\r\n//       setError(error.message || 'Failed to verify payment. Please try again.');\r\n//       setStep('confirm');\r\n//       setPaymentStatus('error');\r\n//       if (onError) onError(error);\r\n//     }\r\n//   };\r\n\r\n//   // Expose methods via ref\r\n//   useImperativeHandle(ref, () => ({\r\n//     open: (paymentDetails) => {\r\n//       handleOpen(paymentDetails);\r\n//     },\r\n//     close: () => {\r\n//       handleClose();\r\n//     },\r\n//     getPayment: () => payment,\r\n//     getWalletConnection: () => walletConnection,\r\n//     debugWallets: () => debugWalletEnvironment(),\r\n//     getMerchantWallets: () => actualMerchantWallets,\r\n//     getMerchantFeePercentage: () => merchantFeePercentage,\r\n//     getMerchantSupportedNetworks: () => merchantSupportedNetworks,\r\n//     getMerchantSupportedTokens: () => merchantSupportedTokens,\r\n//     // 🚨 NEW: Debug methods for conflict resolution\r\n//     getWalletConflicts: () => walletConflicts,\r\n//     resolveConflicts: () => {\r\n//       const conflicts = resolveWalletConflicts();\r\n//       setWalletConflicts(conflicts);\r\n//       return conflicts;\r\n//     }\r\n//   }));\r\n\r\n//   // Handle opening the payment modal\r\n//   const handleOpen = async (paymentDetails) => {\r\n//     console.log('🚨 HANDLE OPEN DEBUG - START');\r\n//     console.log('paymentDetails received:', paymentDetails);\r\n    \r\n//     if (!paymentDetails || !paymentDetails.amount) {\r\n//       setError('Payment amount is required');\r\n//       if (onError) onError(new Error('Payment amount is required'));\r\n//       return;\r\n//     }\r\n\r\n//     // Store payment details for later use when user selects payment method\r\n//     setStoredPaymentDetails(paymentDetails);\r\n//     setPaymentStatus('idle');\r\n//     setIsOpen(true);\r\n//     setStep('select-currency');\r\n//     setError(null);\r\n    \r\n//     console.log('✅ Modal opened, waiting for user to select payment method');\r\n//   };\r\n\r\n//   // Handle closing the modal\r\n//   const handleClose = () => {\r\n//     if (checkingInterval) {\r\n//       clearInterval(checkingInterval);\r\n//       setCheckingInterval(null);\r\n//     }\r\n    \r\n//     if (processingTimerRef.current) {\r\n//       clearTimeout(processingTimerRef.current);\r\n//       processingTimerRef.current = null;\r\n//     }\r\n    \r\n//     setIsOpen(false);\r\n//     setTransactionHash(null);\r\n//     setWalletConnection(null);\r\n//     setSelectedPaymentMethod(null);\r\n//     setStoredPaymentDetails(null);\r\n//     setPayment(null);\r\n//     setStep('select-currency');\r\n//     setProcessingStartTime(null);\r\n//     setPendingBackendConfirmation(false);\r\n    \r\n//     if (onClose) onClose();\r\n//   };\r\n\r\n//   // Handle payment method selection\r\n//   const handlePaymentMethodSelect = async (paymentMethod) => {\r\n//     console.log('=== PAYMENT METHOD SELECTION DEBUG ===');\r\n//     console.log('1. Payment method selected:', paymentMethod);\r\n//     console.log('2. Stored payment details:', storedPaymentDetails);\r\n    \r\n//     if (!storedPaymentDetails) {\r\n//       setError('Payment details are missing');\r\n//       return;\r\n//     }\r\n    \r\n//     log('Payment method selected:', paymentMethod);\r\n//     setSelectedPaymentMethod(paymentMethod);\r\n    \r\n//     // Create payment with the selected network/currency\r\n//     try {\r\n//       setPaymentStatus('loading');\r\n      \r\n//       console.log('🚀 Creating payment with selected method:');\r\n//       console.log('Network:', paymentMethod.network);\r\n//       console.log('Currency:', paymentMethod.currency);\r\n      \r\n//       // Validate that the requested network is supported by merchant\r\n//       const isNetworkSupported = merchantSupportedNetworks.some(\r\n//         network => network.shortName === paymentMethod.network\r\n//       );\r\n      \r\n//       if (!isNetworkSupported) {\r\n//         throw new Error(`Network ${paymentMethod.network} is not configured for this merchant`);\r\n//       }\r\n      \r\n//       // Validate that the requested currency is supported by merchant\r\n//       const isTokenSupported = merchantSupportedTokens.some(\r\n//         token => token.symbol === paymentMethod.currency && \r\n//                 token.Network && \r\n//                 token.Network.shortName === paymentMethod.network\r\n//       );\r\n      \r\n//       if (!isTokenSupported) {\r\n//         throw new Error(`Token ${paymentMethod.currency} is not supported on ${paymentMethod.network} network for this merchant`);\r\n//       }\r\n      \r\n//       // Ensure we have the latest merchant wallet addresses\r\n//       let walletAddresses = actualMerchantWallets;\r\n//       if (Object.keys(walletAddresses).length === 0) {\r\n//         log('No wallet addresses found, fetching from backend...');\r\n//         walletAddresses = await getMerchantWallets();\r\n//         setActualMerchantWallets(walletAddresses);\r\n//       }\r\n\r\n//       log('Using wallet addresses:', walletAddresses);\r\n\r\n//       // Create payment with SELECTED network/currency\r\n//       const paymentResponse = await createPayment({\r\n//         amount: storedPaymentDetails.amount,\r\n//         currency: paymentMethod.currency,\r\n//         network: paymentMethod.network,\r\n//         customerEmail: storedPaymentDetails.customerEmail || customerEmail,\r\n//         callbackUrl: storedPaymentDetails.callbackUrl,\r\n//         metadata: {\r\n//           ...storedPaymentDetails.metadata,\r\n//           merchantWalletAddresses: walletAddresses\r\n//         },\r\n//         merchantWalletAddresses: walletAddresses\r\n//       });\r\n\r\n//       console.log('✅ Payment created with correct network:', paymentResponse.payment);\r\n      \r\n//       // Use the fee percentage from the payment response\r\n//       if (paymentResponse.payment.customFeePercentage) {\r\n//         const feeFromPayment = parseFloat(paymentResponse.payment.customFeePercentage);\r\n//         setMerchantFeePercentage(feeFromPayment);\r\n//         log('Updated fee percentage from payment response:', `${(feeFromPayment * 100).toFixed(2)}%`);\r\n//       }\r\n      \r\n//       setPayment(paymentResponse.payment);\r\n//       setPaymentStatus('idle');\r\n//       setError(null);\r\n      \r\n//       // Now proceed to confirm step\r\n//       setStep('confirm');\r\n      \r\n//       log('Payment created and proceeding to confirmation');\r\n//     } catch (err) {\r\n//       log('Error creating payment:', err);\r\n//       setError(err.message || 'Failed to create payment');\r\n//       setPaymentStatus('error');\r\n//       if (onError) onError(err);\r\n//     }\r\n    \r\n//     console.log('=== END PAYMENT METHOD SELECTION DEBUG ===');\r\n//   };\r\n\r\n//   // Handle back navigation\r\n//   const handleBack = () => {\r\n//     if (step === 'confirm') {\r\n//       setStep('select-currency');\r\n//       setWalletConnection(null);\r\n//       setPayment(null);\r\n//       setSelectedPaymentMethod(null);\r\n//     } else if (step === 'error') {\r\n//       setStep('confirm');\r\n//     }\r\n//   };\r\n\r\n//   // 🚨 ENHANCED: Wallet connection with advanced conflict resolution\r\n//   const handleConnectWallet = async (walletType) => {\r\n//     console.log('=== ENHANCED WALLET CONNECTION DEBUG ===');\r\n//     console.log('1. Wallet type requested:', walletType);\r\n//     console.log('2. Selected payment method:', selectedPaymentMethod);\r\n//     console.log('3. Available wallets:', availableWallets);\r\n//     console.log('4. Detected conflicts:', walletConflicts);\r\n//     console.log('5. Conflict resolution attempted:', conflictResolutionAttempted);\r\n\r\n//     if (!selectedPaymentMethod) {\r\n//       console.error('No payment method selected');\r\n//       setError('Please select a payment method first');\r\n//       return;\r\n//     }\r\n\r\n//     try {\r\n//       setError(null);\r\n      \r\n//       // 🚨 STEP 1: Detect and resolve conflicts FIRST\r\n//       console.log('🔧 Step 1: Resolving wallet conflicts...');\r\n//       const currentConflicts = resolveWalletConflicts();\r\n//       setWalletConflicts(currentConflicts);\r\n      \r\n//       if (currentConflicts.length > 0) {\r\n//         console.warn('⚠️ Active wallet conflicts detected:');\r\n//         currentConflicts.forEach(conflict => {\r\n//           console.warn(`- [${conflict.severity}] ${conflict.type}: ${conflict.message}`);\r\n//         });\r\n        \r\n//         // Handle critical conflicts for MetaMask\r\n//         if (walletType === WALLET_TYPES.METAMASK) {\r\n//           const criticalConflicts = currentConflicts.filter(c => \r\n//             c.type === 'phantom_hijack_ethereum' || \r\n//             c.type === 'multiple_metamask_providers'\r\n//           );\r\n          \r\n//           if (criticalConflicts.length > 0) {\r\n//             const conflict = criticalConflicts[0];\r\n//             setError(`Wallet conflict detected: ${conflict.message}. ${conflict.solution}`);\r\n            \r\n//             // Give user option to proceed anyway\r\n//             console.warn('🚨 Critical conflict detected but proceeding with caution...');\r\n//           }\r\n//         }\r\n//       }\r\n      \r\n//       // 🚨 STEP 2: Wait a bit for wallet injection to stabilize\r\n//       console.log('⏳ Step 2: Waiting for wallet stabilization...');\r\n//       await new Promise(resolve => setTimeout(resolve, 500));\r\n      \r\n//       // 🚨 STEP 3: Re-detect wallets after conflict resolution\r\n//       console.log('🔍 Step 3: Re-detecting wallets...');\r\n//       const updatedWallets = await detectWalletsWithRetry(2, 500);\r\n//       setAvailableWallets(updatedWallets);\r\n      \r\n//       if (!updatedWallets[walletType]) {\r\n//         throw new Error(`${walletType} wallet not detected. Please make sure it's installed and enabled.`);\r\n//       }\r\n      \r\n//       // 🚨 STEP 4: Attempt connection with retries\r\n//       console.log('🚀 Step 4: Attempting wallet connection...');\r\n//       let connection;\r\n//       let retries = 0;\r\n//       const maxRetries = 3;\r\n      \r\n//       while (retries < maxRetries) {\r\n//         try {\r\n//           console.log(`🔄 Connection attempt ${retries + 1}/${maxRetries} for ${walletType}`);\r\n          \r\n//           connection = await connectWallet(walletType, selectedPaymentMethod.network);\r\n          \r\n//           // Verify the connection is for the right wallet\r\n//           if (connection.walletType !== walletType) {\r\n//             throw new Error(`Connected to ${connection.walletType} instead of ${walletType}`);\r\n//           }\r\n          \r\n//           console.log('✅ Wallet connection successful:', {\r\n//             type: connection.walletType,\r\n//             address: connection.address,\r\n//             network: connection.network\r\n//           });\r\n          \r\n//           break; // Success, exit retry loop\r\n          \r\n//         } catch (connectionError) {\r\n//           retries++;\r\n//           console.warn(`❌ Attempt ${retries} failed:`, connectionError.message);\r\n          \r\n//           if (retries >= maxRetries) {\r\n//             throw connectionError;\r\n//           }\r\n          \r\n//           // Wait longer between retries for MetaMask conflicts\r\n//           const delayMs = walletType === WALLET_TYPES.METAMASK ? 2000 : 1000;\r\n//           console.log(`⏳ Waiting ${delayMs}ms before retry...`);\r\n//           await new Promise(resolve => setTimeout(resolve, delayMs));\r\n//         }\r\n//       }\r\n      \r\n//       setWalletConnection(connection);\r\n//       setError(null);\r\n      \r\n//       console.log('🎉 Wallet connected successfully!');\r\n      \r\n//     } catch (err) {\r\n//       console.error('❌ Final wallet connection error:', err);\r\n      \r\n//       // Enhanced error messages with specific solutions\r\n//       let errorMessage = err.message || 'Failed to connect wallet';\r\n      \r\n//       if (walletType === WALLET_TYPES.METAMASK) {\r\n//         if (errorMessage.includes('Phantom') || errorMessage.includes('hijack')) {\r\n//           errorMessage = 'Phantom wallet is interfering with MetaMask. Please disable Phantom extension temporarily, refresh the page, and try again.';\r\n//         } else if (errorMessage.includes('timeout') || errorMessage.includes('took too long')) {\r\n//           errorMessage = 'MetaMask connection timed out. Please unlock MetaMask, click the extension icon to ensure it\\'s active, and try again.';\r\n//         } else if (errorMessage.includes('rejected') || errorMessage.includes('denied')) {\r\n//           errorMessage = 'Connection rejected. Please approve the connection in MetaMask and try again.';\r\n//         } else if (errorMessage.includes('not detected')) {\r\n//           errorMessage = 'MetaMask not detected. Please install MetaMask extension and refresh the page.';\r\n//         }\r\n//       } else if (walletType === WALLET_TYPES.PHANTOM) {\r\n//         if (errorMessage.includes('not detected')) {\r\n//           errorMessage = 'Phantom wallet not detected. Please install Phantom extension and refresh the page.';\r\n//         }\r\n//       }\r\n      \r\n//       setError(errorMessage);\r\n      \r\n//       // Log detailed error for debugging\r\n//       if (effectiveDebug) {\r\n//         console.error('Detailed connection error:', {\r\n//           walletType,\r\n//           originalError: err,\r\n//           conflicts: walletConflicts,\r\n//           availableWallets\r\n//         });\r\n//       }\r\n//     }\r\n//   };\r\n\r\n//   // Enhanced payment handling\r\n//   const handlePayment = async (isQRPayment = false) => {\r\n//     if (!payment || !selectedPaymentMethod) {\r\n//       setError('Missing payment information');\r\n//       return;\r\n//     }\r\n\r\n//     // Handle QR payment verification\r\n//     if (isQRPayment) {\r\n//       console.log('🔄 QR Payment - Starting verification process...');\r\n//       await handleQRPaymentVerification();\r\n//       return;\r\n//     }\r\n\r\n//     // Original wallet payment flow\r\n//     if (!walletConnection && !testMode) {\r\n//       setError('Please connect your wallet first');\r\n//       return;\r\n//     }\r\n\r\n//     log('Starting payment process...');\r\n//     setPaymentStatus('loading');\r\n//     setTransactionHash(null);\r\n//     setStep('processing');\r\n    \r\n//     setProcessingStartTime(Date.now());\r\n\r\n//     try {\r\n//       let txHash;\r\n\r\n//       if (testMode) {\r\n//         log('Test mode: Generating mock transaction...');\r\n//         txHash = `test_${Date.now().toString(16)}_${Math.random().toString(16).substring(2, 10)}`;\r\n        \r\n//         await new Promise(resolve => setTimeout(resolve, 1000));\r\n//       } else {\r\n//         let merchantAddress;\r\n        \r\n//         if (payment.recipientWallet) {\r\n//           merchantAddress = payment.recipientWallet;\r\n//         } else if (actualMerchantWallets[selectedPaymentMethod.network]) {\r\n//           merchantAddress = actualMerchantWallets[selectedPaymentMethod.network];\r\n//         } else {\r\n//           throw new Error(`No merchant wallet address found for ${selectedPaymentMethod.network} network`);\r\n//         }\r\n\r\n//         log('Using merchant address for payment:', merchantAddress);\r\n//         log('Sending transaction through wallet...');\r\n        \r\n//         // Enhanced transaction sending with better error handling\r\n//         try {\r\n//           txHash = await sendTransaction(walletConnection, {\r\n//             to: merchantAddress,\r\n//             amount: payment.totalAmount || payment.amount,\r\n//             tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n//             tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals,\r\n//             currency: selectedPaymentMethod.currency,\r\n//             network: selectedPaymentMethod.network\r\n//           });\r\n//         } catch (sendError) {\r\n//           // Filter out balance check errors and retry\r\n//           if (sendError.message && sendError.message.includes('Insufficient') && sendError.message.includes('balance')) {\r\n//             console.warn('⚠️ Ignoring balance check error, letting wallet handle it:', sendError.message);\r\n            \r\n//             // Try sending again, the wallet will show the real error if there's insufficient balance\r\n//             txHash = await sendTransaction(walletConnection, {\r\n//               to: merchantAddress,\r\n//               amount: payment.totalAmount || payment.amount,\r\n//               tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n//               tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals,\r\n//               currency: selectedPaymentMethod.currency,\r\n//               network: selectedPaymentMethod.network\r\n//             });\r\n//           } else {\r\n//             throw sendError;\r\n//           }\r\n//         }\r\n//       }\r\n\r\n//       console.log('🎉 TRANSACTION HASH OBTAINED:', txHash);\r\n//       setTransactionHash(txHash);\r\n      \r\n//       console.log('📺 Setting step to success...');\r\n//       setStep('success');\r\n//       setPaymentStatus('success');\r\n      \r\n//       console.log('🔄 About to call processBackendConfirmation...');\r\n      \r\n//       try {\r\n//         console.log('🚀 CALLING processBackendConfirmation...');\r\n//         await processBackendConfirmationWithDebug(txHash);\r\n//       } catch (processError) {\r\n//         console.error('❌ processBackendConfirmation failed:', processError);\r\n//       }\r\n      \r\n//     } catch (err) {\r\n//       log('Payment error:', err);\r\n      \r\n//       // Filter out balance check errors from user display\r\n//       if (err.message && err.message.includes('Insufficient') && err.message.includes('balance')) {\r\n//         setError('Please check your wallet balance and try again. Make sure you have sufficient tokens and network fees.');\r\n//       } else if (err.message && err.message.includes('rejected')) {\r\n//         setError('Transaction rejected by user. Please try again.');\r\n//       } else if (err.message && err.message.includes('timeout')) {\r\n//         setError('Transaction timed out. Please check your wallet and try again.');\r\n//       } else {\r\n//         setError(err.message || 'Failed to process payment');\r\n//       }\r\n      \r\n//       setPaymentStatus('error');\r\n//       setStep('error');\r\n//       if (onError) onError(err);\r\n//     }\r\n//   };\r\n\r\n//   // Get supported wallets for current network\r\n//   const getSupportedWallets = () => {\r\n//     if (!selectedPaymentMethod) return [];\r\n//     return getSupportedWalletsForNetwork(selectedPaymentMethod.network);\r\n//   };\r\n\r\n//   // Filter supported networks based on merchant configuration\r\n//   const getEffectiveSupportedNetworks = () => {\r\n//     if (merchantSupportedNetworks.length === 0) {\r\n//       return supportedNetworks.length > 0 ? supportedNetworks : Object.values(NETWORK_TYPES);\r\n//     }\r\n    \r\n//     return merchantSupportedNetworks.map(network => network.shortName);\r\n//   };\r\n\r\n//   // 🚨 ENHANCED: Wallet conflict warning component\r\n//   const WalletConflictWarning = () => {\r\n//     if (walletConflicts.length === 0) return null;\r\n    \r\n//     const criticalConflicts = walletConflicts.filter(c => c.severity === 'high');\r\n//     const warningConflicts = walletConflicts.filter(c => c.severity === 'medium');\r\n    \r\n//     return (\r\n//       <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-3 mb-4\">\r\n//         <h4 className=\"text-sm font-medium text-yellow-800 mb-2 flex items-center\">\r\n//           ⚠️ Wallet Conflicts Detected\r\n//           {criticalConflicts.length > 0 && (\r\n//             <span className=\"ml-2 bg-red-100 text-red-700 text-xs px-2 py-1 rounded\">\r\n//               Critical\r\n//             </span>\r\n//           )}\r\n//         </h4>\r\n        \r\n//         {criticalConflicts.map((conflict, index) => (\r\n//           <div key={`critical-${index}`} className=\"bg-red-50 border border-red-200 rounded p-2 mb-2\">\r\n//             <div className=\"text-xs text-red-800 font-medium mb-1\">\r\n//               🚨 {conflict.type.replace(/_/g, ' ').toUpperCase()}\r\n//             </div>\r\n//             <div className=\"text-xs text-red-700 mb-1\">\r\n//               <strong>Problem:</strong> {conflict.message}\r\n//             </div>\r\n//             <div className=\"text-xs text-red-700\">\r\n//               <strong>Solution:</strong> {conflict.solution}\r\n//             </div>\r\n//           </div>\r\n//         ))}\r\n        \r\n//         {warningConflicts.map((conflict, index) => (\r\n//           <div key={`warning-${index}`} className=\"text-xs text-yellow-700 mb-2\">\r\n//             <div className=\"font-medium\">⚠️ {conflict.type.replace(/_/g, ' ')}</div>\r\n//             <div className=\"ml-4\">\r\n//               <strong>Issue:</strong> {conflict.message}<br />\r\n//               <strong>Fix:</strong> {conflict.solution}\r\n//             </div>\r\n//           </div>\r\n//         ))}\r\n        \r\n//         <div className=\"flex gap-2 mt-3\">\r\n//           <button\r\n//             onClick={() => window.location.reload()}\r\n//             className=\"text-xs bg-yellow-100 hover:bg-yellow-200 text-yellow-800 px-3 py-1 rounded border border-yellow-300\"\r\n//           >\r\n//             Refresh Page\r\n//           </button>\r\n//           <button\r\n//             onClick={() => {\r\n//               const conflicts = resolveWalletConflicts();\r\n//               setWalletConflicts(conflicts);\r\n//               if (conflicts.length === 0) {\r\n//                 setError(null);\r\n//               }\r\n//             }}\r\n//             className=\"text-xs bg-blue-100 hover:bg-blue-200 text-blue-800 px-3 py-1 rounded border border-blue-300\"\r\n//           >\r\n//             Try Auto-Fix\r\n//           </button>\r\n//         </div>\r\n        \r\n//         {effectiveDebug && (\r\n//           <div className=\"mt-2 pt-2 border-t border-yellow-300\">\r\n//             <button\r\n//               onClick={() => {\r\n//                 const debugInfo = debugWalletEnvironment();\r\n//                 console.log('=== WALLET DEBUG INFO ===', debugInfo);\r\n//                 alert('Debug info logged to console');\r\n//               }}\r\n//               className=\"text-xs bg-gray-100 hover:bg-gray-200 text-gray-700 px-2 py-1 rounded\"\r\n//             >\r\n//               Debug Info\r\n//             </button>\r\n//           </div>\r\n//         )}\r\n//       </div>\r\n//     );\r\n//   };\r\n\r\n//   return (\r\n//     <>\r\n//       {isOpen && (\r\n//         <CoinleyModal\r\n//           isOpen={isOpen}\r\n//           onClose={handleClose}\r\n//           payment={payment}\r\n//           paymentStatus={paymentStatus}\r\n//           selectedPaymentMethod={selectedPaymentMethod}\r\n//           onPaymentMethodSelect={handlePaymentMethodSelect}\r\n//           onPayment={handlePayment}\r\n//           onBack={handleBack}\r\n//           error={error}\r\n//           theme={effectiveTheme}\r\n//           merchantName={merchantName}\r\n//           transactionHash={transactionHash}\r\n//           walletConnection={walletConnection}\r\n//           onConnectWallet={handleConnectWallet}\r\n//           testMode={testMode}\r\n//           supportedNetworks={getEffectiveSupportedNetworks()}\r\n//           availableWallets={availableWallets}\r\n//           supportedWallets={getSupportedWallets()}\r\n//           step={step}\r\n//           merchantWalletAddresses={actualMerchantWallets}\r\n//           debug={effectiveDebug}\r\n//           // Processing info\r\n//           processingStartTime={processingStartTime}\r\n//           pendingBackendConfirmation={pendingBackendConfirmation}\r\n//           paymentNetwork={selectedPaymentMethod?.network}\r\n//           // Pass the dynamic fee percentage\r\n//           merchantFeePercentage={merchantFeePercentage}\r\n//           // 🚨 Pass wallet conflict warning component\r\n//           conflictWarning={<WalletConflictWarning />}\r\n//           // 🚨 Pass conflict information\r\n//           walletConflicts={walletConflicts}\r\n//           conflictResolutionAttempted={conflictResolutionAttempted}\r\n//         />\r\n//       )}\r\n//     </>\r\n//   );\r\n// });\r\n\r\n// CoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\n// export default CoinleyCheckout;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // coinley-sdk/src/components/CoinleyCheckout.jsx\r\n// import React, { forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\n// import { useCoinley } from '../context/CoinleyContext';\r\n// import { useTheme } from '../context/ThemeContext';\r\n// import CoinleyModal from './CoinleyModal';\r\n// import { \r\n//   createPayment, \r\n//   processPayment, \r\n//   verifyQRPayment,\r\n//   getMerchantWallets, \r\n//   getMerchantFeePercentage,\r\n//   getMerchantNetworks,\r\n//   getMerchantTokens \r\n// } from '../services/api';\r\n// import { \r\n//   connectWallet, \r\n//   sendTransaction, \r\n//   detectWallets,\r\n//   getSupportedWalletsForNetwork,\r\n//   NETWORK_TYPES,\r\n//   WALLET_TYPES\r\n// } from '../services/walletService';\r\n\r\n// /**\r\n//  * Simplified Coinley checkout with Coinley Connect integration\r\n//  */\r\n// const CoinleyCheckout = forwardRef(({ \r\n//   apiKey,\r\n//   apiSecret,\r\n//   apiUrl,\r\n//   customerEmail,\r\n//   merchantName = 'Merchant',\r\n//   merchantWalletAddresses = {},\r\n//   onSuccess,\r\n//   onError,\r\n//   onClose,\r\n//   theme,\r\n//   autoOpen = false,\r\n//   debug = false,\r\n//   testMode = false,\r\n//   supportedNetworks = [],\r\n//   preferredNetwork = NETWORK_TYPES.ETHEREUM,\r\n//   preferredWallet = WALLET_TYPES.METAMASK,\r\n//   confirmations = 1,\r\n//   fastMode = true\r\n// }, ref) => {\r\n//   // Context\r\n//   const coinleyContext = useCoinley();\r\n//   const { theme: contextTheme } = useTheme();\r\n  \r\n//   // State - Much simpler now!\r\n//   const [isOpen, setIsOpen] = useState(autoOpen);\r\n//   const [payment, setPayment] = useState(null);\r\n//   const [paymentStatus, setPaymentStatus] = useState('idle');\r\n//   const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n//   const [error, setError] = useState(null);\r\n//   const [transactionHash, setTransactionHash] = useState(null);\r\n//   const [walletConnection, setWalletConnection] = useState(null);\r\n//   const [availableWallets, setAvailableWallets] = useState({});\r\n//   const [step, setStep] = useState('select-currency');\r\n//   const [actualMerchantWallets, setActualMerchantWallets] = useState({});\r\n//   const [merchantFeePercentage, setMerchantFeePercentage] = useState(0.0175);\r\n//   const [storedPaymentDetails, setStoredPaymentDetails] = useState(null);\r\n//   const [merchantSupportedNetworks, setMerchantSupportedNetworks] = useState([]);\r\n//   const [merchantSupportedTokens, setMerchantSupportedTokens] = useState([]);\r\n//   const [processingStartTime, setProcessingStartTime] = useState(null);\r\n//   const [pendingBackendConfirmation, setPendingBackendConfirmation] = useState(false);\r\n  \r\n//   // Use the component props or fallback to context values\r\n//   const effectiveApiKey = apiKey || coinleyContext?.apiKey;\r\n//   const effectiveApiSecret = apiSecret || coinleyContext?.apiSecret;\r\n//   const effectiveApiUrl = apiUrl || coinleyContext?.apiUrl;\r\n//   const effectiveTheme = theme || contextTheme;\r\n//   const effectiveDebug = debug || coinleyContext?.debug;\r\n\r\n//   // Debug logging helper\r\n//   const log = (message, data) => {\r\n//     if (effectiveDebug) {\r\n//       console.log(`[Coinley SDK] ${message}`, data);\r\n//     }\r\n//   };\r\n\r\n//   // Detect wallets on mount - much simpler now\r\n//   useEffect(() => {\r\n//     const detectWalletsAsync = async () => {\r\n//       try {\r\n//         const wallets = await detectWallets();\r\n//         setAvailableWallets(wallets);\r\n//         log('Available wallets detected:', wallets);\r\n//       } catch (error) {\r\n//         console.error('Error detecting wallets:', error);\r\n//         setAvailableWallets({}); // Fallback to empty\r\n//       }\r\n//     };\r\n    \r\n//     detectWalletsAsync();\r\n//   }, [effectiveDebug]);\r\n\r\n//   // Fetch merchant data on component mount\r\n//   useEffect(() => {\r\n//     const fetchMerchantData = async () => {\r\n//       try {\r\n//         log('Fetching merchant data from backend...');\r\n        \r\n//         const [wallets, feePercentage, networks, tokens] = await Promise.all([\r\n//           getMerchantWallets(),\r\n//           getMerchantFeePercentage(),\r\n//           getMerchantNetworks(),\r\n//           getMerchantTokens()\r\n//         ]);\r\n        \r\n//         setActualMerchantWallets(wallets);\r\n//         setMerchantFeePercentage(feePercentage);\r\n//         setMerchantSupportedNetworks(networks);\r\n//         setMerchantSupportedTokens(tokens);\r\n        \r\n//         log('Merchant data fetched successfully:', { \r\n//           wallets, \r\n//           feePercentage: `${(feePercentage * 100).toFixed(2)}%`,\r\n//           networksCount: networks.length,\r\n//           tokensCount: tokens.length\r\n//         });\r\n//       } catch (error) {\r\n//         console.error('Failed to fetch merchant data:', error);\r\n//         setActualMerchantWallets(merchantWalletAddresses);\r\n//         setMerchantFeePercentage(0.0175);\r\n//         setMerchantSupportedNetworks([]);\r\n//         setMerchantSupportedTokens([]);\r\n//       }\r\n//     };\r\n\r\n//     if (effectiveApiKey && effectiveApiSecret) {\r\n//       fetchMerchantData();\r\n//     }\r\n//   }, [effectiveApiKey, effectiveApiSecret, merchantWalletAddresses]);\r\n\r\n//   // Backend confirmation function\r\n//   const processBackendConfirmationWithDebug = async (txHash) => {\r\n//     console.log('🔍 processBackendConfirmationWithDebug called with:', txHash);\r\n    \r\n//     if (!payment || !selectedPaymentMethod || !txHash) {\r\n//       console.error('❌ Missing required data for backend confirmation');\r\n//       return;\r\n//     }\r\n    \r\n//     try {\r\n//       const processResponse = await processPayment({\r\n//         paymentId: payment.id,\r\n//         transactionHash: txHash,\r\n//         network: selectedPaymentMethod.network,\r\n//         senderAddress: walletConnection?.address || 'EXTERNAL_WALLET'\r\n//       });\r\n\r\n//       console.log('✅ Payment processed successfully with backend:', processResponse);\r\n//       setPendingBackendConfirmation(false);\r\n      \r\n//       setPaymentStatus('success');\r\n      \r\n//       if (onSuccess) {\r\n//         onSuccess(payment.id, txHash, {\r\n//           network: selectedPaymentMethod.network,\r\n//           currency: selectedPaymentMethod.currency,\r\n//           amount: payment.totalAmount || payment.amount,\r\n//           processResponse: processResponse\r\n//         });\r\n//       }\r\n//     } catch (processError) {\r\n//       console.error('❌ processBackendConfirmation failed:', processError);\r\n//       setPendingBackendConfirmation(true);\r\n      \r\n//       setTimeout(() => {\r\n//         console.log('🔄 Retrying processBackendConfirmation...');\r\n//         processBackendConfirmationWithDebug(txHash);\r\n//       }, 10000);\r\n//     }\r\n//   };\r\n\r\n//   // QR Payment verification function\r\n//   const handleQRPaymentVerification = async () => {\r\n//     if (!payment) {\r\n//       setError('Payment information is missing');\r\n//       return;\r\n//     }\r\n\r\n//     setPaymentStatus('loading');\r\n//     setStep('processing');\r\n//     setProcessingStartTime(Date.now());\r\n//     setError(null);\r\n\r\n//     try {\r\n//       log('Starting QR payment verification...');\r\n      \r\n//       const verificationResult = await verifyQRPayment(payment.id);\r\n      \r\n//       if (verificationResult.verified) {\r\n//         log('QR payment verified successfully:', verificationResult);\r\n        \r\n//         setTransactionHash(verificationResult.payment.transactionHash);\r\n//         setStep('success');\r\n//         setPaymentStatus('success');\r\n        \r\n//         if (onSuccess) {\r\n//           onSuccess(payment.id, verificationResult.payment.transactionHash, {\r\n//             network: selectedPaymentMethod.network,\r\n//             currency: selectedPaymentMethod.currency,\r\n//             amount: verificationResult.payment.amount,\r\n//             verificationType: 'QR_PAYMENT'\r\n//           });\r\n//         }\r\n//       } else {\r\n//         setError(verificationResult.message || 'Transaction not detected yet. Please wait a moment and try again.');\r\n//         setStep('confirm');\r\n//         setPaymentStatus('idle');\r\n//       }\r\n//     } catch (error) {\r\n//       log('QR payment verification error:', error);\r\n//       setError(error.message || 'Failed to verify payment. Please try again.');\r\n//       setStep('confirm');\r\n//       setPaymentStatus('error');\r\n//       if (onError) onError(error);\r\n//     }\r\n//   };\r\n\r\n//   // Expose methods via ref\r\n//   useImperativeHandle(ref, () => ({\r\n//     open: (paymentDetails) => {\r\n//       handleOpen(paymentDetails);\r\n//     },\r\n//     close: () => {\r\n//       handleClose();\r\n//     },\r\n//     getPayment: () => payment,\r\n//     getWalletConnection: () => walletConnection,\r\n//     getMerchantWallets: () => actualMerchantWallets,\r\n//     getMerchantFeePercentage: () => merchantFeePercentage,\r\n//     getMerchantSupportedNetworks: () => merchantSupportedNetworks,\r\n//     getMerchantSupportedTokens: () => merchantSupportedTokens\r\n//   }));\r\n\r\n//   // Handle opening the payment modal\r\n//   const handleOpen = async (paymentDetails) => {\r\n//     console.log('🚨 HANDLE OPEN DEBUG - START');\r\n//     console.log('paymentDetails received:', paymentDetails);\r\n    \r\n//     if (!paymentDetails || !paymentDetails.amount) {\r\n//       setError('Payment amount is required');\r\n//       if (onError) onError(new Error('Payment amount is required'));\r\n//       return;\r\n//     }\r\n\r\n//     setStoredPaymentDetails(paymentDetails);\r\n//     setPaymentStatus('idle');\r\n//     setIsOpen(true);\r\n//     setStep('select-currency');\r\n//     setError(null);\r\n    \r\n//     console.log('✅ Modal opened, waiting for user to select payment method');\r\n//   };\r\n\r\n//   // Handle closing the modal\r\n//   const handleClose = () => {\r\n//     setIsOpen(false);\r\n//     setTransactionHash(null);\r\n//     setWalletConnection(null);\r\n//     setSelectedPaymentMethod(null);\r\n//     setStoredPaymentDetails(null);\r\n//     setPayment(null);\r\n//     setStep('select-currency');\r\n//     setProcessingStartTime(null);\r\n//     setPendingBackendConfirmation(false);\r\n    \r\n//     if (onClose) onClose();\r\n//   };\r\n\r\n//   // Handle payment method selection\r\n//   const handlePaymentMethodSelect = async (paymentMethod) => {\r\n//     console.log('=== PAYMENT METHOD SELECTION DEBUG ===');\r\n//     console.log('1. Payment method selected:', paymentMethod);\r\n//     console.log('2. Stored payment details:', storedPaymentDetails);\r\n    \r\n//     if (!storedPaymentDetails) {\r\n//       setError('Payment details are missing');\r\n//       return;\r\n//     }\r\n    \r\n//     log('Payment method selected:', paymentMethod);\r\n//     setSelectedPaymentMethod(paymentMethod);\r\n    \r\n//     // Create payment with the selected network/currency\r\n//     try {\r\n//       setPaymentStatus('loading');\r\n      \r\n//       console.log('🚀 Creating payment with selected method:');\r\n//       console.log('Network:', paymentMethod.network);\r\n//       console.log('Currency:', paymentMethod.currency);\r\n      \r\n//       // Validate that the requested network is supported by merchant\r\n//       const isNetworkSupported = merchantSupportedNetworks.some(\r\n//         network => network.shortName === paymentMethod.network\r\n//       );\r\n      \r\n//       if (!isNetworkSupported) {\r\n//         throw new Error(`Network ${paymentMethod.network} is not configured for this merchant`);\r\n//       }\r\n      \r\n//       // Validate that the requested currency is supported by merchant\r\n//       const isTokenSupported = merchantSupportedTokens.some(\r\n//         token => token.symbol === paymentMethod.currency && \r\n//                 token.Network && \r\n//                 token.Network.shortName === paymentMethod.network\r\n//       );\r\n      \r\n//       if (!isTokenSupported) {\r\n//         throw new Error(`Token ${paymentMethod.currency} is not supported on ${paymentMethod.network} network for this merchant`);\r\n//       }\r\n      \r\n//       // Ensure we have the latest merchant wallet addresses\r\n//       let walletAddresses = actualMerchantWallets;\r\n//       if (Object.keys(walletAddresses).length === 0) {\r\n//         log('No wallet addresses found, fetching from backend...');\r\n//         walletAddresses = await getMerchantWallets();\r\n//         setActualMerchantWallets(walletAddresses);\r\n//       }\r\n\r\n//       log('Using wallet addresses:', walletAddresses);\r\n\r\n//       // Create payment with SELECTED network/currency\r\n//       const paymentResponse = await createPayment({\r\n//         amount: storedPaymentDetails.amount,\r\n//         currency: paymentMethod.currency,\r\n//         network: paymentMethod.network,\r\n//         customerEmail: storedPaymentDetails.customerEmail || customerEmail,\r\n//         callbackUrl: storedPaymentDetails.callbackUrl,\r\n//         metadata: {\r\n//           ...storedPaymentDetails.metadata,\r\n//           merchantWalletAddresses: walletAddresses\r\n//         },\r\n//         merchantWalletAddresses: walletAddresses\r\n//       });\r\n\r\n//       console.log('✅ Payment created with correct network:', paymentResponse.payment);\r\n      \r\n//       // Use the fee percentage from the payment response\r\n//       if (paymentResponse.payment.customFeePercentage) {\r\n//         const feeFromPayment = parseFloat(paymentResponse.payment.customFeePercentage);\r\n//         setMerchantFeePercentage(feeFromPayment);\r\n//         log('Updated fee percentage from payment response:', `${(feeFromPayment * 100).toFixed(2)}%`);\r\n//       }\r\n      \r\n//       setPayment(paymentResponse.payment);\r\n//       setPaymentStatus('idle');\r\n//       setError(null);\r\n      \r\n//       // Now proceed to confirm step\r\n//       setStep('confirm');\r\n      \r\n//       log('Payment created and proceeding to confirmation');\r\n//     } catch (err) {\r\n//       log('Error creating payment:', err);\r\n//       setError(err.message || 'Failed to create payment');\r\n//       setPaymentStatus('error');\r\n//       if (onError) onError(err);\r\n//     }\r\n    \r\n//     console.log('=== END PAYMENT METHOD SELECTION DEBUG ===');\r\n//   };\r\n\r\n//   // Handle back navigation\r\n//   const handleBack = () => {\r\n//     if (step === 'confirm') {\r\n//       setStep('select-currency');\r\n//       setWalletConnection(null);\r\n//       setPayment(null);\r\n//       setSelectedPaymentMethod(null);\r\n//     } else if (step === 'error') {\r\n//       setStep('confirm');\r\n//     }\r\n//   };\r\n\r\n//   // SIMPLIFIED: Wallet connection via Coinley Connect\r\n//   const handleConnectWallet = async (walletType) => {\r\n//     console.log('🔗 Connecting wallet via Coinley Connect:', walletType);\r\n\r\n//     if (!selectedPaymentMethod) {\r\n//       console.error('No payment method selected');\r\n//       setError('Please select a payment method first');\r\n//       return;\r\n//     }\r\n\r\n//     try {\r\n//       setError(null);\r\n      \r\n//       // Use the simplified connectWallet function\r\n//       const connection = await connectWallet(walletType, selectedPaymentMethod.network);\r\n      \r\n//       setWalletConnection(connection);\r\n//       setError(null);\r\n      \r\n//       console.log('🎉 Wallet connected successfully via Coinley Connect!', connection);\r\n      \r\n//     } catch (err) {\r\n//       console.error('❌ Wallet connection error:', err);\r\n//       setError(err.message || 'Failed to connect wallet');\r\n//     }\r\n//   };\r\n\r\n//   // SIMPLIFIED: Payment handling via Coinley Connect\r\n//   const handlePayment = async (isQRPayment = false) => {\r\n//     if (!payment || !selectedPaymentMethod) {\r\n//       setError('Missing payment information');\r\n//       return;\r\n//     }\r\n\r\n//     // Handle QR payment verification\r\n//     if (isQRPayment) {\r\n//       console.log('🔄 QR Payment - Starting verification process...');\r\n//       await handleQRPaymentVerification();\r\n//       return;\r\n//     }\r\n\r\n//     // Wallet payment flow via Coinley Connect\r\n//     if (!walletConnection && !testMode) {\r\n//       setError('Please connect your wallet first');\r\n//       return;\r\n//     }\r\n\r\n//     log('Starting payment process via Coinley Connect...');\r\n//     setPaymentStatus('loading');\r\n//     setTransactionHash(null);\r\n//     setStep('processing');\r\n//     setProcessingStartTime(Date.now());\r\n\r\n//     try {\r\n//       let txHash;\r\n\r\n//       if (testMode) {\r\n//         log('Test mode: Generating mock transaction...');\r\n//         txHash = `test_${Date.now().toString(16)}_${Math.random().toString(16).substring(2, 10)}`;\r\n//         await new Promise(resolve => setTimeout(resolve, 1000));\r\n//       } else {\r\n//         let merchantAddress;\r\n        \r\n//         if (payment.recipientWallet) {\r\n//           merchantAddress = payment.recipientWallet;\r\n//         } else if (actualMerchantWallets[selectedPaymentMethod.network]) {\r\n//           merchantAddress = actualMerchantWallets[selectedPaymentMethod.network];\r\n//         } else {\r\n//           throw new Error(`No merchant wallet address found for ${selectedPaymentMethod.network} network`);\r\n//         }\r\n\r\n//         log('Using merchant address for payment:', merchantAddress);\r\n//         log('Sending transaction through Coinley Connect...');\r\n        \r\n//         // Use the simplified sendTransaction function\r\n//         txHash = await sendTransaction(walletConnection, {\r\n//           to: merchantAddress,\r\n//           amount: payment.totalAmount || payment.amount,\r\n//           tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n//           tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals,\r\n//           currency: selectedPaymentMethod.currency,\r\n//           network: selectedPaymentMethod.network\r\n//         });\r\n//       }\r\n\r\n//       console.log('🎉 TRANSACTION HASH OBTAINED:', txHash);\r\n//       setTransactionHash(txHash);\r\n      \r\n//       console.log('📺 Setting step to success...');\r\n//       setStep('success');\r\n//       setPaymentStatus('success');\r\n      \r\n//       console.log('🔄 About to call processBackendConfirmation...');\r\n      \r\n//       try {\r\n//         console.log('🚀 CALLING processBackendConfirmation...');\r\n//         await processBackendConfirmationWithDebug(txHash);\r\n//       } catch (processError) {\r\n//         console.error('❌ processBackendConfirmation failed:', processError);\r\n//       }\r\n      \r\n//     } catch (err) {\r\n//       log('Payment error:', err);\r\n//       setError(err.message || 'Failed to process payment');\r\n//       setPaymentStatus('error');\r\n//       setStep('error');\r\n//       if (onError) onError(err);\r\n//     }\r\n//   };\r\n\r\n//   // Get supported wallets for current network\r\n//   const getSupportedWallets = () => {\r\n//     if (!selectedPaymentMethod) return [];\r\n//     return getSupportedWalletsForNetwork(selectedPaymentMethod.network);\r\n//   };\r\n\r\n//   // Filter supported networks based on merchant configuration\r\n//   const getEffectiveSupportedNetworks = () => {\r\n//     if (merchantSupportedNetworks.length === 0) {\r\n//       return supportedNetworks.length > 0 ? supportedNetworks : Object.values(NETWORK_TYPES);\r\n//     }\r\n    \r\n//     return merchantSupportedNetworks.map(network => network.shortName);\r\n//   };\r\n\r\n//   return (\r\n//     <>\r\n//       {isOpen && (\r\n//         <CoinleyModal\r\n//           isOpen={isOpen}\r\n//           onClose={handleClose}\r\n//           payment={payment}\r\n//           paymentStatus={paymentStatus}\r\n//           selectedPaymentMethod={selectedPaymentMethod}\r\n//           onPaymentMethodSelect={handlePaymentMethodSelect}\r\n//           onPayment={handlePayment}\r\n//           onBack={handleBack}\r\n//           error={error}\r\n//           theme={effectiveTheme}\r\n//           merchantName={merchantName}\r\n//           transactionHash={transactionHash}\r\n//           walletConnection={walletConnection}\r\n//           onConnectWallet={handleConnectWallet}\r\n//           testMode={testMode}\r\n//           supportedNetworks={getEffectiveSupportedNetworks()}\r\n//           availableWallets={availableWallets}\r\n//           supportedWallets={getSupportedWallets()}\r\n//           step={step}\r\n//           merchantWalletAddresses={actualMerchantWallets}\r\n//           debug={effectiveDebug}\r\n//           processingStartTime={processingStartTime}\r\n//           pendingBackendConfirmation={pendingBackendConfirmation}\r\n//           paymentNetwork={selectedPaymentMethod?.network}\r\n//           merchantFeePercentage={merchantFeePercentage}\r\n//         />\r\n//       )}\r\n//     </>\r\n//   );\r\n// });\r\n\r\n// CoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\n// export default CoinleyCheckout;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// coinley-sdk/src/components/CoinleyCheckout.jsx - Updated with wallet-connect-core integration\r\nimport React, { forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\nimport { useCoinley } from '../context/CoinleyContext';\r\nimport { useTheme } from '../context/ThemeContext';\r\nimport CoinleyModal from './CoinleyModal';\r\nimport { \r\n  createPayment, \r\n  processPayment, \r\n  verifyQRPayment,\r\n  getMerchantWallets, \r\n  getMerchantFeePercentage,\r\n  getMerchantNetworks,\r\n  getMerchantTokens \r\n} from '../services/api';\r\nimport { \r\n  // Modern wallet core imports\r\n  useWallet,\r\n  useWalletConnect,\r\n  useWalletTransaction,\r\n  useWalletDetection,\r\n  useTokenBalance,\r\n  useNetworkSwitch,\r\n  ConnectButton,\r\n  // Legacy imports for backward compatibility\r\n  connectWallet, \r\n  sendTransaction, \r\n  detectWallets,\r\n  getSupportedWalletsForNetwork,\r\n  NETWORK_TYPES,\r\n  WALLET_TYPES,\r\n  isEvmNetwork\r\n} from '../services/walletCoreService';\r\n\r\n/**\r\n * Enhanced Coinley checkout with better error handling and direct connections\r\n */\r\nconst CoinleyCheckout = forwardRef(({ \r\n  apiKey,\r\n  apiSecret,\r\n  apiUrl,\r\n  customerEmail,\r\n  merchantName = 'Merchant',\r\n  merchantWalletAddresses = {},\r\n  onSuccess,\r\n  onError,\r\n  onClose,\r\n  theme,\r\n  autoOpen = false,\r\n  debug = false,\r\n  testMode = false,\r\n  supportedNetworks = [],\r\n  preferredNetwork = NETWORK_TYPES.ETHEREUM,\r\n  preferredWallet = WALLET_TYPES.METAMASK,\r\n  confirmations = 1,\r\n  fastMode = true\r\n}, ref) => {\r\n  // Context\r\n  const coinleyContext = useCoinley();\r\n  const { theme: contextTheme } = useTheme();\r\n  \r\n  // Modern wallet core hooks (for EVM networks)\r\n  const { \r\n    address: walletAddress, \r\n    isConnected: isWalletConnected, \r\n    chainId: currentChainId,\r\n    balanceFormatted: nativeBalance,\r\n    disconnect: disconnectWallet\r\n  } = useWallet();\r\n  \r\n  const { connectWallet: connectEvmWallet, isPending: isConnecting } = useWalletConnect();\r\n  const { sendTransaction: sendEvmTransaction, isPending: isSending } = useWalletTransaction();\r\n  const { detectedWallets } = useWalletDetection();\r\n  const { switchChain } = useNetworkSwitch();\r\n  \r\n  // State\r\n  const [isOpen, setIsOpen] = useState(autoOpen);\r\n  const [payment, setPayment] = useState(null);\r\n  const [paymentStatus, setPaymentStatus] = useState('idle');\r\n  const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null);\r\n  const [error, setError] = useState(null);\r\n  const [transactionHash, setTransactionHash] = useState(null);\r\n  const [walletConnection, setWalletConnection] = useState(null);\r\n  const [availableWallets, setAvailableWallets] = useState({});\r\n  const [step, setStep] = useState('select-currency');\r\n  const [actualMerchantWallets, setActualMerchantWallets] = useState({});\r\n  const [merchantFeePercentage, setMerchantFeePercentage] = useState(0.0175);\r\n  const [storedPaymentDetails, setStoredPaymentDetails] = useState(null);\r\n  const [merchantSupportedNetworks, setMerchantSupportedNetworks] = useState([]);\r\n  const [merchantSupportedTokens, setMerchantSupportedTokens] = useState([]);\r\n  const [processingStartTime, setProcessingStartTime] = useState(null);\r\n  const [pendingBackendConfirmation, setPendingBackendConfirmation] = useState(false);\r\n  \r\n  // Use the component props or fallback to context values\r\n  const effectiveApiKey = apiKey || coinleyContext?.apiKey;\r\n  const effectiveApiSecret = apiSecret || coinleyContext?.apiSecret;\r\n  const effectiveApiUrl = apiUrl || coinleyContext?.apiUrl;\r\n  const effectiveTheme = theme || contextTheme;\r\n  const effectiveDebug = debug || coinleyContext?.debug;\r\n\r\n  // Debug logging helper\r\n  const log = (message, data) => {\r\n    if (effectiveDebug) {\r\n      console.log(`[Coinley SDK] ${message}`, data);\r\n    }\r\n  };\r\n\r\n  // ✅ ENHANCED: Modern wallet detection with wallet-connect-core integration\r\n  useEffect(() => {\r\n    const detectWalletsEnhanced = async () => {\r\n      try {\r\n        log('Detecting wallets via wallet-connect-core and legacy methods...');\r\n        \r\n        // Combine modern detection (EVM wallets) with legacy detection (non-EVM)\r\n        const [modernWallets, legacyWallets] = await Promise.allSettled([\r\n          // Modern detection from wallet-connect-core\r\n          Promise.resolve(detectedWallets || []),\r\n          // Legacy detection for non-EVM wallets\r\n          detectWallets()\r\n        ]);\r\n        \r\n        // Convert modern detected wallets to the expected format\r\n        const evmWallets = {};\r\n        if (modernWallets.status === 'fulfilled' && modernWallets.value) {\r\n          modernWallets.value.forEach(wallet => {\r\n            if (wallet.name.toLowerCase().includes('metamask')) {\r\n              evmWallets[WALLET_TYPES.METAMASK] = true;\r\n            } else if (wallet.name.toLowerCase().includes('coinbase')) {\r\n              evmWallets[WALLET_TYPES.COINBASE_WALLET] = true;\r\n            } else if (wallet.name.toLowerCase().includes('trust')) {\r\n              evmWallets[WALLET_TYPES.TRUST_WALLET] = true;\r\n            }\r\n          });\r\n        }\r\n        \r\n        // Merge with legacy detection results\r\n        const legacyResult = legacyWallets.status === 'fulfilled' ? legacyWallets.value : {};\r\n        \r\n        const allWallets = {\r\n          ...legacyResult,\r\n          ...evmWallets\r\n        };\r\n        \r\n        setAvailableWallets(allWallets);\r\n        log('Available wallets detected:', allWallets);\r\n        \r\n      } catch (error) {\r\n        console.error('Error detecting wallets:', error);\r\n        // Fallback to basic detection\r\n        const fallbackWallets = {\r\n          [WALLET_TYPES.METAMASK]: typeof window.ethereum !== 'undefined',\r\n          [WALLET_TYPES.PHANTOM]: typeof window.solana !== 'undefined',\r\n          [WALLET_TYPES.TRONLINK]: typeof window.tronWeb !== 'undefined',\r\n          [WALLET_TYPES.TRUST_WALLET]: false,\r\n          [WALLET_TYPES.LUTE]: false\r\n        };\r\n        setAvailableWallets(fallbackWallets);\r\n        log('Using fallback wallet detection:', fallbackWallets);\r\n      }\r\n    };\r\n    \r\n    detectWalletsEnhanced();\r\n  }, [effectiveDebug, detectedWallets]);\r\n\r\n  // ✅ NEW: Sync wallet connection state with modern wallet core\r\n  useEffect(() => {\r\n    if (isWalletConnected && walletAddress && !walletConnection?.provider) {\r\n      // Create wallet connection object from modern wallet state\r\n      const modernConnection = {\r\n        walletType: 'modern',\r\n        address: walletAddress,\r\n        network: selectedPaymentMethod?.network || 'ethereum',\r\n        isConnected: isWalletConnected,\r\n        chainId: currentChainId,\r\n        provider: 'wallet-connect-core'\r\n      };\r\n      \r\n      setWalletConnection(modernConnection);\r\n      log('✅ Synced modern wallet connection state:', modernConnection);\r\n    } else if (!isWalletConnected && walletConnection?.provider === 'wallet-connect-core') {\r\n      // Clear connection if modern wallet disconnected\r\n      setWalletConnection(null);\r\n      log('✅ Cleared disconnected wallet connection state');\r\n    }\r\n  }, [isWalletConnected, walletAddress, currentChainId, selectedPaymentMethod?.network]);\r\n\r\n  // ✅ ENHANCED: Better merchant data loading with error handling\r\n  useEffect(() => {\r\n    const fetchMerchantData = async () => {\r\n      if (!effectiveApiKey || !effectiveApiSecret) {\r\n        log('Missing API credentials, skipping merchant data fetch');\r\n        return;\r\n      }\r\n\r\n      try {\r\n        log('Fetching merchant data from backend...');\r\n        \r\n        const [wallets, feePercentage, networks, tokens] = await Promise.allSettled([\r\n          getMerchantWallets(),\r\n          getMerchantFeePercentage(),\r\n          getMerchantNetworks(),\r\n          getMerchantTokens()\r\n        ]);\r\n        \r\n        // Handle wallets\r\n        if (wallets.status === 'fulfilled') {\r\n          setActualMerchantWallets(wallets.value || {});\r\n          log('✅ Merchant wallets loaded:', Object.keys(wallets.value || {}));\r\n        } else {\r\n          console.warn('⚠️ Failed to load merchant wallets:', wallets.reason);\r\n          setActualMerchantWallets(merchantWalletAddresses);\r\n        }\r\n        \r\n        // Handle fee percentage\r\n        if (feePercentage.status === 'fulfilled') {\r\n          setMerchantFeePercentage(feePercentage.value || 0.0175);\r\n          log('✅ Merchant fee percentage loaded:', `${((feePercentage.value || 0.0175) * 100).toFixed(2)}%`);\r\n        } else {\r\n          console.warn('⚠️ Failed to load merchant fee percentage:', feePercentage.reason);\r\n          setMerchantFeePercentage(0.0175);\r\n        }\r\n        \r\n        // Handle networks\r\n        if (networks.status === 'fulfilled') {\r\n          setMerchantSupportedNetworks(networks.value || []);\r\n          log('✅ Merchant networks loaded:', networks.value?.length || 0);\r\n        } else {\r\n          console.warn('⚠️ Failed to load merchant networks:', networks.reason);\r\n          setMerchantSupportedNetworks([]);\r\n        }\r\n        \r\n        // Handle tokens\r\n        if (tokens.status === 'fulfilled') {\r\n          setMerchantSupportedTokens(tokens.value || []);\r\n          log('✅ Merchant tokens loaded:', tokens.value?.length || 0);\r\n        } else {\r\n          console.warn('⚠️ Failed to load merchant tokens:', tokens.reason);\r\n          setMerchantSupportedTokens([]);\r\n        }\r\n        \r\n        log('Merchant data loading completed');\r\n        \r\n      } catch (error) {\r\n        console.error('❌ Critical error fetching merchant data:', error);\r\n        // Use fallback values\r\n        setActualMerchantWallets(merchantWalletAddresses || {});\r\n        setMerchantFeePercentage(0.0175);\r\n        setMerchantSupportedNetworks([]);\r\n        setMerchantSupportedTokens([]);\r\n      }\r\n    };\r\n\r\n    fetchMerchantData();\r\n  }, [effectiveApiKey, effectiveApiSecret, merchantWalletAddresses]);\r\n\r\n  // Backend confirmation function\r\n  const processBackendConfirmationWithDebug = async (txHash) => {\r\n    console.log('🔍 processBackendConfirmationWithDebug called with:', txHash);\r\n    \r\n    if (!payment || !selectedPaymentMethod || !txHash) {\r\n      console.error('❌ Missing required data for backend confirmation');\r\n      return;\r\n    }\r\n    \r\n    try {\r\n      const processResponse = await processPayment({\r\n        paymentId: payment.id,\r\n        transactionHash: txHash,\r\n        network: selectedPaymentMethod.network,\r\n        senderAddress: walletConnection?.address || 'EXTERNAL_WALLET'\r\n      });\r\n\r\n      console.log('✅ Payment processed successfully with backend:', processResponse);\r\n      setPendingBackendConfirmation(false);\r\n      \r\n      setPaymentStatus('success');\r\n      \r\n      if (onSuccess) {\r\n        onSuccess(payment.id, txHash, {\r\n          network: selectedPaymentMethod.network,\r\n          currency: selectedPaymentMethod.currency,\r\n          amount: payment.totalAmount || payment.amount,\r\n          processResponse: processResponse\r\n        });\r\n      }\r\n    } catch (processError) {\r\n      console.error('❌ processBackendConfirmation failed:', processError);\r\n      setPendingBackendConfirmation(true);\r\n      \r\n      setTimeout(() => {\r\n        console.log('🔄 Retrying processBackendConfirmation...');\r\n        processBackendConfirmationWithDebug(txHash);\r\n      }, 10000);\r\n    }\r\n  };\r\n\r\n  // QR Payment verification function\r\n  const handleQRPaymentVerification = async () => {\r\n    if (!payment) {\r\n      setError('Payment information is missing');\r\n      return;\r\n    }\r\n\r\n    setPaymentStatus('loading');\r\n    setStep('processing');\r\n    setProcessingStartTime(Date.now());\r\n    setError(null);\r\n\r\n    try {\r\n      log('Starting QR payment verification...');\r\n      \r\n      const verificationResult = await verifyQRPayment(payment.id);\r\n      \r\n      if (verificationResult.verified) {\r\n        log('QR payment verified successfully:', verificationResult);\r\n        \r\n        setTransactionHash(verificationResult.payment.transactionHash);\r\n        setStep('success');\r\n        setPaymentStatus('success');\r\n        \r\n        if (onSuccess) {\r\n          onSuccess(payment.id, verificationResult.payment.transactionHash, {\r\n            network: selectedPaymentMethod.network,\r\n            currency: selectedPaymentMethod.currency,\r\n            amount: verificationResult.payment.amount,\r\n            verificationType: 'QR_PAYMENT'\r\n          });\r\n        }\r\n      } else {\r\n        setError(verificationResult.message || 'Transaction not detected yet. Please wait a moment and try again.');\r\n        setStep('confirm');\r\n        setPaymentStatus('idle');\r\n      }\r\n    } catch (error) {\r\n      log('QR payment verification error:', error);\r\n      setError(error.message || 'Failed to verify payment. Please try again.');\r\n      setStep('confirm');\r\n      setPaymentStatus('error');\r\n      if (onError) onError(error);\r\n    }\r\n  };\r\n\r\n  // Expose methods via ref\r\n  useImperativeHandle(ref, () => ({\r\n    open: (paymentDetails) => {\r\n      handleOpen(paymentDetails);\r\n    },\r\n    close: () => {\r\n      handleClose();\r\n    },\r\n    getPayment: () => payment,\r\n    getWalletConnection: () => walletConnection,\r\n    getMerchantWallets: () => actualMerchantWallets,\r\n    getMerchantFeePercentage: () => merchantFeePercentage,\r\n    getMerchantSupportedNetworks: () => merchantSupportedNetworks,\r\n    getMerchantSupportedTokens: () => merchantSupportedTokens\r\n  }));\r\n\r\n  // Handle opening the payment modal\r\n  const handleOpen = async (paymentDetails) => {\r\n    console.log('🚨 HANDLE OPEN DEBUG - START');\r\n    console.log('paymentDetails received:', paymentDetails);\r\n    \r\n    if (!paymentDetails || !paymentDetails.amount) {\r\n      setError('Payment amount is required');\r\n      if (onError) onError(new Error('Payment amount is required'));\r\n      return;\r\n    }\r\n\r\n    setStoredPaymentDetails(paymentDetails);\r\n    setPaymentStatus('idle');\r\n    setIsOpen(true);\r\n    setStep('select-currency');\r\n    setError(null);\r\n    \r\n    console.log('✅ Modal opened, waiting for user to select payment method');\r\n  };\r\n\r\n  // Handle closing the modal\r\n  const handleClose = () => {\r\n    setIsOpen(false);\r\n    setTransactionHash(null);\r\n    setWalletConnection(null);\r\n    setSelectedPaymentMethod(null);\r\n    setStoredPaymentDetails(null);\r\n    setPayment(null);\r\n    setStep('select-currency');\r\n    setProcessingStartTime(null);\r\n    setPendingBackendConfirmation(false);\r\n    \r\n    if (onClose) onClose();\r\n  };\r\n\r\n  // Handle payment method selection\r\n  const handlePaymentMethodSelect = async (paymentMethod) => {\r\n    console.log('=== PAYMENT METHOD SELECTION DEBUG ===');\r\n    console.log('1. Payment method selected:', paymentMethod);\r\n    console.log('2. Stored payment details:', storedPaymentDetails);\r\n    \r\n    if (!storedPaymentDetails) {\r\n      setError('Payment details are missing');\r\n      return;\r\n    }\r\n    \r\n    log('Payment method selected:', paymentMethod);\r\n    setSelectedPaymentMethod(paymentMethod);\r\n    \r\n    // Create payment with the selected network/currency\r\n    try {\r\n      setPaymentStatus('loading');\r\n      \r\n      console.log('🚀 Creating payment with selected method:');\r\n      console.log('Network:', paymentMethod.network);\r\n      console.log('Currency:', paymentMethod.currency);\r\n      \r\n      // ✅ ENHANCED: Better validation with fallback\r\n      let isNetworkSupported = false;\r\n      let isTokenSupported = false;\r\n      \r\n      if (merchantSupportedNetworks.length > 0) {\r\n        isNetworkSupported = merchantSupportedNetworks.some(\r\n          network => network.shortName === paymentMethod.network\r\n        );\r\n      } else {\r\n        // If no networks configured, allow basic networks\r\n        isNetworkSupported = ['ethereum', 'bsc', 'solana'].includes(paymentMethod.network);\r\n        console.warn('⚠️ No merchant networks configured, using fallback validation');\r\n      }\r\n      \r\n      if (merchantSupportedTokens.length > 0) {\r\n        isTokenSupported = merchantSupportedTokens.some(\r\n          token => token.symbol === paymentMethod.currency && \r\n                  token.Network && \r\n                  token.Network.shortName === paymentMethod.network\r\n        );\r\n      } else {\r\n        // If no tokens configured, allow basic stablecoins\r\n        isTokenSupported = ['USDT', 'USDC'].includes(paymentMethod.currency);\r\n        console.warn('⚠️ No merchant tokens configured, using fallback validation');\r\n      }\r\n      \r\n      if (!isNetworkSupported) {\r\n        throw new Error(`Network ${paymentMethod.network} is not configured for this merchant`);\r\n      }\r\n      \r\n      if (!isTokenSupported) {\r\n        throw new Error(`Token ${paymentMethod.currency} is not supported on ${paymentMethod.network} network for this merchant`);\r\n      }\r\n      \r\n      // Ensure we have the latest merchant wallet addresses\r\n      let walletAddresses = actualMerchantWallets;\r\n      if (Object.keys(walletAddresses).length === 0) {\r\n        log('No wallet addresses found, fetching from backend...');\r\n        try {\r\n          walletAddresses = await getMerchantWallets();\r\n          setActualMerchantWallets(walletAddresses);\r\n        } catch (error) {\r\n          console.warn('⚠️ Failed to fetch wallet addresses:', error);\r\n          walletAddresses = merchantWalletAddresses || {};\r\n        }\r\n      }\r\n\r\n      log('Using wallet addresses:', walletAddresses);\r\n\r\n      // Create payment with SELECTED network/currency\r\n      const paymentResponse = await createPayment({\r\n        amount: storedPaymentDetails.amount,\r\n        currency: paymentMethod.currency,\r\n        network: paymentMethod.network,\r\n        customerEmail: storedPaymentDetails.customerEmail || customerEmail,\r\n        callbackUrl: storedPaymentDetails.callbackUrl,\r\n        metadata: {\r\n          ...storedPaymentDetails.metadata,\r\n          merchantWalletAddresses: walletAddresses\r\n        },\r\n        merchantWalletAddresses: walletAddresses\r\n      });\r\n\r\n      console.log('✅ Payment created with correct network:', paymentResponse.payment);\r\n      \r\n      // Use the fee percentage from the payment response\r\n      if (paymentResponse.payment.customFeePercentage) {\r\n        const feeFromPayment = parseFloat(paymentResponse.payment.customFeePercentage);\r\n        setMerchantFeePercentage(feeFromPayment);\r\n        log('Updated fee percentage from payment response:', `${(feeFromPayment * 100).toFixed(2)}%`);\r\n      }\r\n      \r\n      setPayment(paymentResponse.payment);\r\n      setPaymentStatus('idle');\r\n      setError(null);\r\n      \r\n      // Now proceed to confirm step\r\n      setStep('confirm');\r\n      \r\n      log('Payment created and proceeding to confirmation');\r\n    } catch (err) {\r\n      log('Error creating payment:', err);\r\n      setError(err.message || 'Failed to create payment');\r\n      setPaymentStatus('error');\r\n      if (onError) onError(err);\r\n    }\r\n    \r\n    console.log('=== END PAYMENT METHOD SELECTION DEBUG ===');\r\n  };\r\n\r\n  // Handle back navigation\r\n  const handleBack = () => {\r\n    if (step === 'confirm') {\r\n      setStep('select-currency');\r\n      setWalletConnection(null);\r\n      setPayment(null);\r\n      setSelectedPaymentMethod(null);\r\n    } else if (step === 'error') {\r\n      setStep('confirm');\r\n    }\r\n  };\r\n\r\n  // ✅ ENHANCED: Modern wallet connection with wallet-connect-core integration\r\n  const handleConnectWallet = async (walletType) => {\r\n    console.log('🔗 Connecting wallet with modern core:', walletType);\r\n\r\n    if (!selectedPaymentMethod) {\r\n      console.error('No payment method selected');\r\n      setError('Please select a payment method first');\r\n      return;\r\n    }\r\n\r\n    try {\r\n      setError(null);\r\n      \r\n      // Check if it's an EVM network that can use wallet-connect-core\r\n      if (isEvmNetwork(selectedPaymentMethod.network)) {\r\n        log('Using modern wallet-connect-core for EVM network:', selectedPaymentMethod.network);\r\n        \r\n        // Use modern wallet core for EVM networks\r\n        try {\r\n          await connectEvmWallet(walletType);\r\n          \r\n          // Create connection object for compatibility\r\n          const connection = {\r\n            walletType,\r\n            address: walletAddress,\r\n            network: selectedPaymentMethod.network,\r\n            isConnected: isWalletConnected,\r\n            chainId: currentChainId,\r\n            provider: 'wallet-connect-core'\r\n          };\r\n          \r\n          setWalletConnection(connection);\r\n          log('🎉 Modern wallet connected successfully!', connection);\r\n          \r\n        } catch (evmError) {\r\n          log('Modern connection failed, trying legacy fallback...');\r\n          throw evmError;\r\n        }\r\n      } else {\r\n        // Use legacy connection for non-EVM networks\r\n        log('Using legacy connection for non-EVM network:', selectedPaymentMethod.network);\r\n        const connection = await connectWallet(walletType, selectedPaymentMethod.network);\r\n        setWalletConnection(connection);\r\n        log('🎉 Legacy wallet connected successfully!', connection);\r\n      }\r\n      \r\n      setError(null);\r\n      \r\n    } catch (err) {\r\n      console.error('❌ Wallet connection error:', err);\r\n      setError(err.message || 'Failed to connect wallet');\r\n    }\r\n  };\r\n\r\n  // ✅ ENHANCED: Better payment handling\r\n  const handlePayment = async (isQRPayment = false) => {\r\n    if (!payment || !selectedPaymentMethod) {\r\n      setError('Missing payment information');\r\n      return;\r\n    }\r\n\r\n    // Handle QR payment verification\r\n    if (isQRPayment) {\r\n      console.log('🔄 QR Payment - Starting verification process...');\r\n      await handleQRPaymentVerification();\r\n      return;\r\n    }\r\n\r\n    // Wallet payment flow\r\n    if (!walletConnection && !testMode) {\r\n      setError('Please connect your wallet first');\r\n      return;\r\n    }\r\n\r\n    log('Starting payment process...');\r\n    setPaymentStatus('loading');\r\n    setTransactionHash(null);\r\n    setStep('processing');\r\n    setProcessingStartTime(Date.now());\r\n\r\n    try {\r\n      let txHash;\r\n\r\n      if (testMode) {\r\n        log('Test mode: Generating mock transaction...');\r\n        txHash = `test_${Date.now().toString(16)}_${Math.random().toString(16).substring(2, 10)}`;\r\n        await new Promise(resolve => setTimeout(resolve, 1000));\r\n      } else {\r\n        let merchantAddress;\r\n        \r\n        if (payment.recipientWallet) {\r\n          merchantAddress = payment.recipientWallet;\r\n        } else if (actualMerchantWallets[selectedPaymentMethod.network]) {\r\n          merchantAddress = actualMerchantWallets[selectedPaymentMethod.network];\r\n        } else {\r\n          throw new Error(`No merchant wallet address found for ${selectedPaymentMethod.network} network`);\r\n        }\r\n\r\n        log('Using merchant address for payment:', merchantAddress);\r\n        log('Sending transaction...');\r\n        \r\n        // ✅ Use modern or legacy transaction sending based on network type\r\n        if (isEvmNetwork(selectedPaymentMethod.network) && walletConnection?.provider === 'wallet-connect-core') {\r\n          log('Using modern wallet-connect-core transaction...');\r\n          \r\n          // For EVM networks, use modern transaction hook\r\n          try {\r\n            txHash = await sendEvmTransaction({\r\n              to: merchantAddress,\r\n              value: selectedPaymentMethod.tokenConfig?.address ? '0x0' : \r\n                     `0x${(parseFloat(payment.totalAmount || payment.amount) * Math.pow(10, 18)).toString(16)}`,\r\n              data: selectedPaymentMethod.tokenConfig?.address ? \r\n                    // Token transfer data would go here (ERC-20 transfer)\r\n                    '0x' : undefined\r\n            });\r\n          } catch (evmTxError) {\r\n            log('Modern transaction failed, falling back to legacy...');\r\n            throw evmTxError;\r\n          }\r\n        } else {\r\n          // Use legacy transaction function for non-EVM or fallback\r\n          log('Using legacy transaction method...');\r\n          txHash = await sendTransaction(walletConnection, {\r\n            to: merchantAddress,\r\n            amount: payment.totalAmount || payment.amount,\r\n            tokenAddress: selectedPaymentMethod.tokenConfig?.address,\r\n            tokenDecimals: selectedPaymentMethod.tokenConfig?.decimals,\r\n            currency: selectedPaymentMethod.currency,\r\n            network: selectedPaymentMethod.network\r\n          });\r\n        }\r\n      }\r\n\r\n      console.log('🎉 TRANSACTION HASH OBTAINED:', txHash);\r\n      setTransactionHash(txHash);\r\n      \r\n      console.log('📺 Setting step to success...');\r\n      setStep('success');\r\n      setPaymentStatus('success');\r\n      \r\n      console.log('🔄 About to call processBackendConfirmation...');\r\n      \r\n      try {\r\n        console.log('🚀 CALLING processBackendConfirmation...');\r\n        await processBackendConfirmationWithDebug(txHash);\r\n      } catch (processError) {\r\n        console.error('❌ processBackendConfirmation failed:', processError);\r\n      }\r\n      \r\n    } catch (err) {\r\n      log('Payment error:', err);\r\n      setError(err.message || 'Failed to process payment');\r\n      setPaymentStatus('error');\r\n      setStep('error');\r\n      if (onError) onError(err);\r\n    }\r\n  };\r\n\r\n  // Get supported wallets for current network\r\n  const getSupportedWallets = () => {\r\n    if (!selectedPaymentMethod) return [];\r\n    return getSupportedWalletsForNetwork(selectedPaymentMethod.network);\r\n  };\r\n\r\n  // ✅ ENHANCED: Better network filtering with fallbacks\r\n  const getEffectiveSupportedNetworks = () => {\r\n    if (merchantSupportedNetworks.length === 0) {\r\n      console.warn('⚠️ No merchant networks configured, using fallback networks');\r\n      if (supportedNetworks.length > 0) {\r\n        return supportedNetworks;\r\n      }\r\n      // Ultimate fallback\r\n      return ['ethereum', 'bsc', 'solana'];\r\n    }\r\n    \r\n    return merchantSupportedNetworks.map(network => network.shortName);\r\n  };\r\n\r\n  return (\r\n    <>\r\n      {isOpen && (\r\n        <CoinleyModal\r\n          isOpen={isOpen}\r\n          onClose={handleClose}\r\n          payment={payment}\r\n          paymentStatus={paymentStatus}\r\n          selectedPaymentMethod={selectedPaymentMethod}\r\n          onPaymentMethodSelect={handlePaymentMethodSelect}\r\n          onPayment={handlePayment}\r\n          onBack={handleBack}\r\n          error={error}\r\n          theme={effectiveTheme}\r\n          merchantName={merchantName}\r\n          transactionHash={transactionHash}\r\n          walletConnection={walletConnection}\r\n          onConnectWallet={handleConnectWallet}\r\n          testMode={testMode}\r\n          supportedNetworks={getEffectiveSupportedNetworks()}\r\n          availableWallets={availableWallets}\r\n          supportedWallets={getSupportedWallets()}\r\n          step={step}\r\n          merchantWalletAddresses={actualMerchantWallets}\r\n          debug={effectiveDebug}\r\n          processingStartTime={processingStartTime}\r\n          pendingBackendConfirmation={pendingBackendConfirmation}\r\n          paymentNetwork={selectedPaymentMethod?.network}\r\n          merchantFeePercentage={merchantFeePercentage}\r\n        />\r\n      )}\r\n    </>\r\n  );\r\n});\r\n\r\nCoinleyCheckout.displayName = 'CoinleyCheckout';\r\n\r\nexport default CoinleyCheckout;","// // src/index.js - Updated exports with merchant filtering functions\r\n// // Import styles first\r\n// import './styles.css';\r\n\r\n// // Export wallet service utilities and constants\r\n// export {\r\n//   connectWallet,\r\n//   sendTransaction,\r\n//   detectWallets,\r\n//   getSupportedWalletsForNetwork,\r\n//   getWalletInstallUrl,\r\n//   NETWORK_TYPES,\r\n//   WALLET_TYPES,\r\n//   TOKEN_CONFIG,\r\n//   NETWORK_CONFIG\r\n// } from './services/walletService';\r\n\r\n// // Export API functions (Updated with new merchant filtering functions)\r\n// export {\r\n//   createPayment,\r\n//   getPayment,\r\n//   processPayment,\r\n//   getSupportedNetworks,\r\n//   getMerchantWallets,\r\n//   getMerchantFeePercentage,\r\n//   getMerchantNetworks, // New export for merchant's configured networks\r\n//   getMerchantTokens, // New export for merchant's supported tokens\r\n//   isMerchantNetworkSupported, // New export to check network support\r\n//   isMerchantTokenSupported, // New export to check token support\r\n//   validateWalletAddress,\r\n//   generateMockTransactionHash\r\n// } from './services/api';\r\n\r\n// // Export context providers\r\n// export { ThemeProvider } from './context/ThemeContext';\r\n// export { CoinleyProvider, useCoinley } from './context/CoinleyContext';\r\n\r\n// // Export components\r\n// export { default as QRCode } from './components/QRCode';\r\n// export { default as PaymentStatus } from './components/PaymentStatus';\r\n// export { default as PaymentMethods } from './components/PaymentMethods';\r\n// export { default as CoinleyModal } from './components/CoinleyModal';\r\n// export { default as CoinleyCheckout } from './components/CoinleyCheckout';\r\n\r\n// // Export constants\r\n// export const DEFAULT_CONFIG = {\r\n//   apiUrl: 'https://coinleyserver-production.up.railway.app',\r\n//   debug: false,\r\n//   testMode: false,\r\n//   theme: 'light',\r\n//   supportedNetworks: ['ethereum', 'bsc', 'tron', 'algorand']\r\n// };\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// src/index.js - Updated with new networks support\r\n// Import styles first\r\nimport './styles.css';\r\n\r\n// Export wallet service utilities and constants - Updated with new networks\r\nexport {\r\n  // Modern wallet core hooks and components\r\n  useWallet,\r\n  useWalletConnect,\r\n  useWalletTransaction,\r\n  useWalletDetection,\r\n  useTokenBalance,\r\n  useNetworkSwitch,\r\n  useWalletSign,\r\n  useWalletSignTypedData,\r\n  useWalletModal,\r\n  ConnectButton,\r\n  WalletModal,\r\n  CoinleyWalletProvider,\r\n  initializeWalletCore,\r\n  getWalletConfig,\r\n  // Compatibility functions (legacy + modern hybrid)\r\n  connectWallet,\r\n  sendTransaction,\r\n  detectWallets,\r\n  getSupportedWalletsForNetwork,\r\n  getWalletInstallUrl,\r\n  disconnectWallet,\r\n  isEvmNetwork,\r\n  // Constants\r\n  NETWORK_TYPES,\r\n  WALLET_TYPES,\r\n  TOKEN_CONFIG,\r\n  NETWORK_CONFIG,\r\n  NETWORK_WALLET_MAP\r\n} from './services/walletCoreService';\r\n\r\n// Legacy wallet service exports (for backward compatibility)\r\nexport {\r\n  debugWalletEnvironment,\r\n  getTokenConfig,\r\n  validateWalletAddress,\r\n  generateMockTransactionHash,\r\n  detectWalletsWithRetry,\r\n  sendTokenTransaction,\r\n  sendERC20Transaction,\r\n  sendNativeTransaction\r\n} from './services/walletService';\r\n\r\n// Export API functions\r\nexport {\r\n  createPayment,\r\n  getPayment,\r\n  processPayment,\r\n  verifyQRPayment,\r\n  getSupportedNetworks,\r\n  getMerchantWallets,\r\n  getMerchantFeePercentage,\r\n  getMerchantNetworks,\r\n  getMerchantTokens,\r\n  isMerchantNetworkSupported,\r\n  isMerchantTokenSupported,\r\n  initializeApi,\r\n  getApiConfig\r\n} from './services/api';\r\n\r\n// Export context providers\r\nexport { ThemeProvider } from './context/ThemeContext';\r\nexport { CoinleyProvider, useCoinley } from './context/CoinleyContext';\r\n\r\n// Export components\r\nexport { default as QRCode } from './components/QRCode';\r\nexport { default as PaymentStatus } from './components/PaymentStatus';\r\nexport { default as PaymentMethods } from './components/PaymentMethods';\r\nexport { default as CoinleyModal } from './components/CoinleyModal';\r\nexport { default as CoinleyCheckout } from './components/CoinleyCheckout';\r\n\r\n// Export icon components\r\nexport {\r\n  EthIcon,\r\n  TronIcon,\r\n  AlgorandIcon,\r\n  SolanaIcon,\r\n  BscIcon,\r\n  PyusdIcon,\r\n  UsdpIcon\r\n} from './components/icons';\r\n\r\n// ✅ UPDATED: Enhanced default config with new networks\r\nexport const DEFAULT_CONFIG = {\r\n  apiUrl: 'http://localhost:9000',\r\n  debug: false,\r\n  testMode: false,\r\n  theme: 'light',\r\n  // ✅ UPDATED: Include all supported networks\r\n  supportedNetworks: [\r\n    'ethereum', \r\n    'bsc', \r\n    'tron', \r\n    'algorand', \r\n    'solana',\r\n    'optimism',\r\n    'arbitrum', \r\n    'polygon', \r\n    'avalanche', \r\n    'celo'\r\n  ]\r\n};\r\n\r\n// Version info\r\nexport const VERSION = '1.4.0'; // Updated version for new networks\r\n\r\n// Main initialization function\r\nexport const initializeCoinley = async (config) => {\r\n  const { initializeApi } = await import('./services/api');\r\n  return initializeApi(config);\r\n};\r\n\r\n// ✅ NEW: Network utilities export\r\nexport const SUPPORTED_NETWORKS = {\r\n  ETHEREUM: 'ethereum',\r\n  BSC: 'bsc',\r\n  TRON: 'tron',\r\n  ALGORAND: 'algorand',\r\n  SOLANA: 'solana',\r\n  OPTIMISM: 'optimism',\r\n  ARBITRUM: 'arbitrum',\r\n  POLYGON: 'polygon',\r\n  AVALANCHE: 'avalanche',\r\n  CELO: 'celo'\r\n};\r\n\r\n// ✅ NEW: Helper functions for new networks\r\nexport const getNetworkDisplayName = (networkShortName) => {\r\n  const names = {\r\n    ethereum: 'Ethereum',\r\n    bsc: 'Binance Smart Chain',\r\n    tron: 'TRON',\r\n    algorand: 'Algorand',\r\n    solana: 'Solana',\r\n    optimism: 'Optimism',\r\n    arbitrum: 'Arbitrum One',\r\n    polygon: 'Polygon',\r\n    avalanche: 'Avalanche',\r\n    celo: 'Celo'\r\n  };\r\n  return names[networkShortName] || networkShortName;\r\n};\r\n\r\nexport const isEVMNetwork = (networkShortName) => {\r\n  const evmNetworks = [\r\n    'ethereum', \r\n    'bsc', \r\n    'optimism', \r\n    'arbitrum', \r\n    'polygon', \r\n    'avalanche', \r\n    'celo'\r\n  ];\r\n  return evmNetworks.includes(networkShortName.toLowerCase());\r\n};\r\n\r\nexport const getNetworkChainId = (networkShortName) => {\r\n  const chainIds = {\r\n    ethereum: 1,\r\n    bsc: 56,\r\n    optimism: 10,\r\n    arbitrum: 42161,\r\n    polygon: 137,\r\n    avalanche: 43114,\r\n    celo: 42220\r\n  };\r\n  return chainIds[networkShortName.toLowerCase()];\r\n};\r\n\r\n// ✅ NEW: Network icon mapping (you can add actual icon components later)\r\nexport const getNetworkIcon = (networkShortName) => {\r\n  // This would return actual icon components in a real implementation\r\n  const icons = {\r\n    ethereum: '⟨ETH⟩',\r\n    bsc: '⟨BSC⟩',\r\n    tron: '⟨TRX⟩',\r\n    algorand: '⟨ALGO⟩',\r\n    solana: '⟨SOL⟩',\r\n    optimism: '⟨OP⟩',\r\n    arbitrum: '⟨ARB⟩',\r\n    polygon: '⟨MATIC⟩',\r\n    avalanche: '⟨AVAX⟩',\r\n    celo: '⟨CELO⟩'\r\n  };\r\n  return icons[networkShortName.toLowerCase()] || '⟨?⟩';\r\n};"],"names":["version","docsPath","walk","BaseError","size","pad","SizeExceedsPaddingSizeError","encoder","toBytes","hexToBytes","assertSize","index","size_","SizeOverflowError","hexes","bytesToHex","IntegerOutOfRangeError","formatAbiItem","concat","concatBytes","n","l","hash","slice","assertStartOffset","SliceOffsetOutOfBoundsError","assertEndOffset","bytesRegex","integerRegex","length","yParityOrV","recoveryBit","stringify","value","cause","formatted","formatAuthorizationList","getAction","getChainId","base","getBalance","block","request","rpcStateOverride","estimate","isLE","_32n","buffer","sha256","sha256n","noble_sha256","getBlock","getBlock_","getChainId_","chainId","sendTransaction","e","data","consumed","k","err","getVersion","Hex.size","Hex.SizeOverflowError","Hex.SliceOffsetOutOfBoundsError","Hex.SizeExceedsPaddingSizeError","internal.assertSize","internal.pad","internal.assertStartOffset","internal.assertEndOffset","Errors.BaseError","Json.stringify","toRpc","Hex.fromNumber","Withdrawal.toRpc","wait","args","split","BlockOverrides.toRpc","readContract","custom","res","getEnsAvatar","getEnsName","multicall","contracts","result","shouldRetry","uid","body","response","struct","serializeTransaction","blobs","commitments","proofs","v","signMessage","signTypedData","this","f","_BaseError_walk","key","uid_","connector","chain","connections","viem_multicall","viem_readContract","viem_getBalance","viem_getEnsAvatar","viem_getEnsName","viem_sendTransaction","viem_signMessage","viem_signTypedData","window","connect","disconnect","isReconnecting","provider","error","createStore","api","hydrate","EventEmitter","deserialize","deserialize_","serialize","serialize_","createMipd","client","parameters","x","useRef","useEffect","CoreError","React","require$$0","is","objectIs","useDebugValue","shim","shimModule","require$$1","withSelectorModule","isPlainObject","useSyncExternalStoreWithSelector","useMemo","noop","hashFn","hasObjectPrototype","queue","getDefaultState","m","getPreviousPageParam","getNextPageParam","jsxRuntimeModule","queryClient","jsx","useQuery","tanstack_useQuery","useSyncExternalStore","serializeTransaction_","sourceId","createTransport","walletConfig","useState","_jsx","connectWallet","switchChain","theme","_jsxs","_Fragment","WALLET_TYPES","NETWORK_TYPES","NETWORK_CONFIG","TOKEN_CONFIG","detectWallets","disconnectWallet","process","self","jsxs","_QrCode","assert","_QrSegment","amount","currency","network","getNetworkDisplayName","getNetworkIcon","Fragment","connectEvmWallet","initializeApi"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,314,320]}