near-safe
Version:
An SDK for controlling Ethereum Smart Accounts via ERC4337 from a Near Account.
91 lines (90 loc) • 3.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseEip712TypedData = exports.parseUserOperation = exports.parseWithTypeGuard = exports.isUserOperation = void 0;
const near_ca_1 = require("near-ca");
const viem_1 = require("viem");
const isUserOperation = (data) => {
if (typeof data !== "object" || data === null)
return false;
const candidate = data;
// Required fields
const hasRequiredFields = "sender" in candidate &&
"nonce" in candidate &&
"callData" in candidate &&
"maxPriorityFeePerGas" in candidate &&
"maxFeePerGas" in candidate &&
"verificationGasLimit" in candidate &&
"callGasLimit" in candidate &&
"preVerificationGas" in candidate;
if (!hasRequiredFields)
return false;
// Type checks for required fields
const hasValidRequiredTypes = typeof candidate.sender === "string" &&
(0, viem_1.isAddress)(candidate.sender) &&
typeof candidate.nonce === "string" &&
(0, viem_1.isHex)(candidate.callData) &&
(0, viem_1.isHex)(candidate.maxPriorityFeePerGas) &&
(0, viem_1.isHex)(candidate.maxFeePerGas) &&
(0, viem_1.isHex)(candidate.verificationGasLimit) &&
(0, viem_1.isHex)(candidate.callGasLimit) &&
(0, viem_1.isHex)(candidate.preVerificationGas);
if (!hasValidRequiredTypes)
return false;
// Optional fields type checks
if ("factory" in candidate && candidate.factory !== undefined) {
if (typeof candidate.factory !== "string" || !(0, viem_1.isAddress)(candidate.factory))
return false;
}
if ("factoryData" in candidate && candidate.factoryData !== undefined) {
if (!(0, viem_1.isHex)(candidate.factoryData))
return false;
}
if ("signature" in candidate && candidate.signature !== undefined) {
if (!(0, viem_1.isHex)(candidate.signature))
return false;
}
if ("paymaster" in candidate && candidate.paymaster !== undefined) {
if (typeof candidate.paymaster !== "string" ||
!(0, viem_1.isAddress)(candidate.paymaster))
return false;
}
if ("paymasterData" in candidate && candidate.paymasterData !== undefined) {
if (!(0, viem_1.isHex)(candidate.paymasterData))
return false;
}
if ("paymasterVerificationGasLimit" in candidate &&
candidate.paymasterVerificationGasLimit !== undefined) {
if (!(0, viem_1.isHex)(candidate.paymasterVerificationGasLimit))
return false;
}
if ("paymasterPostOpGasLimit" in candidate &&
candidate.paymasterPostOpGasLimit !== undefined) {
if (!(0, viem_1.isHex)(candidate.paymasterPostOpGasLimit))
return false;
}
return true;
};
exports.isUserOperation = isUserOperation;
const parseWithTypeGuard = (data, typeGuard) => {
// Case 1: Already the correct type
if (typeGuard(data)) {
return data;
}
// Case 2: Stringified data
if (typeof data === "string") {
try {
const parsed = JSON.parse(data);
return typeGuard(parsed) ? parsed : null;
}
catch (error) {
return null;
}
}
// Neither valid type nor valid stringified type
return null;
};
exports.parseWithTypeGuard = parseWithTypeGuard;
const parseUserOperation = (data) => (0, exports.parseWithTypeGuard)(data, exports.isUserOperation);
exports.parseUserOperation = parseUserOperation;
const parseEip712TypedData = (data) => (0, exports.parseWithTypeGuard)(data, near_ca_1.isEIP712TypedData);
exports.parseEip712TypedData = parseEip712TypedData;