UNPKG

@bigmi/client

Version:

Reactive primitives for Bitcoin apps.

143 lines (142 loc) 6.15 kB
import { ChainNotSupportedError } from "../errors/connectors.js"; import { createConnector } from "../factories/createConnector.js"; import { createBidirectionalMap } from "../utils/createBidirectionalMap.js"; import { BaseError, ChainId, MethodNotSupportedRpcError, ProviderNotFoundError, UserRejectedRequestError, getAddressInfo } from "@bigmi/core"; //#region src/connectors/bitget.ts function bitget(parameters = {}) { const { forward: BitgetBitcoinNetworkChainIdMap, reverse: ChainIdToBitgetMap } = createBidirectionalMap([ ["livenet", ChainId.BITCOIN_MAINNET], ["testnet", ChainId.BITCOIN_TESTNET], ["signet", ChainId.BITCOIN_SIGNET] ]); const { shimDisconnect = true } = parameters; let accountsChanged; let chainChanged; return createConnector((config) => ({ id: "bitget", name: "Bitget", type: bitget.type, icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSIjMDAxRjI5Ii8+CjxwYXRoIGQ9Ik0yMTkuOTQ4IDk1LjcwMjJDMjAxLjYyMyA5NS42OTI5IDE4My4zMyA5NS42ODM1IDE2NC45NDEgOTUuNzExNkMxNTMuODIyIDk1LjcxMTYgMTQ5LjY1MSAxMDkuNjcxIDE1Ny45MjEgMTE3LjkzOUwyODMuMDk4IDI0My4xMTdDMjg3LjAwNCAyNDYuNjkgMjg5LjQ0MSAyNTAuNTc0IDI4OS41MyAyNTUuNjkzQzI4OS40NDEgMjYwLjgxMiAyODcuMDA0IDI2NC42OTYgMjgzLjA5OCAyNjguMjY5TDE1Ny45MjEgMzkzLjQ0NkMxNDkuNjUxIDQwMS43MTUgMTUzLjgyMiA0MTUuNjc0IDE2NC45NDEgNDE1LjY3NEMxODMuMzMgNDE1LjcwMiAyMDEuNjIzIDQxNS42OTMgMjE5Ljk0OCA0MTUuNjgzQzIyOS4xMjIgNDE1LjY3OSAyMzguMzA1IDQxNS42NzQgMjQ3LjUxMSA0MTUuNjc0QzI1OS41NTUgNDE1LjY3NCAyNjYuNzIgNDA5LjI0IDI3My4xNTQgNDAyLjgwNUwzODYuMDQ3IDI4OS45MTJDMzk1LjA1NyAyODAuOTAyIDQwMy4xMTkgMjY4LjkzOSA0MDMuMDA5IDI1NS42OTNDNDAzLjExOSAyNDIuNDQ3IDM5NS4wNTcgMjMwLjQ4NCAzODYuMDQ3IDIyMS40NzRMMjczLjE1NCAxMDguNThDMjY2LjcyIDEwMi4xNDYgMjU5LjU1NSA5NS43MTE2IDI0Ny41MTEgOTUuNzExNkMyMzguMzA1IDk1LjcxMTYgMjI5LjEyMiA5NS43MDY5IDIxOS45NDggOTUuNzAyMloiIGZpbGw9IiMwMEYwRkYiLz4KPC9zdmc+", async setup() {}, async getInternalProvider() { if (typeof window === "undefined") return; if ("bitkeep" in window) return window.bitkeep?.unisat; }, 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 { if (!await provider.requestAccounts()) throw new BaseError("error connecting to your wallet"); 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(BitgetBitcoinNetworkChainIdMap[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) { await this.disconnect(); 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(); if (!publicKey.length) throw new BaseError("public key not found"); const { type, purpose } = getAddressInfo(address); return [{ address, addressType: type, publicKey, purpose }]; }, async getChainId() { const provider = await this.getInternalProvider(); if (!provider) throw new ProviderNotFoundError(); return BitgetBitcoinNetworkChainIdMap[await provider.getNetwork()]; }, async isAuthorized() { try { if (shimDisconnect) return Boolean(await config.storage?.getItem(`${this.id}.connected`)); return !!(await this.getAccounts()).length; } catch { return false; } }, async switchChain({ chainId }) { try { const provider = await this.getInternalProvider(); if (!provider) throw new ProviderNotFoundError(); const network = ChainIdToBitgetMap[chainId]; if (!network) throw new ChainNotSupportedError(chainId, bitget.name); const result = await provider.switchNetwork(network); return Boolean(result); } catch { return false; } }, async onAccountsChanged(accounts) { if (accounts.length === 0) this.onDisconnect(); else { if (!await this.getInternalProvider()) throw new ProviderNotFoundError(); const newAccounts = await this.getAccounts(); config.emitter.emit("change", { accounts: newAccounts }); } }, onChainChanged(chainId) { config.emitter.emit("change", { chainId }); }, async onDisconnect(_error) { config.emitter.emit("disconnect"); } })); } bitget.type = "UTXO"; //#endregion export { bitget }; //# sourceMappingURL=bitget.js.map