UNPKG

@web3auth/no-modal

Version:
97 lines (93 loc) 3.84 kB
'use strict'; var baseControllers = require('@toruslabs/base-controllers'); var siwe = require('viem/siwe'); require('@babel/runtime/helpers/objectSpread2'); require('@babel/runtime/helpers/defineProperty'); require('@segment/analytics-next'); require('../../base/loglevel.js'); var baseConnector = require('../../base/connector/baseConnector.js'); require('../../base/connector/connectorStatus.js'); var constants = require('../../base/connector/constants.js'); require('@web3auth/auth'); require('jwt-decode'); require('../../base/constants.js'); var index = require('../../base/errors/index.js'); require('../../base/plugin/errors.js'); require('../../base/plugin/IPlugin.js'); var utils = require('../../base/utils.js'); require('../../base/wallet/index.js'); var solana = require('../../base/wallet/solana.js'); class BaseSolanaConnector extends baseConnector.BaseConnector { async init(_) {} async getAuthTokenInfo() { if (!this.solanaWallet || !this.canAuthorize) throw index.WalletLoginError.notConnectedError(); if (!this.coreOptions) throw index.WalletInitializationError.invalidParams("Please initialize Web3Auth with a valid options"); this.status = constants.CONNECTOR_STATUS.AUTHORIZING; this.emit(constants.CONNECTOR_EVENTS.AUTHORIZING, { connector: this.name }); const accounts = this.solanaWallet.accounts.map(a => a.address); if (accounts.length > 0) { const cached = await this.getCachedOrNullAuthTokenInfo(accounts[0]); if (cached) return cached; const authServer = utils.citadelServerUrl(this.coreOptions.authBuildEnv); const { challenge, signature, chainNamespace } = await this.generateChallengeAndSign(authServer); return this.verifyAndAuthorize({ chainNamespace, signedMessage: signature, challenge, authServer }); } throw index.WalletLoginError.notConnectedError("Not connected with wallet, Please login/connect first"); } async generateChallengeAndSign(authServerUrl, accounts) { const accountsToUse = accounts || this.solanaWallet.accounts.map(a => a.address); if (!accountsToUse || accountsToUse.length === 0) { throw index.WalletLoginError.notConnectedError("No accounts found in the connected wallet"); } const walletChains = new Set(this.solanaWallet.chains); const currentChainConfig = this.coreOptions.chains.find(c => { if (c.chainNamespace !== baseControllers.CHAIN_NAMESPACES.SOLANA) return false; const id = solana.getSolanaChainByChainConfig(c); return id != null && walletChains.has(id); }); if (!currentChainConfig) { throw index.WalletInitializationError.invalidParams("No Solana chain in common between the connected wallet and Web3Auth chain configuration"); } const { chainId, chainNamespace } = currentChainConfig; const authServer = authServerUrl || utils.citadelServerUrl(this.coreOptions.authBuildEnv); const payload = { domain: window.location.origin, uri: window.location.href, address: accountsToUse[0], chainId: parseInt(chainId, 16), version: "1", nonce: siwe.generateSiweNonce(), issuedAt: new Date().toISOString() }; const challenge = await baseControllers.signChallenge(payload, chainNamespace, authServer); const signedMessage = await solana.walletSignMessage(this.solanaWallet, challenge, accountsToUse[0]); return { challenge, signature: signedMessage, chainNamespace }; } async disconnectSession() { super.checkDisconnectionRequirements(); await this.clearWalletSession(); } async disconnect() { this.rehydrated = false; this.emit(constants.CONNECTOR_EVENTS.DISCONNECTED); } } exports.BaseSolanaConnector = BaseSolanaConnector;