@solana-mobile/wallet-adapter-mobile 2.2.7 → 2.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.native.js","names":["Platform","WalletStandardWalletName","WalletStandardRemoteWalletName","BaseSignInMessageSignerWalletAdapter","WalletReadyState","#declareWalletAsInstalled","#accountSelector","#selectedAccount","#publicKey","#wallet","StandardEvents","#handleChangeEvent","PublicKey","WalletPublicKeyError","#connecting","#readyState","#connect","#runWithGuard","WalletNotReadyError","StandardConnect","WalletConnectionError","SolanaSignIn","StandardDisconnect","#assertIsAuthorized","SolanaSignMessage","WalletSignMessageError","SolanaSignAndSendTransaction","#performSignTransactions","WalletSendTransactionError","WalletNotConnectedError","SolanaSignTransaction","VersionedMessage","Transaction","VersionedTransaction","WalletSignTransactionError","LocalSolanaMobileWalletAdapterWallet","RemoteSolanaMobileWalletAdapterWallet","AsyncStorage"],"sources":["../../src/__forks__/react-native/getIsSupported.ts","../../src/adapter.ts","../../src/createDefaultAddressSelector.ts","../../src/__forks__/react-native/createDefaultAuthorizationResultCache.ts","../../src/createDefaultWalletNotFoundHandler.ts"],"sourcesContent":["import { Platform } from 'react-native';\n\nexport default function getIsSupported() {\n return Platform.OS === 'android';\n}\n","import {\n BaseSignInMessageSignerWalletAdapter,\n WalletConnectionError,\n WalletName,\n WalletNotConnectedError,\n WalletNotReadyError,\n WalletPublicKeyError,\n WalletReadyState,\n WalletSendTransactionError,\n WalletSignMessageError,\n WalletSignTransactionError,\n} from '@solana/wallet-adapter-base';\nimport {\n Connection,\n PublicKey,\n SendOptions,\n Transaction as LegacyTransaction,\n TransactionSignature,\n TransactionVersion,\n VersionedTransaction,\n VersionedMessage,\n Transaction,\n} from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n Base64EncodedAddress,\n Finality,\n Chain,\n Cluster,\n SignInPayload,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport {\n SolanaSignAndSendTransaction,\n SolanaSignIn,\n SolanaSignInInput,\n SolanaSignInOutput,\n SolanaSignMessage,\n SolanaSignTransaction,\n SolanaSignTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n IdentifierString,\n StandardConnect,\n StandardDisconnect,\n StandardEvents,\n StandardEventsChangeProperties,\n WalletAccount,\n} from '@wallet-standard/core';\nimport {\n Authorization,\n createDefaultChainSelector,\n LocalSolanaMobileWalletAdapterWallet,\n RemoteSolanaMobileWalletAdapterWallet,\n SolanaMobileWalletAdapterWalletName as WalletStandardWalletName,\n SolanaMobileWalletAdapterRemoteWalletName as WalletStandardRemoteWalletName,\n} from '@solana-mobile/wallet-standard-mobile';\nimport { fromUint8Array } from './base64Utils.js';\nimport getIsSupported from './getIsSupported.js';\n\nexport interface AuthorizationResultCache {\n clear(): Promise<void>;\n get(): Promise<AuthorizationResult | Authorization | undefined>;\n set(authorizationResult: AuthorizationResult | Authorization): Promise<void>;\n}\n\nexport interface AddressSelector {\n select(addresses: Base64EncodedAddress[]): Promise<Base64EncodedAddress>;\n}\n\nexport const SolanaMobileWalletAdapterWalletName = WalletStandardWalletName as WalletName;\nexport const SolanaMobileWalletAdapterRemoteWalletName = WalletStandardRemoteWalletName as WalletName;\n\nconst SIGNATURE_LENGTH_IN_BYTES = 64;\n\nfunction isVersionedTransaction(\n transaction: LegacyTransaction | VersionedTransaction,\n): transaction is VersionedTransaction {\n return 'version' in transaction;\n}\n\nfunction chainOrClusterToChainId(chain: Cluster | Chain): IdentifierString {\n switch (chain) {\n case 'mainnet-beta':\n return 'solana:mainnet';\n case 'testnet':\n return 'solana:testnet';\n case 'devnet':\n return 'solana:devnet';\n default:\n return chain;\n }\n}\n\nabstract class BaseSolanaMobileWalletAdapter extends BaseSignInMessageSignerWalletAdapter {\n readonly supportedTransactionVersions: Set<TransactionVersion> = new Set(\n // FIXME(#244): We can't actually know what versions are supported until we know which wallet we're talking to.\n ['legacy', 0],\n );\n name;\n icon;\n url;\n #wallet: LocalSolanaMobileWalletAdapterWallet | RemoteSolanaMobileWalletAdapterWallet;\n #connecting = false;\n #readyState: WalletReadyState = getIsSupported() ? WalletReadyState.Loadable : WalletReadyState.Unsupported;\n #accountSelector: (accounts: readonly WalletAccount[]) => Promise<WalletAccount>;\n #selectedAccount: WalletAccount | undefined;\n #publicKey: PublicKey | undefined;\n\n #handleChangeEvent = async (properties: StandardEventsChangeProperties) => {\n if (properties.accounts && properties.accounts.length > 0) {\n this.#declareWalletAsInstalled();\n const nextSelectedAccount = await this.#accountSelector(properties.accounts);\n if (nextSelectedAccount !== this.#selectedAccount) {\n this.#selectedAccount = nextSelectedAccount;\n this.#publicKey = undefined;\n this.emit(\n 'connect',\n // Having just set `this.#selectedAccount`, `this.publicKey` is definitely non-null\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.publicKey!,\n );\n }\n }\n };\n\n protected constructor(\n wallet: LocalSolanaMobileWalletAdapterWallet | RemoteSolanaMobileWalletAdapterWallet,\n config: {\n addressSelector: AddressSelector;\n chain: Chain;\n },\n ) {\n super();\n // this.#chain = chainOrClusterToChainId(config.chain);\n this.#accountSelector = async (accounts: readonly WalletAccount[]) => {\n const selectedBase64EncodedAddress = await config.addressSelector.select(\n accounts.map(({ publicKey }) => fromUint8Array(new Uint8Array(publicKey))),\n );\n return (\n accounts.find(\n ({ publicKey }) => fromUint8Array(new Uint8Array(publicKey)) === selectedBase64EncodedAddress,\n ) ?? accounts[0]\n );\n };\n this.#wallet = wallet;\n this.#wallet.features[StandardEvents].on('change', this.#handleChangeEvent);\n this.name = this.#wallet.name as WalletName;\n this.icon = this.#wallet.icon;\n this.url = this.#wallet.url;\n // TODO: evaluate if this logic should be kept - it seems to create a nasty bug where\n // the wallet tries to auto connect on page load and gets blocked by the popup blocker\n // if (this.#readyState !== WalletReadyState.Unsupported) {\n // config.authorizationResultCache.get().then((authorizationResult) => {\n // if (authorizationResult) {\n // // Having a prior authorization result is, right now, the best\n // // indication that a mobile wallet is installed. There is no API\n // // we can use to test for whether the association URI is supported.\n // this.#declareWalletAsInstalled();\n // }\n // });\n // }\n }\n\n get publicKey(): PublicKey | null {\n if (!this.#publicKey && this.#selectedAccount) {\n try {\n this.#publicKey = new PublicKey(this.#selectedAccount.publicKey);\n } catch (e) {\n throw new WalletPublicKeyError((e instanceof Error && e?.message) || 'Unknown error', e);\n }\n }\n return this.#publicKey ?? null;\n }\n\n get connected(): boolean {\n return this.#wallet.connected;\n }\n\n get connecting(): boolean {\n return this.#connecting;\n }\n\n get readyState(): WalletReadyState {\n return this.#readyState;\n }\n\n /** @deprecated Use `autoConnect()` instead. */\n async autoConnect_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(): Promise<void> {\n return await this.autoConnect();\n }\n\n async autoConnect(): Promise<void> {\n this.#connect(true);\n }\n\n async connect(): Promise<void> {\n this.#connect();\n }\n\n async #connect(autoConnect: boolean = false): Promise<void> {\n if (this.connecting || this.connected) {\n return;\n }\n return await this.#runWithGuard(async () => {\n if (this.#readyState !== WalletReadyState.Installed && this.#readyState !== WalletReadyState.Loadable) {\n throw new WalletNotReadyError();\n }\n this.#connecting = true;\n try {\n await this.#wallet.features[StandardConnect].connect({ silent: autoConnect });\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n } finally {\n this.#connecting = false;\n }\n });\n }\n\n /** @deprecated Use `connect()` or `autoConnect()` instead. */\n async performAuthorization(signInPayload?: SignInPayload): Promise<AuthorizationResult> {\n try {\n const cachedAuthorizationResult = await this.#wallet.cachedAuthorizationResult;\n if (cachedAuthorizationResult) {\n await this.#wallet.features[StandardConnect].connect({ silent: true });\n return cachedAuthorizationResult;\n }\n\n if (signInPayload) {\n await this.#wallet.features[SolanaSignIn].signIn(signInPayload);\n } else await this.#wallet.features[StandardConnect].connect();\n const authorizationResult = await await this.#wallet.cachedAuthorizationResult;\n return authorizationResult!;\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n }\n }\n\n async disconnect(): Promise<void> {\n // return await this.#runWithGuard(this.#wallet.features[StandardDisconnect].disconnect);\n return await this.#runWithGuard(async () => {\n this.#connecting = false;\n this.#publicKey = undefined;\n this.#selectedAccount = undefined;\n await this.#wallet.features[StandardDisconnect].disconnect();\n this.emit('disconnect');\n });\n }\n\n async signIn(input?: SolanaSignInInput): Promise<SolanaSignInOutput> {\n return this.#runWithGuard(async () => {\n if (this.#readyState !== WalletReadyState.Installed && this.#readyState !== WalletReadyState.Loadable) {\n throw new WalletNotReadyError();\n }\n this.#connecting = true;\n try {\n const outputs = await this.#wallet.features[SolanaSignIn].signIn({\n ...input,\n domain: input?.domain ?? window.location.host,\n });\n if (outputs.length > 0) {\n return outputs[0];\n } else {\n throw new Error('Sign in failed, no sign in result returned by wallet');\n }\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n } finally {\n this.#connecting = false;\n }\n });\n }\n\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n return await this.#runWithGuard(async () => {\n const account = this.#assertIsAuthorized();\n try {\n const outputs = await this.#wallet.features[SolanaSignMessage].signMessage({\n account,\n message: message,\n });\n return outputs[0].signature;\n } catch (error: any) {\n throw new WalletSignMessageError(error?.message, error);\n }\n });\n }\n\n async sendTransaction<T extends LegacyTransaction | VersionedTransaction>(\n transaction: T,\n connection: Connection,\n options?: SendOptions,\n ): Promise<TransactionSignature> {\n return await this.#runWithGuard(async () => {\n const account = this.#assertIsAuthorized();\n try {\n function getTargetCommitment() {\n let targetCommitment: Finality;\n switch (connection.commitment) {\n case 'confirmed':\n case 'finalized':\n case 'processed':\n targetCommitment = connection.commitment;\n break;\n default:\n targetCommitment = 'finalized';\n }\n let targetPreflightCommitment: Finality;\n switch (options?.preflightCommitment) {\n case 'confirmed':\n case 'finalized':\n case 'processed':\n targetPreflightCommitment = options.preflightCommitment;\n break;\n case undefined:\n targetPreflightCommitment = targetCommitment;\n break;\n default:\n targetPreflightCommitment = 'finalized';\n }\n const preflightCommitmentScore =\n targetPreflightCommitment === 'finalized'\n ? 2\n : targetPreflightCommitment === 'confirmed'\n ? 1\n : 0;\n const targetCommitmentScore =\n targetCommitment === 'finalized' ? 2 : targetCommitment === 'confirmed' ? 1 : 0;\n return preflightCommitmentScore < targetCommitmentScore\n ? targetPreflightCommitment\n : targetCommitment;\n }\n if (SolanaSignAndSendTransaction in this.#wallet.features) {\n const chain = chainOrClusterToChainId(this.#wallet.currentAuthorization!.chain);\n const [signature] = (\n await this.#wallet.features[SolanaSignAndSendTransaction].signAndSendTransaction({\n account,\n transaction: transaction.serialize(),\n chain: chain,\n options: options\n ? {\n skipPreflight: options.skipPreflight,\n maxRetries: options.maxRetries,\n }\n : undefined,\n })\n ).map((output) => {\n return fromUint8Array(output.signature);\n });\n\n return signature;\n } else {\n const [signedTransaction] = await this.#performSignTransactions([transaction]);\n if (isVersionedTransaction(signedTransaction)) {\n return await connection.sendTransaction(signedTransaction);\n } else {\n const serializedTransaction = signedTransaction.serialize();\n return await connection.sendRawTransaction(serializedTransaction, {\n ...options,\n preflightCommitment: getTargetCommitment(),\n });\n }\n }\n } catch (error: any) {\n throw new WalletSendTransactionError(error?.message, error);\n }\n });\n }\n\n async signTransaction<T extends LegacyTransaction | VersionedTransaction>(transaction: T): Promise<T> {\n return await this.#runWithGuard(async () => {\n const [signedTransaction] = await this.#performSignTransactions([transaction]);\n return signedTransaction;\n });\n }\n\n async signAllTransactions<T extends LegacyTransaction | VersionedTransaction>(transactions: T[]): Promise<T[]> {\n return await this.#runWithGuard(async () => {\n const signedTransactions = await this.#performSignTransactions(transactions);\n return signedTransactions;\n });\n }\n\n #declareWalletAsInstalled(): void {\n if (this.#readyState !== WalletReadyState.Installed) {\n this.emit('readyStateChange', (this.#readyState = WalletReadyState.Installed));\n }\n }\n\n #assertIsAuthorized() {\n if (!this.#wallet.isAuthorized || !this.#selectedAccount) throw new WalletNotConnectedError();\n return this.#selectedAccount;\n }\n\n async #performSignTransactions<T extends LegacyTransaction | VersionedTransaction>(\n transactions: T[],\n ): Promise<T[]> {\n const account = this.#assertIsAuthorized();\n try {\n if (SolanaSignTransaction in this.#wallet.features) {\n return this.#wallet.features[SolanaSignTransaction].signTransaction(\n ...transactions.map((value) => {\n return { account, transaction: value.serialize() };\n }),\n ).then((outputs) => {\n return outputs.map((output: SolanaSignTransactionOutput) => {\n const byteArray = output.signedTransaction;\n const numSignatures = byteArray[0];\n const messageOffset = numSignatures * SIGNATURE_LENGTH_IN_BYTES + 1;\n const version = VersionedMessage.deserializeMessageVersion(\n byteArray.slice(messageOffset, byteArray.length),\n );\n if (version === 'legacy') {\n return Transaction.from(byteArray) as T;\n } else {\n return VersionedTransaction.deserialize(byteArray) as T;\n }\n });\n });\n } else {\n throw new Error('Connected wallet does not support signing transactions');\n }\n } catch (error: any) {\n throw new WalletSignTransactionError(error?.message, error);\n }\n }\n\n async #runWithGuard<TReturn>(callback: () => Promise<TReturn>) {\n try {\n return await callback();\n } catch (e: any) {\n this.emit('error', e);\n throw e;\n }\n }\n}\n\nexport class LocalSolanaMobileWalletAdapter extends BaseSolanaMobileWalletAdapter {\n /**\n * @deprecated @param cluster config paramter is deprecated, use @param chain instead\n */\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n cluster: Cluster;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n });\n\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n });\n\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n cluster: Cluster;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n }) {\n const chain = chainOrClusterToChainId(config.chain ?? config.cluster);\n super(\n new LocalSolanaMobileWalletAdapterWallet({\n appIdentity: config.appIdentity,\n authorizationCache: {\n set: config.authorizationResultCache.set,\n get: async () => {\n return (await config.authorizationResultCache.get()) as Authorization | undefined;\n },\n clear: config.authorizationResultCache.clear,\n },\n chains: [chain],\n chainSelector: createDefaultChainSelector(),\n onWalletNotFound: async () => {\n config.onWalletNotFound(this);\n },\n }),\n {\n addressSelector: config.addressSelector,\n chain: chain,\n },\n );\n }\n}\n\nexport class RemoteSolanaMobileWalletAdapter extends BaseSolanaMobileWalletAdapter {\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n remoteHostAuthority: string;\n onWalletNotFound: (mobileWalletAdapter: RemoteSolanaMobileWalletAdapter) => Promise<void>;\n }) {\n const chain = chainOrClusterToChainId(config.chain);\n super(\n new RemoteSolanaMobileWalletAdapterWallet({\n appIdentity: config.appIdentity,\n authorizationCache: {\n set: config.authorizationResultCache.set,\n get: async () => {\n return (await config.authorizationResultCache.get()) as Authorization | undefined;\n },\n clear: config.authorizationResultCache.clear,\n },\n chains: [chain],\n chainSelector: createDefaultChainSelector(),\n remoteHostAuthority: config.remoteHostAuthority,\n onWalletNotFound: async () => {\n config.onWalletNotFound(this);\n },\n }),\n {\n addressSelector: config.addressSelector,\n chain: chain,\n },\n );\n }\n}\n\nexport class SolanaMobileWalletAdapter extends LocalSolanaMobileWalletAdapter {}\n","import { AddressSelector } from './adapter.js';\n\nexport default function createDefaultAddressSelector(): AddressSelector {\n return {\n async select(addresses) {\n return addresses[0];\n },\n };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { AuthorizationResultCache } from '../../adapter.js';\n\nconst CACHE_KEY = 'SolanaMobileWalletAdapterDefaultAuthorizationCache';\n\nexport default function createDefaultAuthorizationResultCache(): AuthorizationResultCache {\n return {\n async clear() {\n try {\n await AsyncStorage.removeItem(CACHE_KEY);\n // eslint-disable-next-line no-empty\n } catch {}\n },\n async get() {\n try {\n return (\n (JSON.parse((await AsyncStorage.getItem(CACHE_KEY)) as string) as AuthorizationResult) || undefined\n );\n // eslint-disable-next-line no-empty\n } catch {}\n },\n async set(authorizationResult: AuthorizationResult) {\n try {\n await AsyncStorage.setItem(CACHE_KEY, JSON.stringify(authorizationResult));\n // eslint-disable-next-line no-empty\n } catch {}\n },\n };\n}\n","import { SolanaMobileWalletAdapter } from './adapter.js';\nimport { defaultErrorModalWalletNotFoundHandler } from '@solana-mobile/wallet-standard-mobile';\n\nasync function defaultWalletNotFoundHandler(mobileWalletAdapter: SolanaMobileWalletAdapter) {\n return defaultErrorModalWalletNotFoundHandler();\n}\n\nexport default function createDefaultWalletNotFoundHandler(): (\n mobileWalletAdapter: SolanaMobileWalletAdapter,\n) => Promise<void> {\n return defaultWalletNotFoundHandler;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.native.js","names":["Platform","WalletStandardWalletName","WalletStandardRemoteWalletName","BaseSignInMessageSignerWalletAdapter","WalletReadyState","#declareWalletAsInstalled","#accountSelector","#selectedAccount","#publicKey","#wallet","StandardEvents","#handleChangeEvent","PublicKey","WalletPublicKeyError","#connecting","#readyState","#connect","#runWithGuard","WalletNotReadyError","StandardConnect","WalletConnectionError","SolanaSignIn","StandardDisconnect","#assertIsAuthorized","SolanaSignMessage","WalletSignMessageError","SolanaSignAndSendTransaction","#performSignTransactions","WalletSendTransactionError","WalletNotConnectedError","SolanaSignTransaction","VersionedMessage","Transaction","VersionedTransaction","WalletSignTransactionError","WalletError","LocalSolanaMobileWalletAdapterWallet","RemoteSolanaMobileWalletAdapterWallet","AsyncStorage"],"sources":["../../src/__forks__/react-native/getIsSupported.ts","../../src/adapter.ts","../../src/createDefaultAddressSelector.ts","../../src/__forks__/react-native/createDefaultAuthorizationResultCache.ts","../../src/createDefaultWalletNotFoundHandler.ts"],"sourcesContent":["import { Platform } from 'react-native';\n\nexport function getIsSupported() {\n return Platform.OS === 'android';\n}\n\n/**\n * @deprecated Use {@link getIsSupported} instead.\n */\nexport default getIsSupported;\n","import {\n BaseSignInMessageSignerWalletAdapter,\n WalletConnectionError,\n WalletError,\n WalletName,\n WalletNotConnectedError,\n WalletNotReadyError,\n WalletPublicKeyError,\n WalletReadyState,\n WalletSendTransactionError,\n WalletSignMessageError,\n WalletSignTransactionError,\n} from '@solana/wallet-adapter-base';\nimport {\n SolanaSignAndSendTransaction,\n SolanaSignIn,\n SolanaSignInInput,\n SolanaSignInOutput,\n SolanaSignMessage,\n SolanaSignTransaction,\n SolanaSignTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n Connection,\n PublicKey,\n SendOptions,\n Transaction as LegacyTransaction,\n Transaction,\n TransactionSignature,\n TransactionVersion,\n VersionedMessage,\n VersionedTransaction,\n} from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n Base64EncodedAddress,\n Chain,\n Cluster,\n Finality,\n SignInPayload,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { base64FromUint8Array } from '@solana-mobile/mobile-wallet-adapter-protocol/encoding';\nimport {\n Authorization,\n createDefaultChainSelector,\n LocalSolanaMobileWalletAdapterWallet,\n RemoteSolanaMobileWalletAdapterWallet,\n SolanaMobileWalletAdapterRemoteWalletName as WalletStandardRemoteWalletName,\n SolanaMobileWalletAdapterWalletName as WalletStandardWalletName,\n} from '@solana-mobile/wallet-standard-mobile';\nimport {\n IdentifierString,\n StandardConnect,\n StandardDisconnect,\n StandardEvents,\n StandardEventsChangeProperties,\n WalletAccount,\n} from '@wallet-standard/core';\n\nimport { getIsSupported } from './getIsSupported.js';\n\nexport interface AuthorizationResultCache {\n clear(): Promise<void>;\n get(): Promise<AuthorizationResult | Authorization | undefined>;\n set(authorizationResult: AuthorizationResult | Authorization): Promise<void>;\n}\n\nexport interface AddressSelector {\n select(addresses: Base64EncodedAddress[]): Promise<Base64EncodedAddress>;\n}\n\nexport const SolanaMobileWalletAdapterWalletName = WalletStandardWalletName as WalletName;\nexport const SolanaMobileWalletAdapterRemoteWalletName = WalletStandardRemoteWalletName as WalletName;\n\nconst SIGNATURE_LENGTH_IN_BYTES = 64;\n\nfunction isVersionedTransaction(\n transaction: LegacyTransaction | VersionedTransaction,\n): transaction is VersionedTransaction {\n return 'version' in transaction;\n}\n\nfunction chainOrClusterToChainId(chain: Cluster | Chain): IdentifierString {\n switch (chain) {\n case 'mainnet-beta':\n return 'solana:mainnet';\n case 'testnet':\n return 'solana:testnet';\n case 'devnet':\n return 'solana:devnet';\n default:\n return chain;\n }\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : 'Unknown error';\n}\n\nabstract class BaseSolanaMobileWalletAdapter extends BaseSignInMessageSignerWalletAdapter {\n readonly supportedTransactionVersions: Set<TransactionVersion> = new Set(\n // FIXME(#244): We can't actually know what versions are supported until we know which wallet we're talking to.\n ['legacy', 0],\n );\n name;\n icon;\n url;\n #wallet: LocalSolanaMobileWalletAdapterWallet | RemoteSolanaMobileWalletAdapterWallet;\n #connecting = false;\n #readyState: WalletReadyState = getIsSupported() ? WalletReadyState.Loadable : WalletReadyState.Unsupported;\n #accountSelector: (accounts: readonly WalletAccount[]) => Promise<WalletAccount>;\n #selectedAccount: WalletAccount | undefined;\n #publicKey: PublicKey | undefined;\n\n #handleChangeEvent = async (properties: StandardEventsChangeProperties) => {\n if (properties.accounts && properties.accounts.length > 0) {\n this.#declareWalletAsInstalled();\n const nextSelectedAccount = await this.#accountSelector(properties.accounts);\n if (nextSelectedAccount !== this.#selectedAccount) {\n this.#selectedAccount = nextSelectedAccount;\n this.#publicKey = undefined;\n this.emit(\n 'connect',\n // Having just set `this.#selectedAccount`, `this.publicKey` is definitely non-null\n\n this.publicKey!,\n );\n }\n }\n };\n\n protected constructor(\n wallet: LocalSolanaMobileWalletAdapterWallet | RemoteSolanaMobileWalletAdapterWallet,\n config: {\n addressSelector: AddressSelector;\n chain: Chain;\n },\n ) {\n super();\n // this.#chain = chainOrClusterToChainId(config.chain);\n this.#accountSelector = async (accounts: readonly WalletAccount[]) => {\n const selectedBase64EncodedAddress = await config.addressSelector.select(\n accounts.map(({ publicKey }) => base64FromUint8Array(new Uint8Array(publicKey))),\n );\n return (\n accounts.find(\n ({ publicKey }) => base64FromUint8Array(new Uint8Array(publicKey)) === selectedBase64EncodedAddress,\n ) ?? accounts[0]\n );\n };\n this.#wallet = wallet;\n this.#wallet.features[StandardEvents].on('change', this.#handleChangeEvent);\n this.name = this.#wallet.name as WalletName;\n this.icon = this.#wallet.icon;\n this.url = this.#wallet.url;\n // TODO: evaluate if this logic should be kept - it seems to create a nasty bug where\n // the wallet tries to auto connect on page load and gets blocked by the popup blocker\n // if (this.#readyState !== WalletReadyState.Unsupported) {\n // config.authorizationResultCache.get().then((authorizationResult) => {\n // if (authorizationResult) {\n // // Having a prior authorization result is, right now, the best\n // // indication that a mobile wallet is installed. There is no API\n // // we can use to test for whether the association URI is supported.\n // this.#declareWalletAsInstalled();\n // }\n // });\n // }\n }\n\n get publicKey(): PublicKey | null {\n if (!this.#publicKey && this.#selectedAccount) {\n try {\n this.#publicKey = new PublicKey(this.#selectedAccount.publicKey);\n } catch (e) {\n throw new WalletPublicKeyError((e instanceof Error && e?.message) || 'Unknown error', e);\n }\n }\n return this.#publicKey ?? null;\n }\n\n get connected(): boolean {\n return this.#wallet.connected;\n }\n\n get connecting(): boolean {\n return this.#connecting;\n }\n\n get readyState(): WalletReadyState {\n return this.#readyState;\n }\n\n /** @deprecated Use `autoConnect()` instead. */\n async autoConnect_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(): Promise<void> {\n return await this.autoConnect();\n }\n\n async autoConnect(): Promise<void> {\n this.#connect(true);\n }\n\n async connect(): Promise<void> {\n this.#connect();\n }\n\n async #connect(autoConnect: boolean = false): Promise<void> {\n if (this.connecting || this.connected) {\n return;\n }\n return await this.#runWithGuard(async () => {\n if (this.#readyState !== WalletReadyState.Installed && this.#readyState !== WalletReadyState.Loadable) {\n throw new WalletNotReadyError();\n }\n this.#connecting = true;\n try {\n await this.#wallet.features[StandardConnect].connect({ silent: autoConnect });\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n } finally {\n this.#connecting = false;\n }\n });\n }\n\n /** @deprecated Use `connect()` or `autoConnect()` instead. */\n async performAuthorization(signInPayload?: SignInPayload): Promise<AuthorizationResult> {\n try {\n const cachedAuthorizationResult = await this.#wallet.cachedAuthorizationResult;\n if (cachedAuthorizationResult) {\n await this.#wallet.features[StandardConnect].connect({ silent: true });\n return cachedAuthorizationResult;\n }\n\n if (signInPayload) {\n await this.#wallet.features[SolanaSignIn].signIn(signInPayload);\n } else await this.#wallet.features[StandardConnect].connect();\n const authorizationResult = await await this.#wallet.cachedAuthorizationResult;\n return authorizationResult!;\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n }\n }\n\n async disconnect(): Promise<void> {\n // return await this.#runWithGuard(this.#wallet.features[StandardDisconnect].disconnect);\n return await this.#runWithGuard(async () => {\n this.#connecting = false;\n this.#publicKey = undefined;\n this.#selectedAccount = undefined;\n await this.#wallet.features[StandardDisconnect].disconnect();\n this.emit('disconnect');\n });\n }\n\n async signIn(input?: SolanaSignInInput): Promise<SolanaSignInOutput> {\n return this.#runWithGuard(async () => {\n if (this.#readyState !== WalletReadyState.Installed && this.#readyState !== WalletReadyState.Loadable) {\n throw new WalletNotReadyError();\n }\n this.#connecting = true;\n try {\n const outputs = await this.#wallet.features[SolanaSignIn].signIn({\n ...input,\n domain: input?.domain ?? window.location.host,\n });\n if (outputs.length > 0) {\n return outputs[0];\n } else {\n throw new Error('Sign in failed, no sign in result returned by wallet');\n }\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n } finally {\n this.#connecting = false;\n }\n });\n }\n\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n return await this.#runWithGuard(async () => {\n const account = this.#assertIsAuthorized();\n try {\n const outputs = await this.#wallet.features[SolanaSignMessage].signMessage({\n account,\n message: message,\n });\n return outputs[0].signature;\n } catch (error: unknown) {\n throw new WalletSignMessageError(getErrorMessage(error), error);\n }\n });\n }\n\n async sendTransaction<T extends LegacyTransaction | VersionedTransaction>(\n transaction: T,\n connection: Connection,\n options?: SendOptions,\n ): Promise<TransactionSignature> {\n return await this.#runWithGuard(async () => {\n const account = this.#assertIsAuthorized();\n try {\n function getTargetCommitment() {\n let targetCommitment: Finality;\n switch (connection.commitment) {\n case 'confirmed':\n case 'finalized':\n case 'processed':\n targetCommitment = connection.commitment;\n break;\n default:\n targetCommitment = 'finalized';\n }\n let targetPreflightCommitment: Finality;\n switch (options?.preflightCommitment) {\n case 'confirmed':\n case 'finalized':\n case 'processed':\n targetPreflightCommitment = options.preflightCommitment;\n break;\n case undefined:\n targetPreflightCommitment = targetCommitment;\n break;\n default:\n targetPreflightCommitment = 'finalized';\n }\n const preflightCommitmentScore =\n targetPreflightCommitment === 'finalized'\n ? 2\n : targetPreflightCommitment === 'confirmed'\n ? 1\n : 0;\n const targetCommitmentScore =\n targetCommitment === 'finalized' ? 2 : targetCommitment === 'confirmed' ? 1 : 0;\n return preflightCommitmentScore < targetCommitmentScore\n ? targetPreflightCommitment\n : targetCommitment;\n }\n if (SolanaSignAndSendTransaction in this.#wallet.features) {\n const chain = chainOrClusterToChainId(this.#wallet.currentAuthorization!.chain);\n const [signature] = (\n await this.#wallet.features[SolanaSignAndSendTransaction].signAndSendTransaction({\n account,\n transaction: transaction.serialize(),\n chain: chain,\n options: options\n ? {\n skipPreflight: options.skipPreflight,\n maxRetries: options.maxRetries,\n }\n : undefined,\n })\n ).map((output) => {\n return base64FromUint8Array(output.signature);\n });\n\n return signature;\n } else {\n const [signedTransaction] = await this.#performSignTransactions([transaction]);\n if (isVersionedTransaction(signedTransaction)) {\n return await connection.sendTransaction(signedTransaction);\n } else {\n const serializedTransaction = signedTransaction.serialize();\n return await connection.sendRawTransaction(serializedTransaction, {\n ...options,\n preflightCommitment: getTargetCommitment(),\n });\n }\n }\n } catch (error: unknown) {\n throw new WalletSendTransactionError(getErrorMessage(error), error);\n }\n });\n }\n\n async signTransaction<T extends LegacyTransaction | VersionedTransaction>(transaction: T): Promise<T> {\n return await this.#runWithGuard(async () => {\n const [signedTransaction] = await this.#performSignTransactions([transaction]);\n return signedTransaction;\n });\n }\n\n async signAllTransactions<T extends LegacyTransaction | VersionedTransaction>(transactions: T[]): Promise<T[]> {\n return await this.#runWithGuard(async () => {\n const signedTransactions = await this.#performSignTransactions(transactions);\n return signedTransactions;\n });\n }\n\n #declareWalletAsInstalled(): void {\n if (this.#readyState !== WalletReadyState.Installed) {\n this.emit('readyStateChange', (this.#readyState = WalletReadyState.Installed));\n }\n }\n\n #assertIsAuthorized() {\n if (!this.#wallet.isAuthorized || !this.#selectedAccount) throw new WalletNotConnectedError();\n return this.#selectedAccount;\n }\n\n async #performSignTransactions<T extends LegacyTransaction | VersionedTransaction>(\n transactions: T[],\n ): Promise<T[]> {\n const account = this.#assertIsAuthorized();\n try {\n if (SolanaSignTransaction in this.#wallet.features) {\n return this.#wallet.features[SolanaSignTransaction].signTransaction(\n ...transactions.map((value) => {\n return { account, transaction: value.serialize() };\n }),\n ).then((outputs) => {\n return outputs.map((output: SolanaSignTransactionOutput) => {\n const byteArray = output.signedTransaction;\n const numSignatures = byteArray[0];\n const messageOffset = numSignatures * SIGNATURE_LENGTH_IN_BYTES + 1;\n const version = VersionedMessage.deserializeMessageVersion(\n byteArray.slice(messageOffset, byteArray.length),\n );\n if (version === 'legacy') {\n return Transaction.from(byteArray) as T;\n } else {\n return VersionedTransaction.deserialize(byteArray) as T;\n }\n });\n });\n } else {\n throw new Error('Connected wallet does not support signing transactions');\n }\n } catch (error: unknown) {\n throw new WalletSignTransactionError(getErrorMessage(error), error);\n }\n }\n\n async #runWithGuard<TReturn>(callback: () => Promise<TReturn>) {\n try {\n return await callback();\n } catch (e: unknown) {\n this.emit('error', e instanceof WalletError ? e : new WalletError(getErrorMessage(e), e));\n throw e;\n }\n }\n}\n\nexport class LocalSolanaMobileWalletAdapter extends BaseSolanaMobileWalletAdapter {\n /**\n * @deprecated @param cluster config paramter is deprecated, use @param chain instead\n */\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n cluster: Cluster;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n });\n\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n });\n\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n cluster: Cluster;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n }) {\n const chain = chainOrClusterToChainId(config.chain ?? config.cluster);\n super(\n new LocalSolanaMobileWalletAdapterWallet({\n appIdentity: config.appIdentity,\n authorizationCache: {\n set: config.authorizationResultCache.set,\n get: async () => {\n return (await config.authorizationResultCache.get()) as Authorization | undefined;\n },\n clear: config.authorizationResultCache.clear,\n },\n chains: [chain],\n chainSelector: createDefaultChainSelector(),\n onWalletNotFound: async () => {\n config.onWalletNotFound(this);\n },\n }),\n {\n addressSelector: config.addressSelector,\n chain: chain,\n },\n );\n }\n}\n\nexport class RemoteSolanaMobileWalletAdapter extends BaseSolanaMobileWalletAdapter {\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n remoteHostAuthority: string;\n onWalletNotFound: (mobileWalletAdapter: RemoteSolanaMobileWalletAdapter) => Promise<void>;\n }) {\n const chain = chainOrClusterToChainId(config.chain);\n super(\n new RemoteSolanaMobileWalletAdapterWallet({\n appIdentity: config.appIdentity,\n authorizationCache: {\n set: config.authorizationResultCache.set,\n get: async () => {\n return (await config.authorizationResultCache.get()) as Authorization | undefined;\n },\n clear: config.authorizationResultCache.clear,\n },\n chains: [chain],\n chainSelector: createDefaultChainSelector(),\n remoteHostAuthority: config.remoteHostAuthority,\n onWalletNotFound: async () => {\n config.onWalletNotFound(this);\n },\n }),\n {\n addressSelector: config.addressSelector,\n chain: chain,\n },\n );\n }\n}\n\nexport class SolanaMobileWalletAdapter extends LocalSolanaMobileWalletAdapter {}\n","import { AddressSelector } from './adapter.js';\n\nexport function createDefaultAddressSelector(): AddressSelector {\n return {\n async select(addresses) {\n return addresses[0];\n },\n };\n}\n\n/**\n * @deprecated Use {@link createDefaultAddressSelector} instead.\n */\nexport default createDefaultAddressSelector;\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { AuthorizationResultCache } from '../../adapter.js';\n\nconst CACHE_KEY = 'SolanaMobileWalletAdapterDefaultAuthorizationCache';\n\nexport function createDefaultAuthorizationResultCache(): AuthorizationResultCache {\n return {\n async clear() {\n try {\n await AsyncStorage.removeItem(CACHE_KEY);\n // eslint-disable-next-line no-empty\n } catch {}\n },\n async get() {\n try {\n return (\n (JSON.parse((await AsyncStorage.getItem(CACHE_KEY)) as string) as AuthorizationResult) || undefined\n );\n // eslint-disable-next-line no-empty\n } catch {}\n },\n async set(authorizationResult: AuthorizationResult) {\n try {\n await AsyncStorage.setItem(CACHE_KEY, JSON.stringify(authorizationResult));\n // eslint-disable-next-line no-empty\n } catch {}\n },\n };\n}\n\n/**\n * @deprecated Use {@link createDefaultAuthorizationResultCache} instead.\n */\nexport default createDefaultAuthorizationResultCache;\n","import { defaultErrorModalWalletNotFoundHandler } from '@solana-mobile/wallet-standard-mobile';\n\nimport { SolanaMobileWalletAdapter } from './adapter.js';\n\nasync function defaultWalletNotFoundHandler(_mobileWalletAdapter: SolanaMobileWalletAdapter) {\n return defaultErrorModalWalletNotFoundHandler();\n}\n\nexport function createDefaultWalletNotFoundHandler(): (\n mobileWalletAdapter: SolanaMobileWalletAdapter,\n) => Promise<void> {\n return defaultWalletNotFoundHandler;\n}\n\n/**\n * @deprecated Use {@link createDefaultWalletNotFoundHandler} instead.\n */\nexport default createDefaultWalletNotFoundHandler;\n"],"mappings":"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"}
@@ -1,13 +1,9 @@
1
- import { BaseSignInMessageSignerWalletAdapter, WalletConnectionError, WalletNotConnectedError, WalletNotReadyError, WalletPublicKeyError, WalletReadyState, WalletSendTransactionError, WalletSignMessageError, WalletSignTransactionError } from "@solana/wallet-adapter-base";
2
- import { PublicKey, Transaction, VersionedMessage, VersionedTransaction } from "@solana/web3.js";
1
+ import { BaseSignInMessageSignerWalletAdapter, WalletConnectionError, WalletError, WalletNotConnectedError, WalletNotReadyError, WalletPublicKeyError, WalletReadyState, WalletSendTransactionError, WalletSignMessageError, WalletSignTransactionError } from "@solana/wallet-adapter-base";
3
2
  import { SolanaSignAndSendTransaction, SolanaSignIn, SolanaSignMessage, SolanaSignTransaction } from "@solana/wallet-standard-features";
4
- import { StandardConnect, StandardDisconnect, StandardEvents } from "@wallet-standard/core";
3
+ import { PublicKey, Transaction, VersionedMessage, VersionedTransaction } from "@solana/web3.js";
4
+ import { base64FromUint8Array } from "@solana-mobile/mobile-wallet-adapter-protocol/encoding";
5
5
  import { LocalSolanaMobileWalletAdapterWallet, RemoteSolanaMobileWalletAdapterWallet, SolanaMobileWalletAdapterRemoteWalletName as SolanaMobileWalletAdapterRemoteWalletName$1, SolanaMobileWalletAdapterWalletName as SolanaMobileWalletAdapterWalletName$1, createDefaultAuthorizationCache, createDefaultChainSelector, defaultErrorModalWalletNotFoundHandler } from "@solana-mobile/wallet-standard-mobile";
6
- //#region src/base64Utils.ts
7
- function fromUint8Array(byteArray) {
8
- return window.btoa(String.fromCharCode.call(null, ...byteArray));
9
- }
10
- //#endregion
6
+ import { StandardConnect, StandardDisconnect, StandardEvents } from "@wallet-standard/core";
11
7
  //#region src/getIsSupported.ts
12
8
  function getIsSupported() {
13
9
  return typeof window !== "undefined" && window.isSecureContext && typeof document !== "undefined" && /android/i.test(navigator.userAgent);
@@ -28,6 +24,9 @@ function chainOrClusterToChainId(chain) {
28
24
  default: return chain;
29
25
  }
30
26
  }
27
+ function getErrorMessage(error) {
28
+ return error instanceof Error ? error.message : "Unknown error";
29
+ }
31
30
  var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletAdapter {
32
31
  supportedTransactionVersions = new Set(["legacy", 0]);
33
32
  name;
@@ -53,8 +52,8 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
53
52
  constructor(wallet, config) {
54
53
  super();
55
54
  this.#accountSelector = async (accounts) => {
56
- const selectedBase64EncodedAddress = await config.addressSelector.select(accounts.map(({ publicKey }) => fromUint8Array(new Uint8Array(publicKey))));
57
- return accounts.find(({ publicKey }) => fromUint8Array(new Uint8Array(publicKey)) === selectedBase64EncodedAddress) ?? accounts[0];
55
+ const selectedBase64EncodedAddress = await config.addressSelector.select(accounts.map(({ publicKey }) => base64FromUint8Array(new Uint8Array(publicKey))));
56
+ return accounts.find(({ publicKey }) => base64FromUint8Array(new Uint8Array(publicKey)) === selectedBase64EncodedAddress) ?? accounts[0];
58
57
  };
59
58
  this.#wallet = wallet;
60
59
  this.#wallet.features[StandardEvents].on("change", this.#handleChangeEvent);
@@ -154,7 +153,7 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
154
153
  message
155
154
  }))[0].signature;
156
155
  } catch (error) {
157
- throw new WalletSignMessageError(error?.message, error);
156
+ throw new WalletSignMessageError(getErrorMessage(error), error);
158
157
  }
159
158
  });
160
159
  }
@@ -197,7 +196,7 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
197
196
  maxRetries: options.maxRetries
198
197
  } : void 0
199
198
  })).map((output) => {
200
- return fromUint8Array(output.signature);
199
+ return base64FromUint8Array(output.signature);
201
200
  });
202
201
  return signature;
203
202
  } else {
@@ -212,7 +211,7 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
212
211
  }
213
212
  }
214
213
  } catch (error) {
215
- throw new WalletSendTransactionError(error?.message, error);
214
+ throw new WalletSendTransactionError(getErrorMessage(error), error);
216
215
  }
217
216
  });
218
217
  }
@@ -252,14 +251,14 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
252
251
  });
253
252
  else throw new Error("Connected wallet does not support signing transactions");
254
253
  } catch (error) {
255
- throw new WalletSignTransactionError(error?.message, error);
254
+ throw new WalletSignTransactionError(getErrorMessage(error), error);
256
255
  }
257
256
  }
258
257
  async #runWithGuard(callback) {
259
258
  try {
260
259
  return await callback();
261
260
  } catch (e) {
262
- this.emit("error", e);
261
+ this.emit("error", e instanceof WalletError ? e : new WalletError(getErrorMessage(e), e));
263
262
  throw e;
264
263
  }
265
264
  }
@@ -326,7 +325,7 @@ function createDefaultAuthorizationResultCache() {
326
325
  }
327
326
  //#endregion
328
327
  //#region src/createDefaultWalletNotFoundHandler.ts
329
- async function defaultWalletNotFoundHandler(mobileWalletAdapter) {
328
+ async function defaultWalletNotFoundHandler(_mobileWalletAdapter) {
330
329
  return defaultErrorModalWalletNotFoundHandler();
331
330
  }
332
331
  function createDefaultWalletNotFoundHandler() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.browser.js","names":["WalletStandardWalletName","WalletStandardRemoteWalletName","#declareWalletAsInstalled","#accountSelector","#selectedAccount","#publicKey","#wallet","#handleChangeEvent","#connecting","#readyState","#connect","#runWithGuard","#assertIsAuthorized","#performSignTransactions","baseCreateDefaultAuthorizationCache"],"sources":["../../src/base64Utils.ts","../../src/getIsSupported.ts","../../src/adapter.ts","../../src/createDefaultAddressSelector.ts","../../src/createDefaultAuthorizationResultCache.ts","../../src/createDefaultWalletNotFoundHandler.ts"],"sourcesContent":["export function fromUint8Array(byteArray: Uint8Array): string {\n return window.btoa(String.fromCharCode.call(null, ...byteArray));\n}\n\nexport function toUint8Array(base64EncodedByteArray: string): Uint8Array {\n return new Uint8Array(\n window\n .atob(base64EncodedByteArray)\n .split('')\n .map((c) => c.charCodeAt(0)),\n );\n}\n","export default function getIsSupported() {\n return (\n typeof window !== 'undefined' &&\n window.isSecureContext &&\n typeof document !== 'undefined' &&\n /android/i.test(navigator.userAgent)\n );\n}\n","import {\n BaseSignInMessageSignerWalletAdapter,\n WalletConnectionError,\n WalletName,\n WalletNotConnectedError,\n WalletNotReadyError,\n WalletPublicKeyError,\n WalletReadyState,\n WalletSendTransactionError,\n WalletSignMessageError,\n WalletSignTransactionError,\n} from '@solana/wallet-adapter-base';\nimport {\n Connection,\n PublicKey,\n SendOptions,\n Transaction as LegacyTransaction,\n TransactionSignature,\n TransactionVersion,\n VersionedTransaction,\n VersionedMessage,\n Transaction,\n} from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n Base64EncodedAddress,\n Finality,\n Chain,\n Cluster,\n SignInPayload,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport {\n SolanaSignAndSendTransaction,\n SolanaSignIn,\n SolanaSignInInput,\n SolanaSignInOutput,\n SolanaSignMessage,\n SolanaSignTransaction,\n SolanaSignTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n IdentifierString,\n StandardConnect,\n StandardDisconnect,\n StandardEvents,\n StandardEventsChangeProperties,\n WalletAccount,\n} from '@wallet-standard/core';\nimport {\n Authorization,\n createDefaultChainSelector,\n LocalSolanaMobileWalletAdapterWallet,\n RemoteSolanaMobileWalletAdapterWallet,\n SolanaMobileWalletAdapterWalletName as WalletStandardWalletName,\n SolanaMobileWalletAdapterRemoteWalletName as WalletStandardRemoteWalletName,\n} from '@solana-mobile/wallet-standard-mobile';\nimport { fromUint8Array } from './base64Utils.js';\nimport getIsSupported from './getIsSupported.js';\n\nexport interface AuthorizationResultCache {\n clear(): Promise<void>;\n get(): Promise<AuthorizationResult | Authorization | undefined>;\n set(authorizationResult: AuthorizationResult | Authorization): Promise<void>;\n}\n\nexport interface AddressSelector {\n select(addresses: Base64EncodedAddress[]): Promise<Base64EncodedAddress>;\n}\n\nexport const SolanaMobileWalletAdapterWalletName = WalletStandardWalletName as WalletName;\nexport const SolanaMobileWalletAdapterRemoteWalletName = WalletStandardRemoteWalletName as WalletName;\n\nconst SIGNATURE_LENGTH_IN_BYTES = 64;\n\nfunction isVersionedTransaction(\n transaction: LegacyTransaction | VersionedTransaction,\n): transaction is VersionedTransaction {\n return 'version' in transaction;\n}\n\nfunction chainOrClusterToChainId(chain: Cluster | Chain): IdentifierString {\n switch (chain) {\n case 'mainnet-beta':\n return 'solana:mainnet';\n case 'testnet':\n return 'solana:testnet';\n case 'devnet':\n return 'solana:devnet';\n default:\n return chain;\n }\n}\n\nabstract class BaseSolanaMobileWalletAdapter extends BaseSignInMessageSignerWalletAdapter {\n readonly supportedTransactionVersions: Set<TransactionVersion> = new Set(\n // FIXME(#244): We can't actually know what versions are supported until we know which wallet we're talking to.\n ['legacy', 0],\n );\n name;\n icon;\n url;\n #wallet: LocalSolanaMobileWalletAdapterWallet | RemoteSolanaMobileWalletAdapterWallet;\n #connecting = false;\n #readyState: WalletReadyState = getIsSupported() ? WalletReadyState.Loadable : WalletReadyState.Unsupported;\n #accountSelector: (accounts: readonly WalletAccount[]) => Promise<WalletAccount>;\n #selectedAccount: WalletAccount | undefined;\n #publicKey: PublicKey | undefined;\n\n #handleChangeEvent = async (properties: StandardEventsChangeProperties) => {\n if (properties.accounts && properties.accounts.length > 0) {\n this.#declareWalletAsInstalled();\n const nextSelectedAccount = await this.#accountSelector(properties.accounts);\n if (nextSelectedAccount !== this.#selectedAccount) {\n this.#selectedAccount = nextSelectedAccount;\n this.#publicKey = undefined;\n this.emit(\n 'connect',\n // Having just set `this.#selectedAccount`, `this.publicKey` is definitely non-null\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.publicKey!,\n );\n }\n }\n };\n\n protected constructor(\n wallet: LocalSolanaMobileWalletAdapterWallet | RemoteSolanaMobileWalletAdapterWallet,\n config: {\n addressSelector: AddressSelector;\n chain: Chain;\n },\n ) {\n super();\n // this.#chain = chainOrClusterToChainId(config.chain);\n this.#accountSelector = async (accounts: readonly WalletAccount[]) => {\n const selectedBase64EncodedAddress = await config.addressSelector.select(\n accounts.map(({ publicKey }) => fromUint8Array(new Uint8Array(publicKey))),\n );\n return (\n accounts.find(\n ({ publicKey }) => fromUint8Array(new Uint8Array(publicKey)) === selectedBase64EncodedAddress,\n ) ?? accounts[0]\n );\n };\n this.#wallet = wallet;\n this.#wallet.features[StandardEvents].on('change', this.#handleChangeEvent);\n this.name = this.#wallet.name as WalletName;\n this.icon = this.#wallet.icon;\n this.url = this.#wallet.url;\n // TODO: evaluate if this logic should be kept - it seems to create a nasty bug where\n // the wallet tries to auto connect on page load and gets blocked by the popup blocker\n // if (this.#readyState !== WalletReadyState.Unsupported) {\n // config.authorizationResultCache.get().then((authorizationResult) => {\n // if (authorizationResult) {\n // // Having a prior authorization result is, right now, the best\n // // indication that a mobile wallet is installed. There is no API\n // // we can use to test for whether the association URI is supported.\n // this.#declareWalletAsInstalled();\n // }\n // });\n // }\n }\n\n get publicKey(): PublicKey | null {\n if (!this.#publicKey && this.#selectedAccount) {\n try {\n this.#publicKey = new PublicKey(this.#selectedAccount.publicKey);\n } catch (e) {\n throw new WalletPublicKeyError((e instanceof Error && e?.message) || 'Unknown error', e);\n }\n }\n return this.#publicKey ?? null;\n }\n\n get connected(): boolean {\n return this.#wallet.connected;\n }\n\n get connecting(): boolean {\n return this.#connecting;\n }\n\n get readyState(): WalletReadyState {\n return this.#readyState;\n }\n\n /** @deprecated Use `autoConnect()` instead. */\n async autoConnect_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(): Promise<void> {\n return await this.autoConnect();\n }\n\n async autoConnect(): Promise<void> {\n this.#connect(true);\n }\n\n async connect(): Promise<void> {\n this.#connect();\n }\n\n async #connect(autoConnect: boolean = false): Promise<void> {\n if (this.connecting || this.connected) {\n return;\n }\n return await this.#runWithGuard(async () => {\n if (this.#readyState !== WalletReadyState.Installed && this.#readyState !== WalletReadyState.Loadable) {\n throw new WalletNotReadyError();\n }\n this.#connecting = true;\n try {\n await this.#wallet.features[StandardConnect].connect({ silent: autoConnect });\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n } finally {\n this.#connecting = false;\n }\n });\n }\n\n /** @deprecated Use `connect()` or `autoConnect()` instead. */\n async performAuthorization(signInPayload?: SignInPayload): Promise<AuthorizationResult> {\n try {\n const cachedAuthorizationResult = await this.#wallet.cachedAuthorizationResult;\n if (cachedAuthorizationResult) {\n await this.#wallet.features[StandardConnect].connect({ silent: true });\n return cachedAuthorizationResult;\n }\n\n if (signInPayload) {\n await this.#wallet.features[SolanaSignIn].signIn(signInPayload);\n } else await this.#wallet.features[StandardConnect].connect();\n const authorizationResult = await await this.#wallet.cachedAuthorizationResult;\n return authorizationResult!;\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n }\n }\n\n async disconnect(): Promise<void> {\n // return await this.#runWithGuard(this.#wallet.features[StandardDisconnect].disconnect);\n return await this.#runWithGuard(async () => {\n this.#connecting = false;\n this.#publicKey = undefined;\n this.#selectedAccount = undefined;\n await this.#wallet.features[StandardDisconnect].disconnect();\n this.emit('disconnect');\n });\n }\n\n async signIn(input?: SolanaSignInInput): Promise<SolanaSignInOutput> {\n return this.#runWithGuard(async () => {\n if (this.#readyState !== WalletReadyState.Installed && this.#readyState !== WalletReadyState.Loadable) {\n throw new WalletNotReadyError();\n }\n this.#connecting = true;\n try {\n const outputs = await this.#wallet.features[SolanaSignIn].signIn({\n ...input,\n domain: input?.domain ?? window.location.host,\n });\n if (outputs.length > 0) {\n return outputs[0];\n } else {\n throw new Error('Sign in failed, no sign in result returned by wallet');\n }\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n } finally {\n this.#connecting = false;\n }\n });\n }\n\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n return await this.#runWithGuard(async () => {\n const account = this.#assertIsAuthorized();\n try {\n const outputs = await this.#wallet.features[SolanaSignMessage].signMessage({\n account,\n message: message,\n });\n return outputs[0].signature;\n } catch (error: any) {\n throw new WalletSignMessageError(error?.message, error);\n }\n });\n }\n\n async sendTransaction<T extends LegacyTransaction | VersionedTransaction>(\n transaction: T,\n connection: Connection,\n options?: SendOptions,\n ): Promise<TransactionSignature> {\n return await this.#runWithGuard(async () => {\n const account = this.#assertIsAuthorized();\n try {\n function getTargetCommitment() {\n let targetCommitment: Finality;\n switch (connection.commitment) {\n case 'confirmed':\n case 'finalized':\n case 'processed':\n targetCommitment = connection.commitment;\n break;\n default:\n targetCommitment = 'finalized';\n }\n let targetPreflightCommitment: Finality;\n switch (options?.preflightCommitment) {\n case 'confirmed':\n case 'finalized':\n case 'processed':\n targetPreflightCommitment = options.preflightCommitment;\n break;\n case undefined:\n targetPreflightCommitment = targetCommitment;\n break;\n default:\n targetPreflightCommitment = 'finalized';\n }\n const preflightCommitmentScore =\n targetPreflightCommitment === 'finalized'\n ? 2\n : targetPreflightCommitment === 'confirmed'\n ? 1\n : 0;\n const targetCommitmentScore =\n targetCommitment === 'finalized' ? 2 : targetCommitment === 'confirmed' ? 1 : 0;\n return preflightCommitmentScore < targetCommitmentScore\n ? targetPreflightCommitment\n : targetCommitment;\n }\n if (SolanaSignAndSendTransaction in this.#wallet.features) {\n const chain = chainOrClusterToChainId(this.#wallet.currentAuthorization!.chain);\n const [signature] = (\n await this.#wallet.features[SolanaSignAndSendTransaction].signAndSendTransaction({\n account,\n transaction: transaction.serialize(),\n chain: chain,\n options: options\n ? {\n skipPreflight: options.skipPreflight,\n maxRetries: options.maxRetries,\n }\n : undefined,\n })\n ).map((output) => {\n return fromUint8Array(output.signature);\n });\n\n return signature;\n } else {\n const [signedTransaction] = await this.#performSignTransactions([transaction]);\n if (isVersionedTransaction(signedTransaction)) {\n return await connection.sendTransaction(signedTransaction);\n } else {\n const serializedTransaction = signedTransaction.serialize();\n return await connection.sendRawTransaction(serializedTransaction, {\n ...options,\n preflightCommitment: getTargetCommitment(),\n });\n }\n }\n } catch (error: any) {\n throw new WalletSendTransactionError(error?.message, error);\n }\n });\n }\n\n async signTransaction<T extends LegacyTransaction | VersionedTransaction>(transaction: T): Promise<T> {\n return await this.#runWithGuard(async () => {\n const [signedTransaction] = await this.#performSignTransactions([transaction]);\n return signedTransaction;\n });\n }\n\n async signAllTransactions<T extends LegacyTransaction | VersionedTransaction>(transactions: T[]): Promise<T[]> {\n return await this.#runWithGuard(async () => {\n const signedTransactions = await this.#performSignTransactions(transactions);\n return signedTransactions;\n });\n }\n\n #declareWalletAsInstalled(): void {\n if (this.#readyState !== WalletReadyState.Installed) {\n this.emit('readyStateChange', (this.#readyState = WalletReadyState.Installed));\n }\n }\n\n #assertIsAuthorized() {\n if (!this.#wallet.isAuthorized || !this.#selectedAccount) throw new WalletNotConnectedError();\n return this.#selectedAccount;\n }\n\n async #performSignTransactions<T extends LegacyTransaction | VersionedTransaction>(\n transactions: T[],\n ): Promise<T[]> {\n const account = this.#assertIsAuthorized();\n try {\n if (SolanaSignTransaction in this.#wallet.features) {\n return this.#wallet.features[SolanaSignTransaction].signTransaction(\n ...transactions.map((value) => {\n return { account, transaction: value.serialize() };\n }),\n ).then((outputs) => {\n return outputs.map((output: SolanaSignTransactionOutput) => {\n const byteArray = output.signedTransaction;\n const numSignatures = byteArray[0];\n const messageOffset = numSignatures * SIGNATURE_LENGTH_IN_BYTES + 1;\n const version = VersionedMessage.deserializeMessageVersion(\n byteArray.slice(messageOffset, byteArray.length),\n );\n if (version === 'legacy') {\n return Transaction.from(byteArray) as T;\n } else {\n return VersionedTransaction.deserialize(byteArray) as T;\n }\n });\n });\n } else {\n throw new Error('Connected wallet does not support signing transactions');\n }\n } catch (error: any) {\n throw new WalletSignTransactionError(error?.message, error);\n }\n }\n\n async #runWithGuard<TReturn>(callback: () => Promise<TReturn>) {\n try {\n return await callback();\n } catch (e: any) {\n this.emit('error', e);\n throw e;\n }\n }\n}\n\nexport class LocalSolanaMobileWalletAdapter extends BaseSolanaMobileWalletAdapter {\n /**\n * @deprecated @param cluster config paramter is deprecated, use @param chain instead\n */\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n cluster: Cluster;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n });\n\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n });\n\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n cluster: Cluster;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n }) {\n const chain = chainOrClusterToChainId(config.chain ?? config.cluster);\n super(\n new LocalSolanaMobileWalletAdapterWallet({\n appIdentity: config.appIdentity,\n authorizationCache: {\n set: config.authorizationResultCache.set,\n get: async () => {\n return (await config.authorizationResultCache.get()) as Authorization | undefined;\n },\n clear: config.authorizationResultCache.clear,\n },\n chains: [chain],\n chainSelector: createDefaultChainSelector(),\n onWalletNotFound: async () => {\n config.onWalletNotFound(this);\n },\n }),\n {\n addressSelector: config.addressSelector,\n chain: chain,\n },\n );\n }\n}\n\nexport class RemoteSolanaMobileWalletAdapter extends BaseSolanaMobileWalletAdapter {\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n remoteHostAuthority: string;\n onWalletNotFound: (mobileWalletAdapter: RemoteSolanaMobileWalletAdapter) => Promise<void>;\n }) {\n const chain = chainOrClusterToChainId(config.chain);\n super(\n new RemoteSolanaMobileWalletAdapterWallet({\n appIdentity: config.appIdentity,\n authorizationCache: {\n set: config.authorizationResultCache.set,\n get: async () => {\n return (await config.authorizationResultCache.get()) as Authorization | undefined;\n },\n clear: config.authorizationResultCache.clear,\n },\n chains: [chain],\n chainSelector: createDefaultChainSelector(),\n remoteHostAuthority: config.remoteHostAuthority,\n onWalletNotFound: async () => {\n config.onWalletNotFound(this);\n },\n }),\n {\n addressSelector: config.addressSelector,\n chain: chain,\n },\n );\n }\n}\n\nexport class SolanaMobileWalletAdapter extends LocalSolanaMobileWalletAdapter {}\n","import { AddressSelector } from './adapter.js';\n\nexport default function createDefaultAddressSelector(): AddressSelector {\n return {\n async select(addresses) {\n return addresses[0];\n },\n };\n}\n","import { AuthorizationResultCache } from './adapter.js';\nimport { createDefaultAuthorizationCache as baseCreateDefaultAuthorizationCache } from '@solana-mobile/wallet-standard-mobile';\n\nexport default function createDefaultAuthorizationResultCache(): AuthorizationResultCache {\n return baseCreateDefaultAuthorizationCache();\n}\n","import { SolanaMobileWalletAdapter } from './adapter.js';\nimport { defaultErrorModalWalletNotFoundHandler } from '@solana-mobile/wallet-standard-mobile';\n\nasync function defaultWalletNotFoundHandler(mobileWalletAdapter: SolanaMobileWalletAdapter) {\n return defaultErrorModalWalletNotFoundHandler();\n}\n\nexport default function createDefaultWalletNotFoundHandler(): (\n mobileWalletAdapter: SolanaMobileWalletAdapter,\n) => Promise<void> {\n return defaultWalletNotFoundHandler;\n}\n"],"mappings":";;;;;;AAAA,SAAgB,eAAe,WAA+B;AAC1D,QAAO,OAAO,KAAK,OAAO,aAAa,KAAK,MAAM,GAAG,UAAU,CAAC;;;;ACDpE,SAAwB,iBAAiB;AACrC,QACI,OAAO,WAAW,eAClB,OAAO,mBACP,OAAO,aAAa,eACpB,WAAW,KAAK,UAAU,UAAU;;;;ACiE5C,MAAa,sCAAsCA;AACnD,MAAa,4CAA4CC;AAEzD,MAAM,4BAA4B;AAElC,SAAS,uBACL,aACmC;AACnC,QAAO,aAAa;;AAGxB,SAAS,wBAAwB,OAA0C;AACvE,SAAQ,OAAR;EACI,KAAK,eACD,QAAO;EACX,KAAK,UACD,QAAO;EACX,KAAK,SACD,QAAO;EACX,QACI,QAAO;;;AAInB,IAAe,gCAAf,cAAqD,qCAAqC;CACtF,+BAAiE,IAAI,IAEjE,CAAC,UAAU,EAAE,CAChB;CACD;CACA;CACA;CACA;CACA,cAAc;CACd,cAAgC,gBAAgB,GAAG,iBAAiB,WAAW,iBAAiB;CAChG;CACA;CACA;CAEA,qBAAqB,OAAO,eAA+C;AACvE,MAAI,WAAW,YAAY,WAAW,SAAS,SAAS,GAAG;AACvD,SAAA,0BAAgC;GAChC,MAAM,sBAAsB,MAAM,MAAA,gBAAsB,WAAW,SAAS;AAC5E,OAAI,wBAAwB,MAAA,iBAAuB;AAC/C,UAAA,kBAAwB;AACxB,UAAA,YAAkB,KAAA;AAClB,SAAK,KACD,WAGA,KAAK,UACR;;;;CAKb,YACI,QACA,QAIF;AACE,SAAO;AAEP,QAAA,kBAAwB,OAAO,aAAuC;GAClE,MAAM,+BAA+B,MAAM,OAAO,gBAAgB,OAC9D,SAAS,KAAK,EAAE,gBAAgB,eAAe,IAAI,WAAW,UAAU,CAAC,CAAC,CAC7E;AACD,UACI,SAAS,MACJ,EAAE,gBAAgB,eAAe,IAAI,WAAW,UAAU,CAAC,KAAK,6BACpE,IAAI,SAAS;;AAGtB,QAAA,SAAe;AACf,QAAA,OAAa,SAAS,gBAAgB,GAAG,UAAU,MAAA,kBAAwB;AAC3E,OAAK,OAAO,MAAA,OAAa;AACzB,OAAK,OAAO,MAAA,OAAa;AACzB,OAAK,MAAM,MAAA,OAAa;;CAe5B,IAAI,YAA8B;AAC9B,MAAI,CAAC,MAAA,aAAmB,MAAA,gBACpB,KAAI;AACA,SAAA,YAAkB,IAAI,UAAU,MAAA,gBAAsB,UAAU;WAC3D,GAAG;AACR,SAAM,IAAI,qBAAsB,aAAa,SAAS,GAAG,WAAY,iBAAiB,EAAE;;AAGhG,SAAO,MAAA,aAAmB;;CAG9B,IAAI,YAAqB;AACrB,SAAO,MAAA,OAAa;;CAGxB,IAAI,aAAsB;AACtB,SAAO,MAAA;;CAGX,IAAI,aAA+B;AAC/B,SAAO,MAAA;;;CAIX,MAAM,8CAA6D;AAC/D,SAAO,MAAM,KAAK,aAAa;;CAGnC,MAAM,cAA6B;AAC/B,QAAA,QAAc,KAAK;;CAGvB,MAAM,UAAyB;AAC3B,QAAA,SAAe;;CAGnB,OAAA,QAAe,cAAuB,OAAsB;AACxD,MAAI,KAAK,cAAc,KAAK,UACxB;AAEJ,SAAO,MAAM,MAAA,aAAmB,YAAY;AACxC,OAAI,MAAA,eAAqB,iBAAiB,aAAa,MAAA,eAAqB,iBAAiB,SACzF,OAAM,IAAI,qBAAqB;AAEnC,SAAA,aAAmB;AACnB,OAAI;AACA,UAAM,MAAA,OAAa,SAAS,iBAAiB,QAAQ,EAAE,QAAQ,aAAa,CAAC;YACxE,GAAG;AACR,UAAM,IAAI,sBAAuB,aAAa,SAAS,EAAE,WAAY,iBAAiB,EAAE;aAClF;AACN,UAAA,aAAmB;;IAEzB;;;CAIN,MAAM,qBAAqB,eAA6D;AACpF,MAAI;GACA,MAAM,4BAA4B,MAAM,MAAA,OAAa;AACrD,OAAI,2BAA2B;AAC3B,UAAM,MAAA,OAAa,SAAS,iBAAiB,QAAQ,EAAE,QAAQ,MAAM,CAAC;AACtE,WAAO;;AAGX,OAAI,cACA,OAAM,MAAA,OAAa,SAAS,cAAc,OAAO,cAAc;OAC5D,OAAM,MAAA,OAAa,SAAS,iBAAiB,SAAS;AAE7D,UAD4B,MAAM,MAAM,MAAA,OAAa;WAEhD,GAAG;AACR,SAAM,IAAI,sBAAuB,aAAa,SAAS,EAAE,WAAY,iBAAiB,EAAE;;;CAIhG,MAAM,aAA4B;AAE9B,SAAO,MAAM,MAAA,aAAmB,YAAY;AACxC,SAAA,aAAmB;AACnB,SAAA,YAAkB,KAAA;AAClB,SAAA,kBAAwB,KAAA;AACxB,SAAM,MAAA,OAAa,SAAS,oBAAoB,YAAY;AAC5D,QAAK,KAAK,aAAa;IACzB;;CAGN,MAAM,OAAO,OAAwD;AACjE,SAAO,MAAA,aAAmB,YAAY;AAClC,OAAI,MAAA,eAAqB,iBAAiB,aAAa,MAAA,eAAqB,iBAAiB,SACzF,OAAM,IAAI,qBAAqB;AAEnC,SAAA,aAAmB;AACnB,OAAI;IACA,MAAM,UAAU,MAAM,MAAA,OAAa,SAAS,cAAc,OAAO;KAC7D,GAAG;KACH,QAAQ,OAAO,UAAU,OAAO,SAAS;KAC5C,CAAC;AACF,QAAI,QAAQ,SAAS,EACjB,QAAO,QAAQ;QAEf,OAAM,IAAI,MAAM,uDAAuD;YAEtE,GAAG;AACR,UAAM,IAAI,sBAAuB,aAAa,SAAS,EAAE,WAAY,iBAAiB,EAAE;aAClF;AACN,UAAA,aAAmB;;IAEzB;;CAGN,MAAM,YAAY,SAA0C;AACxD,SAAO,MAAM,MAAA,aAAmB,YAAY;GACxC,MAAM,UAAU,MAAA,oBAA0B;AAC1C,OAAI;AAKA,YAJgB,MAAM,MAAA,OAAa,SAAS,mBAAmB,YAAY;KACvE;KACS;KACZ,CAAC,EACa,GAAG;YACb,OAAY;AACjB,UAAM,IAAI,uBAAuB,OAAO,SAAS,MAAM;;IAE7D;;CAGN,MAAM,gBACF,aACA,YACA,SAC6B;AAC7B,SAAO,MAAM,MAAA,aAAmB,YAAY;GACxC,MAAM,UAAU,MAAA,oBAA0B;AAC1C,OAAI;IACA,SAAS,sBAAsB;KAC3B,IAAI;AACJ,aAAQ,WAAW,YAAnB;MACI,KAAK;MACL,KAAK;MACL,KAAK;AACD,0BAAmB,WAAW;AAC9B;MACJ,QACI,oBAAmB;;KAE3B,IAAI;AACJ,aAAQ,SAAS,qBAAjB;MACI,KAAK;MACL,KAAK;MACL,KAAK;AACD,mCAA4B,QAAQ;AACpC;MACJ,KAAK,KAAA;AACD,mCAA4B;AAC5B;MACJ,QACI,6BAA4B;;AAUpC,aAPI,8BAA8B,cACxB,IACA,8BAA8B,cAC5B,IACA,MAER,qBAAqB,cAAc,IAAI,qBAAqB,cAAc,IAAI,KAE5E,4BACA;;AAEV,QAAI,gCAAgC,MAAA,OAAa,UAAU;KACvD,MAAM,QAAQ,wBAAwB,MAAA,OAAa,qBAAsB,MAAM;KAC/E,MAAM,CAAC,cACH,MAAM,MAAA,OAAa,SAAS,8BAA8B,uBAAuB;MAC7E;MACA,aAAa,YAAY,WAAW;MAC7B;MACP,SAAS,UACH;OACI,eAAe,QAAQ;OACvB,YAAY,QAAQ;OACvB,GACD,KAAA;MACT,CAAC,EACJ,KAAK,WAAW;AACd,aAAO,eAAe,OAAO,UAAU;OACzC;AAEF,YAAO;WACJ;KACH,MAAM,CAAC,qBAAqB,MAAM,MAAA,wBAA8B,CAAC,YAAY,CAAC;AAC9E,SAAI,uBAAuB,kBAAkB,CACzC,QAAO,MAAM,WAAW,gBAAgB,kBAAkB;UACvD;MACH,MAAM,wBAAwB,kBAAkB,WAAW;AAC3D,aAAO,MAAM,WAAW,mBAAmB,uBAAuB;OAC9D,GAAG;OACH,qBAAqB,qBAAqB;OAC7C,CAAC;;;YAGL,OAAY;AACjB,UAAM,IAAI,2BAA2B,OAAO,SAAS,MAAM;;IAEjE;;CAGN,MAAM,gBAAoE,aAA4B;AAClG,SAAO,MAAM,MAAA,aAAmB,YAAY;GACxC,MAAM,CAAC,qBAAqB,MAAM,MAAA,wBAA8B,CAAC,YAAY,CAAC;AAC9E,UAAO;IACT;;CAGN,MAAM,oBAAwE,cAAiC;AAC3G,SAAO,MAAM,MAAA,aAAmB,YAAY;AAExC,UAD2B,MAAM,MAAA,wBAA8B,aAAa;IAE9E;;CAGN,4BAAkC;AAC9B,MAAI,MAAA,eAAqB,iBAAiB,UACtC,MAAK,KAAK,oBAAqB,MAAA,aAAmB,iBAAiB,UAAW;;CAItF,sBAAsB;AAClB,MAAI,CAAC,MAAA,OAAa,gBAAgB,CAAC,MAAA,gBAAuB,OAAM,IAAI,yBAAyB;AAC7F,SAAO,MAAA;;CAGX,OAAA,wBACI,cACY;EACZ,MAAM,UAAU,MAAA,oBAA0B;AAC1C,MAAI;AACA,OAAI,yBAAyB,MAAA,OAAa,SACtC,QAAO,MAAA,OAAa,SAAS,uBAAuB,gBAChD,GAAG,aAAa,KAAK,UAAU;AAC3B,WAAO;KAAE;KAAS,aAAa,MAAM,WAAW;KAAE;KACpD,CACL,CAAC,MAAM,YAAY;AAChB,WAAO,QAAQ,KAAK,WAAwC;KACxD,MAAM,YAAY,OAAO;KAEzB,MAAM,gBADgB,UAAU,KACM,4BAA4B;AAIlE,SAHgB,iBAAiB,0BAC7B,UAAU,MAAM,eAAe,UAAU,OAAO,CACnD,KACe,SACZ,QAAO,YAAY,KAAK,UAAU;SAElC,QAAO,qBAAqB,YAAY,UAAU;MAExD;KACJ;OAEF,OAAM,IAAI,MAAM,yDAAyD;WAExE,OAAY;AACjB,SAAM,IAAI,2BAA2B,OAAO,SAAS,MAAM;;;CAInE,OAAA,aAA6B,UAAkC;AAC3D,MAAI;AACA,UAAO,MAAM,UAAU;WAClB,GAAQ;AACb,QAAK,KAAK,SAAS,EAAE;AACrB,SAAM;;;;AAKlB,IAAa,iCAAb,cAAoD,8BAA8B;CAoB9E,YAAY,QAOT;EACC,MAAM,QAAQ,wBAAwB,OAAO,SAAS,OAAO,QAAQ;AACrE,QACI,IAAI,qCAAqC;GACrC,aAAa,OAAO;GACpB,oBAAoB;IAChB,KAAK,OAAO,yBAAyB;IACrC,KAAK,YAAY;AACb,YAAQ,MAAM,OAAO,yBAAyB,KAAK;;IAEvD,OAAO,OAAO,yBAAyB;IAC1C;GACD,QAAQ,CAAC,MAAM;GACf,eAAe,4BAA4B;GAC3C,kBAAkB,YAAY;AAC1B,WAAO,iBAAiB,KAAK;;GAEpC,CAAC,EACF;GACI,iBAAiB,OAAO;GACjB;GACV,CACJ;;;AAIT,IAAa,kCAAb,cAAqD,8BAA8B;CAC/E,YAAY,QAOT;EACC,MAAM,QAAQ,wBAAwB,OAAO,MAAM;AACnD,QACI,IAAI,sCAAsC;GACtC,aAAa,OAAO;GACpB,oBAAoB;IAChB,KAAK,OAAO,yBAAyB;IACrC,KAAK,YAAY;AACb,YAAQ,MAAM,OAAO,yBAAyB,KAAK;;IAEvD,OAAO,OAAO,yBAAyB;IAC1C;GACD,QAAQ,CAAC,MAAM;GACf,eAAe,4BAA4B;GAC3C,qBAAqB,OAAO;GAC5B,kBAAkB,YAAY;AAC1B,WAAO,iBAAiB,KAAK;;GAEpC,CAAC,EACF;GACI,iBAAiB,OAAO;GACjB;GACV,CACJ;;;AAIT,IAAa,4BAAb,cAA+C,+BAA+B;;;AC3gB9E,SAAwB,+BAAgD;AACpE,QAAO,EACH,MAAM,OAAO,WAAW;AACpB,SAAO,UAAU;IAExB;;;;ACJL,SAAwB,wCAAkE;AACtF,QAAOa,iCAAqC;;;;ACDhD,eAAe,6BAA6B,qBAAgD;AACxF,QAAO,wCAAwC;;AAGnD,SAAwB,qCAEL;AACf,QAAO"}
1
+ {"version":3,"file":"index.browser.js","names":["WalletStandardWalletName","WalletStandardRemoteWalletName","#declareWalletAsInstalled","#accountSelector","#selectedAccount","#publicKey","#wallet","#handleChangeEvent","#connecting","#readyState","#connect","#runWithGuard","#assertIsAuthorized","#performSignTransactions","baseCreateDefaultAuthorizationCache"],"sources":["../../src/getIsSupported.ts","../../src/adapter.ts","../../src/createDefaultAddressSelector.ts","../../src/createDefaultAuthorizationResultCache.ts","../../src/createDefaultWalletNotFoundHandler.ts"],"sourcesContent":["export function getIsSupported() {\n return (\n typeof window !== 'undefined' &&\n window.isSecureContext &&\n typeof document !== 'undefined' &&\n /android/i.test(navigator.userAgent)\n );\n}\n\n/**\n * @deprecated Use {@link getIsSupported} instead.\n */\nexport default getIsSupported;\n","import {\n BaseSignInMessageSignerWalletAdapter,\n WalletConnectionError,\n WalletError,\n WalletName,\n WalletNotConnectedError,\n WalletNotReadyError,\n WalletPublicKeyError,\n WalletReadyState,\n WalletSendTransactionError,\n WalletSignMessageError,\n WalletSignTransactionError,\n} from '@solana/wallet-adapter-base';\nimport {\n SolanaSignAndSendTransaction,\n SolanaSignIn,\n SolanaSignInInput,\n SolanaSignInOutput,\n SolanaSignMessage,\n SolanaSignTransaction,\n SolanaSignTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n Connection,\n PublicKey,\n SendOptions,\n Transaction as LegacyTransaction,\n Transaction,\n TransactionSignature,\n TransactionVersion,\n VersionedMessage,\n VersionedTransaction,\n} from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n Base64EncodedAddress,\n Chain,\n Cluster,\n Finality,\n SignInPayload,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { base64FromUint8Array } from '@solana-mobile/mobile-wallet-adapter-protocol/encoding';\nimport {\n Authorization,\n createDefaultChainSelector,\n LocalSolanaMobileWalletAdapterWallet,\n RemoteSolanaMobileWalletAdapterWallet,\n SolanaMobileWalletAdapterRemoteWalletName as WalletStandardRemoteWalletName,\n SolanaMobileWalletAdapterWalletName as WalletStandardWalletName,\n} from '@solana-mobile/wallet-standard-mobile';\nimport {\n IdentifierString,\n StandardConnect,\n StandardDisconnect,\n StandardEvents,\n StandardEventsChangeProperties,\n WalletAccount,\n} from '@wallet-standard/core';\n\nimport { getIsSupported } from './getIsSupported.js';\n\nexport interface AuthorizationResultCache {\n clear(): Promise<void>;\n get(): Promise<AuthorizationResult | Authorization | undefined>;\n set(authorizationResult: AuthorizationResult | Authorization): Promise<void>;\n}\n\nexport interface AddressSelector {\n select(addresses: Base64EncodedAddress[]): Promise<Base64EncodedAddress>;\n}\n\nexport const SolanaMobileWalletAdapterWalletName = WalletStandardWalletName as WalletName;\nexport const SolanaMobileWalletAdapterRemoteWalletName = WalletStandardRemoteWalletName as WalletName;\n\nconst SIGNATURE_LENGTH_IN_BYTES = 64;\n\nfunction isVersionedTransaction(\n transaction: LegacyTransaction | VersionedTransaction,\n): transaction is VersionedTransaction {\n return 'version' in transaction;\n}\n\nfunction chainOrClusterToChainId(chain: Cluster | Chain): IdentifierString {\n switch (chain) {\n case 'mainnet-beta':\n return 'solana:mainnet';\n case 'testnet':\n return 'solana:testnet';\n case 'devnet':\n return 'solana:devnet';\n default:\n return chain;\n }\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : 'Unknown error';\n}\n\nabstract class BaseSolanaMobileWalletAdapter extends BaseSignInMessageSignerWalletAdapter {\n readonly supportedTransactionVersions: Set<TransactionVersion> = new Set(\n // FIXME(#244): We can't actually know what versions are supported until we know which wallet we're talking to.\n ['legacy', 0],\n );\n name;\n icon;\n url;\n #wallet: LocalSolanaMobileWalletAdapterWallet | RemoteSolanaMobileWalletAdapterWallet;\n #connecting = false;\n #readyState: WalletReadyState = getIsSupported() ? WalletReadyState.Loadable : WalletReadyState.Unsupported;\n #accountSelector: (accounts: readonly WalletAccount[]) => Promise<WalletAccount>;\n #selectedAccount: WalletAccount | undefined;\n #publicKey: PublicKey | undefined;\n\n #handleChangeEvent = async (properties: StandardEventsChangeProperties) => {\n if (properties.accounts && properties.accounts.length > 0) {\n this.#declareWalletAsInstalled();\n const nextSelectedAccount = await this.#accountSelector(properties.accounts);\n if (nextSelectedAccount !== this.#selectedAccount) {\n this.#selectedAccount = nextSelectedAccount;\n this.#publicKey = undefined;\n this.emit(\n 'connect',\n // Having just set `this.#selectedAccount`, `this.publicKey` is definitely non-null\n\n this.publicKey!,\n );\n }\n }\n };\n\n protected constructor(\n wallet: LocalSolanaMobileWalletAdapterWallet | RemoteSolanaMobileWalletAdapterWallet,\n config: {\n addressSelector: AddressSelector;\n chain: Chain;\n },\n ) {\n super();\n // this.#chain = chainOrClusterToChainId(config.chain);\n this.#accountSelector = async (accounts: readonly WalletAccount[]) => {\n const selectedBase64EncodedAddress = await config.addressSelector.select(\n accounts.map(({ publicKey }) => base64FromUint8Array(new Uint8Array(publicKey))),\n );\n return (\n accounts.find(\n ({ publicKey }) => base64FromUint8Array(new Uint8Array(publicKey)) === selectedBase64EncodedAddress,\n ) ?? accounts[0]\n );\n };\n this.#wallet = wallet;\n this.#wallet.features[StandardEvents].on('change', this.#handleChangeEvent);\n this.name = this.#wallet.name as WalletName;\n this.icon = this.#wallet.icon;\n this.url = this.#wallet.url;\n // TODO: evaluate if this logic should be kept - it seems to create a nasty bug where\n // the wallet tries to auto connect on page load and gets blocked by the popup blocker\n // if (this.#readyState !== WalletReadyState.Unsupported) {\n // config.authorizationResultCache.get().then((authorizationResult) => {\n // if (authorizationResult) {\n // // Having a prior authorization result is, right now, the best\n // // indication that a mobile wallet is installed. There is no API\n // // we can use to test for whether the association URI is supported.\n // this.#declareWalletAsInstalled();\n // }\n // });\n // }\n }\n\n get publicKey(): PublicKey | null {\n if (!this.#publicKey && this.#selectedAccount) {\n try {\n this.#publicKey = new PublicKey(this.#selectedAccount.publicKey);\n } catch (e) {\n throw new WalletPublicKeyError((e instanceof Error && e?.message) || 'Unknown error', e);\n }\n }\n return this.#publicKey ?? null;\n }\n\n get connected(): boolean {\n return this.#wallet.connected;\n }\n\n get connecting(): boolean {\n return this.#connecting;\n }\n\n get readyState(): WalletReadyState {\n return this.#readyState;\n }\n\n /** @deprecated Use `autoConnect()` instead. */\n async autoConnect_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(): Promise<void> {\n return await this.autoConnect();\n }\n\n async autoConnect(): Promise<void> {\n this.#connect(true);\n }\n\n async connect(): Promise<void> {\n this.#connect();\n }\n\n async #connect(autoConnect: boolean = false): Promise<void> {\n if (this.connecting || this.connected) {\n return;\n }\n return await this.#runWithGuard(async () => {\n if (this.#readyState !== WalletReadyState.Installed && this.#readyState !== WalletReadyState.Loadable) {\n throw new WalletNotReadyError();\n }\n this.#connecting = true;\n try {\n await this.#wallet.features[StandardConnect].connect({ silent: autoConnect });\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n } finally {\n this.#connecting = false;\n }\n });\n }\n\n /** @deprecated Use `connect()` or `autoConnect()` instead. */\n async performAuthorization(signInPayload?: SignInPayload): Promise<AuthorizationResult> {\n try {\n const cachedAuthorizationResult = await this.#wallet.cachedAuthorizationResult;\n if (cachedAuthorizationResult) {\n await this.#wallet.features[StandardConnect].connect({ silent: true });\n return cachedAuthorizationResult;\n }\n\n if (signInPayload) {\n await this.#wallet.features[SolanaSignIn].signIn(signInPayload);\n } else await this.#wallet.features[StandardConnect].connect();\n const authorizationResult = await await this.#wallet.cachedAuthorizationResult;\n return authorizationResult!;\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n }\n }\n\n async disconnect(): Promise<void> {\n // return await this.#runWithGuard(this.#wallet.features[StandardDisconnect].disconnect);\n return await this.#runWithGuard(async () => {\n this.#connecting = false;\n this.#publicKey = undefined;\n this.#selectedAccount = undefined;\n await this.#wallet.features[StandardDisconnect].disconnect();\n this.emit('disconnect');\n });\n }\n\n async signIn(input?: SolanaSignInInput): Promise<SolanaSignInOutput> {\n return this.#runWithGuard(async () => {\n if (this.#readyState !== WalletReadyState.Installed && this.#readyState !== WalletReadyState.Loadable) {\n throw new WalletNotReadyError();\n }\n this.#connecting = true;\n try {\n const outputs = await this.#wallet.features[SolanaSignIn].signIn({\n ...input,\n domain: input?.domain ?? window.location.host,\n });\n if (outputs.length > 0) {\n return outputs[0];\n } else {\n throw new Error('Sign in failed, no sign in result returned by wallet');\n }\n } catch (e) {\n throw new WalletConnectionError((e instanceof Error && e.message) || 'Unknown error', e);\n } finally {\n this.#connecting = false;\n }\n });\n }\n\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n return await this.#runWithGuard(async () => {\n const account = this.#assertIsAuthorized();\n try {\n const outputs = await this.#wallet.features[SolanaSignMessage].signMessage({\n account,\n message: message,\n });\n return outputs[0].signature;\n } catch (error: unknown) {\n throw new WalletSignMessageError(getErrorMessage(error), error);\n }\n });\n }\n\n async sendTransaction<T extends LegacyTransaction | VersionedTransaction>(\n transaction: T,\n connection: Connection,\n options?: SendOptions,\n ): Promise<TransactionSignature> {\n return await this.#runWithGuard(async () => {\n const account = this.#assertIsAuthorized();\n try {\n function getTargetCommitment() {\n let targetCommitment: Finality;\n switch (connection.commitment) {\n case 'confirmed':\n case 'finalized':\n case 'processed':\n targetCommitment = connection.commitment;\n break;\n default:\n targetCommitment = 'finalized';\n }\n let targetPreflightCommitment: Finality;\n switch (options?.preflightCommitment) {\n case 'confirmed':\n case 'finalized':\n case 'processed':\n targetPreflightCommitment = options.preflightCommitment;\n break;\n case undefined:\n targetPreflightCommitment = targetCommitment;\n break;\n default:\n targetPreflightCommitment = 'finalized';\n }\n const preflightCommitmentScore =\n targetPreflightCommitment === 'finalized'\n ? 2\n : targetPreflightCommitment === 'confirmed'\n ? 1\n : 0;\n const targetCommitmentScore =\n targetCommitment === 'finalized' ? 2 : targetCommitment === 'confirmed' ? 1 : 0;\n return preflightCommitmentScore < targetCommitmentScore\n ? targetPreflightCommitment\n : targetCommitment;\n }\n if (SolanaSignAndSendTransaction in this.#wallet.features) {\n const chain = chainOrClusterToChainId(this.#wallet.currentAuthorization!.chain);\n const [signature] = (\n await this.#wallet.features[SolanaSignAndSendTransaction].signAndSendTransaction({\n account,\n transaction: transaction.serialize(),\n chain: chain,\n options: options\n ? {\n skipPreflight: options.skipPreflight,\n maxRetries: options.maxRetries,\n }\n : undefined,\n })\n ).map((output) => {\n return base64FromUint8Array(output.signature);\n });\n\n return signature;\n } else {\n const [signedTransaction] = await this.#performSignTransactions([transaction]);\n if (isVersionedTransaction(signedTransaction)) {\n return await connection.sendTransaction(signedTransaction);\n } else {\n const serializedTransaction = signedTransaction.serialize();\n return await connection.sendRawTransaction(serializedTransaction, {\n ...options,\n preflightCommitment: getTargetCommitment(),\n });\n }\n }\n } catch (error: unknown) {\n throw new WalletSendTransactionError(getErrorMessage(error), error);\n }\n });\n }\n\n async signTransaction<T extends LegacyTransaction | VersionedTransaction>(transaction: T): Promise<T> {\n return await this.#runWithGuard(async () => {\n const [signedTransaction] = await this.#performSignTransactions([transaction]);\n return signedTransaction;\n });\n }\n\n async signAllTransactions<T extends LegacyTransaction | VersionedTransaction>(transactions: T[]): Promise<T[]> {\n return await this.#runWithGuard(async () => {\n const signedTransactions = await this.#performSignTransactions(transactions);\n return signedTransactions;\n });\n }\n\n #declareWalletAsInstalled(): void {\n if (this.#readyState !== WalletReadyState.Installed) {\n this.emit('readyStateChange', (this.#readyState = WalletReadyState.Installed));\n }\n }\n\n #assertIsAuthorized() {\n if (!this.#wallet.isAuthorized || !this.#selectedAccount) throw new WalletNotConnectedError();\n return this.#selectedAccount;\n }\n\n async #performSignTransactions<T extends LegacyTransaction | VersionedTransaction>(\n transactions: T[],\n ): Promise<T[]> {\n const account = this.#assertIsAuthorized();\n try {\n if (SolanaSignTransaction in this.#wallet.features) {\n return this.#wallet.features[SolanaSignTransaction].signTransaction(\n ...transactions.map((value) => {\n return { account, transaction: value.serialize() };\n }),\n ).then((outputs) => {\n return outputs.map((output: SolanaSignTransactionOutput) => {\n const byteArray = output.signedTransaction;\n const numSignatures = byteArray[0];\n const messageOffset = numSignatures * SIGNATURE_LENGTH_IN_BYTES + 1;\n const version = VersionedMessage.deserializeMessageVersion(\n byteArray.slice(messageOffset, byteArray.length),\n );\n if (version === 'legacy') {\n return Transaction.from(byteArray) as T;\n } else {\n return VersionedTransaction.deserialize(byteArray) as T;\n }\n });\n });\n } else {\n throw new Error('Connected wallet does not support signing transactions');\n }\n } catch (error: unknown) {\n throw new WalletSignTransactionError(getErrorMessage(error), error);\n }\n }\n\n async #runWithGuard<TReturn>(callback: () => Promise<TReturn>) {\n try {\n return await callback();\n } catch (e: unknown) {\n this.emit('error', e instanceof WalletError ? e : new WalletError(getErrorMessage(e), e));\n throw e;\n }\n }\n}\n\nexport class LocalSolanaMobileWalletAdapter extends BaseSolanaMobileWalletAdapter {\n /**\n * @deprecated @param cluster config paramter is deprecated, use @param chain instead\n */\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n cluster: Cluster;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n });\n\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n });\n\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n cluster: Cluster;\n onWalletNotFound: (mobileWalletAdapter: LocalSolanaMobileWalletAdapter) => Promise<void>;\n }) {\n const chain = chainOrClusterToChainId(config.chain ?? config.cluster);\n super(\n new LocalSolanaMobileWalletAdapterWallet({\n appIdentity: config.appIdentity,\n authorizationCache: {\n set: config.authorizationResultCache.set,\n get: async () => {\n return (await config.authorizationResultCache.get()) as Authorization | undefined;\n },\n clear: config.authorizationResultCache.clear,\n },\n chains: [chain],\n chainSelector: createDefaultChainSelector(),\n onWalletNotFound: async () => {\n config.onWalletNotFound(this);\n },\n }),\n {\n addressSelector: config.addressSelector,\n chain: chain,\n },\n );\n }\n}\n\nexport class RemoteSolanaMobileWalletAdapter extends BaseSolanaMobileWalletAdapter {\n constructor(config: {\n addressSelector: AddressSelector;\n appIdentity: AppIdentity;\n authorizationResultCache: AuthorizationResultCache;\n chain: Chain;\n remoteHostAuthority: string;\n onWalletNotFound: (mobileWalletAdapter: RemoteSolanaMobileWalletAdapter) => Promise<void>;\n }) {\n const chain = chainOrClusterToChainId(config.chain);\n super(\n new RemoteSolanaMobileWalletAdapterWallet({\n appIdentity: config.appIdentity,\n authorizationCache: {\n set: config.authorizationResultCache.set,\n get: async () => {\n return (await config.authorizationResultCache.get()) as Authorization | undefined;\n },\n clear: config.authorizationResultCache.clear,\n },\n chains: [chain],\n chainSelector: createDefaultChainSelector(),\n remoteHostAuthority: config.remoteHostAuthority,\n onWalletNotFound: async () => {\n config.onWalletNotFound(this);\n },\n }),\n {\n addressSelector: config.addressSelector,\n chain: chain,\n },\n );\n }\n}\n\nexport class SolanaMobileWalletAdapter extends LocalSolanaMobileWalletAdapter {}\n","import { AddressSelector } from './adapter.js';\n\nexport function createDefaultAddressSelector(): AddressSelector {\n return {\n async select(addresses) {\n return addresses[0];\n },\n };\n}\n\n/**\n * @deprecated Use {@link createDefaultAddressSelector} instead.\n */\nexport default createDefaultAddressSelector;\n","import { createDefaultAuthorizationCache as baseCreateDefaultAuthorizationCache } from '@solana-mobile/wallet-standard-mobile';\n\nimport { AuthorizationResultCache } from './adapter.js';\n\nexport function createDefaultAuthorizationResultCache(): AuthorizationResultCache {\n return baseCreateDefaultAuthorizationCache();\n}\n\n/**\n * @deprecated Use {@link createDefaultAuthorizationResultCache} instead.\n */\nexport default createDefaultAuthorizationResultCache;\n","import { defaultErrorModalWalletNotFoundHandler } from '@solana-mobile/wallet-standard-mobile';\n\nimport { SolanaMobileWalletAdapter } from './adapter.js';\n\nasync function defaultWalletNotFoundHandler(_mobileWalletAdapter: SolanaMobileWalletAdapter) {\n return defaultErrorModalWalletNotFoundHandler();\n}\n\nexport function createDefaultWalletNotFoundHandler(): (\n mobileWalletAdapter: SolanaMobileWalletAdapter,\n) => Promise<void> {\n return defaultWalletNotFoundHandler;\n}\n\n/**\n * @deprecated Use {@link createDefaultWalletNotFoundHandler} instead.\n */\nexport default createDefaultWalletNotFoundHandler;\n"],"mappings":";;;;;;;AAAA,SAAgB,iBAAiB;AAC7B,QACI,OAAO,WAAW,eAClB,OAAO,mBACP,OAAO,aAAa,eACpB,WAAW,KAAK,UAAU,UAAU;;;;ACmE5C,MAAa,sCAAsCA;AACnD,MAAa,4CAA4CC;AAEzD,MAAM,4BAA4B;AAElC,SAAS,uBACL,aACmC;AACnC,QAAO,aAAa;;AAGxB,SAAS,wBAAwB,OAA0C;AACvE,SAAQ,OAAR;EACI,KAAK,eACD,QAAO;EACX,KAAK,UACD,QAAO;EACX,KAAK,SACD,QAAO;EACX,QACI,QAAO;;;AAInB,SAAS,gBAAgB,OAAwB;AAC7C,QAAO,iBAAiB,QAAQ,MAAM,UAAU;;AAGpD,IAAe,gCAAf,cAAqD,qCAAqC;CACtF,+BAAiE,IAAI,IAEjE,CAAC,UAAU,EAAE,CAChB;CACD;CACA;CACA;CACA;CACA,cAAc;CACd,cAAgC,gBAAgB,GAAG,iBAAiB,WAAW,iBAAiB;CAChG;CACA;CACA;CAEA,qBAAqB,OAAO,eAA+C;AACvE,MAAI,WAAW,YAAY,WAAW,SAAS,SAAS,GAAG;AACvD,SAAA,0BAAgC;GAChC,MAAM,sBAAsB,MAAM,MAAA,gBAAsB,WAAW,SAAS;AAC5E,OAAI,wBAAwB,MAAA,iBAAuB;AAC/C,UAAA,kBAAwB;AACxB,UAAA,YAAkB,KAAA;AAClB,SAAK,KACD,WAGA,KAAK,UACR;;;;CAKb,YACI,QACA,QAIF;AACE,SAAO;AAEP,QAAA,kBAAwB,OAAO,aAAuC;GAClE,MAAM,+BAA+B,MAAM,OAAO,gBAAgB,OAC9D,SAAS,KAAK,EAAE,gBAAgB,qBAAqB,IAAI,WAAW,UAAU,CAAC,CAAC,CACnF;AACD,UACI,SAAS,MACJ,EAAE,gBAAgB,qBAAqB,IAAI,WAAW,UAAU,CAAC,KAAK,6BAC1E,IAAI,SAAS;;AAGtB,QAAA,SAAe;AACf,QAAA,OAAa,SAAS,gBAAgB,GAAG,UAAU,MAAA,kBAAwB;AAC3E,OAAK,OAAO,MAAA,OAAa;AACzB,OAAK,OAAO,MAAA,OAAa;AACzB,OAAK,MAAM,MAAA,OAAa;;CAe5B,IAAI,YAA8B;AAC9B,MAAI,CAAC,MAAA,aAAmB,MAAA,gBACpB,KAAI;AACA,SAAA,YAAkB,IAAI,UAAU,MAAA,gBAAsB,UAAU;WAC3D,GAAG;AACR,SAAM,IAAI,qBAAsB,aAAa,SAAS,GAAG,WAAY,iBAAiB,EAAE;;AAGhG,SAAO,MAAA,aAAmB;;CAG9B,IAAI,YAAqB;AACrB,SAAO,MAAA,OAAa;;CAGxB,IAAI,aAAsB;AACtB,SAAO,MAAA;;CAGX,IAAI,aAA+B;AAC/B,SAAO,MAAA;;;CAIX,MAAM,8CAA6D;AAC/D,SAAO,MAAM,KAAK,aAAa;;CAGnC,MAAM,cAA6B;AAC/B,QAAA,QAAc,KAAK;;CAGvB,MAAM,UAAyB;AAC3B,QAAA,SAAe;;CAGnB,OAAA,QAAe,cAAuB,OAAsB;AACxD,MAAI,KAAK,cAAc,KAAK,UACxB;AAEJ,SAAO,MAAM,MAAA,aAAmB,YAAY;AACxC,OAAI,MAAA,eAAqB,iBAAiB,aAAa,MAAA,eAAqB,iBAAiB,SACzF,OAAM,IAAI,qBAAqB;AAEnC,SAAA,aAAmB;AACnB,OAAI;AACA,UAAM,MAAA,OAAa,SAAS,iBAAiB,QAAQ,EAAE,QAAQ,aAAa,CAAC;YACxE,GAAG;AACR,UAAM,IAAI,sBAAuB,aAAa,SAAS,EAAE,WAAY,iBAAiB,EAAE;aAClF;AACN,UAAA,aAAmB;;IAEzB;;;CAIN,MAAM,qBAAqB,eAA6D;AACpF,MAAI;GACA,MAAM,4BAA4B,MAAM,MAAA,OAAa;AACrD,OAAI,2BAA2B;AAC3B,UAAM,MAAA,OAAa,SAAS,iBAAiB,QAAQ,EAAE,QAAQ,MAAM,CAAC;AACtE,WAAO;;AAGX,OAAI,cACA,OAAM,MAAA,OAAa,SAAS,cAAc,OAAO,cAAc;OAC5D,OAAM,MAAA,OAAa,SAAS,iBAAiB,SAAS;AAE7D,UAD4B,MAAM,MAAM,MAAA,OAAa;WAEhD,GAAG;AACR,SAAM,IAAI,sBAAuB,aAAa,SAAS,EAAE,WAAY,iBAAiB,EAAE;;;CAIhG,MAAM,aAA4B;AAE9B,SAAO,MAAM,MAAA,aAAmB,YAAY;AACxC,SAAA,aAAmB;AACnB,SAAA,YAAkB,KAAA;AAClB,SAAA,kBAAwB,KAAA;AACxB,SAAM,MAAA,OAAa,SAAS,oBAAoB,YAAY;AAC5D,QAAK,KAAK,aAAa;IACzB;;CAGN,MAAM,OAAO,OAAwD;AACjE,SAAO,MAAA,aAAmB,YAAY;AAClC,OAAI,MAAA,eAAqB,iBAAiB,aAAa,MAAA,eAAqB,iBAAiB,SACzF,OAAM,IAAI,qBAAqB;AAEnC,SAAA,aAAmB;AACnB,OAAI;IACA,MAAM,UAAU,MAAM,MAAA,OAAa,SAAS,cAAc,OAAO;KAC7D,GAAG;KACH,QAAQ,OAAO,UAAU,OAAO,SAAS;KAC5C,CAAC;AACF,QAAI,QAAQ,SAAS,EACjB,QAAO,QAAQ;QAEf,OAAM,IAAI,MAAM,uDAAuD;YAEtE,GAAG;AACR,UAAM,IAAI,sBAAuB,aAAa,SAAS,EAAE,WAAY,iBAAiB,EAAE;aAClF;AACN,UAAA,aAAmB;;IAEzB;;CAGN,MAAM,YAAY,SAA0C;AACxD,SAAO,MAAM,MAAA,aAAmB,YAAY;GACxC,MAAM,UAAU,MAAA,oBAA0B;AAC1C,OAAI;AAKA,YAJgB,MAAM,MAAA,OAAa,SAAS,mBAAmB,YAAY;KACvE;KACS;KACZ,CAAC,EACa,GAAG;YACb,OAAgB;AACrB,UAAM,IAAI,uBAAuB,gBAAgB,MAAM,EAAE,MAAM;;IAErE;;CAGN,MAAM,gBACF,aACA,YACA,SAC6B;AAC7B,SAAO,MAAM,MAAA,aAAmB,YAAY;GACxC,MAAM,UAAU,MAAA,oBAA0B;AAC1C,OAAI;IACA,SAAS,sBAAsB;KAC3B,IAAI;AACJ,aAAQ,WAAW,YAAnB;MACI,KAAK;MACL,KAAK;MACL,KAAK;AACD,0BAAmB,WAAW;AAC9B;MACJ,QACI,oBAAmB;;KAE3B,IAAI;AACJ,aAAQ,SAAS,qBAAjB;MACI,KAAK;MACL,KAAK;MACL,KAAK;AACD,mCAA4B,QAAQ;AACpC;MACJ,KAAK,KAAA;AACD,mCAA4B;AAC5B;MACJ,QACI,6BAA4B;;AAUpC,aAPI,8BAA8B,cACxB,IACA,8BAA8B,cAC5B,IACA,MAER,qBAAqB,cAAc,IAAI,qBAAqB,cAAc,IAAI,KAE5E,4BACA;;AAEV,QAAI,gCAAgC,MAAA,OAAa,UAAU;KACvD,MAAM,QAAQ,wBAAwB,MAAA,OAAa,qBAAsB,MAAM;KAC/E,MAAM,CAAC,cACH,MAAM,MAAA,OAAa,SAAS,8BAA8B,uBAAuB;MAC7E;MACA,aAAa,YAAY,WAAW;MAC7B;MACP,SAAS,UACH;OACI,eAAe,QAAQ;OACvB,YAAY,QAAQ;OACvB,GACD,KAAA;MACT,CAAC,EACJ,KAAK,WAAW;AACd,aAAO,qBAAqB,OAAO,UAAU;OAC/C;AAEF,YAAO;WACJ;KACH,MAAM,CAAC,qBAAqB,MAAM,MAAA,wBAA8B,CAAC,YAAY,CAAC;AAC9E,SAAI,uBAAuB,kBAAkB,CACzC,QAAO,MAAM,WAAW,gBAAgB,kBAAkB;UACvD;MACH,MAAM,wBAAwB,kBAAkB,WAAW;AAC3D,aAAO,MAAM,WAAW,mBAAmB,uBAAuB;OAC9D,GAAG;OACH,qBAAqB,qBAAqB;OAC7C,CAAC;;;YAGL,OAAgB;AACrB,UAAM,IAAI,2BAA2B,gBAAgB,MAAM,EAAE,MAAM;;IAEzE;;CAGN,MAAM,gBAAoE,aAA4B;AAClG,SAAO,MAAM,MAAA,aAAmB,YAAY;GACxC,MAAM,CAAC,qBAAqB,MAAM,MAAA,wBAA8B,CAAC,YAAY,CAAC;AAC9E,UAAO;IACT;;CAGN,MAAM,oBAAwE,cAAiC;AAC3G,SAAO,MAAM,MAAA,aAAmB,YAAY;AAExC,UAD2B,MAAM,MAAA,wBAA8B,aAAa;IAE9E;;CAGN,4BAAkC;AAC9B,MAAI,MAAA,eAAqB,iBAAiB,UACtC,MAAK,KAAK,oBAAqB,MAAA,aAAmB,iBAAiB,UAAW;;CAItF,sBAAsB;AAClB,MAAI,CAAC,MAAA,OAAa,gBAAgB,CAAC,MAAA,gBAAuB,OAAM,IAAI,yBAAyB;AAC7F,SAAO,MAAA;;CAGX,OAAA,wBACI,cACY;EACZ,MAAM,UAAU,MAAA,oBAA0B;AAC1C,MAAI;AACA,OAAI,yBAAyB,MAAA,OAAa,SACtC,QAAO,MAAA,OAAa,SAAS,uBAAuB,gBAChD,GAAG,aAAa,KAAK,UAAU;AAC3B,WAAO;KAAE;KAAS,aAAa,MAAM,WAAW;KAAE;KACpD,CACL,CAAC,MAAM,YAAY;AAChB,WAAO,QAAQ,KAAK,WAAwC;KACxD,MAAM,YAAY,OAAO;KAEzB,MAAM,gBADgB,UAAU,KACM,4BAA4B;AAIlE,SAHgB,iBAAiB,0BAC7B,UAAU,MAAM,eAAe,UAAU,OAAO,CACnD,KACe,SACZ,QAAO,YAAY,KAAK,UAAU;SAElC,QAAO,qBAAqB,YAAY,UAAU;MAExD;KACJ;OAEF,OAAM,IAAI,MAAM,yDAAyD;WAExE,OAAgB;AACrB,SAAM,IAAI,2BAA2B,gBAAgB,MAAM,EAAE,MAAM;;;CAI3E,OAAA,aAA6B,UAAkC;AAC3D,MAAI;AACA,UAAO,MAAM,UAAU;WAClB,GAAY;AACjB,QAAK,KAAK,SAAS,aAAa,cAAc,IAAI,IAAI,YAAY,gBAAgB,EAAE,EAAE,EAAE,CAAC;AACzF,SAAM;;;;AAKlB,IAAa,iCAAb,cAAoD,8BAA8B;CAoB9E,YAAY,QAOT;EACC,MAAM,QAAQ,wBAAwB,OAAO,SAAS,OAAO,QAAQ;AACrE,QACI,IAAI,qCAAqC;GACrC,aAAa,OAAO;GACpB,oBAAoB;IAChB,KAAK,OAAO,yBAAyB;IACrC,KAAK,YAAY;AACb,YAAQ,MAAM,OAAO,yBAAyB,KAAK;;IAEvD,OAAO,OAAO,yBAAyB;IAC1C;GACD,QAAQ,CAAC,MAAM;GACf,eAAe,4BAA4B;GAC3C,kBAAkB,YAAY;AAC1B,WAAO,iBAAiB,KAAK;;GAEpC,CAAC,EACF;GACI,iBAAiB,OAAO;GACjB;GACV,CACJ;;;AAIT,IAAa,kCAAb,cAAqD,8BAA8B;CAC/E,YAAY,QAOT;EACC,MAAM,QAAQ,wBAAwB,OAAO,MAAM;AACnD,QACI,IAAI,sCAAsC;GACtC,aAAa,OAAO;GACpB,oBAAoB;IAChB,KAAK,OAAO,yBAAyB;IACrC,KAAK,YAAY;AACb,YAAQ,MAAM,OAAO,yBAAyB,KAAK;;IAEvD,OAAO,OAAO,yBAAyB;IAC1C;GACD,QAAQ,CAAC,MAAM;GACf,eAAe,4BAA4B;GAC3C,qBAAqB,OAAO;GAC5B,kBAAkB,YAAY;AAC1B,WAAO,iBAAiB,KAAK;;GAEpC,CAAC,EACF;GACI,iBAAiB,OAAO;GACjB;GACV,CACJ;;;AAIT,IAAa,4BAAb,cAA+C,+BAA+B;;;ACjhB9E,SAAgB,+BAAgD;AAC5D,QAAO,EACH,MAAM,OAAO,WAAW;AACpB,SAAO,UAAU;IAExB;;;;ACHL,SAAgB,wCAAkE;AAC9E,QAAOa,iCAAqC;;;;ACDhD,eAAe,6BAA6B,sBAAiD;AACzF,QAAO,wCAAwC;;AAGnD,SAAgB,qCAEG;AACf,QAAO"}
package/lib/esm/index.js CHANGED
@@ -1,13 +1,9 @@
1
- import { BaseSignInMessageSignerWalletAdapter, WalletConnectionError, WalletNotConnectedError, WalletNotReadyError, WalletPublicKeyError, WalletReadyState, WalletSendTransactionError, WalletSignMessageError, WalletSignTransactionError } from "@solana/wallet-adapter-base";
2
- import { PublicKey, Transaction, VersionedMessage, VersionedTransaction } from "@solana/web3.js";
1
+ import { BaseSignInMessageSignerWalletAdapter, WalletConnectionError, WalletError, WalletNotConnectedError, WalletNotReadyError, WalletPublicKeyError, WalletReadyState, WalletSendTransactionError, WalletSignMessageError, WalletSignTransactionError } from "@solana/wallet-adapter-base";
3
2
  import { SolanaSignAndSendTransaction, SolanaSignIn, SolanaSignMessage, SolanaSignTransaction } from "@solana/wallet-standard-features";
4
- import { StandardConnect, StandardDisconnect, StandardEvents } from "@wallet-standard/core";
3
+ import { PublicKey, Transaction, VersionedMessage, VersionedTransaction } from "@solana/web3.js";
4
+ import { base64FromUint8Array } from "@solana-mobile/mobile-wallet-adapter-protocol/encoding";
5
5
  import { LocalSolanaMobileWalletAdapterWallet, RemoteSolanaMobileWalletAdapterWallet, SolanaMobileWalletAdapterRemoteWalletName as SolanaMobileWalletAdapterRemoteWalletName$1, SolanaMobileWalletAdapterWalletName as SolanaMobileWalletAdapterWalletName$1, createDefaultAuthorizationCache, createDefaultChainSelector, defaultErrorModalWalletNotFoundHandler } from "@solana-mobile/wallet-standard-mobile";
6
- //#region src/base64Utils.ts
7
- function fromUint8Array(byteArray) {
8
- return window.btoa(String.fromCharCode.call(null, ...byteArray));
9
- }
10
- //#endregion
6
+ import { StandardConnect, StandardDisconnect, StandardEvents } from "@wallet-standard/core";
11
7
  //#region src/getIsSupported.ts
12
8
  function getIsSupported() {
13
9
  return typeof window !== "undefined" && window.isSecureContext && typeof document !== "undefined" && /android/i.test(navigator.userAgent);
@@ -28,6 +24,9 @@ function chainOrClusterToChainId(chain) {
28
24
  default: return chain;
29
25
  }
30
26
  }
27
+ function getErrorMessage(error) {
28
+ return error instanceof Error ? error.message : "Unknown error";
29
+ }
31
30
  var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletAdapter {
32
31
  supportedTransactionVersions = new Set(["legacy", 0]);
33
32
  name;
@@ -53,8 +52,8 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
53
52
  constructor(wallet, config) {
54
53
  super();
55
54
  this.#accountSelector = async (accounts) => {
56
- const selectedBase64EncodedAddress = await config.addressSelector.select(accounts.map(({ publicKey }) => fromUint8Array(new Uint8Array(publicKey))));
57
- return accounts.find(({ publicKey }) => fromUint8Array(new Uint8Array(publicKey)) === selectedBase64EncodedAddress) ?? accounts[0];
55
+ const selectedBase64EncodedAddress = await config.addressSelector.select(accounts.map(({ publicKey }) => base64FromUint8Array(new Uint8Array(publicKey))));
56
+ return accounts.find(({ publicKey }) => base64FromUint8Array(new Uint8Array(publicKey)) === selectedBase64EncodedAddress) ?? accounts[0];
58
57
  };
59
58
  this.#wallet = wallet;
60
59
  this.#wallet.features[StandardEvents].on("change", this.#handleChangeEvent);
@@ -154,7 +153,7 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
154
153
  message
155
154
  }))[0].signature;
156
155
  } catch (error) {
157
- throw new WalletSignMessageError(error?.message, error);
156
+ throw new WalletSignMessageError(getErrorMessage(error), error);
158
157
  }
159
158
  });
160
159
  }
@@ -197,7 +196,7 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
197
196
  maxRetries: options.maxRetries
198
197
  } : void 0
199
198
  })).map((output) => {
200
- return fromUint8Array(output.signature);
199
+ return base64FromUint8Array(output.signature);
201
200
  });
202
201
  return signature;
203
202
  } else {
@@ -212,7 +211,7 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
212
211
  }
213
212
  }
214
213
  } catch (error) {
215
- throw new WalletSendTransactionError(error?.message, error);
214
+ throw new WalletSendTransactionError(getErrorMessage(error), error);
216
215
  }
217
216
  });
218
217
  }
@@ -252,14 +251,14 @@ var BaseSolanaMobileWalletAdapter = class extends BaseSignInMessageSignerWalletA
252
251
  });
253
252
  else throw new Error("Connected wallet does not support signing transactions");
254
253
  } catch (error) {
255
- throw new WalletSignTransactionError(error?.message, error);
254
+ throw new WalletSignTransactionError(getErrorMessage(error), error);
256
255
  }
257
256
  }
258
257
  async #runWithGuard(callback) {
259
258
  try {
260
259
  return await callback();
261
260
  } catch (e) {
262
- this.emit("error", e);
261
+ this.emit("error", e instanceof WalletError ? e : new WalletError(getErrorMessage(e), e));
263
262
  throw e;
264
263
  }
265
264
  }
@@ -326,7 +325,7 @@ function createDefaultAuthorizationResultCache() {
326
325
  }
327
326
  //#endregion
328
327
  //#region src/createDefaultWalletNotFoundHandler.ts
329
- async function defaultWalletNotFoundHandler(mobileWalletAdapter) {
328
+ async function defaultWalletNotFoundHandler(_mobileWalletAdapter) {
330
329
  return defaultErrorModalWalletNotFoundHandler();
331
330
  }
332
331
  function createDefaultWalletNotFoundHandler() {