UNPKG

@web3-wallet/coinbase-wallet

Version:
89 lines (70 loc) 2.42 kB
import type { CoinbaseWalletProvider, CoinbaseWalletSDK, } from '@coinbase/wallet-sdk'; import type { CoinbaseWalletSDKOptions } from '@coinbase/wallet-sdk/dist/CoinbaseWalletSDK'; import type { ConnectorOptions } from '@web3-wallet/core'; import { type WalletName, Connector } from '@web3-wallet/core'; import { icon } from './assets'; type ScanToConnectOptions = { rpcUrl: string; chainId: number; }; type ProviderOptions = CoinbaseWalletSDKOptions & { scanToConnectOptions?: ScanToConnectOptions; }; const _walletName = 'Coinbase Wallet'; const walletName = _walletName as WalletName<typeof _walletName>; export type CoinbaseWalletOptions = ConnectorOptions<ProviderOptions>; export class CoinbaseWallet extends Connector<CoinbaseWalletOptions> { public static walletName: WalletName<string> = walletName; public static walletIcon: string = icon; public walletName: WalletName<string> = walletName; /** {@inheritdoc Connector.provider} */ public override provider?: CoinbaseWalletProvider; /** * A `CoinbaseWalletSDK` instance. */ public coinbaseWallet?: CoinbaseWalletSDK; /** * {@inheritdoc Connector.constructor} * * @param options - Options to pass to `@coinbase/wallet-sdk`. */ constructor(options: CoinbaseWalletOptions) { super(options); } /** {@inheritdoc Connector.detectProvider} */ public override async detectProvider() { if (this.provider) return this.provider; const m = await import('@coinbase/wallet-sdk'); const { scanToConnectOptions, ...options } = ( this.options as CoinbaseWalletOptions ).providerOptions; this.coinbaseWallet = new m.default(options); this.provider = this.coinbaseWallet.makeWeb3Provider( scanToConnectOptions?.rpcUrl, scanToConnectOptions?.chainId, ); return this.provider; } private get connected() { return !!this.provider?.selectedAddress; } /** {@inheritdoc Connector.autoConnect} */ public override async autoConnect(): Promise<boolean> { await this.lazyInitialize(); if (!this.connected) { console.debug(`No existing connection`); return false; } return await super.autoConnect(); } /** {@inheritdoc Connector.disconnect} */ public override async disconnect(force = true): Promise<void> { await super.disconnect(); if (force) { await this.coinbaseWallet?.disconnect(); } } }