@web3auth/no-modal
Version:
Multi chain wallet aggregator for web3Auth
84 lines (81 loc) • 3.39 kB
JavaScript
import { CHAIN_NAMESPACES, signChallenge } from '@toruslabs/base-controllers';
import { generateSiweNonce } from 'viem/siwe';
import { WalletLoginError, WalletInitializationError } from '../../base/errors/index.js';
import { citadelServerUrl } from '../../base/utils.js';
import { BaseConnector } from '../../base/connector/baseConnector.js';
import { CONNECTOR_STATUS, CONNECTOR_EVENTS } from '../../base/connector/constants.js';
import { getSolanaChainByChainConfig, walletSignMessage } from '../../base/wallet/solana.js';
class BaseSolanaConnector extends BaseConnector {
async init(_) {}
async getAuthTokenInfo() {
if (!this.solanaWallet || !this.canAuthorize) throw WalletLoginError.notConnectedError();
if (!this.coreOptions) throw WalletInitializationError.invalidParams("Please initialize Web3Auth with a valid options");
this.status = CONNECTOR_STATUS.AUTHORIZING;
this.emit(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 = citadelServerUrl(this.coreOptions.authBuildEnv);
const {
challenge,
signature,
chainNamespace
} = await this.generateChallengeAndSign(authServer);
return this.verifyAndAuthorize({
chainNamespace,
signedMessage: signature,
challenge,
authServer
});
}
throw 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 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 !== CHAIN_NAMESPACES.SOLANA) return false;
const id = getSolanaChainByChainConfig(c);
return id != null && walletChains.has(id);
});
if (!currentChainConfig) {
throw WalletInitializationError.invalidParams("No Solana chain in common between the connected wallet and Web3Auth chain configuration");
}
const {
chainId,
chainNamespace
} = currentChainConfig;
const authServer = authServerUrl || citadelServerUrl(this.coreOptions.authBuildEnv);
const payload = {
domain: window.location.origin,
uri: window.location.href,
address: accountsToUse[0],
chainId: parseInt(chainId, 16),
version: "1",
nonce: generateSiweNonce(),
issuedAt: new Date().toISOString()
};
const challenge = await signChallenge(payload, chainNamespace, authServer);
const signedMessage = await 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(CONNECTOR_EVENTS.DISCONNECTED);
}
}
export { BaseSolanaConnector };