@biconomy/abstractjs
Version:
SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.
164 lines • 5.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildActionPolicy = exports.calldataArgument = exports.getUniversalActionPolicyConditionType = exports.UniversalPolicyAbi = void 0;
const viem_1 = require("viem");
const constants_1 = require("../../constants/index.js");
const modules_1 = require("../../modules/index.js");
const utils_1 = require("../utils/index.js");
exports.UniversalPolicyAbi = [
{
components: [
{
name: "valueLimitPerUse",
type: "uint256"
},
{
components: [
{
name: "length",
type: "uint256"
},
{
components: [
{
name: "condition",
type: "uint8"
},
{
name: "offset",
type: "uint64"
},
{
name: "isLimited",
type: "bool"
},
{
name: "ref",
type: "bytes32"
},
{
components: [
{
name: "limit",
type: "uint256"
},
{
name: "used",
type: "uint256"
}
],
name: "usage",
type: "tuple"
}
],
name: "rules",
type: "tuple[16]"
}
],
name: "paramRules",
type: "tuple"
}
],
name: "ActionConfig",
type: "tuple"
}
];
const getUniversalActionPolicyConditionType = (conditionType) => {
let condition = modules_1.ParamCondition.EQUAL;
switch (conditionType) {
case "equal":
condition = modules_1.ParamCondition.EQUAL;
break;
case "greaterThan":
condition = modules_1.ParamCondition.GREATER_THAN;
break;
case "lessThan":
condition = modules_1.ParamCondition.LESS_THAN;
break;
case "greaterThanOrEqual":
condition = modules_1.ParamCondition.GREATER_THAN_OR_EQUAL;
break;
case "lessThanOrEqual":
condition = modules_1.ParamCondition.LESS_THAN_OR_EQUAL;
break;
case "notEqual":
condition = modules_1.ParamCondition.NOT_EQUAL;
break;
default:
condition = modules_1.ParamCondition.EQUAL;
break;
}
return condition;
};
exports.getUniversalActionPolicyConditionType = getUniversalActionPolicyConditionType;
const calldataArgument = (value) => {
if (value <= 0) {
throw new Error("Invalid calldata argument value");
}
return BigInt((value - 1) * 32);
};
exports.calldataArgument = calldataArgument;
const getUniversalPolicy = (params) => {
const { rules, valueLimitPerUse } = params;
if (rules.length > 16) {
throw new Error("Universal policy only supports 16 rules");
}
const paramRules = [];
const defaultParamRule = {
condition: modules_1.ParamCondition.GREATER_THAN,
isLimited: false,
offset: (0, exports.calldataArgument)(1),
ref: (0, viem_1.toHex)((0, viem_1.toBytes)("0x", { size: 32 })),
usage: { limit: BigInt(0), used: BigInt(0) }
};
for (let index = 0; index < 16; index++) {
const configuredRule = rules[index];
if (configuredRule) {
paramRules.push({
condition: (0, exports.getUniversalActionPolicyConditionType)(configuredRule.condition),
offset: configuredRule.calldataOffset,
ref: (0, utils_1.toBytes32)(configuredRule.comparisonValue),
isLimited: configuredRule.isLimited ?? false,
usage: configuredRule.usage || { limit: BigInt(0), used: BigInt(0) }
});
}
else {
paramRules.push(defaultParamRule);
}
}
return (0, constants_1.getUniversalActionPolicy)({
paramRules: {
length: BigInt(rules.length),
rules: paramRules
},
valueLimitPerUse: valueLimitPerUse || 0n
});
};
const buildActionPolicy = (parameters) => {
const { type } = parameters;
switch (type) {
case "sudo": {
return (0, constants_1.getSudoPolicy)();
}
case "universal": {
return getUniversalPolicy(parameters);
}
case "timeframe": {
return (0, constants_1.getTimeFramePolicy)({
validAfter: parameters.validAfter,
validUntil: parameters.validUntil
});
}
case "usageLimit": {
return (0, constants_1.getUsageLimitPolicy)({ limit: parameters.limit });
}
case "spendingLimits": {
return (0, constants_1.getSpendingLimitsPolicy)(parameters.tokenLimits);
}
default: {
throw new Error(`Unknown build action policy type: ${type}`);
}
}
};
exports.buildActionPolicy = buildActionPolicy;
//# sourceMappingURL=buildActionPolicy.js.map