| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- import {
- BaseMessageSignerWalletAdapter,
- isVersionedTransaction,
- scopePollingDetectionStrategy,
- WalletAccountError,
- WalletConnectionError,
- WalletDisconnectedError,
- WalletError,
- WalletNotConnectedError,
- WalletNotReadyError,
- WalletPublicKeyError,
- WalletReadyState,
- WalletSendTransactionError,
- WalletSignMessageError,
- WalletSignTransactionError,
- type EventEmitter,
- type SendTransactionOptions,
- type WalletName,
- } from '@solana/wallet-adapter-base';
- import {
- PublicKey,
- type Connection,
- type SendOptions,
- type Transaction,
- type TransactionSignature,
- type VersionedTransaction,
- } from '@solana/web3.js';
- interface TokenPocketWalletEvents {
- connect(...args: unknown[]): unknown;
- disconnect(...args: unknown[]): unknown;
- }
- interface TokenPocketWallet extends EventEmitter<TokenPocketWalletEvents> {
- isTokenPocket?: boolean;
- publicKey?: { toBytes(): Uint8Array };
- isConnected: boolean;
- signAndSendTransaction<T extends Transaction | VersionedTransaction>(
- transaction: T,
- options?: SendOptions
- ): Promise<{ signature: TransactionSignature }>;
- signTransaction<T extends Transaction | VersionedTransaction>(transaction: T): Promise<T>;
- signAllTransactions<T extends Transaction | VersionedTransaction>(transactions: T[]): Promise<T[]>;
- signMessage(message: Uint8Array): Promise<{ signature: Uint8Array }>;
- connect(): Promise<void>;
- disconnect(): Promise<void>;
- }
- interface TokenPocketWindow extends Window {
- solana?: TokenPocketWallet;
- }
- declare const window: TokenPocketWindow;
- export interface TokenPocketWalletAdapterConfig {}
- export const TokenPocketWalletName = 'TokenPocket' as WalletName<'TokenPocket'>;
- export class TokenPocketWalletAdapter extends BaseMessageSignerWalletAdapter {
- name = TokenPocketWalletName;
- url = 'https://tokenpocket.pro';
- icon =
- 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEyMCIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGc+CjxwYXRoIGQ9Ik0xMDQxLjUyIDBILTI3VjEwMjRIMTA0MS41MlYwWiIgZmlsbD0iIzI5ODBGRSIvPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNDA4XzIyNSkiPgo8cGF0aCBkPSJNNDA2Ljc5NiA0MzguNjQzSDQwNi45MjdDNDA2Ljc5NiA0MzcuODU3IDQwNi43OTYgNDM2Ljk0IDQwNi43OTYgNDM2LjE1NFY0MzguNjQzWiIgZmlsbD0iIzI5QUVGRiIvPgo8cGF0aCBkPSJNNjY3LjYwMiA0NjMuNTMzSDUyMy4yNDlWNzI0LjA3NkM1MjMuMjQ5IDczNi4zODkgNTMzLjIwNCA3NDYuMzQ1IDU0NS41MTcgNzQ2LjM0NUg2NDUuMzMzQzY1Ny42NDcgNzQ2LjM0NSA2NjcuNjAyIDczNi4zODkgNjY3LjYwMiA3MjQuMDc2VjQ2My41MzNaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNDUzLjU2MyAyNzdINDQ4LjcxNkgxOTAuMjY5QzE3Ny45NTUgMjc3IDE2OCAyODYuOTU1IDE2OCAyOTkuMjY5VjM4OS42NTNDMTY4IDQwMS45NjcgMTc3Ljk1NSA0MTEuOTIyIDE5MC4yNjkgNDExLjkyMkgyNTAuOTE4SDI3NS4wMjFWNDM4LjY0NFY3MjQuNzMxQzI3NS4wMjEgNzM3LjA0NSAyODQuOTc2IDc0NyAyOTcuMjg5IDc0N0gzOTIuMTI4QzQwNC40NDEgNzQ3IDQxNC4zOTYgNzM3LjA0NSA0MTQuMzk2IDcyNC43MzFWNDM4LjY0NFY0MzYuMTU2VjQxMS45MjJINDM4LjQ5OUg0NDguMzIzSDQ1My4xN0M0OTAuMzcyIDQxMS45MjIgNTIwLjYzMSAzODEuNjYzIDUyMC42MzEgMzQ0LjQ2MUM1MjEuMDI0IDMwNy4yNTkgNDkwLjc2NSAyNzcgNDUzLjU2MyAyNzdaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNjY3LjczNSA0NjMuNTMzVjY0NS4zNUM2NzIuNzEzIDY0Ni41MjkgNjc3LjgyMSA2NDcuNDQ2IDY4My4wNjEgNjQ4LjIzMkM2OTAuMzk3IDY0OS4yOCA2OTcuOTk0IDY0OS45MzUgNzA1LjU5MiA2NTAuMDY2QzcwNS45ODUgNjUwLjA2NiA3MDYuMzc4IDY1MC4wNjYgNzA2LjkwMiA2NTAuMDY2VjUwNS40NUM2ODUuMDI2IDUwNC4wMDkgNjY3LjczNSA0ODUuODAxIDY2Ny43MzUgNDYzLjUzM1oiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl80MDhfMjI1KSIvPgo8cGF0aCBkPSJNNzA5Ljc4MSAyNzdDNjA2LjgyMiAyNzcgNTIzLjI0OSAzNjAuNTczIDUyMy4yNDkgNDYzLjUzM0M1MjMuMjQ5IDU1Mi4wODQgNTg0Ljk0NiA2MjYuMjI1IDY2Ny43MzMgNjQ1LjM1VjQ2My41MzNDNjY3LjczMyA0NDAuMzQ3IDY4Ni41OTYgNDIxLjQ4NCA3MDkuNzgxIDQyMS40ODRDNzMyLjk2NyA0MjEuNDg0IDc1MS44MyA0NDAuMzQ3IDc1MS44MyA0NjMuNTMzQzc1MS44MyA0ODMuMDUxIDczOC42IDQ5OS40MjUgNzIwLjUyMyA1MDQuMTRDNzE3LjExNyA1MDUuMDU3IDcxMy40NDkgNTA1LjU4MSA3MDkuNzgxIDUwNS41ODFWNjUwLjA2NkM3MTMuNDQ5IDY1MC4wNjYgNzE2Ljk4NiA2NDkuOTM1IDcyMC41MjMgNjQ5LjgwNEM4MTguNTA1IDY0NC4xNzEgODk2LjMxNCA1NjIuOTU2IDg5Ni4zMTQgNDYzLjUzM0M4OTYuNDQ1IDM2MC41NzMgODEyLjg3MiAyNzcgNzA5Ljc4MSAyNzdaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzA5Ljc4IDY1MC4wNjZWNTA1LjU4MUM3MDguNzMzIDUwNS41ODEgNzA3LjgxNiA1MDUuNTgxIDcwNi43NjggNTA1LjQ1VjY1MC4wNjZDNzA3LjgxNiA2NTAuMDY2IDcwOC44NjQgNjUwLjA2NiA3MDkuNzggNjUwLjA2NloiIGZpbGw9IndoaXRlIi8+CjwvZz4KPC9nPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzQwOF8yMjUiIHgxPSI3MDkuODQ0IiB5MT0iNTU2LjgyNyIgeDI9IjY2Ny43NTMiIHkyPSI1NTYuODI3IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+CjxzdG9wIG9mZnNldD0iMC45NjY3IiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjMyMzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjMiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF80MDhfMjI1Ij4KPHJlY3Qgd2lkdGg9IjcyOC40NDgiIGhlaWdodD0iNDcwIiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTY4IDI3NykiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K';
- readonly supportedTransactionVersions = null;
- private _connecting: boolean;
- private _wallet: TokenPocketWallet | null;
- private _publicKey: PublicKey | null;
- private _readyState: WalletReadyState =
- typeof window === 'undefined' || typeof document === 'undefined'
- ? WalletReadyState.Unsupported
- : WalletReadyState.NotDetected;
- constructor(config: TokenPocketWalletAdapterConfig = {}) {
- super();
- this._connecting = false;
- this._wallet = null;
- this._publicKey = null;
- if (this._readyState !== WalletReadyState.Unsupported) {
- scopePollingDetectionStrategy(() => {
- if (window.solana?.isTokenPocket) {
- this._readyState = WalletReadyState.Installed;
- this.emit('readyStateChange', this._readyState);
- return true;
- }
- return false;
- });
- }
- }
- get publicKey() {
- return this._publicKey;
- }
- get connecting() {
- return this._connecting;
- }
- get connected() {
- return !!this._wallet?.isConnected;
- }
- get readyState() {
- return this._readyState;
- }
- async connect(): Promise<void> {
- try {
- if (this.connected || this.connecting) return;
- if (this._readyState !== WalletReadyState.Installed) throw new WalletNotReadyError();
- this._connecting = true;
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- const wallet = window.solana!;
- try {
- await wallet.connect();
- } catch (error: any) {
- throw new WalletConnectionError(error?.message, error);
- }
- if (!wallet.publicKey) throw new WalletAccountError();
- let publicKey: PublicKey;
- try {
- publicKey = new PublicKey(wallet.publicKey.toBytes());
- } catch (error: any) {
- throw new WalletPublicKeyError(error?.message, error);
- }
- wallet.on('disconnect', this._disconnected);
- this._wallet = wallet;
- this._publicKey = publicKey;
- this.emit('connect', publicKey);
- } catch (error: any) {
- this.emit('error', error);
- throw error;
- } finally {
- this._connecting = false;
- }
- }
- async disconnect(): Promise<void> {
- const wallet = this._wallet;
- if (wallet) {
- wallet.off('disconnect', this._disconnected);
- this._wallet = null;
- this._publicKey = null;
- this.emit('disconnect');
- }
- }
- async sendTransaction<T extends Transaction | VersionedTransaction>(
- transaction: T,
- connection: Connection,
- options: SendTransactionOptions = {}
- ): Promise<TransactionSignature> {
- try {
- const wallet = this._wallet;
- if (!wallet) throw new WalletNotConnectedError();
- try {
- const { signers, ...sendOptions } = options;
- if (isVersionedTransaction(transaction)) {
- signers?.length && transaction.sign(signers);
- } else {
- transaction = (await this.prepareTransaction(transaction, connection, sendOptions)) as T;
- signers?.length && (transaction as Transaction).partialSign(...signers);
- }
- sendOptions.preflightCommitment = sendOptions.preflightCommitment || connection.commitment;
- const { signature } = await wallet.signAndSendTransaction(transaction, sendOptions);
- return signature;
- } catch (error: any) {
- if (error instanceof WalletError) throw error;
- throw new WalletSendTransactionError(error?.message, error);
- }
- } catch (error: any) {
- this.emit('error', error);
- throw error;
- }
- }
- async signTransaction<T extends Transaction | VersionedTransaction>(transaction: T): Promise<T> {
- try {
- const wallet = this._wallet;
- if (!wallet) throw new WalletNotConnectedError();
- try {
- return ((await wallet.signTransaction(transaction)) as T) || transaction;
- } catch (error: any) {
- throw new WalletSignTransactionError(error?.message, error);
- }
- } catch (error: any) {
- this.emit('error', error);
- throw error;
- }
- }
- async signAllTransactions<T extends Transaction | VersionedTransaction>(transactions: T[]): Promise<T[]> {
- try {
- const wallet = this._wallet;
- if (!wallet) throw new WalletNotConnectedError();
- try {
- return ((await wallet.signAllTransactions(transactions)) as T[]) || transactions;
- } catch (error: any) {
- throw new WalletSignTransactionError(error?.message, error);
- }
- } catch (error: any) {
- this.emit('error', error);
- throw error;
- }
- }
- async signMessage(message: Uint8Array): Promise<Uint8Array> {
- try {
- const wallet = this._wallet;
- if (!wallet) throw new WalletNotConnectedError();
- try {
- const { signature } = await wallet.signMessage(message);
- return signature;
- } catch (error: any) {
- throw new WalletSignMessageError(error?.message, error);
- }
- } catch (error: any) {
- this.emit('error', error);
- throw error;
- }
- }
- private _disconnected = () => {
- const wallet = this._wallet;
- if (wallet) {
- wallet.off('disconnect', this._disconnected);
- this._wallet = null;
- this._publicKey = null;
- this.emit('error', new WalletDisconnectedError());
- this.emit('disconnect');
- }
- };
- }
|