@nevermined-io/core-kit 1.20.1 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZeroDevPolicies.d.ts","sourceRoot":"","sources":["../../../src/nevermined/utils/ZeroDevPolicies.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,GAAG,EAAoC,MAAM,MAAM,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAG7C,wBAAgB,SAAS,CAAC,WAAW,EAAE,GAAG,EAAE,UAK3C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,SAiClE;AAoBD,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,KAAK,MAAM,EAAE;;SAK/D,GAAG;;EAGZ;AACD,eAAO,MAAM,qBAAqB,GAAI,iBAAiB,KAAK,MAAM,EAAE,WACV,CAAA;AAgB1D,eAAO,MAAM,0BAA0B,cACyB,CAAA;AAEhE,eAAO,MAAM,gCAAgC,cAC2C,CAAA;AAExF,eAAO,MAAM,uBAAuB,cACuC,CAAA;AAE3E,eAAO,MAAM,cAAc,cAM1B,CAAA;AAED,eAAO,MAAM,gBAAgB,cAAkE,CAAA;AAE/F,eAAO,MAAM,gBAAgB,cAAkE,CAAA;AAE/F,eAAO,MAAM,iBAAiB,cACuC,CAAA;
|
|
1
|
+
{"version":3,"file":"ZeroDevPolicies.d.ts","sourceRoot":"","sources":["../../../src/nevermined/utils/ZeroDevPolicies.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,GAAG,EAAoC,MAAM,MAAM,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAG7C,wBAAgB,SAAS,CAAC,WAAW,EAAE,GAAG,EAAE,UAK3C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,SAiClE;AAoBD,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,KAAK,MAAM,EAAE;;SAK/D,GAAG;;EAGZ;AACD,eAAO,MAAM,qBAAqB,GAAI,iBAAiB,KAAK,MAAM,EAAE,WACV,CAAA;AAgB1D,eAAO,MAAM,0BAA0B,cACyB,CAAA;AAEhE,eAAO,MAAM,gCAAgC,cAC2C,CAAA;AAExF,eAAO,MAAM,uBAAuB,cACuC,CAAA;AAE3E,eAAO,MAAM,cAAc,cAM1B,CAAA;AAED,eAAO,MAAM,gBAAgB,cAAkE,CAAA;AAE/F,eAAO,MAAM,gBAAgB,cAAkE,CAAA;AAE/F,eAAO,MAAM,iBAAiB,cACuC,CAAA;AAqCrE,eAAO,MAAM,WAAW,GACtB,aAAa,MAAM,EAAE,EACrB,gBAAgB,KAAK,MAAM,EAAE,EAAE,EAC/B,UAAU,MAAM,WAiBjB,CAAA;AAOD,eAAO,MAAM,qBAAqB,GAAI,gBAAgB,KAAK,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,WAWtF,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,KAAK,MAAM,EAAE,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,aAAa,EAAE,CAAA;IAC1B,iBAAiB,EAAE,KAAK,MAAM,EAAE,CAAA;IAChC,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAI,oBAAoB,kBAAkB,KAAG,MAAM,EAgFtF,CAAA"}
|
|
@@ -139,7 +139,8 @@ const assertPolicyFitsTempoEnableGas = (perms, chainId)=>{
|
|
|
139
139
|
};
|
|
140
140
|
// #1929: `order` keys must approve EVERY settlement token they may pay with (one
|
|
141
141
|
// per network/currency), not a single hardcoded one — otherwise paying a plan in
|
|
142
|
-
// a different token (EURC
|
|
142
|
+
// a different token (an EURC plan against a USDC-only key) reverts `InvalidCallData`.
|
|
143
|
+
// No spend
|
|
143
144
|
// limit by design (the approve permissions carry no `valueLimit`).
|
|
144
145
|
export const buildPolicy = (permissions, tokenAddresses, chainId)=>{
|
|
145
146
|
const perms = [
|
|
@@ -163,9 +164,9 @@ export const buildPolicy = (permissions, tokenAddresses, chainId)=>{
|
|
|
163
164
|
};
|
|
164
165
|
// #1929: the session key must permit `approve` on EVERY settlement token it may
|
|
165
166
|
// ever pay with — one per (network, currency). A single-token policy silently
|
|
166
|
-
// breaks the moment the order's token differs from it
|
|
167
|
-
//
|
|
168
|
-
//
|
|
167
|
+
// breaks the moment the order's token differs from it, reverting validateUserOp
|
|
168
|
+
// with `InvalidCallData`. Dedupe + drop zeros here so callers can pass the raw
|
|
169
|
+
// per-network token list.
|
|
169
170
|
export const getAllContractsPolicy = (tokenAddresses, chainId)=>{
|
|
170
171
|
const perms = [
|
|
171
172
|
...getPermissions(assetsRegistryConfig, REGISTER_GROUP_FNS),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/nevermined/utils/ZeroDevPolicies.ts"],"sourcesContent":["import {\n CallPolicyVersion,\n ParamCondition,\n toCallPolicy,\n toRateLimitPolicy,\n toTimestampPolicy,\n} from '@zerodev/permissions/policies'\nimport {\n assetsRegistryConfig,\n fixedPaymentTemplateConfig,\n nft1155CreditsConfig,\n payAsYouGoTemplateAddress,\n payAsYouGoTemplateConfig,\n} from '../../artifacts/generated.js'\nimport { Abi, isAddress, parseAbi, zeroAddress } from 'viem'\nimport { Policy } from '@zerodev/permissions'\nimport { isTempoNetwork } from '../../utils/Network.js'\n\nexport function getPolicy(permissions: any[]) {\n return toCallPolicy({\n policyVersion: CallPolicyVersion.V0_0_4,\n permissions,\n })\n}\n\nexport function getPermissions(config: any, functionNames: string[]) {\n const permissions: any[] = []\n functionNames.forEach((entry) => {\n // A bare name ('register') matches every overload of that name; a full signature\n // ('register(bytes32,string,uint256[])') pins ONE overload. The latter lets callers\n // permit only the signature the SDK actually calls instead of all overloads, which\n // keeps the CallPolicy merkle small (load-bearing on Tempo — see #1929).\n const name = entry.split('(')[0]\n const abis = config.abi.filter((item: any) => {\n if (item.type !== 'function' || item.name !== name) return false\n if (!entry.includes('(')) return true\n const sig = `${item.name}(${(item.inputs ?? []).map((i: any) => i.type).join(',')})`\n return sig === entry\n })\n // Fail LOUD if a requested function resolves to no ABI entry. A pinned full\n // signature (#1929 register trim) that stops matching after a contract regen\n // would otherwise silently emit zero permissions → every userOp for that\n // function reverts `InvalidCallData` at runtime with no build-time error.\n if (abis.length === 0) {\n throw new Error(\n `getPermissions: \"${entry}\" matched no function in the ABI for ${config.address}. ` +\n `A contract regen may have changed the signature (see #1929 register-overload trim).`,\n )\n }\n abis.forEach((abi: any) => {\n permissions.push({\n target: config.address,\n abi: [abi],\n functionName: name,\n })\n })\n })\n return permissions\n}\n\n// Dedupe settlement-token addresses case-insensitively (checksummed vs lowercase\n// are the SAME token) and drop the zero address. Duplicate `approve` permissions\n// re-bloat the CallPolicy merkle, which is load-bearing on Tempo's enable-gas\n// ceiling (#1929) — a case-sensitive `new Set` would let a mixed-casing map edit\n// silently regress the enable.\nfunction dedupeTokens(tokenAddresses: `0x${string}`[]): `0x${string}`[] {\n const seen = new Set<string>()\n const out: `0x${string}`[] = []\n for (const t of tokenAddresses) {\n if (!t || t === zeroAddress) continue\n const key = t.toLowerCase()\n if (seen.has(key)) continue\n seen.add(key)\n out.push(t)\n }\n return out\n}\n\nexport function getERC20ApprovePermissions(contractAddress: `0x${string}`) {\n return {\n target: contractAddress,\n abi: parseAbi([\n 'function approve(address spender, uint256 amount) external returns (bool)',\n ]) as Abi,\n functionName: 'approve',\n }\n}\nexport const getERC20ApprovePolicy = (contractAddress: `0x${string}`) =>\n getPolicy([getERC20ApprovePermissions(contractAddress)])\n\n// AssetRegistry's ABI carries 5 `register` overloads, but the SDK only ever calls\n// register(bytes32 seed, string url, uint256[] plans) (AssetRegistry.register). Pinning the\n// used signature drops the 4 dead overloads from the CallPolicy merkle (16 → 12 perms),\n// which is what lets the session-key ENABLE fit under Tempo's verification-gas ceiling (#1929).\nconst REGISTER_FN = 'register(bytes32,string,uint256[])'\nconst REGISTER_GROUP_FNS = [\n REGISTER_FN,\n 'createPlan',\n 'createPlanWithHooks',\n 'registerAgentAndPlan',\n 'addPlanToAgent',\n 'removePlanFromAgent',\n]\n\nexport const getAgentRegistrationPolicy = () =>\n getPolicy(getPermissions(assetsRegistryConfig, [REGISTER_FN]))\n\nexport const getPricingPlanRegistrationPolicy = () =>\n getPolicy(getPermissions(assetsRegistryConfig, ['createPlan', 'createPlanWithHooks']))\n\nexport const getRegisterAssetsPolicy = () =>\n getPolicy(getPermissions(assetsRegistryConfig, ['registerAgentAndPlan']))\n\nexport const getOrderPolicy = () => {\n const perms = [\n ...getPermissions(fixedPaymentTemplateConfig, ['order']),\n ...getPermissions(payAsYouGoTemplateAddress, ['order']),\n ]\n return getPolicy(perms)\n}\n\nexport const getMintNFTPolicy = () => getPolicy(getPermissions(nft1155CreditsConfig, ['mint']))\n\nexport const getBurnNFTPolicy = () => getPolicy(getPermissions(nft1155CreditsConfig, ['burn']))\n\nexport const getRegisterPolicy = () =>\n getPolicy(getPermissions(assetsRegistryConfig, REGISTER_GROUP_FNS))\n\n// #1929: the session-key CallPolicy must fit under Tempo's verification-gas\n// ceiling for the on-chain ENABLE. Exceeding it makes the enable revert — and\n// NOT tunably: the ZeroDev sponsor ignores the `verificationGasLimit` we send\n// (AA26 is identical whether we ask for 1M or 1000M), so the ONLY lever is\n// making the enable cheaper.\n//\n// Measured on live tempo-moderato against one warm 7702 account, varying ONLY\n// the permission count (padded with dummy ERC20 `approve` permissions), the\n// hosted ZeroDev bundler sponsoring:\n// - Tempo: 14 perms land (5/5) · 15 → AA26 over verificationGasLimit\n// (4/4) · 16+ → AA23 reverted 0x\n// - base-sepolia: 40 perms land. No ceiling — the bound is Tempo-specific,\n// which is why the guard below only asserts on Tempo.\n// The bound stays at 12, two below the measured 14, because it counts\n// PERMISSIONS while what actually blows is GAS: a permission with a heavier ABI\n// than an `approve` costs more, so the count is only a proxy. Raising it is not\n// the fix — pass a PER-NETWORK token subset (see `policiesFor` in the\n// `*ForNetworks` helpers) so each chain's key only approves its own tokens.\nconst MAX_CALLPOLICY_PERMISSIONS = 12\n\nconst assertPolicyFitsTempoEnableGas = (perms: unknown[], chainId?: number): void => {\n // No chainId → assume the restrictive chain (the guard predates the param).\n if (chainId !== undefined && !isTempoNetwork(chainId)) return\n if (perms.length > MAX_CALLPOLICY_PERMISSIONS) {\n throw new Error(\n `CallPolicy has ${perms.length} permissions; exceeds the Tempo session-key enable-gas budget (${MAX_CALLPOLICY_PERMISSIONS}). Split to a per-network token subset instead of growing the cross-network union.`,\n )\n }\n}\n\n// #1929: `order` keys must approve EVERY settlement token they may pay with (one\n// per network/currency), not a single hardcoded one — otherwise paying a plan in\n// a different token (EURC, or pathUSD on Tempo) reverts `InvalidCallData`. No spend\n// limit by design (the approve permissions carry no `valueLimit`).\nexport const buildPolicy = (\n permissions: string[],\n tokenAddresses: `0x${string}`[],\n chainId?: number,\n) => {\n const perms = [\n ...(permissions.includes('register')\n ? getPermissions(assetsRegistryConfig, REGISTER_GROUP_FNS)\n : []),\n ...(permissions.includes('mint') ? getPermissions(nft1155CreditsConfig, ['mint']) : []),\n ...(permissions.includes('burn') ? getPermissions(nft1155CreditsConfig, ['burn']) : []),\n ...(permissions.includes('order') ? getPermissions(fixedPaymentTemplateConfig, ['order']) : []),\n ...(permissions.includes('order') ? getPermissions(payAsYouGoTemplateConfig, ['order']) : []),\n ...(permissions.includes('order')\n ? dedupeTokens(tokenAddresses).map((t) => getERC20ApprovePermissions(t))\n : []),\n ]\n\n assertPolicyFitsTempoEnableGas(perms, chainId)\n return getPolicy(perms)\n}\n\n// #1929: the session key must permit `approve` on EVERY settlement token it may\n// ever pay with — one per (network, currency). A single-token policy silently\n// breaks the moment the order's token differs from it (EURC plans, or pathUSD on\n// Tempo), reverting validateUserOp with `InvalidCallData`. Dedupe + drop zeros\n// here so callers can pass the raw per-network token list.\nexport const getAllContractsPolicy = (tokenAddresses: `0x${string}`[], chainId?: number) => {\n const perms = [\n ...getPermissions(assetsRegistryConfig, REGISTER_GROUP_FNS),\n ...getPermissions(fixedPaymentTemplateConfig, ['order']),\n ...getPermissions(payAsYouGoTemplateConfig, ['order']),\n ...getPermissions(nft1155CreditsConfig, ['mint', 'burn']),\n ...dedupeTokens(tokenAddresses).map((t) => getERC20ApprovePermissions(t)),\n ].filter(Boolean)\n\n assertPolicyFitsTempoEnableGas(perms, chainId)\n return getPolicy(perms)\n}\n\nexport type OrderContract = {\n address: `0x${string}`\n isPayAsYouGo: boolean\n}\n\nexport type OrderPolicyOptions = {\n contracts: OrderContract[]\n subscriberAddress: `0x${string}`\n numberOfPurchases: bigint\n totalAmount: bigint\n count?: number\n erc20ContractAddress?: `0x${string}`\n validUntil?: number\n}\n\nexport const getZeroDevOrderPolicies = (orderPolicyOptions: OrderPolicyOptions): Policy[] => {\n const policies: Policy[] = []\n\n const orderPermissions = orderPolicyOptions.contracts.map((contract) => {\n if (contract.isPayAsYouGo) {\n return {\n target: contract.address,\n abi: parseAbi([\n 'function order(bytes32 _seed, uint256 _planId, bytes[] memory _params) external payable',\n ]) as Abi,\n valueLimit: 0n,\n functionName: 'order',\n args: [null, null],\n }\n }\n return {\n target: contract.address,\n abi: parseAbi([\n 'function order(bytes32 _seed, uint256 _planId, address _creditsReceiver, uint256 _numberOfPurchases, bytes[] memory _params) external payable',\n ]) as Abi,\n valueLimit: 0n,\n functionName: 'order',\n args: [\n null,\n null,\n {\n condition: ParamCondition.EQUAL,\n value: orderPolicyOptions.subscriberAddress,\n },\n {\n condition: ParamCondition.EQUAL,\n value: orderPolicyOptions.numberOfPurchases,\n },\n ],\n }\n })\n\n const callPermissions: any[] = [...orderPermissions]\n\n if (\n orderPolicyOptions.erc20ContractAddress &&\n isAddress(orderPolicyOptions.erc20ContractAddress)\n ) {\n callPermissions.push({\n target: orderPolicyOptions.erc20ContractAddress,\n abi: parseAbi([\n 'function approve(address spender, uint256 amount) external returns (bool)',\n ]) as Abi,\n valueLimit: 0n,\n functionName: 'approve',\n args: [\n {\n condition: ParamCondition.NOT_EQUAL,\n value: zeroAddress,\n },\n {\n condition: ParamCondition.LESS_THAN_OR_EQUAL,\n value: orderPolicyOptions.totalAmount,\n },\n ],\n })\n }\n\n policies.push(getPolicy(callPermissions))\n\n if (orderPolicyOptions.count) {\n const rateLimitPolicy = toRateLimitPolicy({\n count: orderPolicyOptions.count,\n })\n policies.push(rateLimitPolicy)\n }\n\n if (orderPolicyOptions.validUntil) {\n const timestampPolicy = toTimestampPolicy({\n validUntil: orderPolicyOptions.validUntil,\n })\n policies.push(timestampPolicy)\n }\n\n return policies\n}\n"],"names":["CallPolicyVersion","ParamCondition","toCallPolicy","toRateLimitPolicy","toTimestampPolicy","assetsRegistryConfig","fixedPaymentTemplateConfig","nft1155CreditsConfig","payAsYouGoTemplateAddress","payAsYouGoTemplateConfig","isAddress","parseAbi","zeroAddress","isTempoNetwork","getPolicy","permissions","policyVersion","V0_0_4","getPermissions","config","functionNames","forEach","entry","name","split","abis","abi","filter","item","type","includes","sig","inputs","map","i","join","length","Error","address","push","target","functionName","dedupeTokens","tokenAddresses","seen","Set","out","t","key","toLowerCase","has","add","getERC20ApprovePermissions","contractAddress","getERC20ApprovePolicy","REGISTER_FN","REGISTER_GROUP_FNS","getAgentRegistrationPolicy","getPricingPlanRegistrationPolicy","getRegisterAssetsPolicy","getOrderPolicy","perms","getMintNFTPolicy","getBurnNFTPolicy","getRegisterPolicy","MAX_CALLPOLICY_PERMISSIONS","assertPolicyFitsTempoEnableGas","chainId","undefined","buildPolicy","getAllContractsPolicy","Boolean","getZeroDevOrderPolicies","orderPolicyOptions","policies","orderPermissions","contracts","contract","isPayAsYouGo","valueLimit","args","condition","EQUAL","value","subscriberAddress","numberOfPurchases","callPermissions","erc20ContractAddress","NOT_EQUAL","LESS_THAN_OR_EQUAL","totalAmount","count","rateLimitPolicy","validUntil","timestampPolicy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/nevermined/utils/ZeroDevPolicies.ts"],"sourcesContent":["import {\n CallPolicyVersion,\n ParamCondition,\n toCallPolicy,\n toRateLimitPolicy,\n toTimestampPolicy,\n} from '@zerodev/permissions/policies'\nimport {\n assetsRegistryConfig,\n fixedPaymentTemplateConfig,\n nft1155CreditsConfig,\n payAsYouGoTemplateAddress,\n payAsYouGoTemplateConfig,\n} from '../../artifacts/generated.js'\nimport { Abi, isAddress, parseAbi, zeroAddress } from 'viem'\nimport { Policy } from '@zerodev/permissions'\nimport { isTempoNetwork } from '../../utils/Network.js'\n\nexport function getPolicy(permissions: any[]) {\n return toCallPolicy({\n policyVersion: CallPolicyVersion.V0_0_4,\n permissions,\n })\n}\n\nexport function getPermissions(config: any, functionNames: string[]) {\n const permissions: any[] = []\n functionNames.forEach((entry) => {\n // A bare name ('register') matches every overload of that name; a full signature\n // ('register(bytes32,string,uint256[])') pins ONE overload. The latter lets callers\n // permit only the signature the SDK actually calls instead of all overloads, which\n // keeps the CallPolicy merkle small (load-bearing on Tempo — see #1929).\n const name = entry.split('(')[0]\n const abis = config.abi.filter((item: any) => {\n if (item.type !== 'function' || item.name !== name) return false\n if (!entry.includes('(')) return true\n const sig = `${item.name}(${(item.inputs ?? []).map((i: any) => i.type).join(',')})`\n return sig === entry\n })\n // Fail LOUD if a requested function resolves to no ABI entry. A pinned full\n // signature (#1929 register trim) that stops matching after a contract regen\n // would otherwise silently emit zero permissions → every userOp for that\n // function reverts `InvalidCallData` at runtime with no build-time error.\n if (abis.length === 0) {\n throw new Error(\n `getPermissions: \"${entry}\" matched no function in the ABI for ${config.address}. ` +\n `A contract regen may have changed the signature (see #1929 register-overload trim).`,\n )\n }\n abis.forEach((abi: any) => {\n permissions.push({\n target: config.address,\n abi: [abi],\n functionName: name,\n })\n })\n })\n return permissions\n}\n\n// Dedupe settlement-token addresses case-insensitively (checksummed vs lowercase\n// are the SAME token) and drop the zero address. Duplicate `approve` permissions\n// re-bloat the CallPolicy merkle, which is load-bearing on Tempo's enable-gas\n// ceiling (#1929) — a case-sensitive `new Set` would let a mixed-casing map edit\n// silently regress the enable.\nfunction dedupeTokens(tokenAddresses: `0x${string}`[]): `0x${string}`[] {\n const seen = new Set<string>()\n const out: `0x${string}`[] = []\n for (const t of tokenAddresses) {\n if (!t || t === zeroAddress) continue\n const key = t.toLowerCase()\n if (seen.has(key)) continue\n seen.add(key)\n out.push(t)\n }\n return out\n}\n\nexport function getERC20ApprovePermissions(contractAddress: `0x${string}`) {\n return {\n target: contractAddress,\n abi: parseAbi([\n 'function approve(address spender, uint256 amount) external returns (bool)',\n ]) as Abi,\n functionName: 'approve',\n }\n}\nexport const getERC20ApprovePolicy = (contractAddress: `0x${string}`) =>\n getPolicy([getERC20ApprovePermissions(contractAddress)])\n\n// AssetRegistry's ABI carries 5 `register` overloads, but the SDK only ever calls\n// register(bytes32 seed, string url, uint256[] plans) (AssetRegistry.register). Pinning the\n// used signature drops the 4 dead overloads from the CallPolicy merkle (16 → 12 perms),\n// which is what lets the session-key ENABLE fit under Tempo's verification-gas ceiling (#1929).\nconst REGISTER_FN = 'register(bytes32,string,uint256[])'\nconst REGISTER_GROUP_FNS = [\n REGISTER_FN,\n 'createPlan',\n 'createPlanWithHooks',\n 'registerAgentAndPlan',\n 'addPlanToAgent',\n 'removePlanFromAgent',\n]\n\nexport const getAgentRegistrationPolicy = () =>\n getPolicy(getPermissions(assetsRegistryConfig, [REGISTER_FN]))\n\nexport const getPricingPlanRegistrationPolicy = () =>\n getPolicy(getPermissions(assetsRegistryConfig, ['createPlan', 'createPlanWithHooks']))\n\nexport const getRegisterAssetsPolicy = () =>\n getPolicy(getPermissions(assetsRegistryConfig, ['registerAgentAndPlan']))\n\nexport const getOrderPolicy = () => {\n const perms = [\n ...getPermissions(fixedPaymentTemplateConfig, ['order']),\n ...getPermissions(payAsYouGoTemplateAddress, ['order']),\n ]\n return getPolicy(perms)\n}\n\nexport const getMintNFTPolicy = () => getPolicy(getPermissions(nft1155CreditsConfig, ['mint']))\n\nexport const getBurnNFTPolicy = () => getPolicy(getPermissions(nft1155CreditsConfig, ['burn']))\n\nexport const getRegisterPolicy = () =>\n getPolicy(getPermissions(assetsRegistryConfig, REGISTER_GROUP_FNS))\n\n// #1929: the session-key CallPolicy must fit under Tempo's verification-gas\n// ceiling for the on-chain ENABLE. Exceeding it makes the enable revert — and\n// NOT tunably: the ZeroDev sponsor ignores the `verificationGasLimit` we send\n// (AA26 is identical whether we ask for 1M or 1000M), so the ONLY lever is\n// making the enable cheaper.\n//\n// Measured on live tempo-moderato against one warm 7702 account, varying ONLY\n// the permission count (padded with dummy ERC20 `approve` permissions), the\n// hosted ZeroDev bundler sponsoring:\n// - Tempo: 14 perms land (5/5) · 15 → AA26 over verificationGasLimit\n// (4/4) · 16+ → AA23 reverted 0x\n// - base-sepolia: 40 perms land. No ceiling — the bound is Tempo-specific,\n// which is why the guard below only asserts on Tempo.\n// The bound stays at 12, two below the measured 14, because it counts\n// PERMISSIONS while what actually blows is GAS: a permission with a heavier ABI\n// than an `approve` costs more, so the count is only a proxy. Raising it is not\n// the fix — pass a PER-NETWORK token subset (see `policiesFor` in the\n// `*ForNetworks` helpers) so each chain's key only approves its own tokens.\nconst MAX_CALLPOLICY_PERMISSIONS = 12\n\nconst assertPolicyFitsTempoEnableGas = (perms: unknown[], chainId?: number): void => {\n // No chainId → assume the restrictive chain (the guard predates the param).\n if (chainId !== undefined && !isTempoNetwork(chainId)) return\n if (perms.length > MAX_CALLPOLICY_PERMISSIONS) {\n throw new Error(\n `CallPolicy has ${perms.length} permissions; exceeds the Tempo session-key enable-gas budget (${MAX_CALLPOLICY_PERMISSIONS}). Split to a per-network token subset instead of growing the cross-network union.`,\n )\n }\n}\n\n// #1929: `order` keys must approve EVERY settlement token they may pay with (one\n// per network/currency), not a single hardcoded one — otherwise paying a plan in\n// a different token (an EURC plan against a USDC-only key) reverts `InvalidCallData`.\n// No spend\n// limit by design (the approve permissions carry no `valueLimit`).\nexport const buildPolicy = (\n permissions: string[],\n tokenAddresses: `0x${string}`[],\n chainId?: number,\n) => {\n const perms = [\n ...(permissions.includes('register')\n ? getPermissions(assetsRegistryConfig, REGISTER_GROUP_FNS)\n : []),\n ...(permissions.includes('mint') ? getPermissions(nft1155CreditsConfig, ['mint']) : []),\n ...(permissions.includes('burn') ? getPermissions(nft1155CreditsConfig, ['burn']) : []),\n ...(permissions.includes('order') ? getPermissions(fixedPaymentTemplateConfig, ['order']) : []),\n ...(permissions.includes('order') ? getPermissions(payAsYouGoTemplateConfig, ['order']) : []),\n ...(permissions.includes('order')\n ? dedupeTokens(tokenAddresses).map((t) => getERC20ApprovePermissions(t))\n : []),\n ]\n\n assertPolicyFitsTempoEnableGas(perms, chainId)\n return getPolicy(perms)\n}\n\n// #1929: the session key must permit `approve` on EVERY settlement token it may\n// ever pay with — one per (network, currency). A single-token policy silently\n// breaks the moment the order's token differs from it, reverting validateUserOp\n// with `InvalidCallData`. Dedupe + drop zeros here so callers can pass the raw\n// per-network token list.\nexport const getAllContractsPolicy = (tokenAddresses: `0x${string}`[], chainId?: number) => {\n const perms = [\n ...getPermissions(assetsRegistryConfig, REGISTER_GROUP_FNS),\n ...getPermissions(fixedPaymentTemplateConfig, ['order']),\n ...getPermissions(payAsYouGoTemplateConfig, ['order']),\n ...getPermissions(nft1155CreditsConfig, ['mint', 'burn']),\n ...dedupeTokens(tokenAddresses).map((t) => getERC20ApprovePermissions(t)),\n ].filter(Boolean)\n\n assertPolicyFitsTempoEnableGas(perms, chainId)\n return getPolicy(perms)\n}\n\nexport type OrderContract = {\n address: `0x${string}`\n isPayAsYouGo: boolean\n}\n\nexport type OrderPolicyOptions = {\n contracts: OrderContract[]\n subscriberAddress: `0x${string}`\n numberOfPurchases: bigint\n totalAmount: bigint\n count?: number\n erc20ContractAddress?: `0x${string}`\n validUntil?: number\n}\n\nexport const getZeroDevOrderPolicies = (orderPolicyOptions: OrderPolicyOptions): Policy[] => {\n const policies: Policy[] = []\n\n const orderPermissions = orderPolicyOptions.contracts.map((contract) => {\n if (contract.isPayAsYouGo) {\n return {\n target: contract.address,\n abi: parseAbi([\n 'function order(bytes32 _seed, uint256 _planId, bytes[] memory _params) external payable',\n ]) as Abi,\n valueLimit: 0n,\n functionName: 'order',\n args: [null, null],\n }\n }\n return {\n target: contract.address,\n abi: parseAbi([\n 'function order(bytes32 _seed, uint256 _planId, address _creditsReceiver, uint256 _numberOfPurchases, bytes[] memory _params) external payable',\n ]) as Abi,\n valueLimit: 0n,\n functionName: 'order',\n args: [\n null,\n null,\n {\n condition: ParamCondition.EQUAL,\n value: orderPolicyOptions.subscriberAddress,\n },\n {\n condition: ParamCondition.EQUAL,\n value: orderPolicyOptions.numberOfPurchases,\n },\n ],\n }\n })\n\n const callPermissions: any[] = [...orderPermissions]\n\n if (\n orderPolicyOptions.erc20ContractAddress &&\n isAddress(orderPolicyOptions.erc20ContractAddress)\n ) {\n callPermissions.push({\n target: orderPolicyOptions.erc20ContractAddress,\n abi: parseAbi([\n 'function approve(address spender, uint256 amount) external returns (bool)',\n ]) as Abi,\n valueLimit: 0n,\n functionName: 'approve',\n args: [\n {\n condition: ParamCondition.NOT_EQUAL,\n value: zeroAddress,\n },\n {\n condition: ParamCondition.LESS_THAN_OR_EQUAL,\n value: orderPolicyOptions.totalAmount,\n },\n ],\n })\n }\n\n policies.push(getPolicy(callPermissions))\n\n if (orderPolicyOptions.count) {\n const rateLimitPolicy = toRateLimitPolicy({\n count: orderPolicyOptions.count,\n })\n policies.push(rateLimitPolicy)\n }\n\n if (orderPolicyOptions.validUntil) {\n const timestampPolicy = toTimestampPolicy({\n validUntil: orderPolicyOptions.validUntil,\n })\n policies.push(timestampPolicy)\n }\n\n return policies\n}\n"],"names":["CallPolicyVersion","ParamCondition","toCallPolicy","toRateLimitPolicy","toTimestampPolicy","assetsRegistryConfig","fixedPaymentTemplateConfig","nft1155CreditsConfig","payAsYouGoTemplateAddress","payAsYouGoTemplateConfig","isAddress","parseAbi","zeroAddress","isTempoNetwork","getPolicy","permissions","policyVersion","V0_0_4","getPermissions","config","functionNames","forEach","entry","name","split","abis","abi","filter","item","type","includes","sig","inputs","map","i","join","length","Error","address","push","target","functionName","dedupeTokens","tokenAddresses","seen","Set","out","t","key","toLowerCase","has","add","getERC20ApprovePermissions","contractAddress","getERC20ApprovePolicy","REGISTER_FN","REGISTER_GROUP_FNS","getAgentRegistrationPolicy","getPricingPlanRegistrationPolicy","getRegisterAssetsPolicy","getOrderPolicy","perms","getMintNFTPolicy","getBurnNFTPolicy","getRegisterPolicy","MAX_CALLPOLICY_PERMISSIONS","assertPolicyFitsTempoEnableGas","chainId","undefined","buildPolicy","getAllContractsPolicy","Boolean","getZeroDevOrderPolicies","orderPolicyOptions","policies","orderPermissions","contracts","contract","isPayAsYouGo","valueLimit","args","condition","EQUAL","value","subscriberAddress","numberOfPurchases","callPermissions","erc20ContractAddress","NOT_EQUAL","LESS_THAN_OR_EQUAL","totalAmount","count","rateLimitPolicy","validUntil","timestampPolicy"],"mappings":"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"}
|