UNPKG

@aa-simulator/btc-connectkit

Version:

First Account Abstraction Protocol on Bitcoin

1,058 lines (1,014 loc) 88.2 kB
"use client"; // src/connector/base.ts var BaseConnector = class { }; // src/icons/lnd.png var lnd_default = "data:image/png;base64,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"; // src/utils/index.ts import { toHex } from "viem"; function shortString(str) { if (Array.isArray(str)) { str = "[" + str.toString() + "]"; } if (str) { if (typeof str.toString === "function") { str = str.toString(); } if (str.length <= 10) { return str; } return `${str.slice(0, 5)}...${str.slice(str.length - 5, str.length)}`; } return ""; } async function copyToClipboard(text) { const clipboardCopy = async () => { if (navigator.clipboard) { return navigator.clipboard.writeText(text); } else { const textarea = document.createElement("textarea"); textarea.value = text; textarea.setAttribute("readonly", ""); textarea.style.position = "absolute"; textarea.style.left = "-9999px"; document.body.appendChild(textarea); textarea.select(); const result = document.execCommand("copy"); document.body.removeChild(textarea); if (!result) { throw new Error("Copy to clipboard failed"); } } }; return new Promise((resolve, reject) => { clipboardCopy().then(resolve).catch(reject); }); } var defaultTokenIcon = "https://static.particle.network/token-list/defaultToken/default.png"; var ipfsToSrc = (ipfs) => { if (!ipfs || !ipfs.startsWith("ipfs://")) { return ipfs || ""; } return `https://ipfs.io/ipfs/${encodeURI(ipfs.slice(7))}`; }; var base64ToHex = (base64Str) => { const buffer = Buffer.from(base64Str, "base64"); return toHex(buffer).slice(2); }; // src/connector/lnd.ts var DEFAULT_BTC_TYPE = "WITNESS_PUBKEY_HASH"; var DEFAULT_DERIVATION_PATH = "m/84'/0'/0'/0/0"; var LNDConnector = class extends BaseConnector { constructor(config) { super(); this.metadata = { id: "lnd", name: "LND Node", icon: lnd_default, downloadUrl: "" }; if (config) { this._config = config; } } get config() { return this._config; } setConfig(config) { this._config = config; } async makeRequest(endpoint, method = "GET", body) { this.ensureConfig(); try { const response = await fetch(`${this.config.restHost}/${endpoint}`, { method, headers: { "Grpc-Metadata-macaroon": this.config.macaroon, "Content-Type": "application/json" }, body: body ? JSON.stringify(body) : void 0 }); if (!response.ok) { throw new Error(`LND request failed: ${response.statusText}`); } return response.json(); } catch (e) { throw e; } } isReady() { return !!this.config?.restHost && !!this.config?.macaroon; } ensureConfig() { if (!this._config) { throw new Error("LND connector not configured"); } return this._config; } async getNativeSegwitAccount() { this.ensureConfig(); const accountName = "default"; const response = await this.makeRequest(`v2/wallet/addresses?account_name=${accountName}`); if (!response.account_with_addresses) { throw new Error("No account in this accountName!"); } const nativeSegwitAccount = response.account_with_addresses.find( (i) => i.address_type === DEFAULT_BTC_TYPE ); if (!nativeSegwitAccount || !nativeSegwitAccount.addresses || nativeSegwitAccount.addresses.length === 0) { throw new Error("No Taproot address in your default account!"); } const firstAddr = nativeSegwitAccount.addresses.find( (addr) => addr.derivation_path === DEFAULT_DERIVATION_PATH ); return firstAddr || firstAddr.addresses[0]; } async requestAccounts() { this.ensureConfig(); const account = await this.getNativeSegwitAccount(); return [account.address]; } async getAccounts() { this.ensureConfig(); return this.requestAccounts(); } async getPublicKey() { this.ensureConfig(); const account = await this.getNativeSegwitAccount(); return base64ToHex(account.public_key); } async signMessage(message, address) { if (!address || address === "ecdsa" || address === "bip322-simple") { throw new Error("Please use valid address"); } const response = await this.makeRequest("v2/wallet/address/signmessage", "POST", { msg: Buffer.from(message).toString("base64"), addr: address }); return response.signature; } async getNetwork() { return "livenet"; } async switchNetwork() { throw new Error("Network switching not supported in LND"); } async sendBitcoin(toAddress, satoshis, options) { throw new Error("Network sendBitcoin not supported in LND"); } getProvider() { return this; } async sendInscription() { throw new Error("Inscription not supported in LND"); } on(event, handler) { } removeListener(event, handler) { } disconnect() { } }; // src/icons/unisat.svg var unisat_default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iX2ZyYW1lXzIiIGRhdGEtbmFtZT0iZnJhbWUgMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iLTEyIDAgMTAwIDEwMCI+CiAgPGRlZnM+CiAgICA8c3R5bGU+CiAgICAgIC5jbHMtMSB7CiAgICAgICAgZmlsbDogdXJsKCNfbGxfMTI2KTsKICAgICAgfQoKICAgICAgLmNscy0yIHsKICAgICAgICBmaWxsOiB1cmwoI19sbF8xMjMpOwogICAgICB9CgogICAgICAuY2xzLTMgewogICAgICAgIGZpbGw6IHVybCgjX2xsXzEyMSk7CiAgICAgIH0KCiAgICAgIC5jbHMtNCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBmb250LWZhbWlseTogSmV0QnJhaW5zTW9ub1JvbWFuLU1lZGl1bSwgJ0pldEJyYWlucyBNb25vJzsKICAgICAgICBmb250LXNpemU6IDI0Ljc5cHg7CiAgICAgICAgZm9udC12YXJpYXRpb24tc2V0dGluZ3M6ICd3Z2h0JyA1MDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9Il9sbF8xMjYiICB4MT0iOTYxLjY4IiB5MT0iLTQ1LjU3IiB4Mj0iOTg2LjE0IiB5Mj0iLTExMC4wNiIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3ODAuOTkgNjcxLjcpIHJvdGF0ZSgtMTM0LjczKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwNzAxMDAiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIuMzYiIHN0b3AtY29sb3I9IiM3NzM5MGQiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIuNjciIHN0b3AtY29sb3I9IiNlYTgxMDEiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZjRiODUyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJfbGxfMTIxIiAgeDE9Ijk2NS4xNyIgeTE9Ii0xMzIuNDEiIHgyPSI5MjkuMjIiIHkyPSItNjUuMjIiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzgwLjk5IDY3MS43KSByb3RhdGUoLTEzNC43MykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMDcwMTAwIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iLjM3IiBzdG9wLWNvbG9yPSIjNzczOTBkIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iLjY3IiBzdG9wLWNvbG9yPSIjZWE4MTAxIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2Y0ZmI1MiIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxyYWRpYWxHcmFkaWVudCBpZD0iX2xsXzEyMyIgIGN4PSIzNS41OSIgY3k9IjMwLjc2IiBmeD0iMzUuNTkiIGZ5PSIzMC43NiIgcj0iNy40NyIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgwIDApIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2Y0Yjg1MiIvPgogICAgICA8c3RvcCBvZmZzZXQ9Ii4zMyIgc3RvcC1jb2xvcj0iI2VhODEwMSIvPgogICAgICA8c3RvcCBvZmZzZXQ9Ii42NCIgc3RvcC1jb2xvcj0iIzc3MzkwZCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwNzAxMDAiLz4KICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnIGlkPSJfZnJhbWVfMS0yIiA+CiAgICA8Zz4KICAgICAgPGc+CiAgICAgICAgPHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNTQuODEsOC45MWwyMC4zNCwyMC4xNGMxLjczLDEuNzEsMi41OCwzLjQ0LDIuNTUsNS4xOS0uMDMsMS43NC0uNzcsMy4zNC0yLjIzLDQuNzgtMS41MiwxLjUxLTMuMTYsMi4yOC00LjkyLDIuMzEtMS43NiwuMDMtMy41LS44Mi01LjI0LTIuNTNsLTIwLjgtMjAuNmMtMi4zNi0yLjM0LTQuNjQtNC02Ljg0LTQuOTctMi4xOS0uOTctNC41LTEuMTItNi45Mi0uNDYtMi40MiwuNjYtNS4wMiwyLjM3LTcuOCw1LjEzLTMuODQsMy44LTUuNjcsNy4zNy01LjQ4LDEwLjcxLC4xOSwzLjM0LDIuMDksNi43OSw1LjcxLDEwLjM4bDIwLjk3LDIwLjc3YzEuNzUsMS43MywyLjYxLDMuNDYsMi41OCw1LjE4LS4wMywxLjcyLS43OCwzLjMyLTIuMjYsNC43OC0xLjQ4LDEuNDYtMy4xLDIuMjMtNC44OCwyLjI5LTEuNzcsLjA2LTMuNTMtLjc4LTUuMjgtMi41MUwxMy45OSw0OS4zNmMtMy4zMS0zLjI4LTUuNy02LjM4LTcuMTctOS4zLTEuNDctMi45Mi0yLjAyLTYuMjMtMS42NC05LjkyLC4zNC0zLjE2LDEuMzYtNi4yMiwzLjA0LTkuMTksMS42OS0yLjk3LDQuMS02LDcuMjMtOS4xMSwzLjczLTMuNyw3LjI5LTYuNTMsMTAuNjktOC41QzI5LjU0LDEuMzcsMzIuODIsLjI3LDM1Ljk5LC4wNGMzLjE3LS4yMyw2LjMsLjQsOS40LDEuODksMy4wOSwxLjQ5LDYuMjMsMy44MSw5LjQzLDYuOThaIi8+CiAgICAgICAgPHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMjIuOTIsOTAuMTlMMi41OCw3MC4wNUMuODUsNjguMzQsMCw2Ni42MSwuMDMsNjQuODZzLjc3LTMuMzQsMi4yMy00Ljc4YzEuNTItMS41MSwzLjE2LTIuMjgsNC45Mi0yLjMxLDEuNzYtLjAzLDMuNSwuODEsNS4yNCwyLjUzbDIwLjgsMjAuNmMyLjM3LDIuMzQsNC42NCw0LDYuODQsNC45N3M0LjUsMS4xMiw2LjkyLC40NmMyLjQyLS42Niw1LjAyLTIuMzcsNy44LTUuMTMsMy44NC0zLjgsNS42Ny03LjM3LDUuNDgtMTAuNzEtLjE5LTMuMzQtMi4wOS02LjgtNS43MS0xMC4zOGwtMTEuMTctMTAuOTdjLTEuNzUtMS43My0yLjYxLTMuNDYtMi41OC01LjE4LC4wMy0xLjcyLC43OC0zLjMyLDIuMjYtNC43OCwxLjQ4LTEuNDYsMy4xLTIuMjMsNC44OC0yLjI5LDEuNzctLjA2LDMuNTMsLjc4LDUuMjgsMi41MWwxMC41MywxMC4zNGMzLjMxLDMuMjgsNS43LDYuMzgsNy4xNyw5LjMsMS40NywyLjkyLDIuMDIsNi4yMywxLjY0LDkuOTItLjM0LDMuMTYtMS4zNiw2LjIyLTMuMDQsOS4xOS0xLjY5LDIuOTctNC4xLDYtNy4yMyw5LjExLTMuNzMsMy43LTcuMjksNi41My0xMC42OSw4LjUtMy40LDEuOTctNi42OCwzLjA3LTkuODUsMy4zLTMuMTcsLjIzLTYuMy0uNC05LjQtMS44OS0zLjA5LTEuNDktNi4yNC0zLjgxLTkuNDMtNi45OFoiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJjbHMtMiIgY3g9IjM1LjYiIGN5PSIzMC43NSIgcj0iNy40NyIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4="; // src/connector/unisat.ts var UnisatConnector = class extends BaseConnector { constructor() { super(); this.metadata = { id: "unisat", name: "Unisat Wallet", icon: unisat_default, downloadUrl: "https://unisat.io" }; this.config = void 0; } isReady() { if (typeof window !== "undefined") { return typeof window.unisat !== "undefined"; } return false; } async requestAccounts() { const accounts = await this.getProviderOrThrow().requestAccounts(); return accounts; } async getAccounts() { const accounts = await this.getProviderOrThrow().getAccounts(); return accounts; } async getPublicKey() { return this.getProviderOrThrow().getPublicKey(); } async signMessage(signStr, type) { const addresses = await this.getAccounts(); if (addresses.length === 0) { throw new Error(`${this.metadata.name} not connected!`); } return this.getProviderOrThrow().signMessage(signStr, type); } on(event, handler) { const provider = this.getProvider(); return provider?.on?.(event, handler); } removeListener(event, handler) { const provider = this.getProvider(); return provider?.removeListener?.(event, handler); } getProvider() { if (this.isReady()) { return window.unisat; } } getProviderOrThrow() { const provider = this.getProvider(); if (!provider) { throw new Error(`${this.metadata.name} is not install or not create Bitcoin wallet!`); } return provider; } async getNetwork() { return this.getProviderOrThrow().getNetwork(); } async switchNetwork(network) { return this.getProviderOrThrow().switchNetwork(network); } async sendBitcoin(toAddress, satoshis, options) { return this.getProviderOrThrow().sendBitcoin(toAddress, satoshis, options); } async sendInscription(address, inscriptionId, options) { const result = await this.getProviderOrThrow().sendInscription(address, inscriptionId, options); if (typeof result === "string") { return { txid: result }; } return result; } disconnect() { } }; // src/context/index.tsx import { SmartAccount } from "@aa-simulator/core"; import { createContext, useCallback as useCallback8, useContext, useEffect as useEffect7, useMemo as useMemo6, useState as useState8 } from "react"; // src/components/connectModal/index.tsx import { useEffect as useEffect5, useState as useState4 } from "react"; // src/hooks/useAccounts.ts var useAccounts = () => { const { accounts } = useConnectProvider(); return { accounts }; }; // src/hooks/useBTCProvider.ts import { useCallback, useEffect, useState } from "react"; var useBTCProvider = () => { const { connector, provider, accounts, getPublicKey, signMessage, getNetwork, switchNetwork, sendBitcoin } = useConnectProvider(); const [pubKey, setPubKey] = useState(""); const [address, setAddress] = useState(""); const sendInscription = useCallback( async (address2, inscriptionId, options) => { if (!connector) { throw new Error("Wallet not connected!"); } const result = await connector.sendInscription(address2, inscriptionId, options); return result; }, [connector] ); useEffect(() => { if (accounts && accounts.length > 0) { getPublicKey().then(setPubKey); setAddress(accounts[0]); } }, [accounts]); return { provider, accounts, getPublicKey, signMessage, getNetwork, switchNetwork, sendBitcoin, sendInscription, pubKey, address }; }; // src/hooks/useConnectModal.ts import { useCallback as useCallback2, useMemo } from "react"; // src/utils/eventUtils.ts import { EventEmitter } from "events"; var events = new EventEmitter(); events.setMaxListeners(100); var getPendingSignEventAccount = () => { return events.listenerCount("sendUserOpResult" /* sendUserOpResult */) + events.listenerCount("personalSignResult" /* personalSignResult */) + events.listenerCount("signTypedDataResult" /* signTypedDataResult */); }; var eventUtils_default = events; // src/hooks/useConnectModal.ts var useConnectModal = () => { const { openConnectModal: _openConnectModal, disconnect: _disconnect } = useConnectProvider(); const { accounts } = useAccounts(); const connect = useCallback2(async () => { return new Promise((resolve, reject) => { const onConnectResult = ({ result, error }) => { if (result) { resolve(result); } else { reject(error); } }; eventUtils_default.once("connectResult" /* connectResult */, onConnectResult); _openConnectModal(); }); }, [_openConnectModal]); const openConnectModalAsync = useMemo(() => { if (accounts.length > 0) { return void 0; } else { return connect; } }, [accounts, connect]); const disconnect = useMemo(() => { if (accounts.length > 0) { return _disconnect; } else { return void 0; } }, [accounts, _disconnect]); const openConnectModal = useMemo(() => { if (accounts.length > 0) { return void 0; } else { return _openConnectModal; } }, [accounts, _openConnectModal]); return { openConnectModal, openConnectModalAsync, disconnect }; }; // src/hooks/useConnector.ts import { useCallback as useCallback3 } from "react"; var useConnector = () => { const { connectors, setConnectorId, updateConnector, connector } = useConnectProvider(); const connect = useCallback3( async (connectorId) => { const connector2 = connectors.find((item) => item.metadata.id === connectorId); if (!connector2) { throw new Error(`connector id ${connectorId} not found`); } const accounts = await connector2.requestAccounts(); if (accounts.length > 0) { localStorage.setItem("current-connector-id", connector2.metadata.id); setConnectorId(connector2.metadata.id); } return accounts; }, [connectors, setConnectorId] ); const updateConfig = useCallback3( (config) => { const connector2 = connectors.find((c) => c.metadata.id === "lnd"); if (connector2) { connector2.setConfig(config); updateConnector("lnd", { ...config }); } }, [connectors, updateConnector] ); return { connectors, connect, updateConfig, connector }; }; // src/hooks/useETHProvider.ts import { intToHex } from "@ethereumjs/util"; import { useCallback as useCallback4, useEffect as useEffect3, useMemo as useMemo2, useState as useState2 } from "react"; import { createWalletClient, custom, toHex as toHex2 } from "viem"; // src/evmSigner/provider.ts var EthereumProvider = class { constructor(sendUserOp, signer, account) { this.sendUserOp = sendUserOp; this.signer = signer; this.account = account; } on(event, listener) { this.signer?.on(event, listener); return this; } once(event, listener) { this.signer?.once(event, listener); return this; } off(event, listener) { this.signer?.off(event, listener); return this; } removeListener(event, listener) { this.signer?.removeListener(event, listener); return this; } async request(arg) { const method = arg.method; if (!method) { throw new Error("Method not found."); } if (method === "eth_accounts" || method === "eth_requestAccounts") { return this.account ? [this.account] : []; } else if (method === "eth_sendTransaction") { const txData = arg.params?.[0]; const result = await this.sendUserOp({ tx: txData }); return result; } return this.signer?.request(arg); } }; // src/utils/txConfirmUtils.ts var txConfirm = { isNotRemind: () => { if (typeof window === "undefined") return false; const value = localStorage.getItem("tx-confirm-modal-remind"); return value === "0"; }, setNotRemind: (notRemind) => { if (typeof window === "undefined") return; if (notRemind) { localStorage.setItem("tx-confirm-modal-remind", "0"); } else { localStorage.removeItem("tx-confirm-modal-remind"); } }, reset: () => { if (typeof window === "undefined") return; localStorage.removeItem("tx-confirm-modal-remind"); } }; var txConfirmUtils_default = txConfirm; // src/evmSigner/walletClientProvider.ts var WalletClientProvider = class { constructor(provider) { this.provider = provider; } on(event, listener) { this.provider.on(event, listener); return this; } once(event, listener) { this.provider?.once?.(event, listener); return this; } off(event, listener) { this.provider?.off?.(event, listener); return this; } removeListener(event, listener) { this.provider?.removeListener?.(event, listener); return this; } async request(arg) { const method = arg.method; if (!method) { throw new Error("Method not found."); } if (method === "personal_sign" /* personalSign */ || method.startsWith("eth_signTypedData" /* signTypedData */)) { const showConfirmModal = !txConfirmUtils_default.isNotRemind(); if (showConfirmModal) { if (getPendingSignEventAccount() > 0) { throw new Error("Operation failed, there is a transaction being processed"); } } if (!showConfirmModal) { return this.provider.request(arg); } } if (method === "personal_sign" /* personalSign */) { return new Promise((resolve, reject) => { eventUtils_default.emit("personalSign" /* personalSign */, arg); eventUtils_default.once("personalSignResult" /* personalSignResult */, ({ result, error }) => { if (result) { resolve(result); } else { reject(error); } }); }); } else if (method.startsWith("eth_signTypedData" /* signTypedData */)) { return new Promise((resolve, reject) => { eventUtils_default.emit("signTypedData" /* signTypedData */, arg); eventUtils_default.once("signTypedDataResult" /* signTypedDataResult */, ({ result, error }) => { if (result) { resolve(result); } else { reject(error); } }); }); } return this.provider.request(arg); } }; // src/utils/wait.ts var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); // src/hooks/useETHProvider.ts var useETHProvider = () => { const { evmAccount, smartAccount, getSmartAccountInfo } = useConnectProvider(); const [chainId, setChainId] = useState2(); useEffect3(() => { if (smartAccount) { const chainId2 = smartAccount.provider.chainId; setChainId(chainId2); const onChangeChange = (id) => { setChainId(Number(id)); }; smartAccount.provider.on("chainChanged", onChangeChange); return () => { smartAccount.provider?.removeListener?.("chainChanged", onChangeChange); }; } }, [smartAccount]); const switchChain = useCallback4( async (chainId2) => { if (smartAccount?.provider) { await smartAccount.provider.request({ method: "wallet_switchEthereumChain", params: [ { chainId: intToHex(chainId2) } ] }); } }, [smartAccount?.provider] ); const buildUserOp = useCallback4( async ({ tx }) => { if (!smartAccount) { throw new Error("The smart account is not initialized."); } const btcPubKey = await smartAccount.provider.getPublicKey(); const result = await smartAccount.buildCustomUserOperation({ tx, btcPubKey }); return result; }, [smartAccount] ); const increaseFeesByPercentage = useCallback4((userOp, retryCount) => { const percentage = Math.min(retryCount * 10, 100); const increase = (value) => { const bigValue = BigInt(value); return bigValue + bigValue * BigInt(percentage) / BigInt(100); }; return { ...userOp, maxFeePerGas: toHex2(increase(userOp.maxFeePerGas)), maxPriorityFeePerGas: toHex2(increase(userOp.maxPriorityFeePerGas)) }; }, []); const sendUserOp = useCallback4( async (params, retryCount = 0, maxRetries = 10) => { try { if (!smartAccount) { throw new Error("The smart account is not initialized."); } const btcPubKey = await smartAccount.provider.getPublicKey(); let userOpBundle; if (Object.prototype.hasOwnProperty.call(params, "userOp")) { const { userOp } = params; if (userOp) { userOpBundle = { userOp, btcPubKey }; } } let userOpParams; if (!userOpBundle) { userOpParams = params; const { tx } = userOpParams; userOpBundle = await buildUserOp({ tx }); } if (userOpBundle) { if (retryCount > 0) { userOpBundle.userOp = increaseFeesByPercentage(userOpBundle.userOp, retryCount); } return await smartAccount.sendCustomUserOperation(userOpBundle); } return await new Promise((resolve, reject) => { eventUtils_default.emit("sendUserOp" /* sendUserOp */, userOpBundle, userOpParams); eventUtils_default.once("sendUserOpResult" /* sendUserOpResult */, ({ result, error }) => { if (result) { resolve(result); } else { reject(error); } }); }); } catch (e) { if (e?.message?.includes("Replacement UserOperation must have higher") && retryCount <= maxRetries) { const waitTime = 1e3 * (retryCount + 1); await wait(waitTime); return sendUserOp(params, retryCount + 1, maxRetries); } throw e; } }, [smartAccount, buildUserOp] ); const sendTransactions = useCallback4( (txs, forceHideConfirmModal) => { if (!smartAccount) { throw new Error("The smart account is not initialized."); } const showConfirmModal = !forceHideConfirmModal && !txConfirmUtils_default.isNotRemind(); if (showConfirmModal) { if (getPendingSignEventAccount() > 0) { throw new Error("Operation failed, there is a transaction being processed"); } } }, [smartAccount] ); const publicClient = useMemo2(() => { if (!smartAccount || !chainId) { return void 0; } return (smartAccount?.provider).publicClient; }, [smartAccount, chainId]); const provider = useMemo2(() => { const ethereumProvider = new EthereumProvider(sendUserOp, smartAccount?.provider, evmAccount); return ethereumProvider; }, [evmAccount, sendUserOp, smartAccount?.provider]); const walletClient = useMemo2(() => { return createWalletClient({ transport: custom(new WalletClientProvider(provider)) }); }, [provider]); const waitForUserOperationReceipt = useCallback4( async (txHash) => { if (!smartAccount) { throw new Error("The smart account is not initialized."); } return await smartAccount.waitForUserOperationReceipt(txHash); }, [smartAccount] ); return { provider, evmAccount, account: evmAccount, getSmartAccountInfo, switchChain, chainId, buildUserOp, sendUserOp, sendTransactions, publicClient, walletClient, waitForUserOperationReceipt }; }; // src/icons/back.svg var back_default = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjQiPjxwYXRoIGQ9Ik00MDAtODAgMC00ODBsNDAwLTQwMCA3MSA3MS0zMjkgMzI5IDMyOSAzMjktNzEgNzFaIiBmaWxsPSJ3aGl0ZSIvPjwvc3ZnPg=="; // src/icons/close.svg var close_default = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjQiPjxwYXRoIGQ9Im0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFoiIGZpbGw9IndoaXRlIi8+PC9zdmc+"; // src/icons/retry.svg var retry_default = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjQiPjxwYXRoIGQ9Ik00ODAtMTYwcS0xMzQgMC0yMjctOTN0LTkzLTIyN3EwLTEzNCA5My0yMjd0MjI3LTkzcTY5IDAgMTMyIDI4LjVUNzIwLTY5MHYtMTEwaDgwdjI4MEg1MjB2LTgwaDE2OHEtMzItNTYtODcuNS04OFQ0ODAtNzIwcS0xMDAgMC0xNzAgNzB0LTcwIDE3MHEwIDEwMCA3MCAxNzB0MTcwIDcwcTc3IDAgMTM5LTQ0dDg3LTExNmg4NHEtMjggMTA2LTExNCAxNzN0LTE5NiA2N1oiIGZpbGw9IndoaXRlIi8+PC9zdmc+"; // esbuild-scss-modules-plugin:./spinner.module.scss var digest = "906d42389ecad5c2ab92642c8e0775ea667c413b069684ce9d01199562f2d0be"; var classes = { "loader": "_loader_g0am3_1", "rotate": "_rotate_g0am3_1", "prixClipFix": "_prixClipFix_g0am3_1" }; var css = `._loader_g0am3_1{animation:_rotate_g0am3_1 1s linear infinite;border-radius:50%;height:20px;position:relative;width:20px}._loader_g0am3_1:before{animation:_prixClipFix_g0am3_1 2s linear infinite;border:2px solid #000;border-radius:50%;box-sizing:border-box;content:"";inset:0;position:absolute}@keyframes _rotate_g0am3_1{to{transform:rotate(1turn)}}@keyframes _prixClipFix_g0am3_1{0%{clip-path:polygon(50% 50%,0 0,0 0,0 0,0 0,0 0)}25%{clip-path:polygon(50% 50%,0 0,100% 0,100% 0,100% 0,100% 0)}50%{clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)}75%{clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)}to{clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0)}}`; (function() { if (typeof document !== "undefined" && !document.getElementById(digest)) { var ele = document.createElement("style"); ele.id = digest; ele.textContent = css; document.head.appendChild(ele); } })(); var spinner_module_default = classes; // src/components/spinner/index.tsx import { jsx } from "react/jsx-runtime"; var Spinner = ({ className, style }) => { return /* @__PURE__ */ jsx("span", { className: spinner_module_default.loader + (className ? ` ${className}` : ""), style }); }; var spinner_default = Spinner; // esbuild-scss-modules-plugin:./button.module.scss var digest2 = "424d614dbc2763d7cad7ca35c00bd255c6ed55da308a1f3018594201a47127bf"; var classes2 = { "btn": "_btn_ofd87_1" }; var css2 = `._btn_ofd87_1{align-items:center;background:#fff;border-radius:8px;color:#000;display:flex;flex-direction:row;font-size:16px;gap:16px;justify-content:center;padding:6px 24px;position:relative}._btn_ofd87_1:hover{opacity:.85}._btn_ofd87_1:disabled{background:hsla(0,0%,100%,.2);color:hsla(0,0%,100%,.639);cursor:not-allowed;opacity:1}`; (function() { if (typeof document !== "undefined" && !document.getElementById(digest2)) { var ele = document.createElement("style"); ele.id = digest2; ele.textContent = css2; document.head.appendChild(ele); } })(); var button_module_default = classes2; // src/components/button/index.tsx import { jsx as jsx2, jsxs } from "react/jsx-runtime"; var Button = ({ children, isLoading, isDisabled, onClick, className, style }) => { return /* @__PURE__ */ jsxs( "button", { className: button_module_default.btn + (className ? ` ${className}` : ""), onClick: isLoading || isDisabled ? void 0 : onClick, disabled: isDisabled, style, children: [ isLoading && !isDisabled && /* @__PURE__ */ jsx2(spinner_default, {}), children ] } ); }; var button_default = Button; // src/components/modal/index.tsx import { useEffect as useEffect4, useMemo as useMemo3, useRef, useState as useState3 } from "react"; import { createPortal } from "react-dom"; import { RemoveScroll } from "react-remove-scroll"; // esbuild-scss-modules-plugin:./modal.module.scss var digest3 = "843e780c4554818cff2fa93ea4d0684a19cceefe69e06b974c1552b143d78b8d"; var classes3 = { "container": "_container_10dh8_1", "modal": "_modal_10dh8_18" }; var css3 = `._container_10dh8_1{align-items:center;backdrop-filter:blur(12px);background:rgba(0,0,0,.502);bottom:0;color:#fff;display:flex;height:100%;justify-content:center;left:0;overflow:hidden;position:fixed;right:0;top:0;width:100%;z-index:100000}._container_10dh8_1 ._modal_10dh8_18{align-items:center;background-color:#171a1f;border-radius:16px;display:flex;flex-direction:column;font-size:14px;height:auto;margin:16px;max-height:70%;max-width:100%;overflow:auto;padding:24px;position:relative;width:380px}`; (function() { if (typeof document !== "undefined" && !document.getElementById(digest3)) { var ele = document.createElement("style"); ele.id = digest3; ele.textContent = css3; document.head.appendChild(ele); } })(); var modal_module_default = classes3; // src/components/modal/index.tsx import { Fragment, jsx as jsx3 } from "react/jsx-runtime"; var stopPropagation = (event) => event.stopPropagation(); var Modal = ({ open, onClose, children, isDismissable = true, contentStyle, contentClassName }) => { const handleBackdropClick = useMemo3(() => isDismissable ? onClose : void 0, [onClose, isDismissable]); const modalRef = useRef(null); const [modalHeight, setModalHeight] = useState3(); useEffect4(() => { if (isDismissable) { const handleEscape = (event) => open && event.key === "Escape" && onClose(); document.addEventListener("keydown", handleEscape); return () => document.removeEventListener("keydown", handleEscape); } }, [open, onClose, isDismissable]); const [bodyScrollable, setBodyScrollable] = useState3(true); useEffect4(() => { setBodyScrollable(getComputedStyle(window.document.body).overflow !== "hidden"); }, []); useEffect4(() => { if (modalRef.current) { setModalHeight(modalRef.current.offsetHeight); } }, [modalRef.current?.offsetHeight]); return /* @__PURE__ */ jsx3(Fragment, { children: open ? createPortal( /* @__PURE__ */ jsx3(RemoveScroll, { enabled: bodyScrollable, children: /* @__PURE__ */ jsx3( "div", { className: modal_module_default.container, onClick: handleBackdropClick, style: { "--modal-height": `${modalHeight || 0}px` }, children: /* @__PURE__ */ jsx3( "div", { className: modal_module_default.modal + (contentClassName ? ` ${contentClassName}` : ""), style: contentStyle, onClick: stopPropagation, ref: modalRef, children } ) } ) }), document.body ) : null }); }; var modal_default = Modal; // esbuild-scss-modules-plugin:./connect.module.scss var digest4 = "c7bbc091f1227154742a5bd0d55a3df29eb913eb0ad4cafc7ab236b574002f65"; var classes4 = { "connectModal": "_connectModal_1kqtj_1", "title": "_title_1kqtj_4", "closeBtn": "_closeBtn_1kqtj_9", "backBtn": "_backBtn_1kqtj_15", "walletItem": "_walletItem_1kqtj_21", "walletIcon": "_walletIcon_1kqtj_33", "walletName": "_walletName_1kqtj_38", "connecting": "_connecting_1kqtj_43", "connectingIconContainer": "_connectingIconContainer_1kqtj_51", "retryContainer": "_retryContainer_1kqtj_54", "retryIcon": "_retryIcon_1kqtj_63", "connectingIcon": "_connectingIcon_1kqtj_51", "connection": "_connection_1kqtj_72", "acceptRequest": "_acceptRequest_1kqtj_76", "btnDownload": "_btnDownload_1kqtj_83" }; var css4 = `._connectModal_1kqtj_1{gap:12px}._connectModal_1kqtj_1 ._title_1kqtj_4{font-size:18px;font-weight:700;margin-bottom:4px}._connectModal_1kqtj_1 ._closeBtn_1kqtj_9{cursor:pointer;position:absolute;right:16px;top:16px}._connectModal_1kqtj_1 ._backBtn_1kqtj_15{cursor:pointer;left:16px;position:absolute;top:16px}._connectModal_1kqtj_1 ._walletItem_1kqtj_21{border:1px solid #3a3a3a;border-radius:8px;box-sizing:border-box;cursor:pointer;display:flex;padding:8px;width:100%}._connectModal_1kqtj_1 ._walletItem_1kqtj_21:hover{background:hsla(0,0%,100%,.05)}._connectModal_1kqtj_1 ._walletItem_1kqtj_21 ._walletIcon_1kqtj_33{border-radius:4px;height:42px;width:42px}._connectModal_1kqtj_1 ._walletItem_1kqtj_21 ._walletName_1kqtj_38{flex-grow:1;line-height:42px;text-align:center}._connectModal_1kqtj_1 ._connecting_1kqtj_43{align-items:center;display:flex;flex-direction:column;height:204px;justify-content:center;width:100%}._connectModal_1kqtj_1 ._connecting_1kqtj_43 ._connectingIconContainer_1kqtj_51{position:relative}._connectModal_1kqtj_1 ._connecting_1kqtj_43 ._connectingIconContainer_1kqtj_51 ._retryContainer_1kqtj_54{background:#4b5563;border-radius:50%;bottom:-12px;cursor:pointer;padding:4px;position:absolute;right:-12px}._connectModal_1kqtj_1 ._connecting_1kqtj_43 ._connectingIconContainer_1kqtj_51 ._retryContainer_1kqtj_54 ._retryIcon_1kqtj_63{height:24px;width:24px}._connectModal_1kqtj_1 ._connecting_1kqtj_43 ._connectingIcon_1kqtj_51{border-radius:4px;height:60px;width:60px}._connectModal_1kqtj_1 ._connecting_1kqtj_43 ._connection_1kqtj_72{font-size:18px;margin-top:20px}._connectModal_1kqtj_1 ._connecting_1kqtj_43 ._acceptRequest_1kqtj_76{color:hsla(0,0%,100%,.4);font-size:14px;margin-top:6px;text-align:center;white-space:pre-wrap}._connectModal_1kqtj_1 ._connecting_1kqtj_43 ._btnDownload_1kqtj_83{margin-top:20px}`; (function() { if (typeof document !== "undefined" && !document.getElementById(digest4)) { var ele = document.createElement("style"); ele.id = digest4; ele.textContent = css4; document.head.appendChild(ele); } })(); var connect_module_default = classes4; // src/components/connectModal/index.tsx import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime"; var ConnectModal = ({ open, onClose }) => { const [backVisible, setBackVisible] = useState4(false); const [retryVisible, setRetryVisible] = useState4(false); const [walletReady, setWalletReady] = useState4(true); const [selectConnector, setSelectConnector] = useState4(); const { connect, connectors } = useConnector(); const closeModal = (accounts) => { onClose(); if (accounts) { eventUtils_default.emit("connectResult" /* connectResult */, { result: accounts }); } else { eventUtils_default.emit("connectResult" /* connectResult */, { error: { code: 4001, message: "The user rejected the request." } }); } }; useEffect5(() => { if (!open) { setBackVisible(false); setRetryVisible(false); setWalletReady(true); setSelectConnector(void 0); } }, [open]); const onConnect = async (connector) => { setBackVisible(true); setSelectConnector(connector); if (connector.isReady()) { try { const accounts = await connect(connector.metadata.id); closeModal(accounts); } catch (error) { if (error.code === 4001) { setRetryVisible(true); } } } else { setWalletReady(false); } }; const onBack = () => { setBackVisible(false); setRetryVisible(false); setWalletReady(true); setSelectConnector(void 0); }; const onRetry = () => { setRetryVisible(false); if (selectConnector) { onConnect(selectConnector); } }; return /* @__PURE__ */ jsxs2(modal_default, { open, onClose: () => closeModal(), isDismissable: false, contentClassName: connect_module_default.connectModal, children: [ /* @__PURE__ */ jsx4("div", { className: connect_module_default.title, children: selectConnector?.metadata.name || "Choose Wallet" }), /* @__PURE__ */ jsx4("img", { className: connect_module_default.closeBtn, src: close_default, onClick: () => closeModal() }), backVisible && /* @__PURE__ */ jsx4("img", { className: connect_module_default.backBtn, src: back_default, onClick: onBack }), !backVisible && connectors.map((connector) => { return /* @__PURE__ */ jsxs2("div", { className: connect_module_default.walletItem, onClick: () => onConnect(connector), children: [ /* @__PURE__ */ jsx4("img", { className: connect_module_default.walletIcon, src: connector.metadata.icon }), /* @__PURE__ */ jsx4("div", { className: connect_module_default.walletName, children: connector.metadata.name }) ] }, connector.metadata.id); }), backVisible && selectConnector && /* @__PURE__ */ jsxs2("div", { className: connect_module_default.connecting, children: [ /* @__PURE__ */ jsxs2("div", { className: connect_module_default.connectingIconContainer, children: [ /* @__PURE__ */ jsx4("img", { className: connect_module_default.connectingIcon, src: selectConnector.metadata.icon }), retryVisible && /* @__PURE__ */ jsx4("div", { className: connect_module_default.retryContainer, onClick: onRetry, children: /* @__PURE__ */ jsx4("img", { className: connect_module_default.retryIcon, src: retry_default }) }) ] }), walletReady ? /* @__PURE__ */ jsxs2(Fragment2, { children: [ /* @__PURE__ */ jsx4("div", { className: connect_module_default.connection, children: retryVisible ? "Request Cancelled" : "Requesting Connection" }), /* @__PURE__ */ jsx4("div", { className: connect_module_default.acceptRequest, children: retryVisible ? "You cancelled the request.\nClick above to try again." : "Accept the request through your wallet to connect to this app." }) ] }) : /* @__PURE__ */ jsxs2(Fragment2, { children: [ /* @__PURE__ */ jsx4("div", { className: connect_module_default.connection, children: "Wallet Not Installed." }), /* @__PURE__ */ jsx4( button_default, { className: connect_module_default.btnDownload, onClick: () => { window.open(selectConnector?.metadata.downloadUrl, "_blank"); }, children: "Get" } ) ] }) ] }) ] }); }; var connectModal_default = ConnectModal; // src/components/signModal/index.tsx import { chains as chains2 } from "@particle-network/chains"; import { useCallback as useCallback6, useEffect as useEffect6, useMemo as useMemo5, useState as useState6 } from "react"; import { hexToString } from "viem"; // src/icons/check_box.svg var check_box_default = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjQiIGZpbGw9IiNhODU1ZjciPgogICAgPHBhdGgKICAgICAgICBkPSJtNDI0LTMxMiAyODItMjgyLTU2LTU2LTIyNiAyMjYtMTE0LTExNC01NiA1NiAxNzAgMTcwWk0yMDAtMTIwcS0zMyAwLTU2LjUtMjMuNVQxMjAtMjAwdi01NjBxMC0zMyAyMy41LTU2LjVUMjAwLTg0MGg1NjBxMzMgMCA1Ni41IDIzLjVUODQwLTc2MHY1NjBxMCAzMy0yMy41IDU2LjVUNzYwLTEyMEgyMDBabTAtODBoNTYwdi01NjBIMjAwdjU2MFptMC01NjB2NTYwLTU2MFoiIC8+Cjwvc3ZnPg=="; // src/icons/check_box_blank.svg var check_box_blank_default = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjQiIGZpbGw9IiM2YjcyODAiPgogICAgPHBhdGgKICAgICAgICBkPSJNMjAwLTEyMHEtMzMgMC01Ni41LTIzLjVUMTIwLTIwMHYtNTYwcTAtMzMgMjMuNS01Ni41VDIwMC04NDBoNTYwcTMzIDAgNTYuNSAyMy41VDg0MC03NjB2NTYwcTAgMzMtMjMuNSA1Ni41VDc2MC0xMjBIMjAwWm0wLTgwaDU2MHYtNTYwSDIwMHY1NjBaIiAvPgo8L3N2Zz4="; // src/icons/copy.svg var copy_default = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjQiIGZpbGw9IiNmZmYiPgogICAgPHBhdGgKICAgICAgICBkPSJNMzYwLTI0MHEtMzMgMC01Ni41LTIzLjVUMjgwLTMyMHYtNDgwcTAtMzMgMjMuNS01Ni41VDM2MC04ODBoMzYwcTMzIDAgNTYuNSAyMy41VDgwMC04MDB2NDgwcTAgMzMtMjMuNSA1Ni41VDcyMC0yNDBIMzYwWm0wLTgwaDM2MHYtNDgwSDM2MHY0ODBaTTIwMC04MHEtMzMgMC01Ni41LTIzLjVUMTIwLTE2MHYtNTYwaDgwdjU2MGg0NDB2ODBIMjAwWm0xNjAtMjQwdi00ODAgNDgwWiIgLz4KPC9zdmc+"; // src/icons/icon_navigate.svg var icon_navigate_default = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuMTgzNTkgNUwxMi4xODM2IDEwTDcuMTgzNTkgMTUiIHN0cm9rZT0iI0ExQTFBQSIgc3Ryb2tlLXdpZHRoPSIxLjY2NjY3IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+Cg=="; // src/utils/ethereumUtils.ts import { bytesToHex, publicToAddress, toBytes, toChecksumAddress, toRpcSig } from "@ethereumjs/util"; import bitcore from "bitcore-lib"; import { formatUnits } from "viem"; var pubKeyToEVMAddress = (pubKey) => { const address = toChecksumAddress(bytesToHex(publicToAddress(toBytes(`0x${pubKey}`), true))); return address; }; var convertSignature = (signature) => { const sig = bitcore.crypto.Signature.fromCompact(Buffer.from(signature, "base64")); const v = BigInt(sig.i + 27); const evmSig = toRpcSig(v, sig.r.toBuffer(), sig.s.toBuffer()); return evmSig; }; function caculateNativeFee(userOp) { return (BigInt(userOp.callGasLimit) + BigInt(userOp.verificationGasLimit) + BigInt(userOp.preVerificationGas)) * BigInt(userOp.maxFeePerGas); } var getBTCAAAddress = async (smartAccount) => { const btcPublicKey = await smartAccount.provider.getPublicKey(); const owner = await smartAccount.getOwner(btcPublicKey); const localKey = `bevm_aa_BTC_${"1.0.0"}_${owner}`; if (typeof window !== "undefined" && localStorage) { const localAA = localStorage.getItem(localKey); if (localAA) { return localAA; } } const address = await smartAccount.getValidEvmAddress(btcPublicKey); if (typeof window !== "undefined" && localStorage && address) { localStorage.setItem(localKey, address); } return address; }; var getBTCAccountInfo = async (smartAccount, btcAddress) => { const btcPublicKey = await smartAccount.provider.getPublicKey(); const address = await smartAccount.getValidEvmAddress(btcPublicKey); const owner = await smartAccount.getOwner(btcPublicKey); const localKey = `bevm_aa_BTC_${"1.0.0"}_${owner}`; if (typeof window !== "undefined" && localStorage && address) { localStorage.setItem(localKey, address); } return { smartAccountAddress: address, name: "BTC", btcPublicKey, btcAddress }; }; // src/components/copyText/index.tsx import { useState as useState5 } from "react"; // esbuild-scss-modules-plugin:./copyText.module.scss var digest5 = "d6fbb5df7ed6ec51d41f665ca768306181bb1e7d7c1cef8eed9bd4230368d7bb"; var classes5 = { "copyText": "_copyText_smolu_1", "copied": "_copied_smolu_9" }; var css5 = `._copyText_smolu_1{cursor:pointer;text-decoration-line:underline}._copyText_smolu_1:hover{opacity:.75}._copied_smolu_9{color:#a855f7;cursor:none;text-decoration-line:none}._copied_smolu_9:hover{opacity:1}`; (function() { if (typeof document !== "undefined" && !document.getElementById(digest5)) { var ele = document.createElement("style"); ele.id = digest5; ele.textContent = css5; document.head.appendChild(ele); } })(); var copyText_module_default = classes5; // src/components/copyText/index.tsx import { jsx as jsx5 } from "react/jsx-runtime"; function CopyText({ children, value, className, style }) { const [copied, setCopied] = useState5(); const handleClick = async () => { if (copied) { return; } try { if (value) { await copyToClipboard(value); } else if (typeof children === "string" || typeof children === "number" || typeof children === "boolean") { await copyToClipboard(children.toString()); } else { throw new Error("please set copy value"); } setCopied(true); setTimeout(() => setCopied(false), 1e3); } catch (error) { } }; return /* @__PURE__ */ jsx5( "div", { className: copyText_module_default.copyText + (className ? ` ${className}` : "") + (copied ? ` ${copyText_module_default.copied}` : ""), onClick: handleClick, style, children: copied ? "Copied" : children } ); } // src/components/transactionDetails/index.tsx import { chains } from "@particle-network/chains"; import { useCallback as useCallback5, useMemo as useMemo4 } from "react"; import { formatUnits as formatUnits2 } from "viem"; // src/icons/unverified.svg var unverified_default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB0PSIxNzA5Mjg0MDMwNzM5IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDExNTIgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICBwLWlkPSIxMzY3NSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij4KICAgIDxwYXRoCiAgICAgICAgZD0iTTExMjguNjQgODA2LjI3Mkw2NzYuMTYgNzIuMzJjLTU1LjE2OC05Ni4zMi0xNDUuMTUyLTk2LjMyLTIwMC4yNTYgMEwyMy4yMzIgODA2LjRDLTMxLjgwOCA5MDIuNTkyIDE0LjU5MiA5NzkuMiAxMjQuOCA5NzkuMmg5MDUuMjE2YzEwNy4zOTIgMCAxNTMuNzkyLTc5LjM2IDk4LjYyNC0xNzIuOTI4eiIKICAgICAgICBmaWxsPSIjZWFiMzA4IiBwLWlkPSIxMzY3NiI+PC9wYXRoPgogICAgPHBhdGgKICAgICAgICBkPSJNNTc0LjQ2NCA2OTUuODA4YzMyIDAgNjAuOTkyIDI4LjM1MiA2MC45OTIgNTkuNTIgMCAzMS4xNjgtMjYuMTEyIDU5LjUyLTYwLjk5MiA1OS41MmE2MC41NDQgNjAuNTQ0IDAgMCAxLTYwLjgtNTkuNTJjMC0zMS4yMzIgMjguOTI4LTU5LjUyIDYwLjgtNTkuNTJ6IG0yLjg4LTQ0NC45OTJjMjMuMjk2IDAgNDMuNTg0IDE5Ljg0IDQzLjU4NCA0Mi40OTZ2Mjk3LjZjMCAyMi42NTYtMjAuMjg4IDQyLjQ5Ni00My41MiA0Mi40OTZhNDQuMTYgNDQuMTYgMCAwIDEtNDMuNTItNDIuNDk2di0yOTcuNmMwLTIyLjY1NiAyMC4yODgtNDIuNDk2IDQzLjUyLTQyLjQ5NnoiCiAgICAgICAgZmlsbD0iI0ZGRkZGRiIgcC1pZD0iMTM2NzciPjwvcGF0aD4KPC9zdmc+"; // src/icons/verified.svg var verified_default = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB0PSIxNzA5MjgzOTE4NzM0IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICBwLWlkPSIxMjI3OCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij4KICAgIDxwYXRoIGQ9Ik01MTIgNTEybS01MTIgMGE1MTIgNTEyIDAgMSAwIDEwMjQgMCA1MTIgNTEyIDAgMSAwLTEwMjQgMFoiIGZpbGw9IiM0YWRlODAiIHAtaWQ9IjEyMjc5Ij48L3BhdGg+CiAgICA8cGF0aAogICAgICAgIGQ9Ik00NjkuMzc2IDYyMC4xNkwyOTMuNjMyIDQ2OC40OEE1Ny42IDU3LjYgMCAxIDAgMjE4LjM2OCA1NTUuNTJsMjE5LjcxMiAxODkuNzZhNjAuOCA2MC44IDAgMCAwIDg1Ljc2LTYuMjcybDIuNDk2LTMuMTM2IDI4Ny42MTYtMzgxLjI0OGE1Ny42IDU3LjYgMCAwIDAtOTEuOTA0LTY5L