UNPKG

@web3auth/no-modal

Version:
213 lines (209 loc) 7.1 kB
'use strict'; var _objectSpread = require('@babel/runtime/helpers/objectSpread2'); var ethereumControllers = require('@toruslabs/ethereum-controllers'); var auth = require('@web3auth/auth'); async function createAaMiddleware({ eoaProvider, handlers }) { const [eoaAddress] = await eoaProvider.request({ method: ethereumControllers.METHOD_TYPES.GET_ACCOUNTS }); /** * Validates the keyholder address, and returns a normalized (i.e. lowercase) * copy of it. * * an error */ async function validateAndNormalizeKeyholder(address, req) { if (typeof address === "string" && address.length > 0) { // ensure address is included in provided accounts const accounts = await handlers.getAccounts(req); const normalizedAccounts = accounts.map(_address => _address.toLowerCase()); const normalizedAddress = address.toLowerCase(); if (normalizedAccounts.includes(normalizedAddress)) { return normalizedAddress; } } throw auth.rpcErrors.invalidParams({ message: `Invalid parameters: must provide an Ethereum address.` }); } async function normalizeSignSenderAddress(address, req) { // sender is EOA address if (address.toLowerCase() === eoaAddress.toLowerCase()) { return eoaAddress; } const [smartAccountAddress] = await handlers.getAccounts(req); // sender is smart account address if (address.toLowerCase() === smartAccountAddress.toLowerCase()) { // use EOA address as sender for signing return eoaAddress; } throw auth.rpcErrors.invalidParams({ message: `Invalid parameters: must provide valid sender address.` }); } async function lookupAccounts(params) { return handlers.getAccounts(params.request); } async function fetchPrivateKey(params) { if (!handlers.getPrivateKey) { throw auth.rpcErrors.methodNotSupported(); } return handlers.getPrivateKey(params.request); } async function sendTransaction(params) { if (!handlers.processTransaction) { throw auth.rpcErrors.methodNotSupported(); } const req = params.request; const txParams = req.params[0] || { from: "" }; txParams.from = await validateAndNormalizeKeyholder(txParams.from, req); return handlers.processTransaction(txParams, req); } async function signTransaction(params) { const req = params.request; const txParams = req.params[0] || { from: "" }; // normalize sender address if (txParams.from) { txParams.from = await normalizeSignSenderAddress(txParams.from, req); } return handlers.processSignTransaction(txParams, req); } async function ethSign(params) { const req = params.request; let msgParams = req.params; const extraParams = req.params[2] || {}; if (Array.isArray(req.params)) { if (!(req.params.length === 2)) throw new Error(`WalletMiddleware - incorrect params for ${req.method} method. expected [address, message]`); const params = req.params; const address = params[0]; const message = params[1]; msgParams = { from: address, data: message }; } msgParams = _objectSpread(_objectSpread({}, extraParams), msgParams); return handlers.processEthSignMessage(msgParams, req); } async function signTypedDataV4(params) { const req = params.request; if (!(req !== null && req !== void 0 && req.params)) throw new Error("WalletMiddleware - missing params"); let msgParams = req.params; if (Array.isArray(req.params)) { if (!(req.params.length === 2)) throw new Error(`WalletMiddleware - incorrect params for ${req.method} method. expected [address, typedData]`); const params = req.params; const address = params[0]; const message = params[1]; msgParams = { from: address, data: message }; } return handlers.processTypedMessageV4(msgParams, req); } async function personalSign(params) { const req = params.request; let msgParams = req.params; const extraParams = req.params[2] || {}; if (Array.isArray(req.params)) { if (!(req.params.length >= 2)) throw new Error(`WalletMiddleware - incorrect params for ${req.method} method. expected [message, address]`); const params = req.params; if (typeof params[0] === "object") { const { challenge, address } = params[0]; msgParams = { from: address, data: challenge }; } else { const message = params[0]; const address = params[1]; msgParams = { from: address, data: message }; } } msgParams = _objectSpread(_objectSpread({}, extraParams), msgParams); return handlers.processPersonalMessage(msgParams, req); } async function fetchPublicKey(params) { if (!handlers.getPublicKey) { throw auth.rpcErrors.methodNotSupported(); } return handlers.getPublicKey(params.request); } return auth.createScaffoldMiddlewareV2({ // account lookups eth_accounts: lookupAccounts, eth_requestAccounts: lookupAccounts, eth_private_key: fetchPrivateKey, private_key: fetchPrivateKey, eth_public_key: fetchPublicKey, public_key: fetchPublicKey, // tx signatures eth_sendTransaction: sendTransaction, eth_signTransaction: signTransaction, // message signatures eth_sign: ethSign, eth_signTypedData_v4: signTypedDataV4, personal_sign: personalSign }); } async function createEoaMiddleware({ aaProvider }) { async function getAccounts() { const [, eoaAddress] = await aaProvider.request({ method: ethereumControllers.METHOD_TYPES.GET_ACCOUNTS }); return [eoaAddress]; } async function requestAccounts() { const [, eoaAddress] = await aaProvider.request({ method: ethereumControllers.METHOD_TYPES.ETH_REQUEST_ACCOUNTS }); return [eoaAddress]; } return auth.createScaffoldMiddlewareV2({ eth_accounts: getAccounts, eth_requestAccounts: requestAccounts }); } async function createEip7702And5792MiddlewareForAaProvider() { const eip5792Methods = Object.values(ethereumControllers.EIP_5792_METHODS); const eip7702Methods = Object.values(ethereumControllers.EIP_7702_METHODS); const eip7702And5792Methods = [...eip5792Methods, ...eip7702Methods]; return async ({ request, next }) => { if (eip7702And5792Methods.includes(request.method)) { throw auth.providerErrors.unsupportedMethod(`${request.method} is not supported for account abstraction provider`); } return next(request); }; } function providerAsMiddleware(provider) { return async ({ request }) => { return provider.request({ method: request.method, params: request.params }); }; } exports.createAaMiddleware = createAaMiddleware; exports.createEip7702And5792MiddlewareForAaProvider = createEip7702And5792MiddlewareForAaProvider; exports.createEoaMiddleware = createEoaMiddleware; exports.providerAsMiddleware = providerAsMiddleware;