@metamask/smart-accounts-kit 1.1.0 → 1.2.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.
Files changed (66) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/README.md +34 -2
  3. package/dist/actions/index.cjs +5 -5
  4. package/dist/actions/index.mjs +4 -4
  5. package/dist/{smartAccountsEnvironment-BIcho7e0.d.cts → caveats-CQbtzOKm.d.ts} +9 -2
  6. package/dist/{smartAccountsEnvironment-Bso0CIWt.d.ts → caveats-Cey0wm33.d.cts} +9 -2
  7. package/dist/{chunk-UUOH2WAW.cjs → chunk-3SHZ7PV2.cjs} +12 -12
  8. package/dist/{chunk-UUOH2WAW.cjs.map → chunk-3SHZ7PV2.cjs.map} +1 -1
  9. package/dist/{chunk-TPBFVDVM.mjs → chunk-4QXIOE7F.mjs} +8 -6
  10. package/dist/chunk-4QXIOE7F.mjs.map +1 -0
  11. package/dist/{chunk-NOCLGZGB.mjs → chunk-734MOPHR.mjs} +63 -5
  12. package/dist/chunk-734MOPHR.mjs.map +1 -0
  13. package/dist/{chunk-YDLLC6PP.cjs → chunk-7BEEGBA2.cjs} +519 -16
  14. package/dist/chunk-7BEEGBA2.cjs.map +1 -0
  15. package/dist/{chunk-45GHWVQA.mjs → chunk-G7VZ7E6W.mjs} +4 -4
  16. package/dist/{chunk-F2RG26RH.cjs → chunk-HFRQNSZE.cjs} +105 -105
  17. package/dist/{chunk-F2RG26RH.cjs.map → chunk-HFRQNSZE.cjs.map} +1 -1
  18. package/dist/{chunk-YSBBRLMT.mjs → chunk-L5DLMBDC.mjs} +5 -5
  19. package/dist/{chunk-VLKX4BR6.cjs → chunk-MOHCTPYQ.cjs} +8 -6
  20. package/dist/chunk-MOHCTPYQ.cjs.map +1 -0
  21. package/dist/{chunk-QMRKCB7T.cjs → chunk-T4IAMAB2.cjs} +102 -44
  22. package/dist/chunk-T4IAMAB2.cjs.map +1 -0
  23. package/dist/{chunk-BYWRJGSK.cjs → chunk-UB2FLPP3.cjs} +16 -16
  24. package/dist/{chunk-BYWRJGSK.cjs.map → chunk-UB2FLPP3.cjs.map} +1 -1
  25. package/dist/{chunk-23YXLKTX.cjs → chunk-UZO5OYCD.cjs} +14 -14
  26. package/dist/{chunk-23YXLKTX.cjs.map → chunk-UZO5OYCD.cjs.map} +1 -1
  27. package/dist/{chunk-YTELOQ4I.mjs → chunk-VJXM3LWA.mjs} +2 -2
  28. package/dist/{chunk-WV2R7BXP.mjs → chunk-YTNCEXUX.mjs} +3 -3
  29. package/dist/{chunk-C5ZEEH2Z.mjs → chunk-ZA2XYCVX.mjs} +517 -14
  30. package/dist/chunk-ZA2XYCVX.mjs.map +1 -0
  31. package/dist/contracts/index.cjs +6 -6
  32. package/dist/contracts/index.d.cts +2 -2
  33. package/dist/contracts/index.d.ts +2 -2
  34. package/dist/contracts/index.mjs +5 -5
  35. package/dist/{delegation-DgmIOh21.d.ts → delegation-Bx4FEAIU.d.ts} +1 -1
  36. package/dist/{delegation-Ci3me5Rg.d.cts → delegation-KbWHzRxV.d.cts} +1 -1
  37. package/dist/experimental/index.cjs +36 -4
  38. package/dist/experimental/index.cjs.map +1 -1
  39. package/dist/experimental/index.d.cts +4 -1
  40. package/dist/experimental/index.d.ts +4 -1
  41. package/dist/experimental/index.mjs +35 -3
  42. package/dist/experimental/index.mjs.map +1 -1
  43. package/dist/{index-UF6eCzBC.d.ts → index-D2THBlfm.d.ts} +1 -1
  44. package/dist/{index-CSjEW7MJ.d.cts → index-DE87r5KY.d.cts} +1 -1
  45. package/dist/index.cjs +33 -17
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.d.cts +7 -9
  48. package/dist/index.d.ts +7 -9
  49. package/dist/index.mjs +24 -8
  50. package/dist/index.mjs.map +1 -1
  51. package/dist/utils/index.cjs +7 -5
  52. package/dist/utils/index.cjs.map +1 -1
  53. package/dist/utils/index.d.cts +2 -2
  54. package/dist/utils/index.d.ts +2 -2
  55. package/dist/utils/index.mjs +6 -4
  56. package/package.json +5 -4
  57. package/dist/chunk-C5ZEEH2Z.mjs.map +0 -1
  58. package/dist/chunk-NOCLGZGB.mjs.map +0 -1
  59. package/dist/chunk-QMRKCB7T.cjs.map +0 -1
  60. package/dist/chunk-TPBFVDVM.mjs.map +0 -1
  61. package/dist/chunk-VLKX4BR6.cjs.map +0 -1
  62. package/dist/chunk-YDLLC6PP.cjs.map +0 -1
  63. /package/dist/{chunk-45GHWVQA.mjs.map → chunk-G7VZ7E6W.mjs.map} +0 -0
  64. /package/dist/{chunk-YSBBRLMT.mjs.map → chunk-L5DLMBDC.mjs.map} +0 -0
  65. /package/dist/{chunk-YTELOQ4I.mjs.map → chunk-VJXM3LWA.mjs.map} +0 -0
  66. /package/dist/{chunk-WV2R7BXP.mjs.map → chunk-YTNCEXUX.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/caveatBuilder/caveatBuilder.ts","../src/caveatBuilder/types.ts","../src/caveatBuilder/allowedCalldataBuilder.ts","../src/caveatBuilder/allowedMethodsBuilder.ts","../src/caveatBuilder/allowedTargetsBuilder.ts","../src/caveatBuilder/argsEqualityCheckBuilder.ts","../src/caveatBuilder/blockNumberBuilder.ts","../src/caveatBuilder/deployedBuilder.ts","../src/caveatBuilder/erc1155BalanceChangeBuilder.ts","../src/caveatBuilder/erc20BalanceChangeBuilder.ts","../src/caveatBuilder/erc20PeriodTransferBuilder.ts","../src/caveatBuilder/erc20StreamingBuilder.ts","../src/caveatBuilder/erc20TransferAmountBuilder.ts","../src/caveatBuilder/erc721BalanceChangeBuilder.ts","../src/caveatBuilder/erc721TransferBuilder.ts","../src/caveatBuilder/exactCalldataBatchBuilder.ts","../src/caveatBuilder/exactCalldataBuilder.ts","../src/caveatBuilder/exactExecutionBatchBuilder.ts","../src/caveatBuilder/exactExecutionBuilder.ts","../src/caveatBuilder/idBuilder.ts","../src/caveatBuilder/limitedCallsBuilder.ts","../src/caveatBuilder/multiTokenPeriodBuilder.ts","../src/caveatBuilder/nativeBalanceChangeBuilder.ts","../src/caveatBuilder/nativeTokenPaymentBuilder.ts","../src/caveatBuilder/nativeTokenPeriodTransferBuilder.ts","../src/caveatBuilder/nativeTokenStreamingBuilder.ts","../src/caveatBuilder/nativeTokenTransferAmountBuilder.ts","../src/caveatBuilder/nonceBuilder.ts","../src/caveatBuilder/ownershipTransferBuilder.ts","../src/caveatBuilder/redeemerBuilder.ts","../src/caveatBuilder/specificActionERC20TransferBatchBuilder.ts","../src/caveatBuilder/timestampBuilder.ts","../src/caveatBuilder/valueLteBuilder.ts","../src/caveatBuilder/coreCaveatBuilder.ts","../src/caveatBuilder/scope/erc20PeriodicScope.ts","../src/caveatBuilder/scope/erc20StreamingScope.ts","../src/caveatBuilder/scope/erc20TransferScope.ts","../src/utils.ts","../src/caveatBuilder/scope/erc721Scope.ts","../src/caveatBuilder/scope/functionCallScope.ts","../src/caveatBuilder/scope/nativeTokenPeriodicScope.ts","../src/caveatBuilder/scope/nativeTokenStreamingScope.ts","../src/caveatBuilder/scope/nativeTokenTransferScope.ts","../src/caveatBuilder/scope/ownershipScope.ts","../src/caveatBuilder/scope/index.ts","../src/caveatBuilder/resolveCaveats.ts","../src/caveats.ts","../src/delegation.ts"],"sourcesContent":["/**\n * To be used in sdk methods to call Implementation specific code\n *\n */\nexport enum Implementation {\n MultiSig = 'MultiSig',\n Hybrid = 'Hybrid',\n Stateless7702 = 'Stateless7702',\n}\n\n/**\n * Represents predefined time intervals (in seconds) for transfer windows.\n * These values are commonly used to specify the duration of transfer periods,\n * such as hourly, daily, weekly, etc., where each enum member's value is the\n * number of seconds in that interval.\n *\n * Hourly - 1 hour (3600 seconds)\n *\n * Daily - 1 day (86400 seconds)\n *\n * Weekly - 1 week (604800 seconds)\n *\n * BiWeekly - 2 weeks (1209600 seconds)\n *\n * Monthly - 1 month (30 days, 2592000 seconds)\n *\n * Quarterly - 1 quarter (90 days, 7776000 seconds)\n *\n * Yearly - 1 year (365 days, 31536000 seconds)\n */\nexport enum TransferWindow {\n Hourly = 3600, // 60 * 60 (seconds)\n Daily = 86400, // 60 * 60 * 24 (seconds)\n Weekly = 604800, // 60 * 60 * 24 * 7 (seconds)\n BiWeekly = 1209600, // 60 * 60 * 24 * 14 (seconds)\n Monthly = 2592000, // 60 * 60 * 24 * 30 (seconds)\n Quarterly = 7776000, // 60 * 60 * 24 * 90 (seconds)\n Yearly = 31536000, // 60 * 60 * 24 * 365 (seconds)\n}\n\n/**\n * Scope types for configuring delegation permissions.\n * Used with createCaveatBuilderFromScope to specify the type of permission scope.\n */\nexport enum ScopeType {\n Erc20TransferAmount = 'erc20TransferAmount',\n Erc20Streaming = 'erc20Streaming',\n Erc20PeriodTransfer = 'erc20PeriodTransfer',\n NativeTokenTransferAmount = 'nativeTokenTransferAmount',\n NativeTokenStreaming = 'nativeTokenStreaming',\n NativeTokenPeriodTransfer = 'nativeTokenPeriodTransfer',\n Erc721Transfer = 'erc721Transfer',\n OwnershipTransfer = 'ownershipTransfer',\n FunctionCall = 'functionCall',\n}\n\n/**\n * Caveat types for enforcer functions used in delegations.\n * Can be used when defining caveats either via CaveatBuilder.addCaveat\n * or in the caveats array in createDelegation.\n */\nexport enum CaveatType {\n AllowedMethods = 'allowedMethods',\n AllowedTargets = 'allowedTargets',\n Deployed = 'deployed',\n AllowedCalldata = 'allowedCalldata',\n Erc20BalanceChange = 'erc20BalanceChange',\n Erc721BalanceChange = 'erc721BalanceChange',\n Erc1155BalanceChange = 'erc1155BalanceChange',\n ValueLte = 'valueLte',\n LimitedCalls = 'limitedCalls',\n Id = 'id',\n Nonce = 'nonce',\n Timestamp = 'timestamp',\n BlockNumber = 'blockNumber',\n Erc20TransferAmount = 'erc20TransferAmount',\n Erc20Streaming = 'erc20Streaming',\n NativeTokenStreaming = 'nativeTokenStreaming',\n Erc721Transfer = 'erc721Transfer',\n NativeTokenTransferAmount = 'nativeTokenTransferAmount',\n NativeBalanceChange = 'nativeBalanceChange',\n Redeemer = 'redeemer',\n NativeTokenPayment = 'nativeTokenPayment',\n ArgsEqualityCheck = 'argsEqualityCheck',\n SpecificActionERC20TransferBatch = 'specificActionERC20TransferBatch',\n Erc20PeriodTransfer = 'erc20PeriodTransfer',\n NativeTokenPeriodTransfer = 'nativeTokenPeriodTransfer',\n ExactCalldataBatch = 'exactCalldataBatch',\n ExactCalldata = 'exactCalldata',\n ExactExecution = 'exactExecution',\n ExactExecutionBatch = 'exactExecutionBatch',\n MultiTokenPeriod = 'multiTokenPeriod',\n OwnershipTransfer = 'ownershipTransfer',\n}\n","import type { Caveat, SmartAccountsEnvironment } from '../types';\n\ntype CaveatWithOptionalArgs = Omit<Caveat, 'args'> & {\n args?: Caveat['args'];\n};\n\nconst INSECURE_UNRESTRICTED_DELEGATION_ERROR_MESSAGE =\n 'No caveats found. If you definitely want to create an empty caveat collection, set `allowInsecureUnrestrictedDelegation` to `true`.';\n\ntype CaveatBuilderMap = {\n [key: string]: (\n environment: SmartAccountsEnvironment,\n ...args: [...any]\n ) => Caveat;\n};\n\nexport type CaveatBuilderConfig = {\n allowInsecureUnrestrictedDelegation?: boolean;\n};\n\n/**\n * A builder class for creating and managing caveats.\n *\n * @template TCaveatBuilderMap - The type map of available caveat builder functions.\n */\nexport class CaveatBuilder<\n TCaveatBuilderMap extends CaveatBuilderMap = Record<string, never>,\n> {\n #results: Caveat[] = [];\n\n #hasBeenBuilt = false;\n\n readonly #environment: SmartAccountsEnvironment;\n\n readonly #config: CaveatBuilderConfig;\n\n readonly #enforcerBuilders: TCaveatBuilderMap;\n\n constructor(\n environment: SmartAccountsEnvironment,\n config: CaveatBuilderConfig = {},\n enforcerBuilders: TCaveatBuilderMap = {} as TCaveatBuilderMap,\n builtCaveats: Caveat[] = [],\n ) {\n this.#environment = environment;\n this.#config = config;\n this.#enforcerBuilders = enforcerBuilders;\n this.#results = builtCaveats;\n }\n\n /**\n * Extends the CaveatBuilder with a new enforcer function.\n *\n * @template TEnforcerName - The name of the enforcer.\n * @template TFunction - The type of the enforcer function.\n * @param name - The name of the enforcer.\n * @param fn - The enforcer function.\n * @returns The extended CaveatBuilder instance.\n */\n extend<\n TEnforcerName extends string,\n TFunction extends (\n environment: SmartAccountsEnvironment,\n config: any,\n ) => Caveat,\n >(\n name: TEnforcerName,\n fn: TFunction,\n ): CaveatBuilder<TCaveatBuilderMap & Record<TEnforcerName, TFunction>> {\n return new CaveatBuilder<\n TCaveatBuilderMap & Record<TEnforcerName, TFunction>\n >(\n this.#environment,\n this.#config,\n { ...this.#enforcerBuilders, [name]: fn },\n this.#results,\n );\n }\n\n /**\n * Adds a caveat directly using a Caveat object.\n *\n * @param caveat - The caveat to add.\n * @returns The CaveatBuilder instance for chaining.\n */\n addCaveat(caveat: CaveatWithOptionalArgs): CaveatBuilder<TCaveatBuilderMap>;\n\n /**\n * Adds a caveat using a named enforcer function.\n *\n * @param name - The name of the enforcer function to use.\n * @param config - The configuration to pass to the enforcer function.\n * @returns The CaveatBuilder instance for chaining.\n */\n addCaveat<TEnforcerName extends keyof TCaveatBuilderMap>(\n name: TEnforcerName,\n config: Parameters<TCaveatBuilderMap[TEnforcerName]>[1],\n ): CaveatBuilder<TCaveatBuilderMap>;\n\n addCaveat<TEnforcerName extends keyof TCaveatBuilderMap>(\n nameOrCaveat: TEnforcerName | CaveatWithOptionalArgs,\n config?: Parameters<TCaveatBuilderMap[TEnforcerName]>[1],\n ): CaveatBuilder<TCaveatBuilderMap> {\n if (typeof nameOrCaveat === 'object') {\n const caveat = {\n args: '0x00' as const,\n ...nameOrCaveat,\n };\n\n this.#results = [...this.#results, caveat];\n\n return this;\n }\n const name = nameOrCaveat;\n\n const func = this.#enforcerBuilders[name];\n if (typeof func === 'function') {\n const result = func(this.#environment, config);\n\n this.#results = [...this.#results, result];\n\n return this;\n }\n throw new Error(`Function \"${String(name)}\" does not exist.`);\n }\n\n /**\n * Returns the caveats that have been built using this CaveatBuilder.\n *\n * @returns The array of built caveats.\n * @throws Error if the builder has already been built or if no caveats are found and empty caveats are not allowed.\n */\n build(): Caveat[] {\n if (this.#hasBeenBuilt) {\n throw new Error('This CaveatBuilder has already been built.');\n }\n\n if (\n this.#results.length === 0 &&\n !this.#config.allowInsecureUnrestrictedDelegation\n ) {\n throw new Error(INSECURE_UNRESTRICTED_DELEGATION_ERROR_MESSAGE);\n }\n\n this.#hasBeenBuilt = true;\n\n return this.#results;\n }\n}\n","import type { SmartAccountsEnvironment } from '../types';\n\nexport enum BalanceChangeType {\n Increase = 0x0,\n Decrease = 0x1,\n}\n\nexport type UnitOfAuthorityBaseConfig = {\n environment: SmartAccountsEnvironment;\n};\n","import { createAllowedCalldataTerms } from '@metamask/delegation-core';\nimport { type Hex } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport const allowedCalldata = 'allowedCalldata';\n\nexport type AllowedCalldataBuilderConfig = {\n /**\n * The index in the calldata byte array (including the 4-byte method selector)\n * where the expected calldata starts.\n */\n startIndex: number;\n /**\n * The expected calldata as a hex string that must match at the specified index.\n */\n value: Hex;\n};\n\n/**\n * Builds a caveat struct for AllowedCalldataEnforcer that restricts calldata to a specific value at a given index.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing startIndex and value.\n * @returns The Caveat.\n * @throws Error if the value is not a valid hex string, if startIndex is negative, or if startIndex is not a whole number.\n */\nexport const allowedCalldataBuilder = (\n environment: SmartAccountsEnvironment,\n config: AllowedCalldataBuilderConfig,\n): Caveat => {\n const { startIndex, value } = config;\n\n const terms = createAllowedCalldataTerms({ startIndex, value });\n\n const {\n caveatEnforcers: { AllowedCalldataEnforcer },\n } = environment;\n\n if (!AllowedCalldataEnforcer) {\n throw new Error('AllowedCalldataEnforcer not found in environment');\n }\n\n return {\n enforcer: AllowedCalldataEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createAllowedMethodsTerms } from '@metamask/delegation-core';\nimport { isHex, toFunctionSelector } from 'viem';\nimport type { AbiFunction, Hex } from 'viem';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const allowedMethods = 'allowedMethods';\n\nexport type MethodSelector = Hex | string | AbiFunction;\n\n// length of function selector in chars, _including_ 0x prefix\nconst FUNCTION_SELECTOR_STRING_LENGTH = 10;\n\nexport type AllowedMethodsBuilderConfig = {\n /**\n * An array of method selectors that the delegate is allowed to call.\n * Can be 4-byte hex strings, ABI function signatures, or ABIFunction objects.\n */\n selectors: MethodSelector[];\n};\n\n/**\n * Builds a caveat struct for the AllowedMethodsEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing the allowed function selectors.\n * @returns The Caveat.\n * @throws Error if no selectors are provided or if any selector is invalid.\n */\nexport const allowedMethodsBuilder = (\n environment: SmartAccountsEnvironment,\n config: AllowedMethodsBuilderConfig,\n): Caveat => {\n const { selectors } = config;\n\n if (selectors.length === 0) {\n throw new Error('Invalid selectors: must provide at least one selector');\n }\n\n const parsedSelectors = selectors.map(parseSelector);\n\n const terms = createAllowedMethodsTerms({ selectors: parsedSelectors });\n\n const {\n caveatEnforcers: { AllowedMethodsEnforcer },\n } = environment;\n\n if (!AllowedMethodsEnforcer) {\n throw new Error('AllowedMethodsEnforcer not found in environment');\n }\n\n return {\n enforcer: AllowedMethodsEnforcer,\n terms,\n args: '0x00',\n };\n};\n\n/**\n * Parses a method selector into a hex string.\n *\n * @param selector - The method selector to parse.\n * @returns The parsed selector as a hex string.\n */\nfunction parseSelector(selector: MethodSelector) {\n if (isHex(selector)) {\n if (selector.length === FUNCTION_SELECTOR_STRING_LENGTH) {\n return selector;\n }\n throw new Error(\n 'Invalid selector: must be a 4 byte hex string, abi function signature, or AbiFunction',\n );\n }\n\n try {\n return toFunctionSelector(selector);\n } catch (rootError: any) {\n throw new Error(\n 'Invalid selector: must be a 4 byte hex string, abi function signature, or AbiFunction',\n { cause: rootError },\n );\n }\n}\n","import { createAllowedTargetsTerms } from '@metamask/delegation-core';\nimport { isAddress, type Address } from 'viem';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const allowedTargets = 'allowedTargets';\n\nexport type AllowedTargetsBuilderConfig = {\n /**\n * An array of addresses that the delegate is allowed to call.\n * Each address must be a valid hex string.\n */\n targets: Address[];\n};\n\n/**\n * Builds a caveat struct for AllowedTargetsEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing the targets.\n * @returns The Caveat.\n * @throws Error if no targets are provided or if any of the addresses are invalid.\n */\nexport const allowedTargetsBuilder = (\n environment: SmartAccountsEnvironment,\n config: AllowedTargetsBuilderConfig,\n): Caveat => {\n const { targets } = config;\n\n if (targets.length === 0) {\n throw new Error(\n 'Invalid targets: must provide at least one target address',\n );\n }\n\n // we check that the address is valid, but doesn't need to be checksummed\n const invalidAddresses = targets.filter(\n (target) => !isAddress(target, { strict: false }),\n );\n\n if (invalidAddresses.length > 0) {\n throw new Error('Invalid targets: must be valid addresses');\n }\n\n const terms = createAllowedTargetsTerms({ targets });\n\n const {\n caveatEnforcers: { AllowedTargetsEnforcer },\n } = environment;\n\n if (!AllowedTargetsEnforcer) {\n throw new Error('AllowedTargetsEnforcer not found in environment');\n }\n\n return {\n enforcer: AllowedTargetsEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createArgsEqualityCheckTerms } from '@metamask/delegation-core';\nimport { type Hex, isHex } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport const argsEqualityCheck = 'argsEqualityCheck';\n\nexport type ArgsEqualityCheckBuilderConfig = {\n /**\n * The expected args as a hex string that must match exactly when redeeming the delegation.\n */\n args: Hex;\n};\n\n/**\n * Builds a caveat struct for the ArgsEqualityCheckEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the builder.\n * @returns The Caveat.\n * @throws Error if the config is invalid.\n */\nexport const argsEqualityCheckBuilder = (\n environment: SmartAccountsEnvironment,\n config: ArgsEqualityCheckBuilderConfig,\n): Caveat => {\n const { args } = config;\n if (!isHex(args)) {\n throw new Error('Invalid config: args must be a valid hex string');\n }\n\n const {\n caveatEnforcers: { ArgsEqualityCheckEnforcer },\n } = environment;\n\n if (!ArgsEqualityCheckEnforcer) {\n throw new Error('ArgsEqualityCheckEnforcer not found in environment');\n }\n\n return {\n enforcer: ArgsEqualityCheckEnforcer,\n terms: createArgsEqualityCheckTerms({ args }),\n args: '0x00',\n };\n};\n","import { createBlockNumberTerms } from '@metamask/delegation-core';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport const blockNumber = 'blockNumber';\n\nexport type BlockNumberBuilderConfig = {\n /**\n * The block number after which the delegation is valid.\n * Set to 0n to disable this threshold.\n */\n afterThreshold: bigint;\n /**\n * The block number before which the delegation is valid.\n * Set to 0n to disable this threshold.\n */\n beforeThreshold: bigint;\n};\n\n/**\n * Builds a caveat struct for the BlockNumberEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the BlockNumberEnforcer.\n * @returns The Caveat.\n * @throws Error if both thresholds are zero, if blockAfterThreshold is greater than or equal to blockBeforeThreshold, or if BlockNumberEnforcer is not available in the environment.\n */\nexport const blockNumberBuilder = (\n environment: SmartAccountsEnvironment,\n config: BlockNumberBuilderConfig,\n): Caveat => {\n const { afterThreshold, beforeThreshold } = config;\n\n if (afterThreshold === 0n && beforeThreshold === 0n) {\n throw new Error(\n 'Invalid thresholds: At least one of afterThreshold or beforeThreshold must be specified',\n );\n }\n\n if (beforeThreshold !== 0n && afterThreshold >= beforeThreshold) {\n throw new Error(\n 'Invalid thresholds: afterThreshold must be less than beforeThreshold if both are specified',\n );\n }\n\n const terms = createBlockNumberTerms({ afterThreshold, beforeThreshold });\n\n const {\n caveatEnforcers: { BlockNumberEnforcer },\n } = environment;\n\n if (!BlockNumberEnforcer) {\n throw new Error('BlockNumberEnforcer not found in environment');\n }\n\n return {\n enforcer: BlockNumberEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createDeployedTerms } from '@metamask/delegation-core';\nimport { isAddress, isHex, type Address, type Hex } from 'viem';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const deployed = 'deployed';\n\nexport type DeployedBuilderConfig = {\n /**\n * The contract address as a hex string.\n */\n contractAddress: Address;\n /**\n * The salt to use with the deployment, as a hex string.\n */\n salt: Hex;\n /**\n * The bytecode of the contract as a hex string.\n */\n bytecode: Hex;\n};\n\n/**\n * Builds a caveat struct for a DeployedEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration for the deployed builder.\n * @returns The Caveat.\n * @throws Error if the contract address, factory address, or bytecode is invalid.\n */\nexport const deployedBuilder = (\n environment: SmartAccountsEnvironment,\n config: DeployedBuilderConfig,\n): Caveat => {\n const { contractAddress, salt, bytecode } = config;\n\n // we check that the addresses are valid, but don't need to be checksummed\n if (!isAddress(contractAddress, { strict: false })) {\n throw new Error(\n `Invalid contractAddress: must be a valid Ethereum address`,\n );\n }\n\n if (!isHex(salt)) {\n throw new Error('Invalid salt: must be a valid hexadecimal string');\n }\n\n if (!isHex(bytecode)) {\n throw new Error('Invalid bytecode: must be a valid hexadecimal string');\n }\n\n const terms = createDeployedTerms({ contractAddress, salt, bytecode });\n\n const {\n caveatEnforcers: { DeployedEnforcer },\n } = environment;\n\n if (!DeployedEnforcer) {\n throw new Error('DeployedEnforcer not found in environment');\n }\n\n return {\n enforcer: DeployedEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createERC1155BalanceChangeTerms } from '@metamask/delegation-core';\nimport { type Address, isAddress } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\nimport { BalanceChangeType } from './types';\n\nexport const erc1155BalanceChange = 'erc1155BalanceChange';\n\nexport type Erc1155BalanceChangeBuilderConfig = {\n /**\n * The ERC-1155 contract address as a hex string.\n */\n tokenAddress: Address;\n /**\n * The recipient's address as a hex string.\n */\n recipient: Address;\n /**\n * The ID of the ERC-1155 token as a bigint.\n */\n tokenId: bigint;\n /**\n * The amount by which the balance must have changed as a bigint.\n */\n balance: bigint;\n /**\n * The balance change type for the ERC-1155 token.\n * Specifies whether the balance should have increased or decreased.\n * Valid parameters are BalanceChangeType.Increase and BalanceChangeType.Decrease.\n */\n changeType: BalanceChangeType;\n};\n\n/**\n * Builds a caveat struct for the ERC1155BalanceChangeEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the ERC1155 balance change.\n * @returns The Caveat.\n * @throws Error if the token address is invalid, the recipient address is invalid, or the amount is not a positive number.\n */\nexport const erc1155BalanceChangeBuilder = (\n environment: SmartAccountsEnvironment,\n config: Erc1155BalanceChangeBuilderConfig,\n): Caveat => {\n const { tokenAddress, recipient, tokenId, balance, changeType } = config;\n\n if (!isAddress(tokenAddress, { strict: false })) {\n throw new Error('Invalid tokenAddress: must be a valid address');\n }\n\n if (!isAddress(recipient, { strict: false })) {\n throw new Error('Invalid recipient: must be a valid address');\n }\n\n if (balance <= 0n) {\n throw new Error('Invalid balance: must be a positive number');\n }\n\n if (tokenId < 0n) {\n throw new Error('Invalid tokenId: must be a non-negative number');\n }\n\n if (\n changeType !== BalanceChangeType.Increase &&\n changeType !== BalanceChangeType.Decrease\n ) {\n throw new Error('Invalid changeType: must be either Increase or Decrease');\n }\n\n const terms = createERC1155BalanceChangeTerms({\n tokenAddress,\n recipient,\n tokenId,\n balance,\n changeType,\n });\n\n const {\n caveatEnforcers: { ERC1155BalanceChangeEnforcer },\n } = environment;\n\n if (!ERC1155BalanceChangeEnforcer) {\n throw new Error('ERC1155BalanceChangeEnforcer not found in environment');\n }\n\n return {\n enforcer: ERC1155BalanceChangeEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createERC20BalanceChangeTerms } from '@metamask/delegation-core';\nimport { type Address, isAddress } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\nimport { BalanceChangeType } from './types';\n\nexport const erc20BalanceChange = 'erc20BalanceChange';\n\nexport type Erc20BalanceChangeBuilderConfig = {\n /**\n * The ERC-20 contract address as a hex string.\n */\n tokenAddress: Address;\n /**\n * The recipient's address as a hex string.\n */\n recipient: Address;\n /**\n * The amount by which the balance must have changed as a bigint.\n */\n balance: bigint;\n /**\n * The balance change type for the ERC-20 token.\n * Specifies whether the balance should have increased or decreased.\n * Valid parameters are BalanceChangeType.Increase and BalanceChangeType.Decrease.\n */\n changeType: BalanceChangeType;\n};\n\n/**\n * Builds a caveat struct for the ERC20BalanceChangeEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the ERC20 balance change.\n * @returns The Caveat.\n * @throws Error if the token address is invalid, the amount is not a positive number, or the change type is invalid.\n */\nexport const erc20BalanceChangeBuilder = (\n environment: SmartAccountsEnvironment,\n config: Erc20BalanceChangeBuilderConfig,\n): Caveat => {\n const { tokenAddress, recipient, balance, changeType } = config;\n\n if (!isAddress(tokenAddress, { strict: false })) {\n throw new Error('Invalid tokenAddress: must be a valid address');\n }\n\n if (balance <= 0n) {\n throw new Error('Invalid balance: must be a positive number');\n }\n\n if (\n changeType !== BalanceChangeType.Increase &&\n changeType !== BalanceChangeType.Decrease\n ) {\n throw new Error('Invalid changeType: must be either Increase or Decrease');\n }\n\n const terms = createERC20BalanceChangeTerms({\n tokenAddress,\n recipient,\n balance,\n changeType,\n });\n\n const {\n caveatEnforcers: { ERC20BalanceChangeEnforcer },\n } = environment;\n\n if (!ERC20BalanceChangeEnforcer) {\n throw new Error('ERC20BalanceChangeEnforcer not found in environment');\n }\n\n return {\n enforcer: ERC20BalanceChangeEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createERC20TokenPeriodTransferTerms } from '@metamask/delegation-core';\nimport type { Address } from 'viem';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const erc20PeriodTransfer = 'erc20PeriodTransfer';\n\nexport type Erc20PeriodTransferBuilderConfig = {\n /**\n * The ERC-20 contract address as a hex string.\n */\n tokenAddress: Address;\n /**\n * The maximum amount of tokens that can be transferred per period.\n */\n periodAmount: bigint;\n /**\n * The duration of each period in seconds.\n */\n periodDuration: number;\n /**\n * The timestamp when the first period begins in seconds.\n */\n startDate: number;\n};\n\n/**\n * Builds a caveat struct for ERC20PeriodTransferEnforcer.\n * This enforcer validates that ERC20 token transfers do not exceed a specified amount\n * within a given time period. The transferable amount resets at the beginning of each period,\n * and any unused tokens are forfeited once the period ends.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration for the ERC20 period transfer builder.\n * @returns The Caveat.\n * @throws Error if the token address is invalid or if any of the numeric parameters are invalid.\n */\nexport const erc20PeriodTransferBuilder = (\n environment: SmartAccountsEnvironment,\n config: Erc20PeriodTransferBuilderConfig,\n): Caveat => {\n const { tokenAddress, periodAmount, periodDuration, startDate } = config;\n\n const terms = createERC20TokenPeriodTransferTerms({\n tokenAddress,\n periodAmount,\n periodDuration,\n startDate,\n });\n\n const {\n caveatEnforcers: { ERC20PeriodTransferEnforcer },\n } = environment;\n\n if (!ERC20PeriodTransferEnforcer) {\n throw new Error('ERC20PeriodTransferEnforcer not found in environment');\n }\n\n return {\n enforcer: ERC20PeriodTransferEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createERC20StreamingTerms } from '@metamask/delegation-core';\nimport { type Address } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport const erc20Streaming = 'erc20Streaming';\n\nexport type Erc20StreamingBuilderConfig = {\n /**\n * The ERC-20 contract address as a hex string.\n */\n tokenAddress: Address;\n /**\n * The initial amount available at start time as a bigint.\n */\n initialAmount: bigint;\n /**\n * Maximum total amount that can be unlocked as a bigint.\n */\n maxAmount: bigint;\n /**\n * Rate at which tokens accrue per second as a bigint.\n */\n amountPerSecond: bigint;\n /**\n * The start timestamp in seconds.\n */\n startTime: number;\n};\n\n/**\n * Builds a caveat for ERC20 token streaming with configurable parameters.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration for the ERC20 streaming builder.\n * @returns The Caveat.\n * @throws Error if the token address is invalid.\n * @throws Error if the initial amount is a negative number.\n * @throws Error if the max amount is not greater than 0.\n * @throws Error if the max amount is less than the initial amount.\n * @throws Error if the amount per second is not a positive number.\n * @throws Error if the start time is not a positive number.\n */\nexport const erc20StreamingBuilder = (\n environment: SmartAccountsEnvironment,\n config: Erc20StreamingBuilderConfig,\n): Caveat => {\n const { tokenAddress, initialAmount, maxAmount, amountPerSecond, startTime } =\n config;\n\n const terms = createERC20StreamingTerms({\n tokenAddress,\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTime,\n });\n\n const {\n caveatEnforcers: { ERC20StreamingEnforcer },\n } = environment;\n\n if (!ERC20StreamingEnforcer) {\n throw new Error('ERC20StreamingEnforcer not found in environment');\n }\n\n return {\n enforcer: ERC20StreamingEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createERC20TransferAmountTerms } from '@metamask/delegation-core';\nimport type { Address } from 'viem';\nimport { isAddress } from 'viem';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const erc20TransferAmount = 'erc20TransferAmount';\n\nexport type Erc20TransferAmountBuilderConfig = {\n /**\n * The ERC-20 contract address as a hex string.\n */\n tokenAddress: Address;\n /**\n * The maximum amount of tokens that can be transferred as a bigint.\n */\n maxAmount: bigint;\n};\n\n/**\n * Builds a caveat struct for ERC20TransferAmountEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration for the ERC20 transfer amount builder.\n * @returns The Caveat.\n * @throws Error if the token address is invalid or if the max amount is not a positive number.\n */\nexport const erc20TransferAmountBuilder = (\n environment: SmartAccountsEnvironment,\n config: Erc20TransferAmountBuilderConfig,\n): Caveat => {\n const { tokenAddress, maxAmount } = config;\n\n if (!isAddress(tokenAddress, { strict: false })) {\n throw new Error('Invalid tokenAddress: must be a valid address');\n }\n\n if (maxAmount <= 0n) {\n throw new Error('Invalid maxAmount: must be a positive number');\n }\n\n const terms = createERC20TransferAmountTerms({ tokenAddress, maxAmount });\n\n const {\n caveatEnforcers: { ERC20TransferAmountEnforcer },\n } = environment;\n\n if (!ERC20TransferAmountEnforcer) {\n throw new Error('ERC20TransferAmountEnforcer not found in environment');\n }\n\n return {\n enforcer: ERC20TransferAmountEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createERC721BalanceChangeTerms } from '@metamask/delegation-core';\nimport { type Address, isAddress } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\nimport { BalanceChangeType } from './types';\n\nexport const erc721BalanceChange = 'erc721BalanceChange';\n\nexport type Erc721BalanceChangeBuilderConfig = {\n /**\n * The ERC-721 contract address as a hex string.\n */\n tokenAddress: Address;\n /**\n * The recipient's address as a hex string.\n */\n recipient: Address;\n /**\n * The amount by which the balance must have changed as a bigint.\n */\n amount: bigint;\n /**\n * The balance change type for the ERC-721 token.\n * Specifies whether the balance should have increased or decreased.\n * Valid parameters are BalanceChangeType.Increase and BalanceChangeType.Decrease.\n */\n changeType: BalanceChangeType;\n};\n\n/**\n * Builds a caveat struct for the ERC721BalanceChangeEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the ERC721 balance change.\n * @returns The Caveat.\n * @throws Error if the token address is invalid, the recipient address is invalid, or the amount is not a positive number.\n */\nexport const erc721BalanceChangeBuilder = (\n environment: SmartAccountsEnvironment,\n config: Erc721BalanceChangeBuilderConfig,\n): Caveat => {\n const { tokenAddress, recipient, amount, changeType } = config;\n\n if (!isAddress(tokenAddress, { strict: false })) {\n throw new Error('Invalid tokenAddress: must be a valid address');\n }\n\n if (!isAddress(recipient, { strict: false })) {\n throw new Error('Invalid recipient: must be a valid address');\n }\n\n if (amount <= 0n) {\n throw new Error('Invalid balance: must be a positive number');\n }\n\n if (\n changeType !== BalanceChangeType.Increase &&\n changeType !== BalanceChangeType.Decrease\n ) {\n throw new Error('Invalid changeType: must be either Increase or Decrease');\n }\n\n const terms = createERC721BalanceChangeTerms({\n tokenAddress,\n recipient,\n amount,\n changeType,\n });\n\n const {\n caveatEnforcers: { ERC721BalanceChangeEnforcer },\n } = environment;\n\n if (!ERC721BalanceChangeEnforcer) {\n throw new Error('ERC721BalanceChangeEnforcer not found in environment');\n }\n\n return {\n enforcer: ERC721BalanceChangeEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createERC721TransferTerms } from '@metamask/delegation-core';\nimport { type Address, isAddress } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport const erc721Transfer = 'erc721Transfer';\n\nexport type Erc721TransferBuilderConfig = {\n /**\n * The ERC-721 contract address as a hex string.\n */\n tokenAddress: Address;\n /**\n * The token ID as a bigint.\n */\n tokenId: bigint;\n};\n\n/**\n * Builds a caveat struct for the ERC721TransferEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the ERC721 transfer builder.\n * @returns The Caveat representing the caveat for ERC721 transfer.\n * @throws Error if the permitted contract address is invalid.\n */\nexport const erc721TransferBuilder = (\n environment: SmartAccountsEnvironment,\n config: Erc721TransferBuilderConfig,\n): Caveat => {\n const { tokenAddress, tokenId } = config;\n\n if (!isAddress(tokenAddress, { strict: false })) {\n throw new Error('Invalid tokenAddress: must be a valid address');\n }\n\n if (tokenId < 0n) {\n throw new Error('Invalid tokenId: must be a non-negative number');\n }\n\n const terms = createERC721TransferTerms({ tokenAddress, tokenId });\n\n const {\n caveatEnforcers: { ERC721TransferEnforcer },\n } = environment;\n\n if (!ERC721TransferEnforcer) {\n throw new Error('ERC721TransferEnforcer not found in environment');\n }\n\n return {\n enforcer: ERC721TransferEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createExactCalldataBatchTerms } from '@metamask/delegation-core';\nimport { isAddress } from 'viem';\n\nimport type { ExecutionStruct } from '../executions';\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const exactCalldataBatch = 'exactCalldataBatch';\n\nexport type ExactCalldataBatchBuilderConfig = {\n /**\n * An array of executions that must be matched exactly in the batch.\n * Each execution specifies a target address, value, and calldata.\n */\n executions: ExecutionStruct[];\n};\n\n/**\n * Builds a caveat struct for ExactCalldataBatchEnforcer.\n * This enforcer ensures that the provided batch execution calldata matches exactly\n * the expected calldata for each execution.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing executions.\n * @returns The Caveat.\n * @throws Error if any of the executions have invalid parameters.\n */\nexport const exactCalldataBatchBuilder = (\n environment: SmartAccountsEnvironment,\n config: ExactCalldataBatchBuilderConfig,\n): Caveat => {\n const { executions } = config;\n\n if (executions.length === 0) {\n throw new Error('Invalid executions: array cannot be empty');\n }\n\n // Validate each execution\n for (const execution of executions) {\n if (!isAddress(execution.target, { strict: false })) {\n throw new Error('Invalid target: must be a valid address');\n }\n\n if (execution.value < 0n) {\n throw new Error('Invalid value: must be a non-negative number');\n }\n\n if (!execution.callData.startsWith('0x')) {\n throw new Error(\n 'Invalid calldata: must be a hex string starting with 0x',\n );\n }\n }\n\n const terms = createExactCalldataBatchTerms({ executions });\n\n const {\n caveatEnforcers: { ExactCalldataBatchEnforcer },\n } = environment;\n\n if (!ExactCalldataBatchEnforcer) {\n throw new Error('ExactCalldataBatchEnforcer not found in environment');\n }\n\n return {\n enforcer: ExactCalldataBatchEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createExactCalldataTerms } from '@metamask/delegation-core';\nimport type { Hex } from 'viem';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const exactCalldata = 'exactCalldata';\n\nexport type ExactCalldataBuilderConfig = {\n /**\n * The exact calldata that must be matched as a hex string.\n */\n calldata: Hex;\n};\n\n/**\n * Builds a caveat struct for ExactCalldataEnforcer.\n * This enforcer ensures that the provided execution calldata matches exactly\n * the expected calldata.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration for the ExactCalldataBuilder.\n * @returns The Caveat.\n * @throws Error if any of the parameters are invalid.\n */\nexport const exactCalldataBuilder = (\n environment: SmartAccountsEnvironment,\n config: ExactCalldataBuilderConfig,\n): Caveat => {\n const { calldata } = config;\n\n const terms = createExactCalldataTerms({ calldata });\n\n const {\n caveatEnforcers: { ExactCalldataEnforcer },\n } = environment;\n\n if (!ExactCalldataEnforcer) {\n throw new Error('ExactCalldataEnforcer not found in environment');\n }\n\n return {\n enforcer: ExactCalldataEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createExactExecutionBatchTerms } from '@metamask/delegation-core';\nimport { isAddress } from 'viem';\n\nimport type { ExecutionStruct } from '../executions';\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const exactExecutionBatch = 'exactExecutionBatch';\n\nexport type ExactExecutionBatchBuilderConfig = {\n /**\n * An array of executions that must be matched exactly in the batch.\n * Each execution specifies a target address, value, and calldata.\n */\n executions: ExecutionStruct[];\n};\n\n/**\n * Builds a caveat struct for ExactExecutionBatchEnforcer.\n * This enforcer ensures that each execution in the batch matches exactly\n * with the expected execution (target, value, and calldata).\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing executions.\n * @returns The Caveat.\n * @throws Error if any of the execution parameters are invalid.\n */\nexport const exactExecutionBatchBuilder = (\n environment: SmartAccountsEnvironment,\n config: ExactExecutionBatchBuilderConfig,\n): Caveat => {\n const { executions } = config;\n\n if (executions.length === 0) {\n throw new Error('Invalid executions: array cannot be empty');\n }\n\n // Validate each execution\n for (const execution of executions) {\n if (!isAddress(execution.target, { strict: false })) {\n throw new Error('Invalid target: must be a valid address');\n }\n\n if (execution.value < 0n) {\n throw new Error('Invalid value: must be a non-negative number');\n }\n\n if (!execution.callData.startsWith('0x')) {\n throw new Error(\n 'Invalid calldata: must be a hex string starting with 0x',\n );\n }\n }\n\n const terms = createExactExecutionBatchTerms({ executions });\n\n const {\n caveatEnforcers: { ExactExecutionBatchEnforcer },\n } = environment;\n\n if (!ExactExecutionBatchEnforcer) {\n throw new Error('ExactExecutionBatchEnforcer not found in environment');\n }\n\n return {\n enforcer: ExactExecutionBatchEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createExactExecutionTerms } from '@metamask/delegation-core';\nimport { isAddress } from 'viem';\n\nimport type { ExecutionStruct } from '../executions';\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const exactExecution = 'exactExecution';\n\nexport type ExactExecutionBuilderConfig = {\n /**\n * The execution that must be matched exactly.\n * Specifies the target address, value, and calldata.\n */\n execution: ExecutionStruct;\n};\n\n/**\n * Builds a caveat struct for ExactExecutionEnforcer.\n * This enforcer ensures that the provided execution matches exactly\n * with the expected execution (target, value, and calldata).\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing the execution.\n * @returns The Caveat.\n * @throws Error if any of the execution parameters are invalid.\n */\nexport const exactExecutionBuilder = (\n environment: SmartAccountsEnvironment,\n config: ExactExecutionBuilderConfig,\n): Caveat => {\n const { execution } = config;\n\n if (!isAddress(execution.target, { strict: false })) {\n throw new Error('Invalid target: must be a valid address');\n }\n\n if (execution.value < 0n) {\n throw new Error('Invalid value: must be a non-negative number');\n }\n\n if (!execution.callData.startsWith('0x')) {\n throw new Error('Invalid calldata: must be a hex string starting with 0x');\n }\n\n const terms = createExactExecutionTerms({ execution });\n\n const {\n caveatEnforcers: { ExactExecutionEnforcer },\n } = environment;\n\n if (!ExactExecutionEnforcer) {\n throw new Error('ExactExecutionEnforcer not found in environment');\n }\n\n return {\n enforcer: ExactExecutionEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createIdTerms } from '@metamask/delegation-core';\nimport { maxUint256 } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport type IdBuilderConfig = {\n /**\n * An id for the delegation. Only one delegation may be redeemed with any given id.\n */\n id: bigint | number;\n};\n\nexport const id = 'id';\n\n/**\n * Builds a caveat struct for the IdEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing the id to use in the caveat.\n * @returns The Caveat.\n * @throws Error if the provided id is not a number, not an integer, or is not 32 bytes or fewer in length.\n */\nexport const idBuilder = (\n environment: SmartAccountsEnvironment,\n config: IdBuilderConfig,\n): Caveat => {\n const { id: idValue } = config;\n\n let idBigInt: bigint;\n\n if (typeof idValue === 'number') {\n if (!Number.isInteger(idValue)) {\n throw new Error('Invalid id: must be an integer');\n }\n\n idBigInt = BigInt(idValue);\n } else if (typeof idValue === 'bigint') {\n idBigInt = idValue;\n } else {\n throw new Error('Invalid id: must be a bigint or number');\n }\n\n if (idBigInt < 0n) {\n throw new Error('Invalid id: must be a non-negative number');\n }\n\n if (idBigInt > maxUint256) {\n throw new Error('Invalid id: must be less than 2^256');\n }\n\n const terms = createIdTerms({ id: idBigInt });\n\n const {\n caveatEnforcers: { IdEnforcer },\n } = environment;\n\n if (!IdEnforcer) {\n throw new Error('IdEnforcer not found in environment');\n }\n\n return {\n enforcer: IdEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createLimitedCallsTerms } from '@metamask/delegation-core';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport const limitedCalls = 'limitedCalls';\n\nexport type LimitedCallsBuilderConfig = {\n /**\n * The maximum number of times this delegation may be redeemed.\n */\n limit: number;\n};\n\n/**\n * Builds a caveat struct for the LimitedCallsEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing the limit.\n * @returns The Caveat.\n * @throws Error if the limit is not a positive integer.\n */\nexport const limitedCallsBuilder = (\n environment: SmartAccountsEnvironment,\n config: LimitedCallsBuilderConfig,\n): Caveat => {\n const { limit } = config;\n\n if (!Number.isInteger(limit)) {\n throw new Error('Invalid limit: must be an integer');\n }\n\n if (limit <= 0) {\n throw new Error('Invalid limit: must be a positive integer');\n }\n\n const terms = createLimitedCallsTerms({ limit });\n\n const {\n caveatEnforcers: { LimitedCallsEnforcer },\n } = environment;\n\n if (!LimitedCallsEnforcer) {\n throw new Error('LimitedCallsEnforcer not found in environment');\n }\n\n return {\n enforcer: LimitedCallsEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createMultiTokenPeriodTerms } from '@metamask/delegation-core';\nimport type { Hex } from 'viem';\nimport { isAddress } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport type TokenPeriodConfig = {\n /**\n * The token contract address as a hex string.\n */\n token: Hex;\n /**\n * The maximum amount of tokens that can be transferred per period.\n */\n periodAmount: bigint;\n /**\n * The duration of each period in seconds.\n */\n periodDuration: number;\n /**\n * The timestamp when the first period begins in seconds.\n */\n startDate: number;\n};\n\nexport type MultiTokenPeriodBuilderConfig = {\n tokenConfigs: TokenPeriodConfig[];\n};\n\nexport const multiTokenPeriod = 'multiTokenPeriod';\n\n/**\n * Creates a caveat for the MultiTokenPeriodEnforcer.\n * This enforcer allows setting periodic transfer limits for multiple tokens.\n * Each token can have its own period amount, duration, and start date.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration for the MultiTokenPeriodBuilder.\n * @param config.tokenConfigs - The token configurations for the MultiTokenPeriodBuilder.\n * @returns The caveat object for the MultiTokenPeriodEnforcer.\n */\nexport const multiTokenPeriodBuilder = (\n environment: SmartAccountsEnvironment,\n config: MultiTokenPeriodBuilderConfig,\n): Caveat => {\n if (!config?.tokenConfigs || config.tokenConfigs.length === 0) {\n throw new Error(\n 'MultiTokenPeriodBuilder: tokenConfigs array cannot be empty',\n );\n }\n\n config.tokenConfigs.forEach((tokenConfig) => {\n if (!isAddress(tokenConfig.token)) {\n throw new Error(`Invalid token address: ${String(tokenConfig.token)}`);\n }\n\n if (tokenConfig.periodAmount <= 0) {\n throw new Error('Invalid period amount: must be greater than 0');\n }\n\n if (tokenConfig.periodDuration <= 0) {\n throw new Error('Invalid period duration: must be greater than 0');\n }\n });\n\n const terms = createMultiTokenPeriodTerms({\n tokenConfigs: config.tokenConfigs,\n });\n\n const {\n caveatEnforcers: { MultiTokenPeriodEnforcer },\n } = environment;\n\n if (!MultiTokenPeriodEnforcer) {\n throw new Error('MultiTokenPeriodEnforcer not found in environment');\n }\n\n return {\n enforcer: MultiTokenPeriodEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createNativeBalanceChangeTerms } from '@metamask/delegation-core';\nimport { type Address, isAddress } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\nimport { BalanceChangeType } from './types';\n\nexport const nativeBalanceChange = 'nativeBalanceChange';\n\nexport type NativeBalanceChangeBuilderConfig = {\n /**\n * The recipient's address as a hex string.\n */\n recipient: Address;\n /**\n * The amount by which the balance must have changed as a bigint.\n */\n balance: bigint;\n /**\n * The balance change type for the native currency.\n * Specifies whether the balance should have increased or decreased.\n * Valid parameters are BalanceChangeType.Increase and BalanceChangeType.Decrease.\n */\n changeType: BalanceChangeType;\n};\n\n/**\n * Builds a caveat struct for the NativeBalanceChangeEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the NativeBalanceChangeEnforcer.\n * @returns The Caveat.\n * @throws Error if the recipient address is invalid or the amount is not a positive number.\n */\nexport const nativeBalanceChangeBuilder = (\n environment: SmartAccountsEnvironment,\n config: NativeBalanceChangeBuilderConfig,\n): Caveat => {\n const { recipient, balance, changeType } = config;\n\n if (!isAddress(recipient)) {\n throw new Error('Invalid recipient: must be a valid Address');\n }\n\n if (balance <= 0n) {\n throw new Error('Invalid balance: must be a positive number');\n }\n\n if (\n changeType !== BalanceChangeType.Increase &&\n changeType !== BalanceChangeType.Decrease\n ) {\n throw new Error('Invalid changeType: must be either Increase or Decrease');\n }\n\n const terms = createNativeBalanceChangeTerms({\n recipient,\n balance,\n changeType,\n });\n\n const {\n caveatEnforcers: { NativeBalanceChangeEnforcer },\n } = environment;\n\n if (!NativeBalanceChangeEnforcer) {\n throw new Error('NativeBalanceChangeEnforcer not found in environment');\n }\n\n return {\n enforcer: NativeBalanceChangeEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createNativeTokenPaymentTerms } from '@metamask/delegation-core';\nimport { type Address, isAddress } from 'viem';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const nativeTokenPayment = 'nativeTokenPayment';\n\nexport type NativeTokenPaymentBuilderConfig = {\n /**\n * The recipient's address as a hex string.\n */\n recipient: Address;\n /**\n * The amount that must be paid as a bigint.\n */\n amount: bigint;\n};\n\n/**\n * Builds a caveat struct for the NativeTokenPaymentEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the NativeTokenPaymentEnforcer.\n * @returns The Caveat.\n * @throws Error if the amount is invalid or the recipient address is invalid.\n */\nexport const nativeTokenPaymentBuilder = (\n environment: SmartAccountsEnvironment,\n config: NativeTokenPaymentBuilderConfig,\n): Caveat => {\n const { recipient, amount } = config;\n\n if (amount <= 0n) {\n throw new Error('Invalid amount: must be positive');\n }\n\n if (!isAddress(recipient)) {\n throw new Error('Invalid recipient: must be a valid address');\n }\n\n const terms = createNativeTokenPaymentTerms({ recipient, amount });\n\n const {\n caveatEnforcers: { NativeTokenPaymentEnforcer },\n } = environment;\n\n if (!NativeTokenPaymentEnforcer) {\n throw new Error('NativeTokenPaymentEnforcer not found in environment');\n }\n\n return {\n enforcer: NativeTokenPaymentEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createNativeTokenPeriodTransferTerms } from '@metamask/delegation-core';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const nativeTokenPeriodTransfer = 'nativeTokenPeriodTransfer';\n\nexport type NativeTokenPeriodTransferBuilderConfig = {\n /**\n * The maximum amount of tokens that can be transferred per period.\n */\n periodAmount: bigint;\n /**\n * The duration of each period in seconds.\n */\n periodDuration: number;\n /**\n * The timestamp when the first period begins in seconds.\n */\n startDate: number;\n};\n\n/**\n * Builds a caveat struct for NativeTokenPeriodTransferEnforcer.\n * This enforcer validates that native token (ETH) transfers do not exceed a specified amount\n * within a given time period. The transferable amount resets at the beginning of each period,\n * and any unused ETH is forfeited once the period ends.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing periodAmount, periodDuration, and startDate.\n * @returns The Caveat.\n * @throws Error if any of the parameters are invalid.\n */\nexport const nativeTokenPeriodTransferBuilder = (\n environment: SmartAccountsEnvironment,\n config: NativeTokenPeriodTransferBuilderConfig,\n): Caveat => {\n const { periodAmount, periodDuration, startDate } = config;\n\n const terms = createNativeTokenPeriodTransferTerms({\n periodAmount,\n periodDuration,\n startDate,\n });\n\n const {\n caveatEnforcers: { NativeTokenPeriodTransferEnforcer },\n } = environment;\n\n if (!NativeTokenPeriodTransferEnforcer) {\n throw new Error(\n 'NativeTokenPeriodTransferEnforcer not found in environment',\n );\n }\n\n return {\n enforcer: NativeTokenPeriodTransferEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createNativeTokenStreamingTerms } from '@metamask/delegation-core';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport const nativeTokenStreaming = 'nativeTokenStreaming';\n\nexport type NativeTokenStreamingBuilderConfig = {\n /**\n * The initial amount available at start time as a bigint.\n */\n initialAmount: bigint;\n /**\n * Maximum total amount that can be unlocked as a bigint.\n */\n maxAmount: bigint;\n /**\n * Rate at which tokens accrue per second as a bigint.\n */\n amountPerSecond: bigint;\n /**\n * Start timestamp as a number in seconds.\n */\n startTime: number;\n};\n\n/**\n * Builds a caveat struct for the NativeTokenStreamingEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the NativeTokenStreamingEnforcer.\n * @returns The Caveat.\n * @throws Error if any of the parameters are invalid.\n */\nexport const nativeTokenStreamingBuilder = (\n environment: SmartAccountsEnvironment,\n config: NativeTokenStreamingBuilderConfig,\n): Caveat => {\n const { initialAmount, maxAmount, amountPerSecond, startTime } = config;\n\n const terms = createNativeTokenStreamingTerms({\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTime,\n });\n\n const {\n caveatEnforcers: { NativeTokenStreamingEnforcer },\n } = environment;\n\n if (!NativeTokenStreamingEnforcer) {\n throw new Error('NativeTokenStreamingEnforcer not found in environment');\n }\n\n return {\n enforcer: NativeTokenStreamingEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createNativeTokenTransferAmountTerms } from '@metamask/delegation-core';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const nativeTokenTransferAmount = 'nativeTokenTransferAmount';\n\nexport type NativeTokenTransferAmountBuilderConfig = {\n /**\n * The maximum amount of native tokens that can be transferred.\n */\n maxAmount: bigint;\n};\n\n/**\n * Builds a caveat struct for the NativeTokenTransferAmountEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing the maxAmount.\n * @returns The Caveat.\n * @throws Error if the maxAmount is negative.\n */\nexport const nativeTokenTransferAmountBuilder = (\n environment: SmartAccountsEnvironment,\n config: NativeTokenTransferAmountBuilderConfig,\n): Caveat => {\n const { maxAmount } = config;\n\n if (maxAmount < 0n) {\n throw new Error('Invalid maxAmount: must be zero or positive');\n }\n\n const terms = createNativeTokenTransferAmountTerms({ maxAmount });\n\n const {\n caveatEnforcers: { NativeTokenTransferAmountEnforcer },\n } = environment;\n\n if (!NativeTokenTransferAmountEnforcer) {\n throw new Error(\n 'NativeTokenTransferAmountEnforcer not found in environment',\n );\n }\n\n return {\n enforcer: NativeTokenTransferAmountEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createNonceTerms } from '@metamask/delegation-core';\nimport { type Hex } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport const nonce = 'nonce';\n\nexport type NonceBuilderConfig = {\n /**\n * A nonce as a hex string to allow bulk revocation of delegations.\n */\n nonce: Hex;\n};\n\n/**\n * Builds a caveat struct for the NonceEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing the nonce value.\n * @returns The Caveat.\n * @throws Error if the nonce is invalid.\n */\nexport const nonceBuilder = (\n environment: SmartAccountsEnvironment,\n config: NonceBuilderConfig,\n): Caveat => {\n const { nonce: nonceValue } = config;\n\n const terms = createNonceTerms({ nonce: nonceValue });\n\n const {\n caveatEnforcers: { NonceEnforcer },\n } = environment;\n\n if (!NonceEnforcer) {\n throw new Error('NonceEnforcer not found in environment');\n }\n\n return {\n enforcer: NonceEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createOwnershipTransferTerms } from '@metamask/delegation-core';\nimport { type Address, isAddress } from 'viem';\n\nimport type { SmartAccountsEnvironment, Caveat } from '../types';\n\nexport const ownershipTransfer = 'ownershipTransfer';\n\nexport type OwnershipTransferBuilderConfig = {\n /**\n * The target contract address as a hex string for which ownership transfers are allowed.\n */\n contractAddress: Address;\n};\n\n/**\n * Builds a caveat struct for the OwnershipTransferEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the ownership transfer builder.\n * @returns The Caveat representing the caveat for ownership transfer.\n * @throws Error if the target contract address is invalid.\n */\nexport const ownershipTransferBuilder = (\n environment: SmartAccountsEnvironment,\n config: OwnershipTransferBuilderConfig,\n): Caveat => {\n const { contractAddress } = config;\n\n if (!isAddress(contractAddress, { strict: false })) {\n throw new Error('Invalid contractAddress: must be a valid address');\n }\n\n const terms = createOwnershipTransferTerms({ contractAddress });\n\n const {\n caveatEnforcers: { OwnershipTransferEnforcer },\n } = environment;\n\n if (!OwnershipTransferEnforcer) {\n throw new Error('OwnershipTransferEnforcer not found in environment');\n }\n\n return {\n enforcer: OwnershipTransferEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createRedeemerTerms } from '@metamask/delegation-core';\nimport { type Address, isAddress } from 'viem';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const redeemer = 'redeemer';\n\nexport type RedeemerBuilderConfig = {\n /**\n * An array of addresses that are allowed to redeem the delegation.\n * Each address must be a valid hex string.\n */\n redeemers: Address[];\n};\n\n/**\n * Builds a caveat struct for the RedeemerEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing redeemers.\n * @returns The Caveat.\n * @throws Error if the redeemer address is invalid or the array is empty.\n */\nexport const redeemerBuilder = (\n environment: SmartAccountsEnvironment,\n config: RedeemerBuilderConfig,\n): Caveat => {\n const { redeemers } = config;\n\n if (redeemers.length === 0) {\n throw new Error(\n 'Invalid redeemers: must specify at least one redeemer address',\n );\n }\n\n for (const redeemerAddress of redeemers) {\n if (!isAddress(redeemerAddress)) {\n throw new Error('Invalid redeemers: must be a valid address');\n }\n }\n\n const terms = createRedeemerTerms({ redeemers });\n\n const {\n caveatEnforcers: { RedeemerEnforcer },\n } = environment;\n\n if (!RedeemerEnforcer) {\n throw new Error('RedeemerEnforcer not found in environment');\n }\n\n return {\n enforcer: RedeemerEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createSpecificActionERC20TransferBatchTerms } from '@metamask/delegation-core';\nimport { isAddress, type Address, type Hex } from 'viem';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const specificActionERC20TransferBatch =\n 'specificActionERC20TransferBatch';\n\nexport type SpecificActionErc20TransferBatchBuilderConfig = {\n /**\n * The address of the ERC-20 token contract.\n */\n tokenAddress: Address;\n /**\n * The address that will receive the tokens.\n */\n recipient: Address;\n /**\n * The amount of tokens to transfer.\n */\n amount: bigint;\n /**\n * The target address for the first transaction.\n */\n target: Address;\n /**\n * The calldata for the first transaction.\n */\n calldata: Hex;\n};\n\n/**\n * Builds a caveat struct for SpecificActionERC20TransferBatchEnforcer.\n * Enforces a batch of exactly 2 transactions: a specific action followed by an ERC20 transfer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration for the specific action ERC20 transfer batch builder.\n * @returns The Caveat.\n * @throws Error if any of the addresses are invalid or if the amount is not a positive number.\n */\nexport const specificActionERC20TransferBatchBuilder = (\n environment: SmartAccountsEnvironment,\n config: SpecificActionErc20TransferBatchBuilderConfig,\n): Caveat => {\n const { tokenAddress, recipient, amount, target, calldata } = config;\n\n if (!isAddress(tokenAddress, { strict: false })) {\n throw new Error('Invalid tokenAddress: must be a valid address');\n }\n\n if (!isAddress(recipient, { strict: false })) {\n throw new Error('Invalid recipient: must be a valid address');\n }\n\n if (!isAddress(target, { strict: false })) {\n throw new Error('Invalid target: must be a valid address');\n }\n\n if (amount <= 0n) {\n throw new Error('Invalid amount: must be a positive number');\n }\n\n const terms = createSpecificActionERC20TransferBatchTerms({\n tokenAddress,\n recipient,\n amount,\n target,\n calldata,\n });\n\n const {\n caveatEnforcers: { SpecificActionERC20TransferBatchEnforcer },\n } = environment;\n\n if (!SpecificActionERC20TransferBatchEnforcer) {\n throw new Error(\n 'SpecificActionERC20TransferBatchEnforcer not found in environment',\n );\n }\n\n return {\n enforcer: SpecificActionERC20TransferBatchEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createTimestampTerms } from '@metamask/delegation-core';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const timestamp = 'timestamp';\n\nexport type TimestampBuilderConfig = {\n /**\n * The timestamp after which the delegation is valid in seconds.\n * Set to 0 to disable this threshold.\n */\n afterThreshold: number;\n /**\n * The timestamp before which the delegation is valid.\n * Set to 0 to disable this threshold.\n */\n beforeThreshold: number;\n};\n\n/**\n * Builds a caveat struct for the TimestampEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object for the TimestampEnforcer.\n * @returns The Caveat.\n * @throws Error if any of the parameters are invalid.\n */\nexport const timestampBuilder = (\n environment: SmartAccountsEnvironment,\n config: TimestampBuilderConfig,\n): Caveat => {\n const { afterThreshold, beforeThreshold } = config;\n\n const terms = createTimestampTerms({\n timestampAfterThreshold: afterThreshold,\n timestampBeforeThreshold: beforeThreshold,\n });\n\n const {\n caveatEnforcers: { TimestampEnforcer },\n } = environment;\n\n if (!TimestampEnforcer) {\n throw new Error('TimestampEnforcer not found in environment');\n }\n\n return {\n enforcer: TimestampEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import { createValueLteTerms } from '@metamask/delegation-core';\n\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport const valueLte = 'valueLte';\n\nexport type ValueLteBuilderConfig = {\n /**\n * The maximum value that may be specified when redeeming this delegation.\n */\n maxValue: bigint;\n};\n\n/**\n * Builds a caveat struct for ValueLteEnforcer.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - The configuration object containing the maximum value allowed for the transaction.\n * @returns The Caveat.\n * @throws Error if any of the parameters are invalid.\n */\nexport const valueLteBuilder = (\n environment: SmartAccountsEnvironment,\n config: ValueLteBuilderConfig,\n): Caveat => {\n const { maxValue } = config;\n\n const terms = createValueLteTerms({ maxValue });\n\n const {\n caveatEnforcers: { ValueLteEnforcer },\n } = environment;\n\n if (!ValueLteEnforcer) {\n throw new Error('ValueLteEnforcer not found in environment');\n }\n\n return {\n enforcer: ValueLteEnforcer,\n terms,\n args: '0x00',\n };\n};\n","import type { SmartAccountsEnvironment } from '../types';\nimport {\n allowedCalldata,\n allowedCalldataBuilder,\n} from './allowedCalldataBuilder';\nimport { allowedMethods, allowedMethodsBuilder } from './allowedMethodsBuilder';\nimport { allowedTargets, allowedTargetsBuilder } from './allowedTargetsBuilder';\nimport {\n argsEqualityCheck,\n argsEqualityCheckBuilder,\n} from './argsEqualityCheckBuilder';\nimport { blockNumber, blockNumberBuilder } from './blockNumberBuilder';\nimport type { CaveatBuilderConfig } from './caveatBuilder';\nimport { CaveatBuilder } from './caveatBuilder';\nimport { deployed, deployedBuilder } from './deployedBuilder';\nimport {\n erc1155BalanceChange,\n erc1155BalanceChangeBuilder,\n} from './erc1155BalanceChangeBuilder';\nimport {\n erc20BalanceChange,\n erc20BalanceChangeBuilder,\n} from './erc20BalanceChangeBuilder';\nimport {\n erc20PeriodTransfer,\n erc20PeriodTransferBuilder,\n} from './erc20PeriodTransferBuilder';\nimport { erc20Streaming, erc20StreamingBuilder } from './erc20StreamingBuilder';\nimport {\n erc20TransferAmount,\n erc20TransferAmountBuilder,\n} from './erc20TransferAmountBuilder';\nimport {\n erc721BalanceChange,\n erc721BalanceChangeBuilder,\n} from './erc721BalanceChangeBuilder';\nimport { erc721Transfer, erc721TransferBuilder } from './erc721TransferBuilder';\nimport {\n exactCalldataBatch,\n exactCalldataBatchBuilder,\n} from './exactCalldataBatchBuilder';\nimport { exactCalldata, exactCalldataBuilder } from './exactCalldataBuilder';\nimport {\n exactExecutionBatch,\n exactExecutionBatchBuilder,\n} from './exactExecutionBatchBuilder';\nimport { exactExecution, exactExecutionBuilder } from './exactExecutionBuilder';\nimport { id, idBuilder } from './idBuilder';\nimport { limitedCalls, limitedCallsBuilder } from './limitedCallsBuilder';\nimport {\n multiTokenPeriod,\n multiTokenPeriodBuilder,\n} from './multiTokenPeriodBuilder';\nimport {\n nativeBalanceChange,\n nativeBalanceChangeBuilder,\n} from './nativeBalanceChangeBuilder';\nimport {\n nativeTokenPayment,\n nativeTokenPaymentBuilder,\n} from './nativeTokenPaymentBuilder';\nimport {\n nativeTokenPeriodTransfer,\n nativeTokenPeriodTransferBuilder,\n} from './nativeTokenPeriodTransferBuilder';\nimport {\n nativeTokenStreaming,\n nativeTokenStreamingBuilder,\n} from './nativeTokenStreamingBuilder';\nimport {\n nativeTokenTransferAmount,\n nativeTokenTransferAmountBuilder,\n} from './nativeTokenTransferAmountBuilder';\nimport { nonce, nonceBuilder } from './nonceBuilder';\nimport {\n ownershipTransfer,\n ownershipTransferBuilder,\n} from './ownershipTransferBuilder';\nimport { redeemer, redeemerBuilder } from './redeemerBuilder';\nimport {\n specificActionERC20TransferBatch,\n specificActionERC20TransferBatchBuilder,\n} from './specificActionERC20TransferBatchBuilder';\nimport { timestamp, timestampBuilder } from './timestampBuilder';\nimport { valueLte, valueLteBuilder } from './valueLteBuilder';\nimport type { CaveatType } from '../constants';\n\n// While we could derive CoreCaveatMap from the createCaveatBuilder function,\n// doing so would significantly complicate type resolution. By explicitly\n// declaring the return type of createCaveatBuilder, we ensure the caveat\n// map remains synchronized with the actual implementation.\ntype CoreCaveatMapByString = {\n allowedMethods: typeof allowedMethodsBuilder;\n allowedTargets: typeof allowedTargetsBuilder;\n deployed: typeof deployedBuilder;\n allowedCalldata: typeof allowedCalldataBuilder;\n erc20BalanceChange: typeof erc20BalanceChangeBuilder;\n erc721BalanceChange: typeof erc721BalanceChangeBuilder;\n erc1155BalanceChange: typeof erc1155BalanceChangeBuilder;\n valueLte: typeof valueLteBuilder;\n limitedCalls: typeof limitedCallsBuilder;\n id: typeof idBuilder;\n nonce: typeof nonceBuilder;\n timestamp: typeof timestampBuilder;\n blockNumber: typeof blockNumberBuilder;\n erc20TransferAmount: typeof erc20TransferAmountBuilder;\n erc20Streaming: typeof erc20StreamingBuilder;\n nativeTokenStreaming: typeof nativeTokenStreamingBuilder;\n erc721Transfer: typeof erc721TransferBuilder;\n nativeTokenTransferAmount: typeof nativeTokenTransferAmountBuilder;\n nativeBalanceChange: typeof nativeBalanceChangeBuilder;\n redeemer: typeof redeemerBuilder;\n nativeTokenPayment: typeof nativeTokenPaymentBuilder;\n argsEqualityCheck: typeof argsEqualityCheckBuilder;\n specificActionERC20TransferBatch: typeof specificActionERC20TransferBatchBuilder;\n erc20PeriodTransfer: typeof erc20PeriodTransferBuilder;\n nativeTokenPeriodTransfer: typeof nativeTokenPeriodTransferBuilder;\n exactCalldataBatch: typeof exactCalldataBatchBuilder;\n exactCalldata: typeof exactCalldataBuilder;\n exactExecution: typeof exactExecutionBuilder;\n exactExecutionBatch: typeof exactExecutionBatchBuilder;\n multiTokenPeriod: typeof multiTokenPeriodBuilder;\n ownershipTransfer: typeof ownershipTransferBuilder;\n};\n\ntype CoreCaveatMap = CoreCaveatMapByString & {\n [K in CaveatType as `${K}`]: CoreCaveatMapByString[`${K}`];\n};\n\n/**\n * A caveat builder type that includes all core caveat types pre-configured.\n * This type represents a fully configured caveat builder with all the standard\n * caveat builders available for use.\n */\nexport type CoreCaveatBuilder = CaveatBuilder<CoreCaveatMap>;\n\ntype ExtractCaveatMapType<TCaveatBuilder extends CaveatBuilder<any>> =\n TCaveatBuilder extends CaveatBuilder<infer TCaveatMap> ? TCaveatMap : never;\ntype ExtractedCoreMap = ExtractCaveatMapType<CoreCaveatBuilder>;\n\nexport type CaveatConfigurations = {\n [TType in keyof ExtractedCoreMap]: {\n type: TType;\n } & Parameters<ExtractedCoreMap[TType]>[1];\n}[keyof ExtractedCoreMap];\n\nexport type CaveatConfiguration<\n TCaveatBuilder extends CaveatBuilder<any>,\n CaveatMap = ExtractCaveatMapType<TCaveatBuilder>,\n> =\n CaveatMap extends Record<string, (...args: any[]) => any>\n ? {\n [TType in keyof CaveatMap]: {\n type: TType;\n } & Parameters<CaveatMap[TType]>[1];\n }[keyof CaveatMap]\n : never;\n\nexport type CoreCaveatConfiguration = CaveatConfiguration<CoreCaveatBuilder>;\n\n/**\n * Creates a caveat builder with all core caveat types pre-configured.\n *\n * @param environment - The DeleGator environment configuration.\n * @param config - Optional configuration for the caveat builder.\n * @returns A fully configured CoreCaveatBuilder instance with all core caveat types.\n */\nexport const createCaveatBuilder = (\n environment: SmartAccountsEnvironment,\n config?: CaveatBuilderConfig,\n): CoreCaveatBuilder => {\n const caveatBuilder = new CaveatBuilder(environment, config)\n .extend(allowedMethods, allowedMethodsBuilder)\n .extend(allowedTargets, allowedTargetsBuilder)\n .extend(deployed, deployedBuilder)\n .extend(allowedCalldata, allowedCalldataBuilder)\n .extend(erc20BalanceChange, erc20BalanceChangeBuilder)\n .extend(erc721BalanceChange, erc721BalanceChangeBuilder)\n .extend(erc1155BalanceChange, erc1155BalanceChangeBuilder)\n .extend(valueLte, valueLteBuilder)\n .extend(limitedCalls, limitedCallsBuilder)\n .extend(id, idBuilder)\n .extend(nonce, nonceBuilder)\n .extend(timestamp, timestampBuilder)\n .extend(blockNumber, blockNumberBuilder)\n .extend(erc20TransferAmount, erc20TransferAmountBuilder)\n .extend(erc20Streaming, erc20StreamingBuilder)\n .extend(nativeTokenStreaming, nativeTokenStreamingBuilder)\n .extend(erc721Transfer, erc721TransferBuilder)\n .extend(nativeTokenTransferAmount, nativeTokenTransferAmountBuilder)\n .extend(nativeBalanceChange, nativeBalanceChangeBuilder)\n .extend(redeemer, redeemerBuilder)\n .extend(nativeTokenPayment, nativeTokenPaymentBuilder)\n .extend(argsEqualityCheck, argsEqualityCheckBuilder)\n .extend(\n specificActionERC20TransferBatch,\n specificActionERC20TransferBatchBuilder,\n )\n .extend(erc20PeriodTransfer, erc20PeriodTransferBuilder)\n .extend(nativeTokenPeriodTransfer, nativeTokenPeriodTransferBuilder)\n .extend(exactCalldataBatch, exactCalldataBatchBuilder)\n .extend(exactCalldata, exactCalldataBuilder)\n .extend(exactExecution, exactExecutionBuilder)\n .extend(exactExecutionBatch, exactExecutionBatchBuilder)\n .extend(multiTokenPeriod, multiTokenPeriodBuilder)\n .extend(ownershipTransfer, ownershipTransferBuilder);\n\n return caveatBuilder;\n};\n","import type { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { Erc20PeriodTransferBuilderConfig } from '../erc20PeriodTransferBuilder';\n\nexport type Erc20PeriodicScopeConfig = {\n type: ScopeType.Erc20PeriodTransfer;\n} & Erc20PeriodTransferBuilderConfig;\n\n/**\n * Creates a caveat builder configured for ERC20 token periodic transfers with recurring limits.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing ERC20 periodic transfer parameters.\n * @returns A configured caveat builder with ERC20 period transfer and value limit caveats.\n * @throws Error if any of the ERC20 periodic transfer parameters are invalid.\n * @throws Error if the environment is not properly configured.\n */\nexport function createErc20PeriodicCaveatBuilder(\n environment: SmartAccountsEnvironment,\n config: Erc20PeriodicScopeConfig,\n): CoreCaveatBuilder {\n return createCaveatBuilder(environment)\n .addCaveat('valueLte', {\n maxValue: 0n,\n })\n .addCaveat('erc20PeriodTransfer', {\n tokenAddress: config.tokenAddress,\n periodAmount: config.periodAmount,\n periodDuration: config.periodDuration,\n startDate: config.startDate,\n });\n}\n","import type { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { Erc20StreamingBuilderConfig } from '../erc20StreamingBuilder';\n\nexport type Erc20StreamingScopeConfig = {\n type: ScopeType.Erc20Streaming;\n} & Erc20StreamingBuilderConfig;\n\n/**\n * Creates a caveat builder configured for ERC20 token streaming with time-based limits.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing ERC20 streaming parameters.\n * @returns A configured caveat builder with ERC20 streaming and value limit caveats.\n * @throws Error if any of the ERC20 streaming parameters are invalid.\n * @throws Error if the environment is not properly configured.\n */\nexport function createErc20StreamingCaveatBuilder(\n environment: SmartAccountsEnvironment,\n config: Erc20StreamingScopeConfig,\n): CoreCaveatBuilder {\n return createCaveatBuilder(environment)\n .addCaveat('valueLte', {\n maxValue: 0n,\n })\n .addCaveat('erc20Streaming', {\n tokenAddress: config.tokenAddress,\n initialAmount: config.initialAmount,\n maxAmount: config.maxAmount,\n amountPerSecond: config.amountPerSecond,\n startTime: config.startTime,\n });\n}\n","import type { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { Erc20TransferAmountBuilderConfig } from '../erc20TransferAmountBuilder';\n\nexport type Erc20TransferScopeConfig = {\n type: ScopeType.Erc20TransferAmount;\n} & Erc20TransferAmountBuilderConfig;\n\n/**\n * Creates a caveat builder configured for ERC20 token transfers with amount limits.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing ERC20 transfer parameters.\n * @returns A configured caveat builder with ERC20 transfer amount and value limit caveats.\n * @throws Error if any of the ERC20 transfer parameters are invalid.\n * @throws Error if the environment is not properly configured.\n */\nexport function createErc20TransferCaveatBuilder(\n environment: SmartAccountsEnvironment,\n config: Erc20TransferScopeConfig,\n): CoreCaveatBuilder {\n return createCaveatBuilder(environment)\n .addCaveat('valueLte', {\n maxValue: 0n,\n })\n .addCaveat('erc20TransferAmount', {\n tokenAddress: config.tokenAddress,\n maxAmount: config.maxAmount,\n });\n}\n","import { type Hex, isHex, toHex } from 'viem';\n\n/**\n * Utility function to check if an object has all specified properties defined and not undefined.\n *\n * @template TObject - The type of the object to check.\n * @template TKey - The keys of the properties to check for.\n * @param object - The object to check for the required properties.\n * @param properties - An array of property names to verify on the object.\n * @returns True if all specified properties exist on the object and are not undefined, otherwise false.\n */\nexport const hasProperties = <\n TObject extends Record<string, any>,\n TKey extends keyof TObject,\n>(\n object: TObject,\n properties: readonly TKey[],\n): object is TObject & Record<TKey, NonNullable<TObject[TKey]>> => {\n return properties.every(\n (prop) => prop in object && object[prop] !== undefined,\n );\n};\n\n/**\n * Checks if a value is defined (not null or undefined).\n *\n * @param value - The value to check.\n * @returns A boolean indicating whether the value is defined.\n */\nexport function isDefined<TValue>(\n value: TValue | null | undefined,\n): value is TValue {\n return value !== undefined && value !== null;\n}\n\n/**\n * Asserts that a value is defined (not null or undefined).\n *\n * @param value - The value to check.\n * @param parameterName - Optional: The name of the parameter that is being checked.\n * @throws {Error} If the value is null or undefined.\n */\nexport function assertIsDefined<TValue>(\n value: TValue | null | undefined,\n parameterName?: string,\n): asserts value is TValue {\n if (!isDefined(value)) {\n throw new Error(\n `Invalid parameters: ${parameterName ?? 'value'} is required`,\n );\n }\n}\n\n/**\n * Converts a value to a hex string or throws an error if the value is invalid.\n *\n * @param value - The value to convert to hex.\n * @param parameterName - Optional: The name of the parameter that is being converted to hex.\n * @returns The value as a hex string.\n */\nexport function toHexOrThrow(\n value: Parameters<typeof toHex>[0] | undefined,\n parameterName?: string,\n): Hex {\n assertIsDefined(value, parameterName);\n\n if (typeof value === 'string') {\n if (!isHex(value)) {\n throw new Error(\n `Invalid parameters: ${parameterName ?? 'value'} is not a valid hex value`,\n );\n }\n return value;\n }\n\n return toHex(value);\n}\n","import type { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport { hasProperties } from '../../utils';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { Erc721TransferBuilderConfig } from '../erc721TransferBuilder';\n\nexport type Erc721ScopeBaseConfig = {\n type: ScopeType.Erc721Transfer;\n};\n\nexport type Erc721ScopeConfig = Erc721ScopeBaseConfig &\n Erc721TransferBuilderConfig;\n\nconst isErc721TransferConfig = (\n config: Erc721ScopeBaseConfig,\n): config is Erc721TransferBuilderConfig & Erc721ScopeBaseConfig => {\n return hasProperties(\n config as Erc721TransferBuilderConfig & Erc721ScopeBaseConfig,\n ['tokenAddress', 'tokenId'],\n );\n};\n\n/**\n * Creates a caveat builder configured for ERC721 unit of authority.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing permitted contract and token ID.\n * @returns A configured caveat builder with the specified caveats.\n * @throws Error if any of the required parameters are invalid.\n */\nexport function createErc721CaveatBuilder(\n environment: SmartAccountsEnvironment,\n config: Erc721ScopeConfig,\n): CoreCaveatBuilder {\n if (!isErc721TransferConfig(config)) {\n throw new Error('Invalid ERC721 configuration');\n }\n\n const caveatBuilder = createCaveatBuilder(environment).addCaveat(\n 'erc721Transfer',\n config,\n );\n\n return caveatBuilder;\n}\n","import type { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport { hasProperties } from '../../utils';\nimport type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';\nimport type { AllowedMethodsBuilderConfig } from '../allowedMethodsBuilder';\nimport type { AllowedTargetsBuilderConfig } from '../allowedTargetsBuilder';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';\nimport type { ValueLteBuilderConfig } from '../valueLteBuilder';\n\ntype FunctionCallScopeBaseConfig = {\n type: ScopeType.FunctionCall;\n allowedCalldata?: AllowedCalldataBuilderConfig[];\n exactCalldata?: ExactCalldataBuilderConfig;\n valueLte?: ValueLteBuilderConfig;\n};\n\nexport type FunctionCallScopeConfig = FunctionCallScopeBaseConfig &\n AllowedTargetsBuilderConfig &\n AllowedMethodsBuilderConfig;\n\nconst isFunctionCallConfig = (\n config: FunctionCallScopeConfig,\n): config is FunctionCallScopeConfig => {\n return hasProperties(config, ['targets', 'selectors']);\n};\n\n/**\n * Creates a caveat builder configured for function call unit of authority.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing allowed targets, methods, and optionally calldata.\n * @returns A configured caveat builder with the specified caveats.\n * @throws Error if any of the required parameters are invalid.\n * @throws Error if both allowedCalldata and exactCalldata are provided simultaneously.\n */\nexport function createFunctionCallCaveatBuilder(\n environment: SmartAccountsEnvironment,\n config: FunctionCallScopeConfig,\n): CoreCaveatBuilder {\n const { targets, selectors, allowedCalldata, exactCalldata } = config;\n\n if (!isFunctionCallConfig(config)) {\n throw new Error('Invalid Function Call configuration');\n }\n\n if (allowedCalldata && allowedCalldata.length > 0 && exactCalldata) {\n throw new Error(\n 'Cannot specify both allowedCalldata and exactCalldata. Please use only one calldata restriction type.',\n );\n }\n\n const valueLteConfig = config.valueLte ?? { maxValue: 0n };\n\n const caveatBuilder = createCaveatBuilder(environment)\n .addCaveat('allowedTargets', { targets })\n .addCaveat('allowedMethods', { selectors })\n .addCaveat('valueLte', valueLteConfig);\n\n if (allowedCalldata && allowedCalldata.length > 0) {\n allowedCalldata.forEach((calldataConfig) => {\n caveatBuilder.addCaveat('allowedCalldata', calldataConfig);\n });\n } else if (exactCalldata) {\n caveatBuilder.addCaveat('exactCalldata', exactCalldata);\n }\n\n return caveatBuilder;\n}\n","import type { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';\nimport type { NativeTokenPeriodTransferBuilderConfig } from '../nativeTokenPeriodTransferBuilder';\n\nexport type NativeTokenPeriodicScopeConfig = {\n type: ScopeType.NativeTokenPeriodTransfer;\n allowedCalldata?: AllowedCalldataBuilderConfig[];\n exactCalldata?: ExactCalldataBuilderConfig;\n} & NativeTokenPeriodTransferBuilderConfig;\n\n/**\n * Creates a caveat builder configured for native token periodic transfers with recurring limits.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing native token periodic transfer parameters.\n * @returns A configured caveat builder with native token period transfer and exact calldata caveats.\n * @throws Error if any of the native token periodic transfer parameters are invalid.\n * @throws Error if both allowedCalldata and exactCalldata are provided simultaneously.\n * @throws Error if the environment is not properly configured.\n */\nexport function createNativeTokenPeriodicCaveatBuilder(\n environment: SmartAccountsEnvironment,\n config: NativeTokenPeriodicScopeConfig,\n): CoreCaveatBuilder {\n const {\n periodAmount,\n periodDuration,\n startDate,\n allowedCalldata,\n exactCalldata,\n } = config;\n\n if (allowedCalldata && allowedCalldata.length > 0 && exactCalldata) {\n throw new Error(\n 'Cannot specify both allowedCalldata and exactCalldata. Please use only one calldata restriction type.',\n );\n }\n\n const caveatBuilder = createCaveatBuilder(environment);\n\n // Add calldata restrictions\n if (allowedCalldata && allowedCalldata.length > 0) {\n allowedCalldata.forEach((calldataConfig) => {\n caveatBuilder.addCaveat('allowedCalldata', calldataConfig);\n });\n } else if (exactCalldata) {\n caveatBuilder.addCaveat('exactCalldata', exactCalldata);\n } else {\n // Default behavior: only allow empty calldata\n caveatBuilder.addCaveat('exactCalldata', {\n calldata: '0x',\n });\n }\n\n // Add native token period transfer restriction\n caveatBuilder.addCaveat('nativeTokenPeriodTransfer', {\n periodAmount,\n periodDuration,\n startDate,\n });\n\n return caveatBuilder;\n}\n","import type { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';\nimport type { NativeTokenStreamingBuilderConfig } from '../nativeTokenStreamingBuilder';\n\nexport type NativeTokenStreamingScopeConfig = {\n type: ScopeType.NativeTokenStreaming;\n allowedCalldata?: AllowedCalldataBuilderConfig[];\n exactCalldata?: ExactCalldataBuilderConfig;\n} & NativeTokenStreamingBuilderConfig;\n\n/**\n * Creates a caveat builder configured for native token streaming with time-based limits.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing native token streaming parameters.\n * @returns A configured caveat builder with native token streaming and exact calldata caveats.\n * @throws Error if any of the native token streaming parameters are invalid.\n * @throws Error if both allowedCalldata and exactCalldata are provided simultaneously.\n * @throws Error if the environment is not properly configured.\n */\nexport function createNativeTokenStreamingCaveatBuilder(\n environment: SmartAccountsEnvironment,\n config: NativeTokenStreamingScopeConfig,\n): CoreCaveatBuilder {\n const {\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTime,\n allowedCalldata,\n exactCalldata,\n } = config;\n\n if (allowedCalldata && allowedCalldata.length > 0 && exactCalldata) {\n throw new Error(\n 'Cannot specify both allowedCalldata and exactCalldata. Please use only one calldata restriction type.',\n );\n }\n\n const caveatBuilder = createCaveatBuilder(environment);\n\n // Add calldata restrictions\n if (allowedCalldata && allowedCalldata.length > 0) {\n allowedCalldata.forEach((calldataConfig) => {\n caveatBuilder.addCaveat('allowedCalldata', calldataConfig);\n });\n } else if (exactCalldata) {\n caveatBuilder.addCaveat('exactCalldata', exactCalldata);\n } else {\n // Default behavior: only allow empty calldata\n caveatBuilder.addCaveat('exactCalldata', {\n calldata: '0x',\n });\n }\n\n // Add native token streaming restriction\n caveatBuilder.addCaveat('nativeTokenStreaming', {\n initialAmount,\n maxAmount,\n amountPerSecond,\n startTime,\n });\n\n return caveatBuilder;\n}\n","import type { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';\nimport type { NativeTokenTransferAmountBuilderConfig } from '../nativeTokenTransferAmountBuilder';\n\nexport type NativeTokenTransferScopeConfig = {\n type: ScopeType.NativeTokenTransferAmount;\n allowedCalldata?: AllowedCalldataBuilderConfig[];\n exactCalldata?: ExactCalldataBuilderConfig;\n} & NativeTokenTransferAmountBuilderConfig;\n\n/**\n * Creates a caveat builder configured for native token transfers with amount limits.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing native token transfer parameters.\n * @returns A configured caveat builder with native token transfer amount and exact calldata caveats.\n * @throws Error if any of the native token transfer parameters are invalid.\n * @throws Error if both allowedCalldata and exactCalldata are provided simultaneously.\n * @throws Error if the environment is not properly configured.\n */\nexport function createNativeTokenTransferCaveatBuilder(\n environment: SmartAccountsEnvironment,\n config: NativeTokenTransferScopeConfig,\n): CoreCaveatBuilder {\n const { maxAmount, allowedCalldata, exactCalldata } = config;\n\n if (allowedCalldata && allowedCalldata.length > 0 && exactCalldata) {\n throw new Error(\n 'Cannot specify both allowedCalldata and exactCalldata. Please use only one calldata restriction type.',\n );\n }\n\n const caveatBuilder = createCaveatBuilder(environment);\n\n // Add calldata restrictions\n if (allowedCalldata && allowedCalldata.length > 0) {\n allowedCalldata.forEach((calldataConfig) => {\n caveatBuilder.addCaveat('allowedCalldata', calldataConfig);\n });\n } else if (exactCalldata) {\n caveatBuilder.addCaveat('exactCalldata', exactCalldata);\n } else {\n // Default behavior: only allow empty calldata\n caveatBuilder.addCaveat('exactCalldata', {\n calldata: '0x',\n });\n }\n\n // Add native token transfer amount restriction\n caveatBuilder.addCaveat('nativeTokenTransferAmount', {\n maxAmount,\n });\n\n return caveatBuilder;\n}\n","import type { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport { hasProperties } from '../../utils';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { OwnershipTransferBuilderConfig } from '../ownershipTransferBuilder';\n\ntype OwnershipScopeBaseConfig = {\n type: ScopeType.OwnershipTransfer;\n};\n\nexport type OwnershipScopeConfig = OwnershipScopeBaseConfig &\n OwnershipTransferBuilderConfig;\n\nconst isOwnershipTransferConfig = (\n config: OwnershipScopeConfig,\n): config is OwnershipTransferBuilderConfig & OwnershipScopeBaseConfig => {\n return hasProperties(\n config as OwnershipTransferBuilderConfig & OwnershipScopeBaseConfig,\n ['contractAddress'],\n );\n};\n\n/**\n * Creates a caveat builder configured for ownership transfer unit of authority.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @param config - Configuration object containing the target contract.\n * @returns A configured caveat builder with the specified caveats.\n * @throws Error if any of the required parameters are invalid.\n */\nexport function createOwnershipCaveatBuilder(\n environment: SmartAccountsEnvironment,\n config: OwnershipScopeConfig,\n): CoreCaveatBuilder {\n if (!isOwnershipTransferConfig(config)) {\n throw new Error('Invalid ownership transfer configuration');\n }\n\n const caveatBuilder = createCaveatBuilder(environment).addCaveat(\n 'ownershipTransfer',\n config,\n );\n\n return caveatBuilder;\n}\n","import {\n type Erc20PeriodicScopeConfig,\n createErc20PeriodicCaveatBuilder,\n} from './erc20PeriodicScope';\nimport {\n type Erc20StreamingScopeConfig,\n createErc20StreamingCaveatBuilder,\n} from './erc20StreamingScope';\nimport {\n type Erc20TransferScopeConfig,\n createErc20TransferCaveatBuilder,\n} from './erc20TransferScope';\nimport {\n type Erc721ScopeConfig,\n createErc721CaveatBuilder,\n} from './erc721Scope';\nimport {\n createFunctionCallCaveatBuilder,\n type FunctionCallScopeConfig,\n} from './functionCallScope';\nimport {\n type NativeTokenPeriodicScopeConfig,\n createNativeTokenPeriodicCaveatBuilder,\n} from './nativeTokenPeriodicScope';\nimport {\n type NativeTokenStreamingScopeConfig,\n createNativeTokenStreamingCaveatBuilder,\n} from './nativeTokenStreamingScope';\nimport {\n type NativeTokenTransferScopeConfig,\n createNativeTokenTransferCaveatBuilder,\n} from './nativeTokenTransferScope';\nimport {\n createOwnershipCaveatBuilder,\n type OwnershipScopeConfig,\n} from './ownershipScope';\nimport { ScopeType } from '../../constants';\nimport type { SmartAccountsEnvironment } from '../../types';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\n\n// We want to allow the scope `type` to be passed as either an enum reference,\n// or the enum's string value this generic accepts a union of scope configs, and\n// converts them to an identical union except the `type` parameter is converted\n// to a union of `ScopeType.XXXX | `${ScopeType.XXXX}`.\nexport type ConvertScopeConfigsToInputs<T extends { type: ScopeType }> =\n T extends { type: ScopeType }\n ? Omit<T, 'type'> & { type: T['type'] | `${T['type']}` }\n : never;\n\ntype ScopeConfigBase =\n | Erc20TransferScopeConfig\n | Erc20StreamingScopeConfig\n | Erc20PeriodicScopeConfig\n | NativeTokenTransferScopeConfig\n | NativeTokenStreamingScopeConfig\n | NativeTokenPeriodicScopeConfig\n | Erc721ScopeConfig\n | OwnershipScopeConfig\n | FunctionCallScopeConfig;\n\nexport type ScopeConfig = ConvertScopeConfigsToInputs<ScopeConfigBase>;\n\nconst normalizeScopeConfig = (config: ScopeConfig): ScopeConfigBase => {\n return {\n ...config,\n type: config.type as ScopeType,\n } as ScopeConfigBase;\n};\n\nexport const createCaveatBuilderFromScope = (\n environment: SmartAccountsEnvironment,\n scopeConfig: ScopeConfig,\n): CoreCaveatBuilder => {\n const normalizedScopeConfig = normalizeScopeConfig(scopeConfig);\n\n switch (normalizedScopeConfig.type) {\n case ScopeType.Erc20TransferAmount:\n return createErc20TransferCaveatBuilder(\n environment,\n normalizedScopeConfig,\n );\n case ScopeType.Erc20Streaming:\n return createErc20StreamingCaveatBuilder(\n environment,\n normalizedScopeConfig,\n );\n case ScopeType.Erc20PeriodTransfer:\n return createErc20PeriodicCaveatBuilder(\n environment,\n normalizedScopeConfig,\n );\n case ScopeType.NativeTokenTransferAmount:\n return createNativeTokenTransferCaveatBuilder(\n environment,\n normalizedScopeConfig,\n );\n case ScopeType.NativeTokenStreaming:\n return createNativeTokenStreamingCaveatBuilder(\n environment,\n normalizedScopeConfig,\n );\n case ScopeType.NativeTokenPeriodTransfer:\n return createNativeTokenPeriodicCaveatBuilder(\n environment,\n normalizedScopeConfig,\n );\n case ScopeType.Erc721Transfer:\n return createErc721CaveatBuilder(environment, normalizedScopeConfig);\n case ScopeType.OwnershipTransfer:\n return createOwnershipCaveatBuilder(environment, normalizedScopeConfig);\n case ScopeType.FunctionCall:\n return createFunctionCallCaveatBuilder(\n environment,\n normalizedScopeConfig,\n );\n default:\n // eslint-disable-next-line no-case-declarations\n const exhaustivenessCheck: never = normalizedScopeConfig;\n throw new Error(\n `Invalid scope type: ${(exhaustivenessCheck as { type: string }).type}`,\n );\n }\n};\n","import type { CaveatBuilder } from './caveatBuilder';\nimport type { CoreCaveatConfiguration } from './coreCaveatBuilder';\nimport { createCaveatBuilderFromScope, type ScopeConfig } from './scope';\nimport type { Caveat, SmartAccountsEnvironment } from '../types';\n\nexport type Caveats = CaveatBuilder | (Caveat | CoreCaveatConfiguration)[];\n\n/**\n * Resolves the array of Caveat from a Caveats argument.\n *\n * @param config - The configuration for the caveat builder.\n * @param config.environment - The environment to be used for the caveat builder.\n * @param config.scope - The scope to be used for the caveat builder.\n * @param config.caveats - The caveats to be resolved, which can be either a CaveatBuilder or an array of Caveat or CaveatConfiguration. Optional - if not provided, only scope caveats will be used.\n * @returns The resolved array of caveats.\n */\nexport const resolveCaveats = ({\n environment,\n scope,\n caveats,\n}: {\n environment: SmartAccountsEnvironment;\n scope: ScopeConfig;\n caveats?: Caveats;\n}) => {\n const scopeCaveatBuilder = createCaveatBuilderFromScope(environment, scope);\n\n if (caveats) {\n if ('build' in caveats && typeof caveats.build === 'function') {\n (caveats as CaveatBuilder).build().forEach((caveat) => {\n scopeCaveatBuilder.addCaveat(caveat);\n });\n } else if (Array.isArray(caveats)) {\n caveats.forEach((caveat) => {\n try {\n if ('type' in caveat) {\n const { type, ...config } = caveat;\n scopeCaveatBuilder.addCaveat(type, config);\n } else {\n scopeCaveatBuilder.addCaveat(caveat);\n }\n } catch (error) {\n throw new Error(`Invalid caveat: ${(error as Error).message}`);\n }\n });\n }\n }\n\n return scopeCaveatBuilder.build();\n};\n","import {\n type Hex,\n encodeAbiParameters,\n parseAbiParameters,\n keccak256,\n toHex,\n} from 'viem';\n\nimport type { Caveat } from './types';\n\nexport const CAVEAT_ABI_TYPE_COMPONENTS = [\n { type: 'address', name: 'enforcer' },\n { type: 'bytes', name: 'terms' },\n { type: 'bytes', name: 'args' },\n];\n\nexport const CAVEAT_TYPEHASH: Hex = keccak256(\n toHex('Caveat(address enforcer,bytes terms)'),\n);\n\n/**\n * Calculates the hash of a single Caveat.\n *\n * @param input - The Caveat data.\n * @returns The keccak256 hash of the encoded Caveat packet.\n */\nexport const getCaveatPacketHash = (input: Caveat): Hex => {\n const encoded = encodeAbiParameters(\n parseAbiParameters('bytes32, address, bytes32'),\n [CAVEAT_TYPEHASH, input.enforcer, keccak256(input.terms)],\n );\n return keccak256(encoded);\n};\n\n/**\n * Creates a caveat.\n *\n * @param enforcer - The contract that guarantees the caveat is upheld.\n * @param terms - The data that the enforcer will use to verify the caveat (unique per enforcer).\n * @param args - Additional arguments for the caveat (optional).\n * @returns A Caveat.\n */\nexport const createCaveat = (\n enforcer: Hex,\n terms: Hex,\n args: Hex = '0x00',\n): Caveat => ({\n enforcer,\n terms,\n args,\n});\n","import {\n encodeDelegations as encodeDelegationsCore,\n decodeDelegations as decodeDelegationsCore,\n encodeDelegation as encodeDelegationCore,\n decodeDelegation as decodeDelegationCore,\n hashDelegation as hashDelegationCore,\n ANY_BENEFICIARY,\n DELEGATION_TYPEHASH,\n CAVEAT_TYPEHASH,\n ROOT_AUTHORITY,\n} from '@metamask/delegation-core';\nimport { toHex, getAddress, isHex } from 'viem';\nimport type { TypedData, AbiParameter, Address, Hex } from 'viem';\nimport { signTypedData } from 'viem/accounts';\n\nimport { type Caveats, resolveCaveats } from './caveatBuilder';\nimport type { ScopeConfig } from './caveatBuilder/scope';\nimport { CAVEAT_ABI_TYPE_COMPONENTS } from './caveats';\nimport type {\n Delegation,\n PermissionContext,\n SmartAccountsEnvironment,\n} from './types';\n\nexport {\n ANY_BENEFICIARY,\n DELEGATION_TYPEHASH,\n CAVEAT_TYPEHASH,\n ROOT_AUTHORITY,\n};\n\n/**\n * The ABI type components of a Delegation.\n */\nexport const DELEGATION_ABI_TYPE_COMPONENTS = [\n { type: 'address', name: 'delegate' },\n { type: 'address', name: 'delegator' },\n { type: 'bytes32', name: 'authority' },\n { type: 'tuple[]', name: 'caveats', components: CAVEAT_ABI_TYPE_COMPONENTS },\n { type: 'uint256', name: 'salt' },\n { type: 'bytes', name: 'signature' },\n];\n\n/**\n * Converts a delegation to a delegation struct.\n *\n * @param delegation - The delegation to convert.\n * @returns The delegation struct.\n */\nexport const toDelegationStruct = (\n delegation: Delegation,\n): DelegationStruct => {\n const caveats = delegation.caveats.map((caveat) => ({\n enforcer: getAddress(caveat.enforcer),\n terms: caveat.terms,\n args: caveat.args,\n }));\n\n // this is not strictly necessary anymore, as we default the salt to 0x00 but\n // leaving in to maintain backwards compatibility\n const salt = delegation.salt === '0x' ? 0n : BigInt(delegation.salt);\n\n return {\n delegate: getAddress(delegation.delegate),\n delegator: getAddress(delegation.delegator),\n authority: delegation.authority ?? ROOT_AUTHORITY,\n caveats,\n salt,\n signature: delegation.signature,\n };\n};\n\n/**\n * Converts a DelegationStruct to a Delegation.\n * The Delegation type is used for off-chain operations and has a hex string salt.\n *\n * @param delegationStruct - The delegation struct to convert\n * @returns The converted delegation with a hex string salt\n */\n\nexport const toDelegation = (\n delegationStruct: DelegationStruct,\n): Delegation => {\n return {\n ...delegationStruct,\n salt: toHex(delegationStruct.salt),\n };\n};\n\n/**\n * Represents a DelegationStruct as defined in the Delegation Framework.\n * This is distinguished from the Delegation type by requiring the salt to be a bigint\n * instead of a Hex string, which is useful for on-chain operations and EIP-712 signing.\n */\nexport type DelegationStruct = Omit<Delegation, 'salt'> & {\n salt: bigint;\n};\n\n/**\n * ABI Encodes an array of delegations.\n *\n * @param delegations - The delegations to encode, either as an array of delegations or the ABI encoding of the array of delegations.\n * @returns The encoded delegations.\n */\nexport const encodeDelegations = (delegations: PermissionContext): Hex => {\n if (Array.isArray(delegations)) {\n const delegationStructs = delegations.map(toDelegationStruct);\n\n return encodeDelegationsCore(delegationStructs);\n }\n\n if (isHex(delegations)) {\n return delegations;\n }\n\n throw new Error(\n 'Invalid delegations - must be an array of delegations or a hex string',\n );\n};\n\n/**\n * ABI Encodes a single delegation.\n *\n * @param delegation - The delegation to encode.\n * @returns The encoded delegation.\n */\nexport const encodeDelegation = (delegation: Delegation): Hex => {\n const delegationStruct = toDelegationStruct(delegation);\n\n return encodeDelegationCore(delegationStruct);\n};\n\n/**\n * Decodes an array of delegations from its ABI-encoded representation.\n *\n * @param delegations - The delegations to decode, either as an array of delegations or its ABI-encoded hex representation.\n * @returns An array of decoded delegations.\n */\nexport const decodeDelegations = (\n delegations: PermissionContext,\n): Delegation[] => {\n if (Array.isArray(delegations)) {\n return delegations;\n }\n\n if (isHex(delegations)) {\n return decodeDelegationsCore(delegations).map(toDelegation);\n }\n\n throw new Error(\n 'Invalid delegations - must be an array of delegations or a hex string',\n );\n};\n\n/**\n * Decodes a single delegation from its ABI-encoded representation.\n *\n * @param encoded - The hex-encoded delegation to decode.\n * @returns The decoded delegation.\n */\nexport const decodeDelegation = (encoded: Hex): Delegation => {\n // decodeDelegationCore returns DelegationStruct, so we need to map it back to Delegation\n return toDelegation(decodeDelegationCore(encoded));\n};\n\n/**\n * TypedData to be used when signing a Delegation. Delegation value for `signature` and Caveat values for `args` are omitted as they cannot be known at signing time.\n */\nexport const SIGNABLE_DELEGATION_TYPED_DATA: TypedData = {\n Caveat: [\n { name: 'enforcer', type: 'address' },\n { name: 'terms', type: 'bytes' },\n ],\n Delegation: [\n { name: 'delegate', type: 'address' },\n { name: 'delegator', type: 'address' },\n { name: 'authority', type: 'bytes32' },\n { name: 'caveats', type: 'Caveat[]' },\n { name: 'salt', type: 'uint256' },\n ],\n} as const;\n\n/**\n * The ABI type for a full delegation.\n */\nexport const DELEGATION_ARRAY_ABI_TYPE: AbiParameter = {\n type: 'tuple[]',\n components: DELEGATION_ABI_TYPE_COMPONENTS,\n} as const;\n\n/**\n * The ABI type for a single delegation.\n */\nexport const DELEGATION_ABI_TYPE: AbiParameter = {\n type: 'tuple',\n components: DELEGATION_ABI_TYPE_COMPONENTS,\n} as const;\n\n/**\n * Gets a delegation hash offchain.\n *\n * @param input - The delegation to get the hash for.\n * @returns The hash of the delegation parameters.\n */\nexport const hashDelegation = (input: Delegation): Hex => {\n const delegationStruct = toDelegationStruct(input);\n\n return hashDelegationCore(delegationStruct);\n};\n\ntype BaseCreateDelegationOptions = {\n environment: SmartAccountsEnvironment;\n scope: ScopeConfig;\n from: Hex;\n caveats?: Caveats;\n parentDelegation?: Delegation | Hex;\n salt?: Hex;\n};\n\n/**\n * Options for creating a specific delegation\n */\nexport type CreateDelegationOptions = BaseCreateDelegationOptions & {\n to: Hex;\n};\n\n/**\n * Options for creating an open delegation\n */\nexport type CreateOpenDelegationOptions = BaseCreateDelegationOptions;\n\n/**\n * Resolves the authority for a delegation based on the parent delegation.\n *\n * @param parentDelegation - The parent delegation or its hash.\n * @returns The resolved authority hash.\n */\nexport const resolveAuthority = (parentDelegation?: Delegation | Hex): Hex => {\n if (!parentDelegation) {\n return ROOT_AUTHORITY;\n }\n\n if (typeof parentDelegation === 'string') {\n return parentDelegation;\n }\n\n return hashDelegation(parentDelegation);\n};\n\n/**\n * Creates a delegation with specific delegate.\n *\n * @param options - The options for creating the delegation.\n * @returns The created delegation data structure.\n */\nexport const createDelegation = (\n options: CreateDelegationOptions,\n): Delegation => {\n return {\n delegate: options.to,\n delegator: options.from,\n authority: resolveAuthority(options.parentDelegation),\n caveats: resolveCaveats(options),\n salt: options.salt ?? '0x00',\n signature: '0x',\n };\n};\n\n/**\n * Creates an open delegation that can be redeemed by any delegate.\n *\n * @param options - The options for creating the open delegation.\n * @returns The created delegation data structure.\n */\nexport const createOpenDelegation = (\n options: CreateOpenDelegationOptions,\n): Delegation => {\n return {\n delegate: ANY_BENEFICIARY,\n delegator: options.from,\n authority: resolveAuthority(options.parentDelegation),\n caveats: resolveCaveats(options),\n salt: options.salt ?? '0x00',\n signature: '0x',\n };\n};\n\n/**\n * Prepares typed data for delegation signing (internal helper function).\n *\n * @param params - The parameters for preparing the typed data.\n * @param params.delegation - The delegation to prepare for signing.\n * @param params.delegationManager - The address of the delegation manager contract.\n * @param params.chainId - The chain ID for the signature.\n * @param params.name - The name of the contract.\n * @param params.version - The version of the contract.\n * @param params.allowInsecureUnrestrictedDelegation - Whether to allow insecure unrestricted delegation.\n * @returns The typed data parameters ready for signing.\n * @internal\n */\nexport const prepareSignDelegationTypedData = ({\n delegation,\n delegationManager,\n chainId,\n name = 'DelegationManager',\n version = '1',\n allowInsecureUnrestrictedDelegation = false,\n}: {\n delegation: Omit<Delegation, 'signature'>;\n delegationManager: Address;\n chainId: number;\n name?: string;\n version?: string;\n allowInsecureUnrestrictedDelegation?: boolean;\n}) => {\n const delegationStruct = toDelegationStruct({\n ...delegation,\n signature: '0x',\n });\n\n if (\n delegationStruct.caveats.length === 0 &&\n !allowInsecureUnrestrictedDelegation\n ) {\n throw new Error(\n 'No caveats found. If you definitely want to sign a delegation without caveats, set `allowInsecureUnrestrictedDelegation` to `true`.',\n );\n }\n\n return {\n domain: {\n chainId,\n name,\n version,\n verifyingContract: delegationManager,\n },\n types: SIGNABLE_DELEGATION_TYPED_DATA,\n primaryType: 'Delegation' as const,\n message: delegationStruct,\n };\n};\n\n/**\n * Signs a delegation using a private key.\n *\n * @param params - The parameters for signing the delegation.\n * @param params.privateKey - The private key to use for signing.\n * @param params.delegation - The delegation to sign.\n * @param params.delegationManager - The address of the delegation manager contract.\n * @param params.chainId - The chain ID for the signature.\n * @param params.name - The name of the contract.\n * @param params.version - The version of the contract.\n * @param params.allowInsecureUnrestrictedDelegation - Whether to allow insecure unrestricted delegation.\n * @returns The signed delegation.\n */\nexport const signDelegation = async ({\n privateKey,\n delegation,\n delegationManager,\n chainId,\n name = 'DelegationManager',\n version = '1',\n allowInsecureUnrestrictedDelegation = false,\n}: {\n privateKey: Hex;\n delegation: Omit<Delegation, 'signature'>;\n delegationManager: Address;\n chainId: number;\n name?: string;\n version?: string;\n allowInsecureUnrestrictedDelegation?: boolean;\n}) => {\n const typedData = prepareSignDelegationTypedData({\n delegation,\n delegationManager,\n chainId,\n name,\n version,\n allowInsecureUnrestrictedDelegation,\n });\n\n return signTypedData({\n privateKey,\n ...typedData,\n });\n};\n"],"mappings":"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","names":["Implementation","TransferWindow","ScopeType","CaveatType","BalanceChangeType","isHex","isAddress","isHex","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isAddress","isHex","allowedCalldata","exactCalldata","allowedCalldata","exactCalldata","allowedCalldata","exactCalldata","allowedCalldata","exactCalldata","toHex","CAVEAT_TYPEHASH","toHex","isHex","toHex","isHex"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/actions/index.ts","../src/actions/erc7710RedeemDelegationAction.ts","../src/actions/erc7715Mapping.ts","../src/actions/erc7715GetGrantedExecutionPermissionsAction.ts","../src/actions/erc7715GetSupportedExecutionPermissionsAction.ts","../src/actions/erc7715RequestExecutionPermissionsAction.ts","../src/actions/getCaveatAvailableAmount.ts","../src/actions/isValid7702Implementation.ts","../src/actions/signDelegation.ts","../src/actions/signUserOperation.ts"],"sourcesContent":["import type { Client, WalletClient } from 'viem';\nimport type { BundlerClient } from 'viem/account-abstraction';\n\nimport type {\n SendTransactionWithDelegationParameters,\n SendUserOperationWithDelegationParameters,\n} from './erc7710RedeemDelegationAction';\nimport {\n sendTransactionWithDelegationAction,\n sendUserOperationWithDelegationAction,\n} from './erc7710RedeemDelegationAction';\nimport { erc7715GetGrantedExecutionPermissionsAction } from './erc7715GetGrantedExecutionPermissionsAction';\nimport { erc7715GetSupportedExecutionPermissionsAction } from './erc7715GetSupportedExecutionPermissionsAction';\nimport { erc7715RequestExecutionPermissionsAction } from './erc7715RequestExecutionPermissionsAction';\nimport type {\n MetaMaskExtensionClient,\n RequestExecutionPermissionsParameters,\n} from './erc7715RequestExecutionPermissionsAction';\n\nexport {\n // Individual action functions\n getErc20PeriodTransferEnforcerAvailableAmount,\n getErc20StreamingEnforcerAvailableAmount,\n getMultiTokenPeriodEnforcerAvailableAmount,\n getNativeTokenPeriodTransferEnforcerAvailableAmount,\n getNativeTokenStreamingEnforcerAvailableAmount,\n // Action builder\n caveatEnforcerActions,\n // Parameter types\n type CaveatEnforcerParams,\n // Result types\n type PeriodTransferResult,\n type StreamingResult,\n} from './getCaveatAvailableAmount';\n\nexport { isValid7702Implementation } from './isValid7702Implementation';\n\n// Signing actions\nexport {\n signDelegation,\n signDelegationActions,\n type SignDelegationParameters,\n type SignDelegationReturnType,\n} from './signDelegation';\n\nexport {\n signUserOperation,\n signUserOperationActions,\n type SignUserOperationParameters,\n type SignUserOperationReturnType,\n} from './signUserOperation';\n\nexport {\n erc7715RequestExecutionPermissionsAction as requestExecutionPermissions,\n type MetaMaskExtensionClient,\n type MetaMaskExtensionSchema,\n type RequestExecutionPermissionsParameters,\n type RequestExecutionPermissionsReturnType,\n} from './erc7715RequestExecutionPermissionsAction';\n\nexport type { PermissionRequestParameter } from './erc7715Types';\n\nexport { erc7715GetSupportedExecutionPermissionsAction as getSupportedExecutionPermissions } from './erc7715GetSupportedExecutionPermissionsAction';\n\nexport { erc7715GetGrantedExecutionPermissionsAction as getGrantedExecutionPermissions } from './erc7715GetGrantedExecutionPermissionsAction';\n\nexport {\n type GetSupportedExecutionPermissionsResult,\n type GetGrantedExecutionPermissionsResult,\n type SupportedPermissionInfo,\n type PermissionTypes,\n type NativeTokenStreamPermission,\n type NativeTokenPeriodicPermission,\n type Erc20TokenStreamPermission,\n type Erc20TokenPeriodicPermission,\n type Erc20TokenRevocationPermission,\n type RpcGetSupportedExecutionPermissionsResult,\n type RpcGetGrantedExecutionPermissionsResult,\n type RpcSupportedPermissionInfo,\n} from './erc7715Types';\n\nexport type { DelegatedCall } from './erc7710RedeemDelegationAction';\n\nexport const erc7715ProviderActions = () => (client: Client) => ({\n requestExecutionPermissions: async (\n parameters: RequestExecutionPermissionsParameters,\n ) => {\n return erc7715RequestExecutionPermissionsAction(\n client as MetaMaskExtensionClient,\n parameters,\n );\n },\n getSupportedExecutionPermissions: async () => {\n return erc7715GetSupportedExecutionPermissionsAction(\n client as MetaMaskExtensionClient,\n );\n },\n getGrantedExecutionPermissions: async () => {\n return erc7715GetGrantedExecutionPermissionsAction(\n client as MetaMaskExtensionClient,\n );\n },\n});\n\n/**\n * Type for a viem Client extended with ERC-7715 provider actions.\n * Use this to type variables that will be assigned an extended client later.\n *\n * @example\n * ```typescript\n * let client: Erc7715Client | null = null;\n *\n * function setupClient() {\n * client = createWalletClient({\n * chain: sepolia,\n * transport: custom(window.ethereum),\n * }).extend(erc7715ProviderActions());\n * }\n * ```\n */\nexport type Erc7715Client = Client &\n ReturnType<ReturnType<typeof erc7715ProviderActions>>;\n\nexport const erc7710WalletActions = () => (client: WalletClient) => ({\n sendTransactionWithDelegation: async (\n args: SendTransactionWithDelegationParameters,\n ) => sendTransactionWithDelegationAction(client, args),\n});\n\nexport const erc7710BundlerActions = () => (client: Client) => ({\n sendUserOperationWithDelegation: async (\n args: SendUserOperationWithDelegationParameters,\n ) => sendUserOperationWithDelegationAction(client as BundlerClient, args),\n});\n","import { DelegationManager } from '@metamask/delegation-abis';\nimport type {\n Account,\n Chain,\n Hex,\n OneOf,\n PublicClient,\n SendTransactionParameters,\n SendTransactionRequest,\n Transport,\n WalletClient,\n} from 'viem';\nimport { concat, encodeFunctionData, isAddressEqual } from 'viem';\nimport type {\n BundlerClient,\n SendUserOperationParameters,\n SmartAccount,\n} from 'viem/account-abstraction';\n\nimport { encodeDelegations } from '../delegation';\nimport {\n createExecution,\n encodeExecutionCalldatas,\n ExecutionMode,\n} from '../executions';\nimport { getSmartAccountsEnvironment } from '../smartAccountsEnvironment';\nimport type { Call, PermissionContext } from '../types';\n\nexport type DelegatedCall = Call &\n OneOf<\n { permissionContext: PermissionContext; delegationManager: Hex } | object\n >;\n\nexport type SendTransactionWithDelegationParameters<\n TChain extends Chain | undefined = Chain | undefined,\n TAccount extends Account | undefined = Account | undefined,\n TChainOverride extends Chain | undefined = Chain | undefined,\n TRequest extends SendTransactionRequest<TChain, TChainOverride> =\n SendTransactionRequest<TChain, TChainOverride>,\n> = SendTransactionParameters<TChain, TAccount, TChainOverride, TRequest> & {\n permissionContext: PermissionContext;\n delegationManager: Hex;\n};\n\n/**\n * Sends a transaction using delegation to execute operations on behalf of another account.\n *\n * @param client - The wallet client to use for sending the transaction.\n * @param args - Transaction parameters with delegation details.\n * @returns Transaction hash of the executed transaction.\n */\nexport async function sendTransactionWithDelegationAction<\n TChain extends Chain | undefined,\n TAccount extends Account | undefined,\n>(\n client: WalletClient<Transport, TChain, TAccount>,\n args: SendTransactionWithDelegationParameters<TChain, TAccount>,\n) {\n if (!args.to) {\n throw new Error(\n '`to` is required. `sendTransactionWithDelegation` cannot be used to deploy contracts.',\n );\n }\n\n // Validate DelegationManager address\n const chainId = client.chain?.id;\n if (!chainId) {\n throw new Error('Chain ID is not set');\n }\n\n const { DelegationManager: expectedDelegationManager } =\n getSmartAccountsEnvironment(chainId);\n if (!isAddressEqual(args.delegationManager, expectedDelegationManager)) {\n throw new Error(\n `Invalid DelegationManager: expected ${expectedDelegationManager} for chain ${chainId}, but got ${args.delegationManager}`,\n );\n }\n\n const executions = [\n createExecution({\n target: args.to,\n value: args.value,\n callData: args.data,\n }),\n ];\n\n const calldata = encodeFunctionData({\n abi: DelegationManager,\n functionName: 'redeemDelegations',\n args: [\n [encodeDelegations(args.permissionContext)],\n [ExecutionMode.SingleDefault],\n encodeExecutionCalldatas([executions]),\n ],\n });\n\n const {\n value: _value,\n permissionContext: _permissionContext,\n delegationManager: _delegationManager,\n ...rest\n } = args;\n\n const hash = await client.sendTransaction({\n ...rest,\n to: args.delegationManager,\n data: calldata,\n } as unknown as SendTransactionParameters);\n\n return hash;\n}\n\nexport type SendUserOperationWithDelegationParameters<\n TAccount extends SmartAccount | undefined = SmartAccount | undefined,\n TAccountOverride extends SmartAccount | undefined = SmartAccount | undefined,\n> = SendUserOperationParameters<TAccount, TAccountOverride, DelegatedCall[]> & {\n dependencies?: { factory: Hex; factoryData: Hex }[];\n calls: DelegatedCall[];\n publicClient: PublicClient<Transport, Chain>;\n};\n\n/**\n * Broadcasts a User Operation with delegation to the Bundler.\n *\n * @param client - Client to use for sending the user operation.\n * @param parameters - Parameters for the user operation with delegation.\n * @returns The User Operation hash of the broadcasted operation.\n * @example\n * import { createBundlerClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const bundlerClient = createBundlerClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const userOpHash = await sendUserOperationWithDelegationAction(bundlerClient, {\n * account: bobSmartAccount,\n * calls: [\n * {\n * to: aliceCounterContractAddress,\n * data: encodeFunctionData({\n * abi: CounterMetadata.abi,\n * functionName: 'increment',\n * }),\n * value: 0n,\n * permissionContext: '0x...',\n * delegationManager: '0x...',\n * },\n * ],\n * dependencies: [{ factory: '0x...', factoryData: '0x...' }], // Optional: for deploying accounts\n * })\n */\nexport async function sendUserOperationWithDelegationAction<\n TAccount extends SmartAccount | undefined,\n TAccountOverride extends SmartAccount | undefined = undefined,\n>(\n client: BundlerClient<Transport, Chain | undefined, TAccount>,\n parameters: SendUserOperationWithDelegationParameters<\n TAccount,\n TAccountOverride\n >,\n) {\n if (parameters.dependencies) {\n const { publicClient } = parameters;\n\n const includedAccountKeys: Record<Hex, boolean> = {};\n\n const chainId = publicClient.chain?.id;\n\n if (!chainId) {\n throw new Error('Chain ID is not set');\n }\n\n const { SimpleFactory } = getSmartAccountsEnvironment(chainId);\n\n const uniqueDependencies = parameters.dependencies.filter((dependency) => {\n if (!isAddressEqual(dependency.factory, SimpleFactory)) {\n throw new Error(\n `Invalid dependency: ${dependency.factory} is not allowed.`,\n );\n }\n\n // ensure that factory calls are not duplicated\n const accountKey = concat([dependency.factory, dependency.factoryData]);\n const isDuplicate = includedAccountKeys[accountKey];\n\n includedAccountKeys[accountKey] = true;\n return !isDuplicate;\n });\n\n const factoryCalls = (\n await Promise.all(\n uniqueDependencies.map(async ({ factory, factoryData }) => {\n const isDeployed = await publicClient\n .call({\n to: factory,\n data: factoryData,\n })\n .then(() => false)\n .catch(() => true);\n\n if (isDeployed) {\n return undefined;\n }\n return {\n to: factory,\n value: 0n,\n data: factoryData,\n };\n }),\n )\n ).filter((call: Call | undefined) => call !== undefined) as Call[];\n\n parameters.calls = [\n ...(factoryCalls as DelegatedCall[]),\n ...parameters.calls,\n ];\n }\n\n parameters.calls = parameters.calls.map((call) => {\n if (!('permissionContext' in call)) {\n return call;\n }\n\n const { permissionContext } = call;\n if (!permissionContext) {\n return call;\n }\n\n return {\n ...call,\n permissionContext: encodeDelegations(permissionContext),\n };\n });\n\n return client.sendUserOperation(\n parameters as unknown as SendUserOperationParameters,\n );\n}\n","import type {\n Erc20TokenPeriodicPermission as RpcErc20TokenPeriodicPermission,\n Erc20TokenStreamPermission as RpcErc20TokenStreamPermission,\n Erc20TokenRevocationPermission as RpcErc20TokenRevocationPermission,\n NativeTokenPeriodicPermission as RpcNativeTokenPeriodicPermission,\n NativeTokenStreamPermission as RpcNativeTokenStreamPermission,\n PermissionRequest,\n PermissionTypes as RpcPermissionTypes,\n Rule,\n} from '@metamask/7715-permission-types';\nimport { hexToNumber, toHex } from 'viem';\n\nimport { isDefined, toHexOrThrow } from '../utils';\nimport type {\n Erc20TokenPeriodicPermission,\n Erc20TokenRevocationPermission,\n Erc20TokenStreamPermission,\n GetGrantedExecutionPermissionsResult,\n GetSupportedExecutionPermissionsResult,\n NativeTokenPeriodicPermission,\n NativeTokenStreamPermission,\n PermissionRequestParameter,\n PermissionTypes as DeveloperPermissionTypes,\n RpcGetGrantedExecutionPermissionsResult,\n RpcGetSupportedExecutionPermissionsResult,\n} from './erc7715Types';\n\n// =============================================================================\n// Developer → RPC (request formatting)\n// =============================================================================\n\n/**\n * Converts a developer permission request to RPC format for wallet submission.\n *\n * @param parameters the permission request parameters\n * @returns the permission request in RPC format\n */\nexport function permissionRequestToRpc(\n parameters: PermissionRequestParameter,\n): PermissionRequest<RpcPermissionTypes> {\n const { chainId, from, expiry } = parameters;\n\n const converter = getPermissionRequestToRpcConverter(\n parameters.permission.type,\n );\n\n const rules: Rule[] = isDefined(expiry)\n ? [\n {\n type: 'expiry',\n data: {\n timestamp: expiry,\n },\n },\n ]\n : [];\n\n const optionalFields = {\n ...(from ? { from } : {}),\n };\n\n return {\n ...optionalFields,\n chainId: toHex(chainId),\n permission: converter(parameters.permission),\n to: parameters.to,\n rules,\n };\n}\n\ntype PermissionRequestToRpcConverter = (\n permission: DeveloperPermissionTypes,\n) => RpcPermissionTypes;\n\n/**\n * Get the permission request to RPC converter for the given permission type.\n *\n * @param permissionType the permission type\n * @returns the permission request to RPC converter for the given permission type\n */\nfunction getPermissionRequestToRpcConverter(\n permissionType: string,\n): PermissionRequestToRpcConverter {\n switch (permissionType) {\n case 'native-token-stream':\n return (permission) =>\n nativeTokenStreamPermissionToRpc(\n permission as NativeTokenStreamPermission,\n );\n case 'erc20-token-stream':\n return (permission) =>\n erc20TokenStreamPermissionToRpc(\n permission as Erc20TokenStreamPermission,\n );\n case 'native-token-periodic':\n return (permission) =>\n nativeTokenPeriodicPermissionToRpc(\n permission as NativeTokenPeriodicPermission,\n );\n case 'erc20-token-periodic':\n return (permission) =>\n erc20TokenPeriodicPermissionToRpc(\n permission as Erc20TokenPeriodicPermission,\n );\n case 'erc20-token-revocation':\n return (permission) =>\n erc20TokenRevocationPermissionToRpc(\n permission as Erc20TokenRevocationPermission,\n );\n default:\n throw new Error(`Unsupported permission type: ${permissionType}`);\n }\n}\n\n/**\n * Convert native token stream permission to RPC format.\n *\n * @param permission the native token stream permission\n * @returns the native token stream permission in RPC format\n */\nfunction nativeTokenStreamPermissionToRpc(\n permission: NativeTokenStreamPermission,\n): RpcNativeTokenStreamPermission {\n const {\n data: {\n initialAmount,\n justification,\n maxAmount,\n startTime,\n amountPerSecond,\n },\n isAdjustmentAllowed,\n } = permission;\n\n const optionalFields = {\n ...(isDefined(initialAmount) && {\n initialAmount: toHexOrThrow(initialAmount, 'initialAmount'),\n }),\n ...(isDefined(maxAmount) && {\n maxAmount: toHexOrThrow(maxAmount, 'maxAmount'),\n }),\n ...(isDefined(startTime) && {\n startTime: Number(startTime),\n }),\n ...(justification ? { justification } : {}),\n };\n\n return {\n type: 'native-token-stream',\n data: {\n amountPerSecond: toHexOrThrow(amountPerSecond, 'amountPerSecond'),\n ...optionalFields,\n },\n isAdjustmentAllowed,\n };\n}\n\n/**\n * Convert ERC20 token stream permission to RPC format.\n *\n * @param permission the erc20 token stream permission\n * @returns the erc20 token stream permission in RPC format\n */\nfunction erc20TokenStreamPermissionToRpc(\n permission: Erc20TokenStreamPermission,\n): RpcErc20TokenStreamPermission {\n const {\n data: {\n tokenAddress,\n amountPerSecond,\n initialAmount,\n startTime,\n maxAmount,\n justification,\n },\n isAdjustmentAllowed,\n } = permission;\n\n const optionalFields = {\n ...(isDefined(initialAmount) && {\n initialAmount: toHexOrThrow(initialAmount, 'initialAmount'),\n }),\n ...(isDefined(maxAmount) && {\n maxAmount: toHexOrThrow(maxAmount, 'maxAmount'),\n }),\n ...(isDefined(startTime) && {\n startTime: Number(startTime),\n }),\n ...(justification ? { justification } : {}),\n };\n\n return {\n type: 'erc20-token-stream',\n data: {\n tokenAddress: toHexOrThrow(tokenAddress, 'tokenAddress'),\n amountPerSecond: toHexOrThrow(amountPerSecond, 'amountPerSecond'),\n ...optionalFields,\n },\n isAdjustmentAllowed,\n };\n}\n\n/**\n * Convert native token periodic permission to RPC format.\n *\n * @param permission the native token periodic permission\n * @returns the native token periodic permission in RPC format\n */\nfunction nativeTokenPeriodicPermissionToRpc(\n permission: NativeTokenPeriodicPermission,\n): RpcNativeTokenPeriodicPermission {\n const {\n data: { periodAmount, periodDuration, startTime, justification },\n isAdjustmentAllowed,\n } = permission;\n\n const optionalFields = {\n ...(isDefined(startTime) && {\n startTime: Number(startTime),\n }),\n ...(justification ? { justification } : {}),\n };\n\n return {\n type: 'native-token-periodic',\n data: {\n periodAmount: toHexOrThrow(periodAmount, 'periodAmount'),\n periodDuration: Number(periodDuration),\n ...optionalFields,\n },\n isAdjustmentAllowed,\n };\n}\n\n/**\n * Convert ERC20 token periodic permission to RPC format.\n *\n * @param permission the erc20 token periodic permission\n * @returns the erc20 token periodic permission in RPC format\n */\nfunction erc20TokenPeriodicPermissionToRpc(\n permission: Erc20TokenPeriodicPermission,\n): RpcErc20TokenPeriodicPermission {\n const {\n data: {\n tokenAddress,\n periodAmount,\n periodDuration,\n startTime,\n justification,\n },\n isAdjustmentAllowed,\n } = permission;\n\n const optionalFields = {\n ...(isDefined(startTime) && {\n startTime: Number(startTime),\n }),\n ...(justification ? { justification } : {}),\n };\n\n return {\n type: 'erc20-token-periodic',\n data: {\n tokenAddress: toHexOrThrow(tokenAddress, 'tokenAddress'),\n periodAmount: toHexOrThrow(periodAmount, 'periodAmount'),\n periodDuration: Number(periodDuration),\n ...optionalFields,\n },\n isAdjustmentAllowed,\n };\n}\n\n/**\n * Convert ERC20 token revocation permission to RPC format.\n *\n * @param permission the erc20 token revocation permission\n * @returns the erc20 token revocation permission in RPC format\n */\nfunction erc20TokenRevocationPermissionToRpc(\n permission: Erc20TokenRevocationPermission,\n): RpcErc20TokenRevocationPermission {\n const {\n data: { justification },\n isAdjustmentAllowed,\n } = permission;\n\n const data = {\n ...(justification ? { justification } : {}),\n };\n return {\n type: 'erc20-token-revocation',\n data,\n isAdjustmentAllowed,\n };\n}\n\n// =============================================================================\n// RPC → Developer friendly types (response conversion)\n// =============================================================================\n\n/**\n * Converts RPC permission responses to developer-friendly types.\n * Converts chainId from hex to number, and token amounts from hex to bigint.\n *\n * @param result the RPC permission responses\n * @returns the developer-friendly permission responses\n */\nexport function permissionResponsesFromRpc(\n result: RpcGetGrantedExecutionPermissionsResult,\n): GetGrantedExecutionPermissionsResult {\n return result.map((permission) => ({\n ...permission,\n chainId: hexToNumber(permission.chainId),\n permission: permissionTypeFromRpc(permission.permission),\n }));\n}\n\n/**\n * Converts RPC permission type data to developer-friendly types.\n * Converts hex amount fields to bigint.\n *\n * @param permission the RPC permission\n * @returns the developer-friendly permission\n */\nexport function permissionTypeFromRpc(\n permission: RpcPermissionTypes,\n): DeveloperPermissionTypes {\n const convertedData: Record<string, unknown> = { ...permission.data };\n\n if ('amountPerSecond' in convertedData && convertedData.amountPerSecond) {\n convertedData.amountPerSecond = BigInt(\n convertedData.amountPerSecond as `0x${string}`,\n );\n }\n\n if ('periodAmount' in convertedData && convertedData.periodAmount) {\n convertedData.periodAmount = BigInt(\n convertedData.periodAmount as `0x${string}`,\n );\n }\n\n if ('initialAmount' in convertedData && convertedData.initialAmount) {\n convertedData.initialAmount = BigInt(\n convertedData.initialAmount as `0x${string}`,\n );\n }\n\n if ('maxAmount' in convertedData && convertedData.maxAmount) {\n convertedData.maxAmount = BigInt(convertedData.maxAmount as `0x${string}`);\n }\n\n return {\n ...permission,\n data: convertedData,\n } as DeveloperPermissionTypes;\n}\n\n/**\n * Converts RPC supported permissions result to developer-friendly types.\n * Converts chain IDs from hex to numbers.\n *\n * @param result the RPC supported permissions result\n * @returns the developer-friendly supported permissions result\n */\nexport function rpcSupportedPermissionsToDeveloper(\n result: RpcGetSupportedExecutionPermissionsResult,\n): GetSupportedExecutionPermissionsResult {\n const converted: GetSupportedExecutionPermissionsResult = {};\n\n for (const [permissionType, permissionInfo] of Object.entries(result)) {\n converted[permissionType] = {\n chainIds: permissionInfo.chainIds.map((chainId) => hexToNumber(chainId)),\n ruleTypes: permissionInfo.ruleTypes,\n };\n }\n\n return converted;\n}\n","import { permissionResponsesFromRpc } from './erc7715Mapping';\nimport type {\n GetGrantedExecutionPermissionsResult,\n MetaMaskExtensionClient,\n} from './erc7715Types';\n\nexport type { GetGrantedExecutionPermissionsResult } from './erc7715Types';\n\n/**\n * Retrieves all previously granted execution permissions from the wallet according to EIP-7715 specification.\n *\n * @param client - The client to use for the request.\n * @returns A promise that resolves to an array of granted permission responses.\n * @description\n * This function queries the wallet for all granted permissions that are not yet revoked.\n * Each permission response includes the chain ID, address, signer, permission details,\n * context, and dependency information.\n * @example\n * ```typescript\n * const grantedPermissions = await erc7715GetGrantedExecutionPermissionsAction(client);\n * // Returns an array of PermissionResponse objects with user-friendly types\n * ```\n */\nexport async function erc7715GetGrantedExecutionPermissionsAction(\n client: MetaMaskExtensionClient,\n): Promise<GetGrantedExecutionPermissionsResult> {\n const result = await client.request(\n {\n method: 'wallet_getGrantedExecutionPermissions',\n params: [],\n },\n { retryCount: 0 },\n );\n\n if (!result) {\n throw new Error('Failed to get granted execution permissions');\n }\n\n return permissionResponsesFromRpc(result);\n}\n","import { rpcSupportedPermissionsToDeveloper } from './erc7715Mapping';\nimport type {\n GetSupportedExecutionPermissionsResult,\n MetaMaskExtensionClient,\n} from './erc7715Types';\n\nexport type { GetSupportedExecutionPermissionsResult } from './erc7715Types';\n\n/**\n * Retrieves the supported execution permission types from the wallet according to EIP-7715 specification.\n *\n * @param client - The client to use for the request.\n * @returns A promise that resolves to a record of supported permission types with their chain IDs and rule types.\n * @description\n * This function queries the wallet for the permission types it supports.\n * The result is keyed by permission type and includes the supported chain IDs and rule types.\n * @example\n * ```typescript\n * const supported = await erc7715GetSupportedExecutionPermissionsAction(client);\n * // Returns:\n * // {\n * // \"native-token-allowance\": {\n * // \"chainIds\": [1, 137],\n * // \"ruleTypes\": [\"expiry\"]\n * // },\n * // \"erc20-token-allowance\": {\n * // \"chainIds\": [1],\n * // \"ruleTypes\": []\n * // }\n * // }\n * ```\n */\nexport async function erc7715GetSupportedExecutionPermissionsAction(\n client: MetaMaskExtensionClient,\n): Promise<GetSupportedExecutionPermissionsResult> {\n const result = await client.request(\n {\n method: 'wallet_getSupportedExecutionPermissions',\n params: [],\n },\n { retryCount: 0 },\n );\n\n if (!result) {\n throw new Error('Failed to get supported execution permissions');\n }\n\n return rpcSupportedPermissionsToDeveloper(result);\n}\n","import {\n permissionRequestToRpc,\n permissionResponsesFromRpc,\n} from './erc7715Mapping';\nimport type {\n GetGrantedExecutionPermissionsResult,\n MetaMaskExtensionClient,\n PermissionRequestParameter,\n} from './erc7715Types';\n\nexport type {\n GetGrantedExecutionPermissionsResult,\n GetSupportedExecutionPermissionsResult,\n MetaMaskExtensionClient,\n MetaMaskExtensionSchema,\n SupportedPermissionInfo,\n PermissionTypes,\n PermissionRequestParameter,\n} from './erc7715Types';\n\n/**\n * Parameters for the RequestExecutionPermissions action.\n *\n * @template Signer - The type of the signer, either an Address or Account.\n */\nexport type RequestExecutionPermissionsParameters =\n PermissionRequestParameter[];\n\n/**\n * Return type for the request execution permissions action.\n */\nexport type RequestExecutionPermissionsReturnType =\n GetGrantedExecutionPermissionsResult;\n\n/**\n * Grants permissions according to EIP-7715 specification.\n *\n * @template Signer - The type of the signer, either an Address or Account.\n * @param client - The client to use for the request.\n * @param parameters - The permissions requests to grant.\n * @returns A promise that resolves to the permission responses.\n * @description\n * This function formats the permissions requests and invokes the wallet method to grant permissions.\n * It will throw an error if the permissions could not be granted.\n */\nexport async function erc7715RequestExecutionPermissionsAction(\n client: MetaMaskExtensionClient,\n parameters: RequestExecutionPermissionsParameters,\n): Promise<RequestExecutionPermissionsReturnType> {\n const formattedPermissionRequest = parameters.map(permissionRequestToRpc);\n\n const result = await client.request(\n {\n method: 'wallet_requestExecutionPermissions',\n params: formattedPermissionRequest,\n },\n { retryCount: 0 },\n );\n\n if (!result) {\n throw new Error('Failed to grant permissions');\n }\n\n return permissionResponsesFromRpc(result);\n}\n","import type { Address, Hex, Client } from 'viem';\n\nimport { hashDelegation } from '../delegation';\nimport * as ERC20PeriodTransferEnforcer from '../DelegationFramework/ERC20PeriodTransferEnforcer';\nimport * as ERC20StreamingEnforcer from '../DelegationFramework/ERC20StreamingEnforcer';\nimport * as MultiTokenPeriodEnforcer from '../DelegationFramework/MultiTokenPeriodEnforcer';\nimport * as NativeTokenPeriodTransferEnforcer from '../DelegationFramework/NativeTokenPeriodTransferEnforcer';\nimport * as NativeTokenStreamingEnforcer from '../DelegationFramework/NativeTokenStreamingEnforcer';\nimport type { SmartAccountsEnvironment, Delegation } from '../types';\n\n/**\n * Parameters for all caveat enforcer actions.\n */\nexport type CaveatEnforcerParams = {\n delegation: Delegation;\n};\n\n/**\n * Return type for period-based transfer enforcers\n */\nexport type PeriodTransferResult = {\n availableAmount: bigint;\n isNewPeriod: boolean;\n currentPeriod: bigint;\n};\n\n/**\n * Return type for streaming enforcers\n */\nexport type StreamingResult = {\n availableAmount: bigint;\n};\n\n/**\n * Finds a caveat that matches the specified enforcer address.\n *\n * @param config - The configuration object.\n * @param config.delegation - The delegation to search.\n * @param config.enforcerAddress - The enforcer address to match.\n * @param config.enforcerName - The name of the enforcer.\n * @returns The matching caveat.\n * @throws Error if no matching caveat is found.\n * @throws Error if multiple matching caveats are found.\n */\nfunction findMatchingCaveat({\n delegation,\n enforcerAddress,\n enforcerName,\n}: {\n delegation: Delegation;\n enforcerAddress: Address;\n enforcerName: keyof SmartAccountsEnvironment['caveatEnforcers'];\n}): { terms: Hex; args: Hex } {\n const matchingCaveats = delegation.caveats.filter(\n (caveat) => caveat.enforcer.toLowerCase() === enforcerAddress.toLowerCase(),\n );\n\n if (matchingCaveats.length === 0) {\n throw new Error(`No caveat found with enforcer matching ${enforcerName}`);\n }\n\n if (matchingCaveats.length > 1) {\n throw new Error(\n `Multiple caveats found with enforcer matching ${enforcerName}`,\n );\n }\n\n const [{ terms, args }] = matchingCaveats as unknown as [\n { terms: Hex; args: Hex },\n ];\n\n return {\n terms,\n args,\n };\n}\n\n/**\n * Gets the delegation manager address from environment.\n *\n * @param environment - The SmartAccountsEnvironment.\n * @returns The delegation manager address.\n */\nfunction getDelegationManager(environment: SmartAccountsEnvironment): Address {\n if (!environment.DelegationManager) {\n throw new Error('Delegation manager address not found');\n }\n\n return environment.DelegationManager;\n}\n\n/**\n * Gets the enforcer address from environment.\n *\n * @param config - The configuration object.\n * @param config.enforcerName - The name of the enforcer.\n * @param config.environment - The SmartAccountsEnvironment.\n * @returns The enforcer address.\n */\nfunction getEnforcerAddress({\n enforcerName,\n environment,\n}: {\n enforcerName: keyof SmartAccountsEnvironment['caveatEnforcers'];\n environment: SmartAccountsEnvironment;\n}): Address {\n const enforcerAddress = environment.caveatEnforcers[enforcerName];\n if (!enforcerAddress) {\n throw new Error(`${enforcerName} not found in environment`);\n }\n\n return enforcerAddress;\n}\n\n/**\n * Get available amount for ERC20 period transfer enforcer.\n *\n * @param client - The viem client.\n * @param environment - The SmartAccountsEnvironment.\n * @param params - The parameters for the ERC20 period transfer enforcer.\n * @returns Promise resolving to the period transfer result.\n */\nexport async function getErc20PeriodTransferEnforcerAvailableAmount(\n client: Client,\n environment: SmartAccountsEnvironment,\n params: CaveatEnforcerParams,\n): Promise<PeriodTransferResult> {\n const enforcerName = 'ERC20PeriodTransferEnforcer';\n\n const delegationManager = getDelegationManager(environment);\n const enforcerAddress = getEnforcerAddress({\n enforcerName,\n environment,\n });\n\n const delegationHash = hashDelegation(params.delegation);\n const { terms } = findMatchingCaveat({\n delegation: params.delegation,\n enforcerAddress,\n enforcerName,\n });\n\n return ERC20PeriodTransferEnforcer.read.getAvailableAmount({\n client,\n contractAddress: enforcerAddress,\n delegationHash,\n delegationManager,\n terms,\n });\n}\n\n/**\n * Get available amount for ERC20 streaming enforcer.\n *\n * @param client - The viem client.\n * @param environment - The SmartAccountsEnvironment.\n * @param params - The parameters for the ERC20 streaming enforcer.\n * @returns Promise resolving to the streaming result.\n */\nexport async function getErc20StreamingEnforcerAvailableAmount(\n client: Client,\n environment: SmartAccountsEnvironment,\n params: CaveatEnforcerParams,\n): Promise<StreamingResult> {\n const enforcerName = 'ERC20StreamingEnforcer';\n const delegationManager = getDelegationManager(environment);\n const enforcerAddress = getEnforcerAddress({\n enforcerName,\n environment,\n });\n\n const delegationHash = hashDelegation(params.delegation);\n const { terms } = findMatchingCaveat({\n delegation: params.delegation,\n enforcerAddress,\n enforcerName,\n });\n\n return ERC20StreamingEnforcer.read.getAvailableAmount({\n client,\n contractAddress: enforcerAddress,\n delegationManager,\n delegationHash,\n terms,\n });\n}\n\n/**\n * Get available amount for multi-token period enforcer.\n *\n * @param client - The viem client.\n * @param environment - The SmartAccountsEnvironment.\n * @param params - The parameters for the multi-token period enforcer.\n * @returns Promise resolving to the period transfer result.\n */\nexport async function getMultiTokenPeriodEnforcerAvailableAmount(\n client: Client,\n environment: SmartAccountsEnvironment,\n params: CaveatEnforcerParams,\n): Promise<PeriodTransferResult> {\n const enforcerName = 'MultiTokenPeriodEnforcer';\n const delegationManager = getDelegationManager(environment);\n const enforcerAddress = getEnforcerAddress({\n enforcerName,\n environment,\n });\n\n const delegationHash = hashDelegation(params.delegation);\n const { terms, args } = findMatchingCaveat({\n delegation: params.delegation,\n enforcerAddress,\n enforcerName,\n });\n\n return MultiTokenPeriodEnforcer.read.getAvailableAmount({\n client,\n contractAddress: enforcerAddress,\n delegationHash,\n delegationManager,\n terms,\n args,\n });\n}\n\n/**\n * Get available amount for native token period transfer enforcer.\n *\n * @param client - The viem client.\n * @param environment - The SmartAccountsEnvironment.\n * @param params - The parameters for the native token period transfer enforcer.\n * @returns Promise resolving to the period transfer result.\n */\nexport async function getNativeTokenPeriodTransferEnforcerAvailableAmount(\n client: Client,\n environment: SmartAccountsEnvironment,\n params: CaveatEnforcerParams,\n): Promise<PeriodTransferResult> {\n const enforcerName = 'NativeTokenPeriodTransferEnforcer';\n const delegationManager = getDelegationManager(environment);\n const enforcerAddress = getEnforcerAddress({\n enforcerName,\n environment,\n });\n\n const delegationHash = hashDelegation(params.delegation);\n const { terms } = findMatchingCaveat({\n delegation: params.delegation,\n enforcerAddress,\n enforcerName,\n });\n\n return NativeTokenPeriodTransferEnforcer.read.getAvailableAmount({\n client,\n contractAddress: enforcerAddress,\n delegationHash,\n delegationManager,\n terms,\n });\n}\n\n/**\n * Get available amount for native token streaming enforcer.\n *\n * @param client - The viem client.\n * @param environment - The SmartAccountsEnvironment.\n * @param params - The parameters for the native token streaming enforcer.\n * @returns Promise resolving to the streaming result.\n */\nexport async function getNativeTokenStreamingEnforcerAvailableAmount(\n client: Client,\n environment: SmartAccountsEnvironment,\n params: CaveatEnforcerParams,\n): Promise<StreamingResult> {\n const enforcerName = 'NativeTokenStreamingEnforcer';\n const delegationManager = getDelegationManager(environment);\n const enforcerAddress = getEnforcerAddress({\n enforcerName,\n environment,\n });\n\n const delegationHash = hashDelegation(params.delegation);\n const { terms } = findMatchingCaveat({\n delegation: params.delegation,\n enforcerAddress,\n enforcerName,\n });\n\n return NativeTokenStreamingEnforcer.read.getAvailableAmount({\n client,\n contractAddress: enforcerAddress,\n delegationManager,\n delegationHash,\n terms,\n });\n}\n\n/**\n * Caveat enforcer actions for extending viem clients.\n *\n * @param params - The parameters object.\n * @param params.environment - The SmartAccountsEnvironment.\n * @returns A function that takes a client and returns the client extension with caveat enforcer actions.\n */\nexport const caveatEnforcerActions =\n ({ environment }: { environment: SmartAccountsEnvironment }) =>\n (client: Client) => ({\n /**\n * Get available amount for ERC20 period transfer enforcer.\n *\n * @param params - The parameters for the ERC20 period transfer enforcer.\n * @returns Promise resolving to the period transfer result.\n */\n getErc20PeriodTransferEnforcerAvailableAmount: async (\n params: CaveatEnforcerParams,\n ): Promise<PeriodTransferResult> => {\n return getErc20PeriodTransferEnforcerAvailableAmount(\n client,\n environment,\n params,\n );\n },\n\n /**\n * Get available amount for ERC20 streaming enforcer.\n *\n * @param params - The parameters for the ERC20 streaming enforcer.\n * @returns Promise resolving to the streaming result.\n */\n getErc20StreamingEnforcerAvailableAmount: async (\n params: CaveatEnforcerParams,\n ): Promise<StreamingResult> => {\n return getErc20StreamingEnforcerAvailableAmount(\n client,\n environment,\n params,\n );\n },\n\n /**\n * Get available amount for multi-token period enforcer.\n *\n * @param params - The parameters for the multi-token period enforcer.\n * @returns Promise resolving to the period transfer result.\n */\n getMultiTokenPeriodEnforcerAvailableAmount: async (\n params: CaveatEnforcerParams,\n ): Promise<PeriodTransferResult> => {\n return getMultiTokenPeriodEnforcerAvailableAmount(\n client,\n environment,\n params,\n );\n },\n\n /**\n * Get available amount for native token period transfer enforcer.\n *\n * @param params - The parameters for the native token period transfer enforcer.\n * @returns Promise resolving to the period transfer result.\n */\n getNativeTokenPeriodTransferEnforcerAvailableAmount: async (\n params: CaveatEnforcerParams,\n ): Promise<PeriodTransferResult> => {\n return getNativeTokenPeriodTransferEnforcerAvailableAmount(\n client,\n environment,\n params,\n );\n },\n\n /**\n * Get available amount for native token streaming enforcer.\n *\n * @param params - The parameters for the native token streaming enforcer.\n * @returns Promise resolving to the streaming result.\n */\n getNativeTokenStreamingEnforcerAvailableAmount: async (\n params: CaveatEnforcerParams,\n ): Promise<StreamingResult> => {\n return getNativeTokenStreamingEnforcerAvailableAmount(\n client,\n environment,\n params,\n );\n },\n });\n","import type { Client, Address, Hex } from 'viem';\nimport { isAddressEqual } from 'viem';\nimport { getCode } from 'viem/actions';\n\nimport type { SmartAccountsEnvironment } from '../types';\n\n// EIP-7702 delegation prefix (0xef0100)\nconst DELEGATION_PREFIX = '0xef0100' as const;\n\n/**\n * Parameters for checking if an account is delegated to the EIP-7702 implementation.\n */\nexport type IsValid7702ImplementationParameters = {\n /** The client to use for the query. */\n client: Client;\n /** The address to check for proper delegation. */\n accountAddress: Address;\n /** The SmartAccountsEnvironment containing contract addresses. */\n environment: SmartAccountsEnvironment;\n};\n\n/**\n * Extracts the delegated contract address from EIP-7702 delegation code.\n *\n * @param code - The code returned from getCode for a delegated account.\n * @returns The delegated contract address or null if not a valid delegation.\n */\nfunction extractDelegatedAddress(code: Hex | undefined): Address | null {\n if (code?.length !== 48) {\n // 0x (2 chars) + ef0100 (6 chars) + address (40 chars) = 48 chars\n return null;\n }\n\n if (!code.toLowerCase().startsWith(DELEGATION_PREFIX.toLowerCase())) {\n return null;\n }\n\n // Extract the 20-byte address after the delegation prefix\n const addressHex = code.slice(8); // Remove '0xef0100' prefix (8 chars)\n return `0x${addressHex}`;\n}\n\n/**\n * Checks if an account is properly delegated to the EIP-7702 implementation.\n *\n * This function validates EIP-7702 delegations by checking if the EOA has a 7702\n * contract assigned to it and comparing the delegated address against the 7702\n * implementation found in the environment.\n *\n * @param params - The parameters for checking the delegation.\n * @param params.client - The client to use for the query.\n * @param params.accountAddress - The address to check for proper delegation.\n * @param params.environment - The SmartAccountsEnvironment containing contract addresses.\n * @returns A promise that resolves to true if the account is properly delegated to the 7702 implementation, false otherwise.\n * @example\n * ```typescript\n * const isValid = await isValid7702Implementation({\n * client: publicClient,\n * accountAddress: '0x...',\n * environment: smartAccountEnvironment,\n * });\n *\n * if (isValid) {\n * console.log('Account is properly delegated to EIP-7702 implementation');\n * } else {\n * console.log('Account is not properly delegated');\n * }\n * ```\n */\nexport async function isValid7702Implementation({\n client,\n accountAddress,\n environment,\n}: IsValid7702ImplementationParameters): Promise<boolean> {\n try {\n // Get the code at the account address\n const code = await getCode(client, {\n address: accountAddress,\n });\n\n // Extract the delegated contract address from the EIP-7702 delegation code\n const delegatedAddress = extractDelegatedAddress(code);\n\n // If no valid delegation found, return false\n if (!delegatedAddress) {\n return false;\n }\n\n // Compare the delegated address with the 7702 implementation in the environment\n const expectedImplementation =\n environment.implementations.EIP7702StatelessDeleGatorImpl;\n if (!expectedImplementation) {\n return false;\n }\n\n return isAddressEqual(delegatedAddress, expectedImplementation);\n } catch {\n // If the call fails (e.g., no code at address, network error),\n // then it's not properly delegated to our implementation\n return false;\n }\n}\n","import type {\n Account,\n Address,\n Chain,\n Client,\n Hex,\n Transport,\n WalletClient,\n} from 'viem';\nimport { BaseError } from 'viem';\nimport { parseAccount } from 'viem/accounts';\n\nimport { prepareSignDelegationTypedData } from '../delegation';\nimport type { Delegation } from '../types';\n\nexport type SignDelegationParameters = {\n /** Account to sign with */\n account?: Account | Address;\n /** The delegation to sign */\n delegation: Omit<Delegation, 'signature'>;\n /** The address of the delegation manager contract */\n delegationManager: Address;\n /** The chain ID for the signature */\n chainId: number;\n /** The name of the contract */\n name?: string;\n /** The version of the contract */\n version?: string;\n /** Whether to allow insecure unrestricted delegation */\n allowInsecureUnrestrictedDelegation?: boolean;\n};\n\nexport type SignDelegationReturnType = Hex;\n\n/**\n * Signs a delegation using a wallet client.\n *\n * @param client - The wallet client to use for signing.\n * @param parameters - The parameters for signing the delegation.\n * @returns The signature of the delegation.\n * @example\n * ```ts\n * const signature = await signDelegation(walletClient, {\n * delegation: {\n * delegate: '0x...',\n * delegator: '0x...',\n * authority: '0x...',\n * caveats: [],\n * salt: '0x'\n * },\n * delegationManager: '0x...',\n * chainId: 1\n * });\n * ```\n */\nexport async function signDelegation<\n TChain extends Chain | undefined,\n TAccount extends Account | undefined,\n>(\n client: Client<Transport, TChain, TAccount> & {\n signTypedData: WalletClient['signTypedData'];\n },\n parameters: SignDelegationParameters,\n): Promise<SignDelegationReturnType> {\n const {\n account: accountParam = client.account,\n delegation,\n delegationManager,\n chainId,\n name = 'DelegationManager',\n version = '1',\n allowInsecureUnrestrictedDelegation = false,\n } = parameters;\n\n if (!accountParam) {\n throw new BaseError('Account not found. Please provide an account.');\n }\n\n const account = parseAccount(accountParam);\n\n const typedData = prepareSignDelegationTypedData({\n delegation,\n delegationManager,\n chainId,\n name,\n version,\n allowInsecureUnrestrictedDelegation,\n });\n\n return client.signTypedData({\n account,\n ...typedData,\n });\n}\n\n/**\n * Creates a sign delegation action that can be used to extend a wallet client.\n *\n * @returns A function that can be used with wallet client extend method.\n * @example\n * ```ts\n * const walletClient = createWalletClient({\n * chain: mainnet,\n * transport: http()\n * }).extend(signDelegationActions());\n * ```\n */\nexport function signDelegationActions() {\n return <\n TChain extends Chain | undefined,\n TAccount extends Account | undefined,\n >(\n client: Client<Transport, TChain, TAccount> & {\n signTypedData: WalletClient['signTypedData'];\n },\n ) => ({\n signDelegation: async (\n parameters: Omit<SignDelegationParameters, 'chainId'> & {\n chainId?: number;\n },\n ) =>\n signDelegation(client, {\n chainId:\n parameters.chainId ??\n (() => {\n if (!client.chain?.id) {\n throw new BaseError(\n 'Chain ID is required. Either provide it in parameters or configure the client with a chain.',\n );\n }\n return client.chain.id;\n })(),\n ...parameters,\n }),\n });\n}\n","import type {\n Account,\n Address,\n Chain,\n Client,\n Hex,\n Transport,\n WalletClient,\n} from 'viem';\nimport { BaseError } from 'viem';\nimport { parseAccount } from 'viem/accounts';\n\nimport { prepareSignUserOperationTypedData } from '../userOp';\nimport type { UserOperationV07 } from '../userOp';\n\nexport type SignUserOperationParameters = {\n /** Account to sign with */\n account?: Account | Address;\n /** The user operation to sign */\n userOperation: Omit<UserOperationV07, 'signature'>;\n /** The entry point contract address */\n entryPoint: { address: Address };\n /** The chain ID that the entry point is deployed on */\n chainId: number;\n /** The address of the smart account */\n address: Address;\n /** The name of the domain of the implementation contract */\n name: 'HybridDeleGator' | 'MultiSigDeleGator';\n /** The version of the domain of the implementation contract */\n version?: string;\n};\n\nexport type SignUserOperationReturnType = Hex;\n\n/**\n * Signs a user operation using a wallet client.\n *\n * @param client - The wallet client to use for signing.\n * @param parameters - The parameters for signing the user operation.\n * @returns The signature of the user operation.\n * @example\n * ```ts\n * const signature = await signUserOperation(walletClient, {\n * userOperation: {\n * sender: '0x...',\n * nonce: 0n,\n * callData: '0x',\n * callGasLimit: 1000000n,\n * verificationGasLimit: 1000000n,\n * preVerificationGas: 21000n,\n * maxFeePerGas: 1000000000n,\n * maxPriorityFeePerGas: 1000000000n\n * },\n * entryPoint: { address: '0x...' },\n * chainId: 1,\n * address: '0x...',\n * name: 'HybridDeleGator'\n * });\n * ```\n */\nexport async function signUserOperation<\n TChain extends Chain | undefined,\n TAccount extends Account | undefined,\n>(\n client: Client<Transport, TChain, TAccount> & {\n signTypedData: WalletClient['signTypedData'];\n },\n parameters: SignUserOperationParameters,\n): Promise<SignUserOperationReturnType> {\n const {\n account: accountParam = client.account,\n userOperation,\n entryPoint,\n chainId,\n name,\n address,\n version = '1',\n } = parameters;\n\n if (!accountParam) {\n throw new BaseError('Account not found. Please provide an account.');\n }\n\n const account = parseAccount(accountParam);\n\n const typedData = prepareSignUserOperationTypedData({\n userOperation,\n entryPoint,\n chainId,\n name,\n address,\n version,\n });\n\n return client.signTypedData({\n account,\n ...typedData,\n });\n}\n\n/**\n * Creates a sign user operation action that can be used to extend a wallet client.\n *\n * @returns A function that can be used with wallet client extend method.\n * @example\n * ```ts\n * const walletClient = createWalletClient({\n * chain: mainnet,\n * transport: http()\n * }).extend(signUserOperationActions());\n * ```\n */\nexport function signUserOperationActions() {\n return <\n TChain extends Chain | undefined,\n TAccount extends Account | undefined,\n >(\n client: Client<Transport, TChain, TAccount> & {\n signTypedData: WalletClient['signTypedData'];\n },\n ) => ({\n signUserOperation: async (\n parameters: Omit<SignUserOperationParameters, 'chainId'> & {\n chainId?: number;\n },\n ) =>\n signUserOperation(client, {\n chainId:\n parameters.chainId ??\n (() => {\n if (!client.chain?.id) {\n throw new BaseError(\n 'Chain ID is required. Either provide it in parameters or configure the client with a chain.',\n );\n }\n return client.chain.id;\n })(),\n ...parameters,\n }),\n });\n}\n"],"mappings":"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","names":["read_exports","isAddressEqual","BaseError","parseAccount","BaseError","parseAccount"]}