@bigmi/client
Version:
Reactive primitives for Bitcoin apps.
143 lines (142 loc) • 6.15 kB
JavaScript
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