UNPKG

@bigmi/client

Version:

Reactive primitives for Bitcoin apps.

140 lines (139 loc) 5.84 kB
import { ChainNotSupportedError } from "../errors/connectors.js"; import { createConnector } from "../factories/createConnector.js"; import { createBidirectionalMap } from "../utils/createBidirectionalMap.js"; import { ChainId, MethodNotSupportedRpcError, ProviderNotFoundError, UserRejectedRequestError, getAddressInfo } from "@bigmi/core"; //#region src/connectors/onekey.ts function onekey(parameters = {}) { const { forward: OneKeyBitcoinNetworkChainIdMap, reverse: ChainIdToOneKeyMap } = createBidirectionalMap([["livenet", ChainId.BITCOIN_MAINNET], ["testnet", ChainId.BITCOIN_TESTNET]]); const { shimDisconnect = true } = parameters; let accountsChanged; let chainChanged; return createConnector((config) => ({ id: "so.onekey.app.wallet.bitcoin", name: "OneKey", type: onekey.type, icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iNi42NjY2NyIgZmlsbD0iIzQ0RDYyQyIvPgo8cGF0aCBkPSJNMTcuNDQ1NyA2Ljc4MzJMMTIuOTk0NSA2Ljc4MzJMMTIuMjEzNiA5LjE0NDQ2SDE0LjY4NTlMMTQuNjg1OSAxNC4xMTgySDE3LjQ0NTdWNi43ODMyWiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yMS4wNzY0IDIwLjEzNzhDMjEuMDc2NCAyMi45NDEzIDE4LjgwMzcgMjUuMjE0MSAxNi4wMDAxIDI1LjIxNDFDMTMuMTk2NiAyNS4yMTQxIDEwLjkyMzggMjIuOTQxMyAxMC45MjM4IDIwLjEzNzhDMTAuOTIzOCAxNy4zMzQyIDEzLjE5NjYgMTUuMDYxNSAxNi4wMDAxIDE1LjA2MTVDMTguODAzNyAxNS4wNjE1IDIxLjA3NjQgMTcuMzM0MiAyMS4wNzY0IDIwLjEzNzhaTTE4Ljc3MTggMjAuMTM3OEMxOC43NzE4IDIxLjY2ODUgMTcuNTMwOSAyMi45MDk1IDE2LjAwMDEgMjIuOTA5NUMxNC40NjkzIDIyLjkwOTUgMTMuMjI4NCAyMS42Njg1IDEzLjIyODQgMjAuMTM3OEMxMy4yMjg0IDE4LjYwNyAxNC40NjkzIDE3LjM2NiAxNi4wMDAxIDE3LjM2NkMxNy41MzA5IDE3LjM2NiAxOC43NzE4IDE4LjYwNyAxOC43NzE4IDIwLjEzNzhaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K", async setup() {}, async getInternalProvider() { if (typeof window === "undefined") return; if ("$onekey" in window) return window.$onekey.btc; }, async getProvider() { const internalProvider = await this.getInternalProvider(); if (!internalProvider) return; return { request: this.request.bind(internalProvider) }; }, async request({ method, params }) { switch (method) { case "signPsbt": { const { psbt, ...options } = params; const toSignInputs = options.inputsToSign.flatMap(({ sigHash, address, signingIndexes }) => signingIndexes.map((index) => ({ index, address, sighashTypes: sigHash !== void 0 ? [sigHash] : void 0 }))); return await this.signPsbt(psbt, { toSignInputs, autoFinalized: options.finalize }); } default: throw new MethodNotSupportedRpcError(); } }, async connect() { const provider = await this.getInternalProvider(); if (!provider) throw new ProviderNotFoundError(); try { await provider.requestAccounts(); const accounts = await this.getAccounts(); const chainId = await this.getChainId(); if (!accountsChanged) { accountsChanged = this.onAccountsChanged.bind(this); provider.addListener("accountsChanged", accountsChanged); } if (!chainChanged) { chainChanged = (network) => this.onChainChanged(OneKeyBitcoinNetworkChainIdMap[network]); provider.addListener("networkChanged", chainChanged); } if (shimDisconnect) await Promise.all([config.storage?.setItem(`${this.id}.connected`, true), config.storage?.removeItem(`${this.id}.disconnected`)]); return { accounts, chainId }; } catch (error) { throw new UserRejectedRequestError(error.message); } }, async disconnect() { const provider = await this.getInternalProvider(); if (accountsChanged) { provider?.removeListener("accountsChanged", accountsChanged); accountsChanged = void 0; } if (chainChanged) { provider?.removeListener("networkChanged", chainChanged); chainChanged = void 0; } if (shimDisconnect) await Promise.all([config.storage?.setItem(`${this.id}.disconnected`, true), config.storage?.removeItem(`${this.id}.connected`)]); }, async getAccounts() { const provider = await this.getInternalProvider(); if (!provider) throw new ProviderNotFoundError(); const address = (await provider.getAccounts())[0]; const publicKey = await provider.getPublicKey(); const { type, purpose } = getAddressInfo(address); return [{ address, addressType: type, publicKey, purpose }]; }, async getChainId() { const provider = await this.getInternalProvider(); if (!provider) throw new ProviderNotFoundError(); return OneKeyBitcoinNetworkChainIdMap[await provider.getNetwork()]; }, async isAuthorized() { try { if (shimDisconnect && await config.storage?.getItem(`${this.id}.disconnected`)) return false; return !!(await this.getAccounts()).length; } catch { return false; } }, async switchChain({ chainId }) { try { const provider = await this.getInternalProvider(); if (!provider) throw new ProviderNotFoundError(); const network = ChainIdToOneKeyMap[chainId]; if (!network) throw new ChainNotSupportedError(chainId, onekey.name); const result = await provider.switchNetwork(network); return Boolean(result); } catch { return false; } }, async onAccountsChanged(accounts) { if (accounts.length === 0) this.onDisconnect(); else { const newAccounts = await this.getAccounts(); config.emitter.emit("change", { accounts: newAccounts }); } }, async onChainChanged(chainId) { const accounts = await this.getAccounts(); config.emitter.emit("change", { chainId, accounts }); }, async onDisconnect(_error) { config.emitter.emit("disconnect"); } })); } onekey.type = "UTXO"; //#endregion export { onekey }; //# sourceMappingURL=onekey.js.map