@zerodev/sdk
Version:
A utility library for working with ERC-4337
106 lines • 4.21 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.deepHexlify = exports.satisfiesRange = exports.validateKernelVersionWithEntryPoint = exports.getExecMode = exports.fixSignedData = exports.getERC20PaymasterApproveCall = exports.hasKernelFeature = exports.KERNEL_FEATURES_BY_VERSION = exports.KERNEL_FEATURES = void 0;
const semver_1 = require("semver");
const viem_1 = require("viem");
var KERNEL_FEATURES;
(function (KERNEL_FEATURES) {
KERNEL_FEATURES["ERC1271_SIG_WRAPPER"] = "ERC1271_SIG_WRAPPER";
KERNEL_FEATURES["ERC1271_WITH_VALIDATOR"] = "ERC1271_WITH_VALIDATOR";
KERNEL_FEATURES["ERC1271_SIG_WRAPPER_WITH_WRAPPED_HASH"] = "ERC1271_SIG_WRAPPER_WITH_WRAPPED_HASH";
KERNEL_FEATURES["ERC1271_REPLAYABLE"] = "ERC1271_REPLAYABLE";
})(KERNEL_FEATURES || (exports.KERNEL_FEATURES = KERNEL_FEATURES = {}));
exports.KERNEL_FEATURES_BY_VERSION = {
[KERNEL_FEATURES.ERC1271_SIG_WRAPPER]: ">=0.2.3 || >=0.3.0-beta",
[KERNEL_FEATURES.ERC1271_WITH_VALIDATOR]: ">=0.3.0-beta",
[KERNEL_FEATURES.ERC1271_SIG_WRAPPER_WITH_WRAPPED_HASH]: ">=0.3.0-beta",
[KERNEL_FEATURES.ERC1271_REPLAYABLE]: ">=0.3.2"
};
const hasKernelFeature = (feature, version) => {
if (!(feature in exports.KERNEL_FEATURES_BY_VERSION)) {
return false;
}
return (0, semver_1.satisfies)(version, exports.KERNEL_FEATURES_BY_VERSION[feature]);
};
exports.hasKernelFeature = hasKernelFeature;
const getERC20PaymasterApproveCall = async (client, { gasToken, approveAmount, entryPoint }) => {
const response = await client.request({
method: "zd_pm_accounts",
params: [
{
chainId: client.chain?.id,
entryPointAddress: entryPoint.address
}
]
});
return {
to: gasToken,
data: (0, viem_1.encodeFunctionData)({
abi: viem_1.erc20Abi,
functionName: "approve",
args: [response[0], approveAmount]
}),
value: 0n
};
};
exports.getERC20PaymasterApproveCall = getERC20PaymasterApproveCall;
const fixSignedData = (sig) => {
let signature = sig;
if (!(0, viem_1.isHex)(signature)) {
signature = `0x${signature}`;
if (!(0, viem_1.isHex)(signature)) {
throw new Error(`Invalid signed data ${sig}`);
}
}
let { r, s, v } = (0, viem_1.hexToSignature)(signature);
if (v === 0n || v === 1n)
v += 27n;
const joined = (0, viem_1.signatureToHex)({ r, s, v: v });
return joined;
};
exports.fixSignedData = fixSignedData;
const getExecMode = ({ callType, execType }) => {
return (0, viem_1.concatHex)([
callType,
execType,
"0x00000000",
"0x00000000",
(0, viem_1.pad)("0x00000000", { size: 22 })
]);
};
exports.getExecMode = getExecMode;
const validateKernelVersionWithEntryPoint = (entryPointVersion, kernelVersion) => {
if ((entryPointVersion === "0.6" &&
!(0, semver_1.satisfies)(kernelVersion, ">=0.2.2 || <=0.2.4")) ||
(entryPointVersion === "0.7" && !(0, semver_1.satisfies)(kernelVersion, ">=0.3.0"))) {
throw new Error("KernelVersion should be >= 0.2.2 and <= 0.2.4 for EntryPointV0.6 and >= 0.3.0 for EntryPointV0.7");
}
};
exports.validateKernelVersionWithEntryPoint = validateKernelVersionWithEntryPoint;
const satisfiesRange = (version, range) => {
return (0, semver_1.satisfies)(version, range);
};
exports.satisfiesRange = satisfiesRange;
function deepHexlify(obj) {
if (typeof obj === "function") {
return undefined;
}
if (obj == null || typeof obj === "string" || typeof obj === "boolean") {
return obj;
}
if (typeof obj === "bigint" || typeof obj === "number") {
return (0, viem_1.toHex)(obj);
}
if (obj._isBigNumber != null || typeof obj !== "object") {
return (0, viem_1.toHex)(obj).replace(/^0x0/, "0x");
}
if (Array.isArray(obj)) {
return obj.map((member) => deepHexlify(member));
}
return Object.keys(obj).reduce((set, key) => {
set[key] = deepHexlify(obj[key]);
return set;
}, {});
}
exports.deepHexlify = deepHexlify;
//# sourceMappingURL=utils.js.map
;