@etherspot/prime-sdk
Version:
Etherspot Prime (Account Abstraction) SDK
105 lines (104 loc) • 4.86 kB
JavaScript
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;
;