UNPKG

@etherspot/prime-sdk

Version:

Etherspot Prime (Account Abstraction) SDK

105 lines (104 loc) 4.86 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveHexlify = exports.deepHexlify = exports.rethrowError = exports.decodeErrorReason = exports.getUserOpHash = exports.packUserOp = exports.AddressZero = void 0; const utils_1 = require("ethers/lib/utils"); const contracts_1 = require("../contracts"); const ethers_1 = require("ethers"); const buffer_1 = require("buffer"); const entryPointAbi = contracts_1.EntryPoint__factory.abi; const validateUserOpMethod = 'simulateValidation'; const UserOpType = (_a = entryPointAbi.find((entry) => entry.name === validateUserOpMethod)) === null || _a === void 0 ? void 0 : _a.inputs[0]; if (UserOpType == null) { throw new Error(`unable to find method ${validateUserOpMethod} in EP ${entryPointAbi .filter((x) => x.type === 'function') .map((x) => x.name) .join(',')}`); } exports.AddressZero = ethers_1.ethers.constants.AddressZero; function encode(typevalues, forSignature) { const types = typevalues.map((typevalue) => typevalue.type === 'bytes' && forSignature ? 'bytes32' : typevalue.type); const values = typevalues.map((typevalue) => typevalue.type === 'bytes' && forSignature ? (0, utils_1.keccak256)(typevalue.val) : typevalue.val); return utils_1.defaultAbiCoder.encode(types, values); } function packUserOp(op, forSignature = true) { if (forSignature) { return utils_1.defaultAbiCoder.encode(['address', 'uint256', 'bytes32', 'bytes32', 'uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes32'], [op.sender, op.nonce, (0, utils_1.keccak256)(op.initCode), (0, utils_1.keccak256)(op.callData), op.callGasLimit, op.verificationGasLimit, op.preVerificationGas, op.maxFeePerGas, op.maxPriorityFeePerGas, (0, utils_1.keccak256)(op.paymasterAndData)]); } else { return utils_1.defaultAbiCoder.encode(['address', 'uint256', 'bytes', 'bytes', 'uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes', 'bytes'], [op.sender, op.nonce, op.initCode, op.callData, op.callGasLimit, op.verificationGasLimit, op.preVerificationGas, op.maxFeePerGas, op.maxPriorityFeePerGas, op.paymasterAndData, op.signature]); } } exports.packUserOp = packUserOp; function getUserOpHash(op, entryPoint, chainId) { const userOpHash = (0, utils_1.keccak256)(packUserOp(op, true)); const enc = utils_1.defaultAbiCoder.encode(['bytes32', 'address', 'uint256'], [userOpHash, entryPoint, chainId]); return (0, utils_1.keccak256)(enc); } exports.getUserOpHash = getUserOpHash; const ErrorSig = (0, utils_1.keccak256)(buffer_1.Buffer.from('Error(string)')).slice(0, 10); const FailedOpSig = (0, utils_1.keccak256)(buffer_1.Buffer.from('FailedOp(uint256,string)')).slice(0, 10); function decodeErrorReason(error) { if (error.startsWith(ErrorSig)) { const [message] = utils_1.defaultAbiCoder.decode(['string'], '0x' + error.substring(10)); return { message }; } else if (error.startsWith(FailedOpSig)) { const [opIndex, message] = utils_1.defaultAbiCoder.decode(['uint256', 'string'], '0x' + error.substring(10)); const formattedMessage = `FailedOp: ${message}`; return { message: formattedMessage, opIndex, }; } } exports.decodeErrorReason = decodeErrorReason; function rethrowError(e) { let error = e; let parent = e; if ((error === null || error === void 0 ? void 0 : error.error) != null) { error = error.error; } while ((error === null || error === void 0 ? void 0 : error.data) != null) { parent = error; error = error.data; } const decoded = typeof error === 'string' && error.length > 2 ? decodeErrorReason(error) : undefined; if (decoded != null) { e.message = decoded.message; if (decoded.opIndex != null) { const errorWithMsg = (0, utils_1.hexConcat)([ErrorSig, utils_1.defaultAbiCoder.encode(['string'], [decoded.message])]); parent.data = errorWithMsg; } } throw e; } exports.rethrowError = rethrowError; function deepHexlify(obj) { if (typeof obj === 'function') { return undefined; } if (obj == null || typeof obj === 'string' || typeof obj === 'boolean') { return obj; } else if (obj._isBigNumber != null || typeof obj !== 'object') { return (0, utils_1.hexlify)(obj).replace(/^0x0/, '0x'); } if (Array.isArray(obj)) { return obj.map((member) => deepHexlify(member)); } return Object.keys(obj).reduce((set, key) => (Object.assign(Object.assign({}, set), { [key]: deepHexlify(obj[key]) })), {}); } exports.deepHexlify = deepHexlify; function resolveHexlify(a) { return deepHexlify(a); } exports.resolveHexlify = resolveHexlify;