@web3auth/no-modal
Version:
Multi chain wallet aggregator for web3Auth
102 lines (98 loc) • 3.96 kB
JavaScript
;
var baseControllers = require('@toruslabs/base-controllers');
var metadataHelpers = require('@toruslabs/metadata-helpers');
var wsEmbed = require('@web3auth/ws-embed');
var viem = require('viem');
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');
class BaseEvmConnector extends baseConnector.BaseConnector {
async init(_) {}
async getAuthTokenInfo() {
if (!this.provider || !this.canAuthorize) throw index.WalletLoginError.notConnectedError();
if (!this.coreOptions) throw index.WalletInitializationError.invalidParams("Please initialize Web3Auth with valid options");
this.status = constants.CONNECTOR_STATUS.AUTHORIZING;
this.emit(constants.CONNECTOR_EVENTS.AUTHORIZING, {
connector: this.name
});
const accounts = await this.provider.request({
method: wsEmbed.EVM_METHOD_TYPES.GET_ACCOUNTS
});
if (accounts && 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, accounts);
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 || (await this.provider.request({
method: wsEmbed.EVM_METHOD_TYPES.GET_ACCOUNTS
}));
if (!accountsToUse || accountsToUse.length === 0) {
throw index.WalletLoginError.notConnectedError("No accounts found in the connected wallet");
}
const chainId = await this.provider.request({
method: "eth_chainId"
});
const currentChainConfig = this.coreOptions.chains.find(x => x.chainId === chainId);
if (!currentChainConfig) throw index.WalletInitializationError.invalidParams("chainConfig is required before authentication");
const {
chainNamespace
} = currentChainConfig;
const authServer = authServerUrl || utils.citadelServerUrl(this.coreOptions.authBuildEnv);
const payload = {
domain: window.location.host,
uri: window.location.href,
address: viem.checksumAddress(accountsToUse[0]),
chainId: parseInt(chainId, 16),
version: "1",
nonce: siwe.generateSiweNonce(),
issuedAt: new Date().toISOString()
};
const challenge = await baseControllers.signChallenge(payload, chainNamespace, authServer);
const hexChallenge = metadataHelpers.bytesToHexPrefixedString(metadataHelpers.utf8ToBytes(challenge));
const signature = await this.provider.request({
method: wsEmbed.EVM_METHOD_TYPES.PERSONAL_SIGN,
params: [hexChallenge, accountsToUse[0]]
});
return {
challenge,
signature,
chainNamespace
};
}
async disconnectSession() {
super.checkDisconnectionRequirements();
await this.clearWalletSession();
}
async disconnect() {
this.rehydrated = false;
this.emit(constants.CONNECTOR_EVENTS.DISCONNECTED);
}
}
exports.BaseEvmConnector = BaseEvmConnector;