UNPKG

@particle-network/solana-connectors

Version:
402 lines (392 loc) 13.6 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { defaultConnectorFns: () => defaultConnectorFns, injected: () => injected, solanaWalletConnectors: () => solanaWalletConnectors, version: () => version }); module.exports = __toCommonJS(src_exports); // src/injected.ts var import_connector_core = require("@particle-network/connector-core"); var import_web3 = require("@solana/web3.js"); // src/utils.ts var isConnected = (provider) => { if (provider && typeof provider.isConnected === "boolean") { return provider.isConnected; } return Boolean(provider == null ? void 0 : provider.publicKey); }; // src/injected.ts var targetMap = { coinbaseWallet: { id: "coinbaseWallet", name: "Coinbase Wallet", provider(window2) { if (typeof window2 !== "undefined") { return window2 == null ? void 0 : window2.coinbaseSolana; } return void 0; } }, bitKeep: { id: "bitKeep", name: "Bitget", provider(window2) { var _a, _b, _c; if (typeof window2 !== "undefined" && ((_b = (_a = window2.bitkeep) == null ? void 0 : _a.solana) == null ? void 0 : _b.isBitKeep)) { return (_c = window2.bitkeep) == null ? void 0 : _c.solana; } } }, phantom: { id: "phantom", name: "Phantom", provider(window2) { var _a, _b, _c; if (typeof window2 !== "undefined" && ((_b = (_a = window2.phantom) == null ? void 0 : _a.solana) == null ? void 0 : _b.isPhantom)) { return (_c = window2.phantom) == null ? void 0 : _c.solana; } } }, trustWallet: { id: "trustWallet", name: "Trust Wallet", provider(window2) { var _a, _b, _c; if (typeof window2 !== "undefined" && ((_b = (_a = window2.trustwallet) == null ? void 0 : _a.solana) == null ? void 0 : _b.isTrust)) { return (_c = window2.trustwallet) == null ? void 0 : _c.solana; } } }, okxWallet: { id: "okxWallet", name: "OKX Wallet", provider(window2) { var _a, _b, _c; if (typeof window2 !== "undefined" && ((_b = (_a = window2.okxwallet) == null ? void 0 : _a.solana) == null ? void 0 : _b.isOkxWallet)) { return (_c = window2.okxwallet) == null ? void 0 : _c.solana; } } }, braveWallet: { id: "braveWallet", name: "Brave Wallet", provider(window2) { var _a; if (typeof window2 !== "undefined" && ((_a = window2.braveSolana) == null ? void 0 : _a.isBraveWallet)) { return window2.braveSolana; } } } }; injected.type = "injected"; function injected(parameters) { const { unstableShimAsyncInject } = parameters; function getTarget() { const target = parameters.target; if (typeof target === "function") { const result = target(); if (result) return result; } if (typeof target === "object") return target; if (typeof target === "string" && targetMap[target]) return targetMap[target]; throw new Error("target not found."); } let accountChanged; let disconnect; return (0, import_connector_core.createConnector)((config) => ({ get icon() { return getTarget().icon; }, get id() { return `solana_${getTarget().id}`; }, get name() { return getTarget().name; }, type: injected.type, async connect({ chainId, isReconnecting } = {}) { var _a, _b, _c; const provider = await this.getProvider(); if (!provider) throw new import_connector_core.ProviderNotFoundError(); let accounts = []; if (isReconnecting) { const connected = await ((_a = config.storage) == null ? void 0 : _a.getItem(`${this.id}.injected.connected`)); if (connected) { if (!isConnected(provider)) { await provider.connect(); } if (!provider.publicKey) throw new import_connector_core.WalletAccountError(this.id); } accounts = await this.getAccounts().catch(() => []); } try { if (!(accounts == null ? void 0 : accounts.length) && !isReconnecting) { if (!isConnected(provider)) { await provider.connect(); } if (!provider.publicKey) throw new import_connector_core.WalletAccountError(this.id); accounts = [provider.publicKey.toBase58()]; } if (!accountChanged) { accountChanged = this.onAccountChanged.bind(this); provider.on("accountChanged", accountChanged); } if (!disconnect) { disconnect = this.onDisconnect.bind(this); provider.on("disconnect", disconnect); } let currentChainId = await this.getChainId(); if (chainId && currentChainId !== chainId) { const chain = await this.switchChain({ chainId }).catch((error) => { if (error.code === import_connector_core.UserRejectedRequestError.code) throw error; return { id: currentChainId }; }); currentChainId = (_b = chain == null ? void 0 : chain.id) != null ? _b : currentChainId; } await ((_c = config.storage) == null ? void 0 : _c.setItem(`${this.id}.injected.connected`, true)); if (provider.publicKey) { this.publicKey = new import_web3.PublicKey(provider.publicKey.toBytes()); } return { accounts, chainId: currentChainId }; } catch (err) { const error = err; if (error.code === import_connector_core.UserRejectedRequestError.code) throw new import_connector_core.UserRejectedRequestError(error); throw error; } }, async disconnect() { var _a; const provider = await this.getProvider(); if (!provider) throw new import_connector_core.ProviderNotFoundError(); if (disconnect) { provider.removeListener("disconnect", disconnect); disconnect = void 0; } try { await provider.disconnect(); } catch { } await ((_a = config.storage) == null ? void 0 : _a.removeItem(`${this.id}.injected.connected`)); this.publicKey = void 0; }, async getAccounts() { var _a; const provider = await this.getProvider(); if (!provider) throw new import_connector_core.ProviderNotFoundError(); if (this.publicKey) { return [this.publicKey.toBase58()]; } const connected = await ((_a = config.storage) == null ? void 0 : _a.getItem(`${this.id}.injected.connected`)); if (connected) { if (!isConnected(provider)) { await provider.connect(); } if (provider.publicKey) { this.publicKey = new import_web3.PublicKey(provider.publicKey.toBytes()); return [this.publicKey.toBase58()]; } } return []; }, async getChainId() { var _a; const provider = await this.getProvider(); if (!provider) throw new import_connector_core.ProviderNotFoundError(); const chainId = await ((_a = config.storage) == null ? void 0 : _a.getItem(`${this.id}.injected.chainId`)); if (chainId && config.chains.find((chain) => chain.id === Number(chainId))) { return Number(chainId); } return config.chains[0].id; }, async getProvider() { if (typeof window === "undefined") return void 0; const target = getTarget(); const provider = target.provider(window); return provider; }, async isAuthorized() { var _a; try { let provider = await this.getProvider(); if (!provider) { if (unstableShimAsyncInject !== void 0 && unstableShimAsyncInject !== false) { const handleProvider = async () => { const provider2 = await this.getProvider(); return provider2; }; const timeout = typeof unstableShimAsyncInject === "number" ? unstableShimAsyncInject : 1e3; provider = await new Promise((resolve) => setTimeout(() => resolve(handleProvider()), timeout)); if (!provider) { throw new import_connector_core.ProviderNotFoundError(); } } else { throw new import_connector_core.ProviderNotFoundError(); } } const connected = await ((_a = config.storage) == null ? void 0 : _a.getItem(`${this.id}.injected.connected`)); return Boolean(connected); } catch { return false; } }, async switchChain({ chainId }) { var _a; const chain = config.chains.find((chain2) => chain2.id === chainId); if (!chain) { throw new import_connector_core.SwitchChainError(new import_connector_core.ChainNotConfiguredError()); } await ((_a = config.storage) == null ? void 0 : _a.setItem(`${this.id}.injected.chainId`, chainId)); config.emitter.emit("change", { chainId }); return chain; }, async onAccountChanged(publicKey) { if (!publicKey) { this.publicKey = void 0; this.onDisconnect(); } else { this.publicKey = new import_web3.PublicKey(publicKey.toBytes()); config.emitter.emit("change", { accounts: [this.publicKey.toBase58()] }); } }, onChainChanged(chain) { const chainId = Number(chain); config.emitter.emit("change", { chainId }); }, async onDisconnect() { var _a; const provider = await this.getProvider(); config.emitter.emit("disconnect"); if (provider) { if (disconnect) { provider.removeListener("disconnect", disconnect); disconnect = void 0; } } this.publicKey = void 0; await ((_a = config.storage) == null ? void 0 : _a.removeItem(`${this.id}.injected.connected`)); }, isInstalled() { if (typeof window === "undefined") return false; const target = getTarget(); const provider = target.provider(window); return Boolean(provider); } })); } // src/defaultConnectorFns.ts var defaultConnectorFns = () => { const connectors = []; connectors.push(injected({ target: "phantom" })); connectors.push(injected({ target: "coinbaseWallet" })); connectors.push(injected({ target: "okxWallet" })); connectors.push(injected({ target: "bitKeep" })); connectors.push(injected({ target: "trustWallet" })); return connectors; }; // src/store.ts var import_connector_core2 = require("@particle-network/connector-core"); var import_vanilla = require("zustand/vanilla"); // src/getConnection.ts var import_web32 = require("@solana/web3.js"); var clients = /* @__PURE__ */ new Map(); function getConnection(chain) { { const client2 = clients.get(chain.id); if (client2) return client2; } const client = new import_web32.Connection(chain.rpcUrls.default.http[0]); clients.set(chain.id, client); return client; } // src/store.ts solanaWalletConnectors.type = "solanaWallet"; function solanaWalletConnectors(parameters = {}) { const { connectorFns } = parameters; const defaultConnectorFns2 = connectorFns != null ? connectorFns : defaultConnectorFns(); return (0, import_connector_core2.createWalletConnector)((options) => { const { ...rest } = options; const allChains = rest.chains.filter(import_connector_core2.isSolanaChain); if (allChains.length == 0) { throw new Error("Please add Solana chains in Connectkit options."); } const chains = (0, import_vanilla.createStore)(() => allChains); function setup(connectorFn) { var _a; const emitter = (0, import_connector_core2.createEmitter)(); const connector = { ...connectorFn({ emitter, chains: chains.getState(), storage: rest.storage }), emitter, uid: emitter.uid, chainType: "solana", walletConnectorType: solanaWalletConnectors.type }; (_a = connector.setup) == null ? void 0 : _a.call(connector); return connector; } const connectors = (0, import_vanilla.createStore)(() => [...defaultConnectorFns2].map(setup)); function getClient(chainId) { const chain = chains.getState().find((chain2) => chain2.id === chainId); if (!chain) { throw new import_connector_core2.ChainNotConfiguredError(); } return getConnection(chain); } return { get type() { return solanaWalletConnectors.type; }, get chains() { return chains.getState(); }, get connectors() { return connectors.getState(); }, store: connectors, getClient, _internal: { connectors: { setup } } }; }); } // src/version.ts var version = "2.1.0"; //# sourceMappingURL=index.cjs.map