{"version":3,"file":"wallet.mjs","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MultichainApiClient, SessionData } from '@metamask/multichain-api-client';\nimport {\n  SOLANA_DEVNET_CHAIN,\n  SOLANA_MAINNET_CHAIN,\n  SOLANA_TESTNET_CHAIN,\n  type SolanaChain,\n} from '@solana/wallet-standard-chains';\nimport {\n  SolanaSignAndSendTransaction,\n  type SolanaSignAndSendTransactionFeature,\n  type SolanaSignAndSendTransactionInput,\n  type SolanaSignAndSendTransactionOutput,\n  SolanaSignIn,\n  type SolanaSignInFeature,\n  type SolanaSignInInput,\n  type SolanaSignInOutput,\n  SolanaSignMessage,\n  type SolanaSignMessageFeature,\n  type SolanaSignMessageInput,\n  type SolanaSignMessageOutput,\n  SolanaSignTransaction,\n  type SolanaSignTransactionFeature,\n  type SolanaSignTransactionInput,\n  type SolanaSignTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport type { IdentifierArray, Wallet } from '@wallet-standard/base';\nimport {\n  StandardConnect,\n  type StandardConnectFeature,\n  type StandardConnectOutput,\n  StandardDisconnect,\n  type StandardDisconnectFeature,\n  StandardEvents,\n  type StandardEventsFeature,\n  type StandardEventsListeners,\n  type StandardEventsNames,\n  type StandardEventsOnMethod,\n} from '@wallet-standard/features';\nimport { ReadonlyWalletAccount } from '@wallet-standard/wallet';\nimport bs58 from 'bs58';\nimport { metamaskIcon } from './icon';\nimport { type CaipAccountId, type DeepWriteable, Scope, type WalletOptions } from './types';\nimport { getAddressFromCaipAccountId, getScopeFromWalletStandardChain, isSessionChangedEvent } from './utils';\n\nexport class MetamaskWalletAccount extends ReadonlyWalletAccount {\n  constructor({ address, publicKey, chains }: { address: string; publicKey: Uint8Array; chains: IdentifierArray }) {\n    const features: IdentifierArray = [\n      SolanaSignAndSendTransaction,\n      SolanaSignTransaction,\n      SolanaSignMessage,\n      SolanaSignIn,\n    ];\n    super({ address, publicKey, chains, features });\n    if (new.target === MetamaskWalletAccount) {\n      Object.freeze(this);\n    }\n  }\n}\n\nexport class MetamaskWallet implements Wallet {\n  // list of scopes in priority order for resolving selected account\n  static readonly scopes = [Scope.MAINNET, Scope.DEVNET, Scope.TESTNET] as const;\n\n  readonly #listeners: { [E in StandardEventsNames]?: StandardEventsListeners[E][] } = {};\n  readonly version = '1.0.0' as const;\n  readonly name;\n  readonly icon = metamaskIcon;\n  readonly chains: SolanaChain[] = [SOLANA_MAINNET_CHAIN, SOLANA_DEVNET_CHAIN, SOLANA_TESTNET_CHAIN];\n  protected scope: Scope | undefined;\n  #account: MetamaskWalletAccount | undefined;\n  #removeSessionChangedListener: (() => void) | undefined;\n\n  client: MultichainApiClient;\n\n  get accounts() {\n    return this.#account ? [this.#account] : [];\n  }\n\n  get features(): StandardConnectFeature &\n    SolanaSignInFeature &\n    StandardDisconnectFeature &\n    StandardEventsFeature &\n    SolanaSignAndSendTransactionFeature &\n    SolanaSignTransactionFeature &\n    SolanaSignMessageFeature {\n    return {\n      [StandardConnect]: {\n        version: this.version,\n        connect: this.#connect,\n      },\n      [SolanaSignIn]: {\n        version: this.version,\n        signIn: this.#signIn,\n      },\n      [StandardDisconnect]: {\n        version: this.version,\n        disconnect: this.#disconnect,\n      },\n      [StandardEvents]: {\n        version: this.version,\n        on: this.#on,\n      },\n      [SolanaSignAndSendTransaction]: {\n        version: this.version,\n        supportedTransactionVersions: ['legacy', 0],\n        signAndSendTransaction: this.#signAndSendTransaction,\n      },\n      [SolanaSignTransaction]: {\n        version: this.version,\n        supportedTransactionVersions: ['legacy', 0],\n        signTransaction: this.#signTransaction,\n      },\n      [SolanaSignMessage]: {\n        version: this.version,\n        signMessage: this.#signMessage,\n      },\n    };\n  }\n\n  constructor({ client, walletName }: WalletOptions) {\n    this.client = client;\n    this.name = `${walletName ?? 'MetaMask'}` as const;\n\n    // TODO: talk with Baptiste and Edouard about this\n    this.#tryRestoringSession();\n    this.#removeSessionChangedListener = this.client.onNotification(this.#handleSessionChangedEvent.bind(this));\n  }\n\n  #on: StandardEventsOnMethod = (event, listener) => {\n    if (this.#listeners[event]) {\n      this.#listeners[event]?.push(listener);\n    } else {\n      this.#listeners[event] = [listener];\n    }\n    return () => this.#off(event, listener);\n  };\n\n  #emit<E extends StandardEventsNames>(event: E, ...args: Parameters<StandardEventsListeners[E]>): void {\n    for (const listener of this.#listeners[event] ?? []) {\n      listener.apply(null, args);\n    }\n  }\n\n  #off<E extends StandardEventsNames>(event: E, listener: StandardEventsListeners[E]): void {\n    this.#listeners[event] = this.#listeners[event]?.filter((existingListener) => listener !== existingListener);\n  }\n\n  #connect = async (): Promise<StandardConnectOutput> => {\n    if (this.accounts.length) {\n      // Already connected\n      return { accounts: this.accounts };\n    }\n\n    // Try restoring session\n    await this.#tryRestoringSession();\n\n    // Otherwise create a session on Mainnet by default\n    if (!this.accounts.length) {\n      await this.#createSession(Scope.MAINNET);\n    }\n\n    // In case user didn't select any Solana scope/account, return\n    if (!this.accounts.length) {\n      return { accounts: [] };\n    }\n\n    this.#removeSessionChangedListener?.();\n    this.#removeSessionChangedListener = this.client.onNotification(this.#handleSessionChangedEvent.bind(this));\n\n    return { accounts: this.accounts };\n  };\n\n  #signIn = async (...inputs: SolanaSignInInput[]): Promise<SolanaSignInOutput[]> => {\n    if (!this.#account || !this.scope) {\n      await this.#connect();\n\n      if (!this.#account || !this.scope) {\n        throw new Error('Not connected');\n      }\n    }\n\n    const results: SolanaSignInOutput[] = [];\n\n    for (const input of inputs) {\n      const signInRes = await this.client.invokeMethod({\n        scope: this.scope,\n        request: {\n          method: 'signIn',\n          params: {\n            ...input,\n            domain: input.domain || window.location.host,\n            address: input.address || this.#account.address,\n          } as DeepWriteable<SolanaSignInInput>,\n        },\n      });\n\n      results.push({\n        account: this.#account,\n        signedMessage: Buffer.from(signInRes.signedMessage, 'base64'),\n        signature: bs58.decode(signInRes.signature),\n      });\n    }\n\n    return results;\n  };\n\n  #disconnect = async (options: { revokeSession?: boolean } = {}) => {\n    const wasConnected = Boolean(this.#account);\n    const { revokeSession = true } = options;\n    this.#account = undefined;\n    this.scope = undefined;\n    if (wasConnected) {\n      this.#emit('change', { accounts: this.accounts });\n    }\n    if (revokeSession) {\n      this.#removeSessionChangedListener?.();\n      this.#removeSessionChangedListener = undefined;\n      await this.client.revokeSession({ scopes: [...MetamaskWallet.scopes] });\n    }\n  };\n\n  #signAndSendTransaction = async (\n    ...inputs: SolanaSignAndSendTransactionInput[]\n  ): Promise<SolanaSignAndSendTransactionOutput[]> => {\n    const account = this.#account;\n    if (!account) {\n      throw new Error('Not connected');\n    }\n\n    this.#validateSendTransactionInput(inputs);\n\n    const scope = getScopeFromWalletStandardChain(inputs[0]?.chain);\n    const session = await this.client.getSession();\n    const sessionAccounts = session?.sessionScopes[scope]?.accounts;\n\n    // Update session if account isn't permissioned for this scope\n    if (sessionAccounts?.includes(`${scope}:${account.address}`)) {\n      this.scope = scope;\n    } else {\n      // Create the session with only the devnet scope, to protect users from accidentally signing transactions on mainnet\n      await this.#createSession(scope, [account.address]);\n    }\n\n    const results: SolanaSignAndSendTransactionOutput[] = [];\n\n    for (const { transaction: transactionBuffer, account } of inputs) {\n      const transaction = Buffer.from(transactionBuffer).toString('base64');\n\n      const signAndSendTransactionRes = await this.client.invokeMethod({\n        scope,\n        request: {\n          method: 'signAndSendTransaction',\n          params: {\n            account: { address: account.address },\n            transaction,\n            scope,\n          },\n        },\n      });\n\n      results.push({\n        signature: bs58.decode(signAndSendTransactionRes.signature),\n      });\n    }\n\n    return results;\n  };\n\n  #signTransaction = async (...inputs: SolanaSignTransactionInput[]): Promise<SolanaSignTransactionOutput[]> => {\n    if (!this.scope) {\n      throw new Error('Not connected');\n    }\n\n    const results: SolanaSignTransactionOutput[] = [];\n\n    for (const { transaction: transactionBuffer, account } of inputs) {\n      const transaction = Buffer.from(transactionBuffer).toString('base64');\n\n      const signTransactionRes = await this.client.invokeMethod({\n        scope: this.scope,\n        request: {\n          method: 'signTransaction',\n          params: {\n            account: { address: account.address },\n            transaction,\n            scope: this.scope,\n          },\n        },\n      });\n\n      results.push({\n        signedTransaction: Uint8Array.from(Buffer.from(signTransactionRes.signedTransaction, 'base64')),\n      });\n    }\n\n    return results;\n  };\n\n  #signMessage = async (...inputs: SolanaSignMessageInput[]): Promise<SolanaSignMessageOutput[]> => {\n    if (!this.scope) {\n      throw new Error('Not connected');\n    }\n\n    const results: SolanaSignMessageOutput[] = [];\n\n    for (const { message: messageBuffer, account } of inputs) {\n      const message = Buffer.from(messageBuffer).toString('base64');\n\n      const signMessageRes = await this.client.invokeMethod({\n        scope: this.scope,\n        request: {\n          method: 'signMessage',\n          params: {\n            message,\n            account: { address: account.address },\n          },\n        },\n      });\n\n      results.push({\n        signedMessage: Buffer.from(signMessageRes.signedMessage, 'base64'),\n        signature: bs58.decode(signMessageRes.signature),\n        signatureType: signMessageRes.signatureType as 'ed25519',\n      });\n    }\n\n    return results;\n  };\n\n  /**\n   * Handles the wallet_sessionChanged event.\n   * Updates internal state to connected (with correct change event) when the session has Solana scopes,\n   * or to disconnected when it does not.\n   * @param data - The event data\n   */\n  async #handleSessionChangedEvent(data: any) {\n    if (!isSessionChangedEvent(data)) {\n      return;\n    }\n\n    const sessionScopes = Object.keys(data.params.sessionScopes);\n    const hasSolanaScope = sessionScopes.some((scope) => MetamaskWallet.scopes.includes(scope as Scope));\n\n    if (hasSolanaScope) {\n      this.updateSession(data.params);\n    } else {\n      // An empty accountsChanged event means that the Solana scope was revoked outside of Wallet Standard.\n      // We don't revoke the session in this case to avoid side effects on EVM scopes\n      await this.#disconnect({ revokeSession: false });\n    }\n  }\n\n  /**\n   * Updates the session and the account to connect to.\n   * This method handles the logic for selecting the appropriate Solana network scope (mainnet/devnet/testnet)\n   * and account to connect to based on the following priority: mainnet > devnet > testnet. It assumes the same\n   * set of accounts is available for all Solana scopes and will take the first account found from the scopes above.\n   *\n   * @param session - The session data containing available scopes and accounts\n   */\n  protected updateSession(session: SessionData | undefined) {\n    // Get session scopes\n    const sessionScopes = new Set(Object.keys(session?.sessionScopes ?? {}));\n\n    // Find the first available scope in priority order: mainnet > devnet > testnet.\n    const scope = MetamaskWallet.scopes.find((s) => sessionScopes.has(s));\n\n    // If no scope is available, don't disconnect so that we can create/update a new session\n    if (!scope) {\n      this.#account = undefined;\n      return;\n    }\n    const selectedAccountId = session?.sessionScopes[scope]?.accounts?.[0];\n\n    // In case the Solana scope is available but without any accounts\n    // Could happen if the user already created a session using ethereum injected provider for example or the SDK\n    // Don't disconnect so that we can create/update a new session\n    if (!selectedAccountId) {\n      this.#account = undefined;\n      return;\n    }\n\n    const addressToConnect = getAddressFromCaipAccountId(selectedAccountId);\n\n    // Update the account and scope\n    const previousAccount = this.#account;\n    this.#account = this.#getAccountFromAddress(addressToConnect);\n    this.scope = scope;\n    if (this.#account.address !== previousAccount?.address) {\n      this.#emit('change', { accounts: this.accounts });\n    }\n  }\n\n  #getAccountFromAddress(address: string) {\n    return new MetamaskWalletAccount({\n      address,\n      publicKey: new Uint8Array(bs58.decode(address)),\n      chains: this.chains,\n    });\n  }\n\n  #validateSendTransactionInput = (inputs: SolanaSignAndSendTransactionInput[]) => {\n    const accountAddress = this.#account?.address;\n    const firstChain = inputs[0]?.chain;\n\n    for (const {\n      account: { address: transactionAddress },\n      chain,\n    } of inputs) {\n      // Verify all transactions are on the same and connected account\n      if (transactionAddress !== accountAddress) {\n        throw new Error('Invalid transaction addresses');\n      }\n      // Verify all transactions are on the same chain\n      if (chain !== firstChain) {\n        throw new Error('All transactions must be on the same chain');\n      }\n    }\n  };\n\n  #tryRestoringSession = async (): Promise<void> => {\n    try {\n      const existingSession = await this.client.getSession();\n\n      if (!existingSession) {\n        return;\n      }\n\n      this.updateSession(existingSession);\n    } catch (error) {\n      console.warn('Error restoring session', error);\n    }\n  };\n\n  #createSession = async (scope: Scope, addresses?: string[]): Promise<void> => {\n    const session = await this.client.createSession({\n      optionalScopes: {\n        [scope]: {\n          ...(addresses ? { accounts: addresses.map((address) => `${scope}:${address}` as CaipAccountId) } : {}),\n          methods: [],\n          notifications: [],\n        },\n      },\n      sessionProperties: {\n        // Previously this was needed to enable metamask_accountsChanged events for Solana.\n        // This isn't needed for that purpose since we now use wallet_sessionChanged events.\n        // However this is still needed to help the wallet identify our injected solana provider\n        // until we migrate to a more accurate property name.\n        // See: https://github.com/MetaMask/metamask-extension/blob/70dd748af54b58ceb8e78d227b6bdf118fb8e7ba/ui/pages/multichain-accounts/multichain-accounts-connect-page/multichain-accounts-connect-page.tsx#L169-L174\n        solana_accountChanged_notifications: true,\n      },\n    });\n\n    this.updateSession(session);\n  };\n}\n"]}