UNPKG

@thirdweb-dev/wallets

Version:

<p align="center"> <br /> <a href="https://thirdweb.com"><img src="https://github.com/thirdweb-dev/js/blob/main/legacy_packages/sdk/logo.svg?raw=true" width="200" alt=""/></a> <br /> </p> <h1 align="center">thirdweb Wallet SDK</h1> <p align="center"> <a h

187 lines (184 loc) 5.88 kB
import { _ as _defineProperty } from '../../../../dist/defineProperty-350fc508.browser.esm.js'; import { W as WagmiConnector } from '../../../../dist/WagmiConnector-2f14002d.browser.esm.js'; import { U as UserRejectedRequestError, a as ConnectorNotFoundError, S as SwitchChainError } from '../../../../dist/errors-9edc08c8.browser.esm.js'; import BloctoSDK from '@blocto/sdk'; import { utils, providers } from 'ethers'; import { w as walletIds } from '../../../../dist/walletIds-dff6dced.browser.esm.js'; import { g as getValidPublicRPCUrl } from '../../../../dist/url-a45219bd.browser.esm.js'; import { n as normalizeChainId } from '../../../../dist/normalizeChainId-1fb9aedf.browser.esm.js'; import '@thirdweb-dev/chains'; import 'eventemitter3'; class BloctoConnector extends WagmiConnector { constructor(_ref) { let { chains, options = {} } = _ref; super({ chains, options }); _defineProperty(this, "id", walletIds.blocto); _defineProperty(this, "name", "Blocto"); _defineProperty(this, "ready", true); this._onAccountsChangedBind = this.onAccountsChanged.bind(this); this._onChainChangedBind = this.onChainChanged.bind(this); this._onDisconnectBind = this.onDisconnect.bind(this); } async connect(config) { try { const provider = await this.getProvider(config); this.setupListeners(); this.emit("message", { type: "connecting" }); const accounts = await provider.request({ method: "eth_requestAccounts" }); const account = utils.getAddress(accounts[0]); const id = await this.getChainId(); const unsupported = this.isChainUnsupported(id); return { account, chain: { id, unsupported }, provider }; } catch (error) { this._handleConnectReset(); if (this._isUserRejectedRequestError(error)) { throw new UserRejectedRequestError(error); } throw error; } } async disconnect() { const provider = await this.getProvider(); await provider.request({ method: "wallet_disconnect" }); this.removeListeners(); this._handleConnectReset(); } async getAccount() { const provider = await this.getProvider(); const accounts = await provider.request({ method: "eth_accounts" }); const [address] = accounts || []; if (!address) { throw new Error("No accounts found"); } return address; } async getChainId() { const provider = await this.getProvider(); const chainId = await provider.request({ method: "eth_chainId" }); return normalizeChainId(chainId); } getProvider() { let { chainId } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (!this._provider) { const _chainId = chainId ?? this.chains[0]?.chainId ?? 1; const _rpc = this.chains.find(x => x.chainId === _chainId)?.rpc[0]; this._provider = new BloctoSDK({ ethereum: { chainId: _chainId, rpc: _rpc }, appId: this.options.appId })?.ethereum; } if (!this._provider) { throw new ConnectorNotFoundError(); } return Promise.resolve(this._provider); } async getSigner() { let { chainId } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; const [provider, account] = await Promise.all([this.getProvider(), this.getAccount()]); return new providers.Web3Provider(provider, chainId).getSigner(account); } async isAuthorized() { return !!this._provider?._blocto?.sessionKeyEnv ?? false; } async switchChain(chainId) { const provider = await this.getProvider(); const id = utils.hexValue(chainId); const chain = this.chains.find(x => x.chainId === chainId); if (!chain) { throw new SwitchChainError(new Error("chain not found on connector.")); } const blocktoSupportedChainList = await provider.supportChainList(); const isBloctoSupportChain = blocktoSupportedChainList[`${chainId}`]; if (!isBloctoSupportChain) { throw new SwitchChainError(new Error(`Blocto unsupported chain: ${id}`)); } try { await provider.request({ method: "wallet_addEthereumChain", params: [{ chainId: id, rpcUrls: getValidPublicRPCUrl(chain) // no client id on purpose here }] }); await provider.request({ method: "wallet_switchEthereumChain", params: [{ chainId: id }] }); return chain; } catch (error) { if (this._isUserRejectedRequestError(error)) { throw new UserRejectedRequestError(error); } throw new SwitchChainError(error); } } onAccountsChanged() { // not supported yet } async onChainChanged(chain) { const id = normalizeChainId(chain); const unsupported = this.isChainUnsupported(id); const account = await this.getAccount(); this.emit("change", { chain: { id, unsupported }, account }); } onDisconnect() { this.emit("disconnect"); } async setupListeners() { const provider = await this.getProvider(); provider.on("accountsChanged", this._onAccountsChangedBind); provider.on("chainChanged", this._onChainChangedBind); provider.on("disconnect", this._onDisconnectBind); } async removeListeners() { const provider = await this.getProvider(); provider.off("accountsChanged", this._onAccountsChangedBind); provider.off("chainChanged", this._onChainChangedBind); provider.off("disconnect", this._onDisconnectBind); } _isUserRejectedRequestError(error) { return /(user rejected)/i.test(error.message); } _handleConnectReset() { this._provider = undefined; } } export { BloctoConnector };