@dgpub/prime-sdk
Version:
Etherspot Prime (Account Abstraction) SDK
262 lines (261 loc) • 14.2 kB
JavaScript
;
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;