@web3auth/no-modal
Version:
Multi chain wallet aggregator for web3Auth
97 lines (93 loc) • 3.84 kB
JavaScript
;
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;