UNPKG

near-safe

Version:

An SDK for controlling Ethereum Smart Accounts via ERC4337 from a Near Account.

91 lines (90 loc) 3.69 kB
"use strict"; 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;