@aa-simulator/btc-connectkit
Version:
First Account Abstraction Protocol on Bitcoin
1,058 lines (1,014 loc) • 88.2 kB
JavaScript
"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