UNPKG

@dgpub/prime-sdk

Version:

Etherspot Prime (Account Abstraction) SDK

262 lines (261 loc) 14.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PrimeSdk = void 0; const wallet_1 = require("./wallet"); const interfaces_1 = require("./interfaces"); const common_1 = require("./common"); const ethers_1 = require("ethers"); const constants_1 = require("./network/constants"); const base_1 = require("./base"); const dto_1 = require("./dto"); const ZeroDevWalletAPI_1 = require("./base/ZeroDevWalletAPI"); const SimpleAccountWalletAPI_1 = require("./base/SimpleAccountWalletAPI"); const errorHandler_service_1 = require("./errorHandler/errorHandler.service"); const bundler_1 = require("./bundler"); const BiconomyPaymasterAPI_1 = require("./base/BiconomyPaymasterAPI"); const BiconomyV1WalletAPI_1 = require("./base/BiconomyV1WalletAPI"); class PrimeSdk { constructor(walletProvider, optionsLike) { var _a; let walletConnectProvider; if ((0, wallet_1.isWalletConnectProvider)(walletProvider)) { walletConnectProvider = new wallet_1.WalletConnect2WalletProvider(walletProvider); } else if (!(0, wallet_1.isWalletProvider)(walletProvider)) { throw new common_1.Exception('Invalid wallet provider'); } const { index, chainId, rpcProviderUrl, accountAddress } = optionsLike; this.chainId = chainId; this.index = index !== null && index !== void 0 ? index : 0; if (!optionsLike.bundlerProvider) { optionsLike.bundlerProvider = new bundler_1.EtherspotBundler(chainId); } this.factoryUsed = (_a = optionsLike.factoryWallet) !== null && _a !== void 0 ? _a : interfaces_1.Factory.ETHERSPOT; let provider; if (rpcProviderUrl) { provider = new ethers_1.providers.JsonRpcProvider(rpcProviderUrl); } else provider = new ethers_1.providers.JsonRpcProvider(optionsLike.bundlerProvider.url); let entryPointAddress = '', walletFactoryAddress = ''; if (constants_1.Networks[chainId]) { entryPointAddress = constants_1.Networks[chainId].contracts.entryPoint; if (constants_1.Networks[chainId].contracts.walletFactory[this.factoryUsed] == '') throw new common_1.Exception('The selected factory is not deployed in the selected chain_id'); walletFactoryAddress = constants_1.Networks[chainId].contracts.walletFactory[this.factoryUsed]; } if (optionsLike.entryPointAddress) entryPointAddress = optionsLike.entryPointAddress; if (optionsLike.walletFactoryAddress) walletFactoryAddress = optionsLike.walletFactoryAddress; if (entryPointAddress == '') throw new common_1.Exception('entryPointAddress not set on the given chain_id'); if (walletFactoryAddress == '') throw new common_1.Exception('walletFactoryAddress not set on the given chain_id'); if (this.factoryUsed === interfaces_1.Factory.ZERO_DEV) { this.etherspotWallet = new ZeroDevWalletAPI_1.ZeroDevWalletAPI({ provider, walletProvider: walletConnectProvider !== null && walletConnectProvider !== void 0 ? walletConnectProvider : walletProvider, optionsLike, entryPointAddress, factoryAddress: walletFactoryAddress, index: this.index, }); } else if (this.factoryUsed === interfaces_1.Factory.SIMPLE_ACCOUNT) { this.etherspotWallet = new SimpleAccountWalletAPI_1.SimpleAccountAPI({ provider, walletProvider: walletConnectProvider !== null && walletConnectProvider !== void 0 ? walletConnectProvider : walletProvider, optionsLike, entryPointAddress, factoryAddress: walletFactoryAddress, index: this.index, }); } else if (this.factoryUsed === interfaces_1.Factory.BICONOMY_V1) { this.etherspotWallet = new BiconomyV1WalletAPI_1.BiconomyV1WalletAPI({ provider, walletProvider: walletConnectProvider !== null && walletConnectProvider !== void 0 ? walletConnectProvider : walletProvider, optionsLike, entryPointAddress, factoryAddress: walletFactoryAddress, index: this.index, }); } else { this.etherspotWallet = new base_1.EtherspotWalletAPI({ provider, walletProvider: walletConnectProvider !== null && walletConnectProvider !== void 0 ? walletConnectProvider : walletProvider, optionsLike, entryPointAddress, factoryAddress: walletFactoryAddress, predefinedAccountAddress: accountAddress, index: this.index, }); } this.bundler = new base_1.HttpRpcClient(optionsLike.bundlerProvider.url, entryPointAddress, chainId); } get state() { return this.etherspotWallet.services.stateService; } get state$() { return this.etherspotWallet.services.stateService.state$; } get supportedNetworks() { return this.etherspotWallet.services.networkService.supportedNetworks; } destroy() { this.etherspotWallet.context.destroy(); } async signMessage(dto) { const { message } = await (0, dto_1.validateDto)(dto, dto_1.SignMessageDto); await this.etherspotWallet.require({ network: false, }); return this.etherspotWallet.services.walletService.signMessage(message); } async getCounterFactualAddress() { return this.etherspotWallet.getCounterFactualAddress(); } async getAccountInitCode() { return this.etherspotWallet.getAccountInitCode(); } async estimate(params = {}, userOpsBatch = { to: [], data: [], value: [] }) { var _a, _b, _c; const { paymasterDetails, gasDetails, callGasLimit, key } = params; let dummySignature = '0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c'; if (this.factoryUsed === interfaces_1.Factory.ZERO_DEV) { dummySignature = '0x00000000870fe151d548a1c527c3804866fab30abf28ed17b79d5fc5149f19ca0819fefc3c57f3da4fdf9b10fab3f2f3dca536467ae44943b9dbb8433efe7760ddd72aaa1c'; } if (userOpsBatch.to.length < 1) { throw new errorHandler_service_1.ErrorHandler('cannot sign empty transaction batch', 1); } if (paymasterDetails === null || paymasterDetails === void 0 ? void 0 : paymasterDetails.url) { if ((paymasterDetails === null || paymasterDetails === void 0 ? void 0 : paymasterDetails.type) === interfaces_1.PaymasterType.PIMLICO || (paymasterDetails === null || paymasterDetails === void 0 ? void 0 : paymasterDetails.type) === interfaces_1.PaymasterType.MULTITOKEN) { const verifyingPaymasterAPI = new base_1.VerifyingPaymasterAPI(paymasterDetails.url, this.etherspotWallet.entryPointAddress, (_a = paymasterDetails.context) !== null && _a !== void 0 ? _a : {}); this.etherspotWallet.setPaymasterApi(verifyingPaymasterAPI); } else { const biconomyPaymasterAPI = new BiconomyPaymasterAPI_1.BiconomyPaymasterAPI(paymasterDetails.url, (_b = paymasterDetails.paymasterServiceData) !== null && _b !== void 0 ? _b : {}); this.etherspotWallet.setPaymasterApi(biconomyPaymasterAPI); } } else this.etherspotWallet.setPaymasterApi(null); const tx = Object.assign({ target: userOpsBatch.to, values: userOpsBatch.value, data: userOpsBatch.data, dummySignature: dummySignature }, gasDetails); const gasInfo = await this.getGasFee(); const partialtx = await this.etherspotWallet.createUnsignedUserOp(Object.assign(Object.assign({}, tx), { maxFeePerGas: gasInfo.maxFeePerGas, maxPriorityFeePerGas: gasInfo.maxPriorityFeePerGas }), key); if (callGasLimit) { partialtx.callGasLimit = ethers_1.BigNumber.from(callGasLimit).toHexString(); } const bundlerGasEstimate = await this.bundler.getVerificationGasInfo(partialtx); if ((gasDetails === null || gasDetails === void 0 ? void 0 : gasDetails.maxFeePerGas) && (gasDetails === null || gasDetails === void 0 ? void 0 : gasDetails.maxPriorityFeePerGas)) { partialtx.maxFeePerGas = gasDetails.maxFeePerGas; partialtx.maxPriorityFeePerGas = gasDetails.maxPriorityFeePerGas; } else if (bundlerGasEstimate.maxFeePerGas && bundlerGasEstimate.maxPriorityFeePerGas) { partialtx.maxFeePerGas = bundlerGasEstimate.maxFeePerGas; partialtx.maxPriorityFeePerGas = bundlerGasEstimate.maxPriorityFeePerGas; } else { const gas = await this.getGasFee(); partialtx.maxFeePerGas = gas.maxFeePerGas; partialtx.maxPriorityFeePerGas = gas.maxPriorityFeePerGas; } if (bundlerGasEstimate.preVerificationGas) { partialtx.preVerificationGas = ethers_1.BigNumber.from(bundlerGasEstimate.preVerificationGas); partialtx.verificationGasLimit = ethers_1.BigNumber.from((_c = bundlerGasEstimate.verificationGasLimit) !== null && _c !== void 0 ? _c : bundlerGasEstimate.verificationGas); const expectedCallGasLimit = ethers_1.BigNumber.from(bundlerGasEstimate.callGasLimit); if (!callGasLimit) partialtx.callGasLimit = expectedCallGasLimit; else if (ethers_1.BigNumber.from(callGasLimit).lt(expectedCallGasLimit)) throw new errorHandler_service_1.ErrorHandler(`CallGasLimit is too low. Expected atleast ${expectedCallGasLimit.toString()}`); } return partialtx; } async getGasFee() { const version = await this.bundler.getBundlerVersion(); if (version && version.includes('skandha')) return this.bundler.getSkandhaGasPrice(); return (0, common_1.getGasFee)(this.etherspotWallet.provider); } async send(userOp) { const signedUserOp = await this.etherspotWallet.signUserOp(userOp); return this.bundler.sendUserOpToBundler(signedUserOp); } async signTypedData(DataFields, message) { return this.etherspotWallet.signTypedData(DataFields, message); } async getNativeBalance() { if (!this.etherspotWallet.accountAddress) { await this.getCounterFactualAddress(); } const balance = await this.etherspotWallet.provider.getBalance(this.etherspotWallet.accountAddress); return ethers_1.ethers.utils.formatEther(balance); } async getUserOpReceipt(userOpHash) { return this.bundler.getUserOpsReceipt(userOpHash); } async getUserOpHash(userOp) { return this.etherspotWallet.getUserOpHash(userOp); } async addUserOpsToBatch(tx, userOpsBatch = { to: [], data: [], value: [] }) { var _a, _b; if (!tx.data && !tx.value) throw new errorHandler_service_1.ErrorHandler('Data and Value both cannot be empty', 1); if (tx.value && this.factoryUsed === interfaces_1.Factory.SIMPLE_ACCOUNT && tx.value.toString() !== '0' && userOpsBatch.value.length > 0) throw new errorHandler_service_1.ErrorHandler('SimpleAccount: native transfers cant be part of batch', 1); userOpsBatch.to.push(tx.to); userOpsBatch.value.push((_a = tx.value) !== null && _a !== void 0 ? _a : ethers_1.BigNumber.from(0)); userOpsBatch.data.push((_b = tx.data) !== null && _b !== void 0 ? _b : '0x'); return userOpsBatch; } async clearUserOpsFromBatch() { } async getAccountContract() { return this.etherspotWallet._getAccountContract(); } async totalGasEstimated(userOp) { const callGasLimit = ethers_1.BigNumber.from(await userOp.callGasLimit); const verificationGasLimit = ethers_1.BigNumber.from(await userOp.verificationGasLimit); const preVerificationGas = ethers_1.BigNumber.from(await userOp.preVerificationGas); return callGasLimit.add(verificationGasLimit).add(preVerificationGas); } async getFiatOnRamp(params = {}) { var _a; if (!params.onlyCryptoNetworks) params.onlyCryptoNetworks = constants_1.onRamperAllNetworks.join(','); else { const networks = params.onlyCryptoNetworks.split(','); for (const network in networks) { if (!constants_1.onRamperAllNetworks.includes(network)) throw new errorHandler_service_1.ErrorHandler('Included Networks which are not supported. Please Check', 1); } } const url = `https://buy.onramper.com/?networkWallets=ETHEREUM:${await this.getCounterFactualAddress()}` + `&apiKey=${common_1.onRampApiKey}` + `&onlyCryptoNetworks=${params.onlyCryptoNetworks}` + `${params.defaultCrypto ? `&defaultCrypto=${params.defaultCrypto}` : ``}` + `${params.excludeCryptos ? `&excludeCryptos=${params.excludeCryptos}` : ``}` + `${params.onlyCryptos ? `&onlyCryptos=${params.onlyCryptos}` : ``}` + `${params.excludeCryptoNetworks ? `&excludeCryptoNetworks=${params.excludeCryptoNetworks}` : ``}` + `${params.defaultAmount ? `&defaultCrypto=${params.defaultAmount}` : ``}` + `${params.defaultFiat ? `&defaultFiat=${params.defaultFiat}` : ``}` + `${params.isAmountEditable ? `&isAmountEditable=${params.isAmountEditable}` : ``}` + `${params.onlyFiats ? `&onlyFiats=${params.onlyFiats}` : ``}` + `${params.excludeFiats ? `&excludeFiats=${params.excludeFiats}` : ``}` + `&themeName=${(_a = params.themeName) !== null && _a !== void 0 ? _a : 'dark'}`; if (typeof window === 'undefined') { (0, common_1.openUrl)(url); } else { window.open(url); } return url; } } exports.PrimeSdk = PrimeSdk;