UNPKG

@biconomy/abstractjs

Version:

SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.

218 lines 9.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.prepareRawComposableParams = exports.prepareComposableInputCalldataParams = exports.isComposableCallRequired = exports.runtimeEncodeAbiParameters = exports.runtimeERC20BalanceOf = exports.runtimeNativeBalanceOf = exports.runtimeERC20AllowanceOf = exports.runtimeParamViaCustomStaticCall = exports.runtimeNonceOf = exports.validateAndProcessConstraints = exports.equalTo = exports.lessThanOrEqualTo = exports.greaterThanOrEqualTo = exports.prepareConstraint = exports.prepareOutputParam = exports.prepareInputParam = exports.isRuntimeComposableValue = exports.ConstraintType = exports.OutputParamFetcherType = exports.InputParamFetcherType = exports.InputParamType = void 0; const viem_1 = require("viem"); const account_1 = require("../../account/index.js"); const constants_1 = require("../../constants/index.js"); const runtimeAbiEncoding_1 = require("./runtimeAbiEncoding.js"); exports.InputParamType = { TARGET: 0, VALUE: 1, CALL_DATA: 2 }; exports.InputParamFetcherType = { RAW_BYTES: 0, STATIC_CALL: 1, BALANCE: 2 }; exports.OutputParamFetcherType = { EXEC_RESULT: 0, STATIC_CALL: 1 }; exports.ConstraintType = { EQ: 0, GTE: 1, LTE: 2, IN: 3 }; const isRuntimeComposableValue = (value) => { if (value && typeof value === "object" && !Array.isArray(value) && value.isRuntime) { return true; } return false; }; exports.isRuntimeComposableValue = isRuntimeComposableValue; const prepareInputParam = (fetcherType, paramData, constraints = []) => { return { fetcherType, paramData, constraints }; }; exports.prepareInputParam = prepareInputParam; const prepareOutputParam = (fetcherType, paramData) => { return { fetcherType, paramData }; }; exports.prepareOutputParam = prepareOutputParam; const prepareConstraint = (constraintType, referenceData) => { return { constraintType, referenceData }; }; exports.prepareConstraint = prepareConstraint; const greaterThanOrEqualTo = (value) => { return { type: exports.ConstraintType.GTE, value }; }; exports.greaterThanOrEqualTo = greaterThanOrEqualTo; const lessThanOrEqualTo = (value) => { return { type: exports.ConstraintType.LTE, value }; }; exports.lessThanOrEqualTo = lessThanOrEqualTo; const equalTo = (value) => { return { type: exports.ConstraintType.EQ, value }; }; exports.equalTo = equalTo; const validateAndProcessConstraints = (constraints) => { const constraintsToAdd = []; if (constraints.length > 0) { for (const constraint of constraints) { if (!Object.values(exports.ConstraintType).slice(0, 3).includes(constraint.type)) { throw new Error("Invalid constraint type"); } if (typeof constraint.value !== "bigint" && typeof constraint.value !== "boolean") { throw new Error("Invalid constraint value"); } if (typeof constraint.value === "bigint" && constraint.value < BigInt(0)) { throw new Error("Invalid constraint value"); } const valueHex = (0, account_1.toBytes32)(constraint.value); const encodedConstraintValue = (0, viem_1.encodeAbiParameters)([{ type: "bytes32" }], [valueHex]); constraintsToAdd.push((0, exports.prepareConstraint)(constraint.type, encodedConstraintValue)); } } return constraintsToAdd; }; exports.validateAndProcessConstraints = validateAndProcessConstraints; const runtimeNonceOf = ({ smartAccountAddress, nonceKey, constraints = [] }) => { const defaultFunctionSig = "getNonce"; const entryPointNonceAbi = (0, viem_1.parseAbi)([ "function getNonce(address sender, uint192 key) public view returns (uint256)" ]); const encodedParam = (0, viem_1.encodeAbiParameters)([{ type: "address" }, { type: "bytes" }], [ constants_1.ENTRY_POINT_ADDRESS, (0, viem_1.encodeFunctionData)({ abi: entryPointNonceAbi, functionName: defaultFunctionSig, args: [smartAccountAddress, nonceKey] }) ]); const constraintsToAdd = (0, exports.validateAndProcessConstraints)(constraints); return { isRuntime: true, inputParams: [ (0, exports.prepareInputParam)(exports.InputParamFetcherType.STATIC_CALL, encodedParam, constraintsToAdd) ], outputParams: [] }; }; exports.runtimeNonceOf = runtimeNonceOf; const runtimeParamViaCustomStaticCall = ({ targetContractAddress, functionAbi, functionName, args, constraints = [] }) => { const encodedParam = (0, viem_1.encodeAbiParameters)([{ type: "address" }, { type: "bytes" }], [ targetContractAddress, (0, viem_1.encodeFunctionData)({ abi: functionAbi, functionName: functionName, args }) ]); const constraintsToAdd = (0, exports.validateAndProcessConstraints)(constraints); return { isRuntime: true, inputParams: [ (0, exports.prepareInputParam)(exports.InputParamFetcherType.STATIC_CALL, encodedParam, constraintsToAdd) ], outputParams: [] }; }; exports.runtimeParamViaCustomStaticCall = runtimeParamViaCustomStaticCall; const runtimeERC20AllowanceOf = ({ owner, spender, tokenAddress, constraints = [] }) => { const encodedParam = (0, viem_1.encodeAbiParameters)([{ type: "address" }, { type: "bytes" }], [ tokenAddress, (0, viem_1.encodeFunctionData)({ abi: viem_1.erc20Abi, functionName: "allowance", args: [owner, spender] }) ]); const constraintsToAdd = (0, exports.validateAndProcessConstraints)(constraints); return { isRuntime: true, inputParams: [ (0, exports.prepareInputParam)(exports.InputParamFetcherType.STATIC_CALL, encodedParam, constraintsToAdd) ], outputParams: [] }; }; exports.runtimeERC20AllowanceOf = runtimeERC20AllowanceOf; const runtimeNativeBalanceOf = ({ targetAddress, constraints = [] }) => { return getBalanceOf({ targetAddress, tokenAddress: viem_1.zeroAddress, constraints }); }; exports.runtimeNativeBalanceOf = runtimeNativeBalanceOf; const runtimeERC20BalanceOf = ({ targetAddress, tokenAddress, constraints = [] }) => { return getBalanceOf({ targetAddress, tokenAddress, constraints }); }; exports.runtimeERC20BalanceOf = runtimeERC20BalanceOf; const getBalanceOf = ({ targetAddress, tokenAddress, constraints = [] }) => { const constraintsToAdd = (0, exports.validateAndProcessConstraints)(constraints); const encodedInputParamData = (0, viem_1.encodePacked)(["address", "address"], [tokenAddress, targetAddress]); return { isRuntime: true, inputParams: [ (0, exports.prepareInputParam)(exports.InputParamFetcherType.BALANCE, encodedInputParamData, constraintsToAdd) ], outputParams: [] }; }; const runtimeEncodeAbiParameters = (inputs, args) => { const inputParams = (0, exports.prepareComposableInputCalldataParams)(inputs, args); return { isRuntime: true, inputParams: inputParams, outputParams: [] }; }; exports.runtimeEncodeAbiParameters = runtimeEncodeAbiParameters; const isComposableCallRequired = (functionContext, args) => { if (!functionContext.inputs || functionContext.inputs.length <= 0) return false; const isComposableCall = functionContext.inputs.some((input, inputIndex) => { if (input.type === "tuple") { const isComposableCallDetected = Object.values(args[inputIndex]).some((internalArg) => (0, exports.isRuntimeComposableValue)(internalArg)); return isComposableCallDetected; } if (input.type.match(/^(.*)\[(\d+)?\]$/)) { const isComposableCallDetected = args[inputIndex].some((internalArg) => (0, exports.isRuntimeComposableValue)(internalArg)); return isComposableCallDetected; } return (0, exports.isRuntimeComposableValue)(args[inputIndex]); }); return isComposableCall; }; exports.isComposableCallRequired = isComposableCallRequired; const prepareComposableInputCalldataParams = (inputs, args) => { const composableParams = (0, runtimeAbiEncoding_1.encodeRuntimeFunctionData)(inputs, args).map((calldata) => { if ((0, exports.isRuntimeComposableValue)(calldata)) { return calldata?.inputParams; } return [ (0, exports.prepareInputParam)(exports.InputParamFetcherType.RAW_BYTES, calldata) ]; }); return composableParams.flat(); }; exports.prepareComposableInputCalldataParams = prepareComposableInputCalldataParams; const prepareRawComposableParams = (calldata) => { const composableParams = [ (0, exports.prepareInputParam)(exports.InputParamFetcherType.RAW_BYTES, calldata) ]; return composableParams.flat(); }; exports.prepareRawComposableParams = prepareRawComposableParams; //# sourceMappingURL=composabilityCalls.js.map