@metamask/smart-accounts-kit 0.4.0-beta.1 → 0.4.0-beta.2
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.
- package/CHANGELOG.md +38 -1
- package/dist/actions/index.cjs +5 -5
- package/dist/actions/index.d.cts +2 -2
- package/dist/actions/index.d.ts +2 -2
- package/dist/actions/index.mjs +4 -4
- package/dist/{chunk-HBAJRXQB.cjs → chunk-23YXLKTX.cjs} +11 -11
- package/dist/{chunk-HBAJRXQB.cjs.map → chunk-23YXLKTX.cjs.map} +1 -1
- package/dist/{chunk-GH5EK5MB.mjs → chunk-33AMUJBJ.mjs} +7 -7
- package/dist/chunk-33AMUJBJ.mjs.map +1 -0
- package/dist/{chunk-TEH426Y4.mjs → chunk-C5ZEEH2Z.mjs} +283 -184
- package/dist/chunk-C5ZEEH2Z.mjs.map +1 -0
- package/dist/{chunk-OPJBYTWX.cjs → chunk-DLD377CN.cjs} +16 -32
- package/dist/chunk-DLD377CN.cjs.map +1 -0
- package/dist/{chunk-YYZWHBF2.mjs → chunk-NOCLGZGB.mjs} +173 -128
- package/dist/chunk-NOCLGZGB.mjs.map +1 -0
- package/dist/{chunk-5FLY3IPW.mjs → chunk-QCULIK3O.mjs} +27 -56
- package/dist/chunk-QCULIK3O.mjs.map +1 -0
- package/dist/{chunk-CLBI7P3Z.cjs → chunk-QMRKCB7T.cjs} +203 -158
- package/dist/chunk-QMRKCB7T.cjs.map +1 -0
- package/dist/{chunk-Q4V7BKAG.cjs → chunk-SOFB2MXG.cjs} +27 -56
- package/dist/chunk-SOFB2MXG.cjs.map +1 -0
- package/dist/{chunk-NGZLJAMA.cjs → chunk-UUOH2WAW.cjs} +12 -12
- package/dist/{chunk-NGZLJAMA.cjs.map → chunk-UUOH2WAW.cjs.map} +1 -1
- package/dist/{chunk-DRVPD5QI.mjs → chunk-WPVSFOQM.mjs} +10 -26
- package/dist/chunk-WPVSFOQM.mjs.map +1 -0
- package/dist/{chunk-ZTGEG2ZA.mjs → chunk-WV2R7BXP.mjs} +2 -2
- package/dist/{chunk-7CVW7JE3.cjs → chunk-XN36L4RX.cjs} +102 -102
- package/dist/chunk-XN36L4RX.cjs.map +1 -0
- package/dist/{chunk-MIP7KJYH.cjs → chunk-YDLLC6PP.cjs} +252 -153
- package/dist/chunk-YDLLC6PP.cjs.map +1 -0
- package/dist/{chunk-XUVEYTD2.mjs → chunk-YTELOQ4I.mjs} +2 -2
- package/dist/contracts/index.cjs +5 -5
- package/dist/contracts/index.d.cts +3 -3
- package/dist/contracts/index.d.ts +3 -3
- package/dist/contracts/index.mjs +4 -4
- package/dist/{delegation-sP7mnAkl.d.ts → delegation-DGUfyX-C.d.ts} +52 -26
- package/dist/{delegation-Bd2v5lF5.d.cts → delegation-D_TY-tAq.d.cts} +52 -26
- package/dist/experimental/index.cjs +4 -4
- package/dist/experimental/index.cjs.map +1 -1
- package/dist/experimental/index.d.cts +1 -1
- package/dist/experimental/index.d.ts +1 -1
- package/dist/experimental/index.mjs +5 -5
- package/dist/experimental/index.mjs.map +1 -1
- package/dist/{index-B9w3fRT-.d.cts → index-B9bsjGqI.d.ts} +4 -5
- package/dist/{index-C8wAvC29.d.cts → index-CZes99jV.d.cts} +92 -62
- package/dist/{index-DpokPMZc.d.ts → index-DvcKJcXi.d.cts} +4 -5
- package/dist/{index-Bfcoh3WQ.d.ts → index-FpCh2419.d.ts} +92 -62
- package/dist/index.cjs +23 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -11
- package/dist/index.d.ts +9 -11
- package/dist/index.mjs +14 -12
- package/dist/index.mjs.map +1 -1
- package/dist/{smartAccountsEnvironment-YDC3jB33.d.cts → smartAccountsEnvironment-BU8kjlEv.d.cts} +1 -1
- package/dist/{smartAccountsEnvironment-EW722Cnw.d.ts → smartAccountsEnvironment-egxuflDO.d.ts} +1 -1
- package/dist/{types-B9GE5CfG.d.ts → types-BLYWtcR3.d.cts} +46 -28
- package/dist/{types-B9GE5CfG.d.cts → types-BLYWtcR3.d.ts} +46 -28
- package/dist/utils/index.cjs +7 -5
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +3 -4
- package/dist/utils/index.d.ts +3 -4
- package/dist/utils/index.mjs +12 -10
- package/package.json +5 -10
- package/dist/chunk-5FLY3IPW.mjs.map +0 -1
- package/dist/chunk-7CVW7JE3.cjs.map +0 -1
- package/dist/chunk-CLBI7P3Z.cjs.map +0 -1
- package/dist/chunk-DRVPD5QI.mjs.map +0 -1
- package/dist/chunk-GH5EK5MB.mjs.map +0 -1
- package/dist/chunk-MIP7KJYH.cjs.map +0 -1
- package/dist/chunk-OPJBYTWX.cjs.map +0 -1
- package/dist/chunk-Q4V7BKAG.cjs.map +0 -1
- package/dist/chunk-TEH426Y4.mjs.map +0 -1
- package/dist/chunk-YYZWHBF2.mjs.map +0 -1
- /package/dist/{chunk-ZTGEG2ZA.mjs.map → chunk-WV2R7BXP.mjs.map} +0 -0
- /package/dist/{chunk-XUVEYTD2.mjs.map → chunk-YTELOQ4I.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/smart-accounts-kit/smart-accounts-kit/packages/smart-accounts-kit/dist/chunk-Q4V7BKAG.cjs","../src/write.ts","../src/smartAccountsEnvironment.ts","../src/userOp.ts"],"names":["SimpleFactory"],"mappings":"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","file":"/home/runner/work/smart-accounts-kit/smart-accounts-kit/packages/smart-accounts-kit/dist/chunk-Q4V7BKAG.cjs","sourcesContent":[null,"import { SimpleFactory, DelegationManager } from '@metamask/delegation-abis';\nimport type { Address, Chain, Hex, PublicClient, WalletClient } from 'viem';\n\nimport { encodePermissionContexts } from './delegation';\nimport type { ExecutionStruct, ExecutionMode } from './executions';\nimport { encodeExecutionCalldatas } from './executions';\nimport type { Delegation, ContractMetaData, Redemption } from './types';\n\n/**\n * Deploys a contract using the SimpleFactory contract.\n *\n * @param walletClient - The wallet client to use for deployment.\n * @param publicClient - The public client to use for simulation.\n * @param simpleFactoryAddress - The address of the SimpleFactory contract.\n * @param creationCode - The creation code for the contract to deploy.\n * @param salt - The salt to use for deterministic deployment.\n * @returns The transaction hash of the deployment.\n */\nexport const deployWithSimpleFactory = async (\n walletClient: WalletClient,\n publicClient: PublicClient,\n simpleFactoryAddress: Address,\n creationCode: Hex,\n salt: Hex,\n) => {\n const { request } = await publicClient.simulateContract({\n account: walletClient.account,\n address: simpleFactoryAddress,\n abi: SimpleFactory,\n functionName: 'deploy',\n args: [creationCode, salt],\n });\n return await walletClient.writeContract(request);\n};\n\n/**\n * Redeems a delegation to execute the provided executions.\n *\n * @param walletClient - The wallet client to use for redemption.\n * @param publicClient - The public client to use for simulation.\n * @param delegationManagerAddress - The address of the DelegationManager contract.\n * @param redemptions - The redemptions to execute, containing permission contexts, executions, and modes.\n * @returns The transaction hash of the redemption.\n */\nexport const redeemDelegations = async (\n walletClient: WalletClient,\n publicClient: PublicClient,\n delegationManagerAddress: Address,\n redemptions: Redemption[],\n) => {\n if (redemptions.length === 0) {\n throw new Error('RedeemDelegations invalid zero redemptions');\n }\n\n const permissionContexts: Delegation[][] = [];\n const executionsBatch: ExecutionStruct[][] = [];\n const executionModes: ExecutionMode[] = [];\n\n redemptions.forEach((redemption) => {\n permissionContexts.push(redemption.permissionContext);\n executionsBatch.push(redemption.executions);\n executionModes.push(redemption.mode);\n });\n\n const encodedPermissionContexts =\n encodePermissionContexts(permissionContexts);\n const executionCalldatas = encodeExecutionCalldatas(executionsBatch);\n\n const { request } = await publicClient.simulateContract({\n account: walletClient.account,\n address: delegationManagerAddress,\n abi: DelegationManager,\n functionName: 'redeemDelegations',\n args: [encodedPermissionContexts, executionModes, executionCalldatas],\n });\n return await walletClient.writeContract(request);\n};\n\n/**\n * Deploys a contract to the blockchain.\n *\n * @param walletClient - The wallet client to use for deployment.\n * @param publicClient - The public client to use for transaction receipt.\n * @param chain - The chain to deploy on.\n * @param contractMetadata - The metadata of the contract to deploy.\n * @param contractMetadata.bytecode - The bytecode of the contract to deploy.\n * @param contractMetadata.abi - The ABI of the contract to deploy.\n * @param args - The constructor arguments for the contract.\n * @returns An object containing the deployed contract address, transaction hash, and receipt.\n */\nexport async function deployContract(\n walletClient: WalletClient,\n publicClient: PublicClient,\n chain: Chain,\n { bytecode, abi }: ContractMetaData,\n args: any[] = [],\n) {\n if (!walletClient.account) {\n throw new Error('Wallet client account is required');\n }\n\n const hash = await walletClient.deployContract({\n abi,\n bytecode,\n args,\n account: walletClient.account,\n chain,\n });\n\n const receipt = await publicClient.waitForTransactionReceipt({\n hash,\n });\n\n if (!receipt.contractAddress) {\n throw new Error('No contract address in receipt');\n }\n\n return { address: receipt.contractAddress, hash, receipt };\n}\n","import {\n EntryPoint,\n SimpleFactory,\n DelegationManager,\n MultiSigDeleGator,\n HybridDeleGator,\n EIP7702StatelessDeleGator,\n SCL_RIP7212,\n AllowedTargetsEnforcer,\n AllowedMethodsEnforcer,\n DeployedEnforcer,\n TimestampEnforcer,\n NonceEnforcer,\n AllowedCalldataEnforcer,\n BlockNumberEnforcer,\n LimitedCallsEnforcer,\n ERC20BalanceChangeEnforcer,\n ERC20StreamingEnforcer,\n IdEnforcer,\n ERC20TransferAmountEnforcer,\n ValueLteEnforcer,\n NativeTokenTransferAmountEnforcer,\n NativeBalanceChangeEnforcer,\n NativeTokenStreamingEnforcer,\n NativeTokenPaymentEnforcer,\n RedeemerEnforcer,\n ArgsEqualityCheckEnforcer,\n ERC721BalanceChangeEnforcer,\n ERC721TransferEnforcer,\n ERC1155BalanceChangeEnforcer,\n OwnershipTransferEnforcer,\n SpecificActionERC20TransferBatchEnforcer,\n ERC20PeriodTransferEnforcer,\n NativeTokenPeriodTransferEnforcer,\n ExactCalldataBatchEnforcer,\n ExactCalldataEnforcer,\n ExactExecutionEnforcer,\n ExactExecutionBatchEnforcer,\n MultiTokenPeriodEnforcer,\n} from '@metamask/delegation-abis';\nimport {\n EntryPoint as EntryPointBytecode,\n SimpleFactory as SimpleFactoryBytecode,\n DelegationManager as DelegationManagerBytecode,\n MultiSigDeleGator as MultiSigDeleGatorBytecode,\n HybridDeleGator as HybridDeleGatorBytecode,\n EIP7702StatelessDeleGator as EIP7702StatelessDeleGatorBytecode,\n SCL_RIP7212 as SCLRIP7212Bytecode,\n AllowedTargetsEnforcer as AllowedTargetsEnforcerBytecode,\n AllowedMethodsEnforcer as AllowedMethodsEnforcerBytecode,\n DeployedEnforcer as DeployedEnforcerBytecode,\n TimestampEnforcer as TimestampEnforcerBytecode,\n NonceEnforcer as NonceEnforcerBytecode,\n AllowedCalldataEnforcer as AllowedCalldataEnforcerBytecode,\n BlockNumberEnforcer as BlockNumberEnforcerBytecode,\n LimitedCallsEnforcer as LimitedCallsEnforcerBytecode,\n ERC20BalanceChangeEnforcer as ERC20BalanceChangeEnforcerBytecode,\n ERC20StreamingEnforcer as ERC20StreamingEnforcerBytecode,\n IdEnforcer as IdEnforcerBytecode,\n ERC20TransferAmountEnforcer as ERC20TransferAmountEnforcerBytecode,\n ValueLteEnforcer as ValueLteEnforcerBytecode,\n NativeTokenTransferAmountEnforcer as NativeTokenTransferAmountEnforcerBytecode,\n NativeBalanceChangeEnforcer as NativeBalanceChangeEnforcerBytecode,\n NativeTokenStreamingEnforcer as NativeTokenStreamingEnforcerBytecode,\n NativeTokenPaymentEnforcer as NativeTokenPaymentEnforcerBytecode,\n RedeemerEnforcer as RedeemerEnforcerBytecode,\n ArgsEqualityCheckEnforcer as ArgsEqualityCheckEnforcerBytecode,\n ERC721BalanceChangeEnforcer as ERC721BalanceChangeEnforcerBytecode,\n ERC721TransferEnforcer as ERC721TransferEnforcerBytecode,\n ERC1155BalanceChangeEnforcer as ERC1155BalanceChangeEnforcerBytecode,\n OwnershipTransferEnforcer as OwnershipTransferEnforcerBytecode,\n SpecificActionERC20TransferBatchEnforcer as SpecificActionERC20TransferBatchEnforcerBytecode,\n ERC20PeriodTransferEnforcer as ERC20PeriodTransferEnforcerBytecode,\n NativeTokenPeriodTransferEnforcer as NativeTokenPeriodTransferEnforcerBytecode,\n ExactCalldataBatchEnforcer as ExactCalldataBatchEnforcerBytecode,\n ExactCalldataEnforcer as ExactCalldataEnforcerBytecode,\n ExactExecutionEnforcer as ExactExecutionEnforcerBytecode,\n ExactExecutionBatchEnforcer as ExactExecutionBatchEnforcerBytecode,\n MultiTokenPeriodEnforcer as MultiTokenPeriodEnforcerBytecode,\n} from '@metamask/delegation-abis/bytecode';\nimport { DELEGATOR_CONTRACTS } from '@metamask/delegation-deployments';\nimport type { Chain, Hex, PublicClient, WalletClient } from 'viem';\n\nimport type { ContractMetaData, SmartAccountsEnvironment } from './types';\nimport { deployContract } from './write';\n\ntype SupportedVersion = '1.0.0' | '1.1.0' | '1.2.0' | '1.3.0';\nexport const PREFERRED_VERSION: SupportedVersion = '1.3.0';\n\nconst contractOverrideMap: Map<string, SmartAccountsEnvironment> = new Map();\n\nconst getContractOverrideKey = (chainId: number, version: SupportedVersion) =>\n `${version}:${chainId}`;\n\n/**\n * Overrides the default environment for a specific chain and version.\n *\n * @param chainId - The chain ID to override.\n * @param version - The version of the environment to override.\n * @param environment - The environment to use as override.\n */\nexport function overrideDeployedEnvironment(\n chainId: number,\n version: SupportedVersion,\n environment: SmartAccountsEnvironment,\n) {\n contractOverrideMap.set(\n getContractOverrideKey(chainId, version),\n environment,\n );\n}\n\n/**\n * Gets the SmartAccountsEnvironment for the specified chain and version.\n *\n * @param chainId - The chain ID to get the environment for.\n * @param version - The version of the environment to get.\n * @returns The SmartAccountsEnvironment.\n */\nexport function getSmartAccountsEnvironment(\n chainId: number,\n version: SupportedVersion = PREFERRED_VERSION,\n): SmartAccountsEnvironment {\n const overrideKey = getContractOverrideKey(chainId, version);\n\n const overriddenContracts = contractOverrideMap.get(overrideKey);\n if (overriddenContracts) {\n return overriddenContracts;\n }\n\n const contracts = DELEGATOR_CONTRACTS[version]?.[chainId];\n if (!contracts) {\n throw new Error(\n `No contracts found for version ${version} chain ${chainId}`,\n );\n }\n return getSmartAccountsEnvironmentV1(contracts);\n}\n\n/**\n * Creates a SmartAccountsEnvironment from contract addresses.\n *\n * @param contracts - The contract addresses to create the environment from.\n * @returns The created SmartAccountsEnvironment.\n */\nexport function getSmartAccountsEnvironmentV1(contracts: {\n [contract: string]: Hex;\n}) {\n return {\n DelegationManager: contracts.DelegationManager,\n EntryPoint: contracts.EntryPoint,\n SimpleFactory: contracts.SimpleFactory,\n implementations: {\n MultiSigDeleGatorImpl: contracts.MultiSigDeleGatorImpl,\n HybridDeleGatorImpl: contracts.HybridDeleGatorImpl,\n EIP7702StatelessDeleGatorImpl: contracts.EIP7702StatelessDeleGatorImpl,\n },\n caveatEnforcers: {\n AllowedCalldataEnforcer: contracts.AllowedCalldataEnforcer,\n AllowedMethodsEnforcer: contracts.AllowedMethodsEnforcer,\n AllowedTargetsEnforcer: contracts.AllowedTargetsEnforcer,\n ArgsEqualityCheckEnforcer: contracts.ArgsEqualityCheckEnforcer,\n BlockNumberEnforcer: contracts.BlockNumberEnforcer,\n DeployedEnforcer: contracts.DeployedEnforcer,\n ERC20BalanceChangeEnforcer: contracts.ERC20BalanceChangeEnforcer,\n ERC20TransferAmountEnforcer: contracts.ERC20TransferAmountEnforcer,\n ERC20StreamingEnforcer: contracts.ERC20StreamingEnforcer,\n ERC721BalanceChangeEnforcer: contracts.ERC721BalanceChangeEnforcer,\n ERC721TransferEnforcer: contracts.ERC721TransferEnforcer,\n ERC1155BalanceChangeEnforcer: contracts.ERC1155BalanceChangeEnforcer,\n IdEnforcer: contracts.IdEnforcer,\n LimitedCallsEnforcer: contracts.LimitedCallsEnforcer,\n NonceEnforcer: contracts.NonceEnforcer,\n TimestampEnforcer: contracts.TimestampEnforcer,\n ValueLteEnforcer: contracts.ValueLteEnforcer,\n NativeTokenTransferAmountEnforcer:\n contracts.NativeTokenTransferAmountEnforcer,\n NativeBalanceChangeEnforcer: contracts.NativeBalanceChangeEnforcer,\n NativeTokenStreamingEnforcer: contracts.NativeTokenStreamingEnforcer,\n NativeTokenPaymentEnforcer: contracts.NativeTokenPaymentEnforcer,\n OwnershipTransferEnforcer: contracts.OwnershipTransferEnforcer,\n RedeemerEnforcer: contracts.RedeemerEnforcer,\n SpecificActionERC20TransferBatchEnforcer:\n contracts.SpecificActionERC20TransferBatchEnforcer,\n ERC20PeriodTransferEnforcer: contracts.ERC20PeriodTransferEnforcer,\n NativeTokenPeriodTransferEnforcer:\n contracts.NativeTokenPeriodTransferEnforcer,\n ExactCalldataBatchEnforcer: contracts.ExactCalldataBatchEnforcer,\n ExactCalldataEnforcer: contracts.ExactCalldataEnforcer,\n ExactExecutionEnforcer: contracts.ExactExecutionEnforcer,\n ExactExecutionBatchEnforcer: contracts.ExactExecutionBatchEnforcer,\n MultiTokenPeriodEnforcer: contracts.MultiTokenPeriodEnforcer,\n },\n } as SmartAccountsEnvironment;\n}\n\nexport type DeployedContract = {\n name: string;\n address: string;\n};\n\n/**\n * Deploys the contracts needed for the Delegation Framework and MetaMask SCA to be functional as well as all Caveat Enforcers.\n *\n * @param walletClient - The wallet client to use for deployment.\n * @param publicClient - The public client to use for deployment.\n * @param chain - The chain to deploy to.\n * @param deployedContracts - Optional map of already deployed contracts.\n * @returns A promise that resolves to the SmartAccountsEnvironment.\n */\nexport async function deploySmartAccountsEnvironment(\n walletClient: WalletClient,\n publicClient: PublicClient,\n chain: Chain,\n deployedContracts: { [contract: string]: Hex } = {},\n) {\n const deployContractCurried = async (\n name: string,\n contract: ContractMetaData,\n params: any[] = [],\n ) => {\n const existingAddress = deployedContracts[name];\n if (existingAddress) {\n return {\n address: existingAddress,\n name,\n };\n }\n\n const deployedContract = await deployContract(\n walletClient,\n publicClient,\n chain,\n contract,\n params,\n );\n\n const newDeployedContracts = { ...deployedContracts };\n newDeployedContracts[name] = deployedContract.address;\n Object.assign(deployedContracts, newDeployedContracts);\n\n return { ...deployedContract, name };\n };\n\n // Deploy v1.3.0 DeleGator contracts\n // - deploy standalone contracts\n const standaloneContracts = {\n SimpleFactory: {\n abi: SimpleFactory,\n bytecode: SimpleFactoryBytecode,\n },\n AllowedCalldataEnforcer: {\n abi: AllowedCalldataEnforcer,\n bytecode: AllowedCalldataEnforcerBytecode,\n },\n AllowedTargetsEnforcer: {\n abi: AllowedTargetsEnforcer,\n bytecode: AllowedTargetsEnforcerBytecode,\n },\n AllowedMethodsEnforcer: {\n abi: AllowedMethodsEnforcer,\n bytecode: AllowedMethodsEnforcerBytecode,\n },\n ArgsEqualityCheckEnforcer: {\n abi: ArgsEqualityCheckEnforcer,\n bytecode: ArgsEqualityCheckEnforcerBytecode,\n },\n DeployedEnforcer: {\n abi: DeployedEnforcer,\n bytecode: DeployedEnforcerBytecode,\n },\n TimestampEnforcer: {\n abi: TimestampEnforcer,\n bytecode: TimestampEnforcerBytecode,\n },\n BlockNumberEnforcer: {\n abi: BlockNumberEnforcer,\n bytecode: BlockNumberEnforcerBytecode,\n },\n LimitedCallsEnforcer: {\n abi: LimitedCallsEnforcer,\n bytecode: LimitedCallsEnforcerBytecode,\n },\n ERC20BalanceChangeEnforcer: {\n abi: ERC20BalanceChangeEnforcer,\n bytecode: ERC20BalanceChangeEnforcerBytecode,\n },\n ERC20TransferAmountEnforcer: {\n abi: ERC20TransferAmountEnforcer,\n bytecode: ERC20TransferAmountEnforcerBytecode,\n },\n ERC20StreamingEnforcer: {\n abi: ERC20StreamingEnforcer,\n bytecode: ERC20StreamingEnforcerBytecode,\n },\n ERC721BalanceChangeEnforcer: {\n abi: ERC721BalanceChangeEnforcer,\n bytecode: ERC721BalanceChangeEnforcerBytecode,\n },\n ERC721TransferEnforcer: {\n abi: ERC721TransferEnforcer,\n bytecode: ERC721TransferEnforcerBytecode,\n },\n ERC1155BalanceChangeEnforcer: {\n abi: ERC1155BalanceChangeEnforcer,\n bytecode: ERC1155BalanceChangeEnforcerBytecode,\n },\n IdEnforcer: { abi: IdEnforcer, bytecode: IdEnforcerBytecode },\n NonceEnforcer: {\n abi: NonceEnforcer,\n bytecode: NonceEnforcerBytecode,\n },\n ValueLteEnforcer: {\n abi: ValueLteEnforcer,\n bytecode: ValueLteEnforcerBytecode,\n },\n NativeTokenTransferAmountEnforcer: {\n abi: NativeTokenTransferAmountEnforcer,\n bytecode: NativeTokenTransferAmountEnforcerBytecode,\n },\n NativeBalanceChangeEnforcer: {\n abi: NativeBalanceChangeEnforcer,\n bytecode: NativeBalanceChangeEnforcerBytecode,\n },\n NativeTokenStreamingEnforcer: {\n abi: NativeTokenStreamingEnforcer,\n bytecode: NativeTokenStreamingEnforcerBytecode,\n },\n OwnershipTransferEnforcer: {\n abi: OwnershipTransferEnforcer,\n bytecode: OwnershipTransferEnforcerBytecode,\n },\n RedeemerEnforcer: {\n abi: RedeemerEnforcer,\n bytecode: RedeemerEnforcerBytecode,\n },\n SpecificActionERC20TransferBatchEnforcer: {\n abi: SpecificActionERC20TransferBatchEnforcer,\n bytecode: SpecificActionERC20TransferBatchEnforcerBytecode,\n },\n ERC20PeriodTransferEnforcer: {\n abi: ERC20PeriodTransferEnforcer,\n bytecode: ERC20PeriodTransferEnforcerBytecode,\n },\n NativeTokenPeriodTransferEnforcer: {\n abi: NativeTokenPeriodTransferEnforcer,\n bytecode: NativeTokenPeriodTransferEnforcerBytecode,\n },\n ExactCalldataBatchEnforcer: {\n abi: ExactCalldataBatchEnforcer,\n bytecode: ExactCalldataBatchEnforcerBytecode,\n },\n ExactCalldataEnforcer: {\n abi: ExactCalldataEnforcer,\n bytecode: ExactCalldataEnforcerBytecode,\n },\n ExactExecutionEnforcer: {\n abi: ExactExecutionEnforcer,\n bytecode: ExactExecutionEnforcerBytecode,\n },\n ExactExecutionBatchEnforcer: {\n abi: ExactExecutionBatchEnforcer,\n bytecode: ExactExecutionBatchEnforcerBytecode,\n },\n MultiTokenPeriodEnforcer: {\n abi: MultiTokenPeriodEnforcer,\n bytecode: MultiTokenPeriodEnforcerBytecode,\n },\n };\n for (const [name, contract] of Object.entries(standaloneContracts)) {\n await deployContractCurried(name, contract);\n }\n\n // - deploy dependencies\n const delegationManager = await deployContractCurried(\n 'DelegationManager',\n { abi: DelegationManager, bytecode: DelegationManagerBytecode },\n [walletClient.account?.address],\n );\n\n // - NativeTokenPaymentEnforcer DelegationManager and ArgsEqualityCheckEnforcer as constructor args\n await deployContractCurried(\n 'NativeTokenPaymentEnforcer',\n {\n abi: NativeTokenPaymentEnforcer,\n bytecode: NativeTokenPaymentEnforcerBytecode,\n },\n [delegationManager.address, deployedContracts.ArgsEqualityCheckEnforcer],\n );\n\n const entryPoint = await deployContractCurried('EntryPoint', {\n abi: EntryPoint,\n bytecode: EntryPointBytecode,\n });\n\n // This is a hack to work around the SCL_RIP7212 being deployed as a library.\n // Forge handles this gracefully, but in the tests we need to manually link\n // the library.\n // We don't use the curried function here because we don't need it added to\n // the environment.\n const { address: sclRIP7212 } = await deployContract(\n walletClient,\n publicClient,\n chain,\n { abi: SCL_RIP7212, bytecode: SCLRIP7212Bytecode },\n [],\n );\n\n // replace linked library address in bytecode https://docs.soliditylang.org/en/latest/using-the-compiler.html#library-linking\n const hybridDeleGatorWithLinkedLibrary = {\n abi: HybridDeleGator,\n bytecode: HybridDeleGatorBytecode.replace(\n /__\\$b8f96b288d4d0429e38b8ed50fd423070f\\$__/gu,\n sclRIP7212.slice(2),\n ) as Hex,\n };\n\n // - deploy DeleGator implementations\n await deployContractCurried(\n 'HybridDeleGatorImpl',\n hybridDeleGatorWithLinkedLibrary,\n [delegationManager.address, entryPoint.address],\n );\n\n await deployContractCurried(\n 'MultiSigDeleGatorImpl',\n {\n abi: MultiSigDeleGator,\n bytecode: MultiSigDeleGatorBytecode,\n },\n [delegationManager.address, entryPoint.address],\n );\n\n await deployContractCurried(\n 'EIP7702StatelessDeleGatorImpl',\n {\n abi: EIP7702StatelessDeleGator,\n bytecode: EIP7702StatelessDeleGatorBytecode,\n },\n [delegationManager.address, entryPoint.address],\n );\n\n // Format deployments\n return getSmartAccountsEnvironmentV1(deployedContracts);\n}\n","import { concat, encodeAbiParameters, keccak256, pad, toHex } from 'viem';\nimport type { Address, Hex, TypedData } from 'viem';\nimport { toPackedUserOperation } from 'viem/account-abstraction';\nimport { signTypedData } from 'viem/accounts';\n\nimport type { OptionalUserOpProps, PackedUserOperationStruct } from './types';\n\n// v7 off-chain user operation, hexlified incoming data from rpc call\nexport type UserOperationV07Hexlify = {\n sender: Hex;\n nonce: Hex;\n factory?: Hex;\n factoryData?: Hex;\n callData: Hex;\n callGasLimit: Hex;\n\n verificationGasLimit: Hex;\n preVerificationGas: Hex;\n maxFeePerGas: Hex;\n maxPriorityFeePerGas: Hex;\n\n paymaster?: Hex;\n paymasterVerificationGasLimit?: Hex;\n paymasterPostOpGasLimit?: Hex;\n paymasterData?: Hex;\n\n signature: Hex;\n};\n\n// v7 off-chain user operation with BigInt fields\nexport type UserOperationV07 = {\n sender: Hex;\n nonce: bigint;\n factory?: Hex;\n factoryData?: Hex;\n callData: Hex;\n\n callGasLimit: bigint;\n verificationGasLimit: bigint;\n preVerificationGas: bigint;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n\n paymaster?: Hex;\n paymasterVerificationGasLimit?: bigint;\n paymasterPostOpGasLimit?: bigint;\n paymasterData?: Hex;\n\n signature: Hex;\n};\n\n/**\n * Creates a raw user operation data structure.\n *\n * @param sender - The smart account taking some action.\n * @param nonce - A nonce, ideally fetched from the Entry Point.\n * @param callData - Calldata to invoke on some contract.\n * @param signature - The signature for the user operation.\n * @param options - Optional properties for the user operation.\n * @returns The created raw user operation data structure.\n */\nexport const createRawUserOp = (\n sender: Hex,\n nonce: bigint,\n callData: Hex,\n signature: Hex = '0x',\n options?: OptionalUserOpProps,\n): UserOperationV07 => ({\n sender,\n nonce,\n callData,\n factory: options?.factory,\n factoryData: options?.factoryData,\n callGasLimit: options?.callGasLimit ?? 0n,\n verificationGasLimit: options?.verificationGasLimit ?? 0n,\n preVerificationGas: options?.preVerificationGas ?? 0n,\n maxFeePerGas: options?.maxFeePerGas ?? 0n,\n maxPriorityFeePerGas: options?.maxPriorityFeePerGas ?? 0n,\n paymaster: options?.paymaster,\n paymasterVerificationGasLimit: options?.paymasterVerificationGasLimit,\n paymasterPostOpGasLimit: options?.paymasterPostOpGasLimit,\n paymasterData: options?.paymasterData,\n signature,\n});\n\n// //////////////////////////////////////////////////////////////////////////////////////\n\n// TODO: These userOp functions are duplicated in ./apps/ew-client/src/utils/userOpBuilder.ts. We should move them to a shared location along with test(./apps/ew-client/test/UserOpBuilder.test.ts) to avoid duplication\n/**\n * Generates a salt value for address derivation.\n *\n * @param salt - Optional salt value.\n * @returns The chosen salt value.\n */\nexport const getSalt = (salt?: Hex): Hex => {\n return salt ?? '0x0';\n};\n\nexport const getPaymasterAndData = (userOp: UserOperationV07): Hex => {\n let paymasterAndData: Hex;\n if (userOp.paymaster) {\n paymasterAndData = concat([\n userOp.paymaster,\n pad(toHex(userOp.paymasterVerificationGasLimit ?? 0n), {\n size: 16,\n }),\n pad(toHex(userOp.paymasterPostOpGasLimit ?? 0n), {\n size: 16,\n }),\n userOp.paymasterData ?? '0x',\n ]);\n } else {\n paymasterAndData = '0x';\n }\n\n return paymasterAndData;\n};\n\nexport const getInitCode = (userOp: UserOperationV07): Hex => {\n return userOp.factory\n ? concat([userOp.factory, userOp.factoryData ?? ('0x' as Hex)])\n : '0x';\n};\n\nexport const getAccountGasLimits = (userOp: UserOperationV07): Hex => {\n return concat([\n pad(toHex(userOp.verificationGasLimit), {\n size: 16,\n }),\n pad(toHex(userOp.callGasLimit), { size: 16 }),\n ]);\n};\n\nexport const getGasFees = (userOp: UserOperationV07): Hex => {\n return concat([\n pad(toHex(userOp.maxPriorityFeePerGas), {\n size: 16,\n }),\n pad(toHex(userOp.maxFeePerGas), { size: 16 }),\n ]);\n};\n\n/**\n * Packs a user operation into a `PackedUserOperationStruct` object.\n *\n * @param userOp - The user operation to pack.\n * @returns The packed user operation.\n */\nexport const packUserOp = (\n userOp: UserOperationV07,\n): PackedUserOperationStruct => {\n const packedOp = {\n sender: userOp.sender,\n nonce: BigInt(userOp.nonce),\n initCode: getInitCode(userOp),\n callData: userOp.callData,\n accountGasLimits: getAccountGasLimits(userOp),\n preVerificationGas: BigInt(userOp.preVerificationGas),\n gasFees: getGasFees(userOp),\n paymasterAndData: getPaymasterAndData(userOp),\n signature: userOp.signature,\n };\n\n return packedOp;\n};\n\n/**\n * Calculates the user operation hash for a given packed user operation.\n *\n * @param packedOp - The packed user operation.\n * @param entryPoint - The entry point address.\n * @param chainId - The chain ID.\n * @returns The user operation hash.\n */\nexport const createUserOpHashV07 = (\n packedOp: PackedUserOperationStruct,\n entryPoint: Hex,\n chainId: bigint,\n) => {\n const hash = keccak256(\n encodeAbiParameters(\n [\n {\n name: 'sender',\n type: 'address',\n },\n {\n name: 'nonce',\n type: 'uint256',\n },\n {\n name: 'initCodeHash',\n type: 'bytes32',\n },\n {\n name: 'callDataHash',\n type: 'bytes32',\n },\n {\n name: 'accountGasLimits',\n type: 'bytes32',\n },\n {\n name: 'preVerificationGas',\n type: 'uint256',\n },\n {\n name: 'gasFees',\n type: 'bytes32',\n },\n {\n name: 'paymasterAndDataHash',\n type: 'bytes32',\n },\n ],\n [\n packedOp.sender,\n packedOp.nonce,\n keccak256(packedOp.initCode),\n keccak256(packedOp.callData),\n packedOp.accountGasLimits,\n packedOp.preVerificationGas,\n packedOp.gasFees,\n keccak256(packedOp.paymasterAndData),\n ],\n ),\n );\n\n return keccak256(\n encodeAbiParameters(\n [\n {\n name: 'userOpHash',\n type: 'bytes32',\n },\n {\n name: 'entryPointAddress',\n type: 'address',\n },\n {\n name: 'chainId',\n type: 'uint256',\n },\n ],\n [hash, entryPoint, chainId],\n ),\n );\n};\n\nexport const SIGNABLE_USER_OP_TYPED_DATA: TypedData = {\n PackedUserOperation: [\n { name: 'sender', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n { name: 'initCode', type: 'bytes' },\n { name: 'callData', type: 'bytes' },\n { name: 'accountGasLimits', type: 'bytes32' },\n { name: 'preVerificationGas', type: 'uint256' },\n { name: 'gasFees', type: 'bytes32' },\n { name: 'paymasterAndData', type: 'bytes' },\n { name: 'entryPoint', type: 'address' },\n ],\n} as const;\n\n/**\n * Prepares typed data for user operation signing.\n * This is an internal helper function that's not exposed in the public API.\n *\n * @param params - The parameters for preparing the typed data.\n * @param params.userOperation - The user operation to prepare for signing.\n * @param params.entryPoint - The entry point contract address.\n * @param params.entryPoint.address - The address of the entry point contract.\n * @param params.chainId - The chain ID that the entry point is deployed on.\n * @param params.name - The name of the domain of the implementation contract.\n * @param params.version - The version of the domain of the implementation contract.\n * @param params.address - The address of the smart account.\n * @returns The prepared typed data for signing.\n */\nexport const prepareSignUserOperationTypedData = ({\n userOperation,\n entryPoint,\n chainId,\n name,\n address,\n version = '1',\n}: {\n userOperation: Omit<UserOperationV07, 'signature'>;\n entryPoint: { address: Address };\n chainId: number;\n name: 'HybridDeleGator' | 'MultiSigDeleGator';\n address: Address;\n version?: string;\n}) => {\n const packedUserOp = toPackedUserOperation({\n ...userOperation,\n signature: '0x',\n });\n\n return {\n domain: {\n chainId,\n name,\n version,\n verifyingContract: address,\n },\n types: SIGNABLE_USER_OP_TYPED_DATA,\n primaryType: 'PackedUserOperation' as const,\n message: { ...packedUserOp, entryPoint: entryPoint.address },\n };\n};\n\n/**\n * Signs a user operation using a private key.\n *\n * @param params - The parameters for signing the user operation.\n * @param params.privateKey - The private key to use for signing.\n * @param params.userOperation - The user operation to sign.\n * @param params.entryPoint - The entry point contract address.\n * @param params.chainId - The chain ID that the entry point is deployed on.\n * @param params.name - The name of the domain of the implementation contract.\n * @param params.version - The version of the domain of the implementation contract.\n * @param params.address - The address of the smart account.\n * @param params.entryPoint.address - The address of the entry point contract.\n * @returns The signature of the user operation.\n */\nexport const signUserOperation = async ({\n privateKey,\n userOperation,\n entryPoint,\n chainId,\n name,\n address,\n version = '1',\n}: {\n privateKey: Hex;\n userOperation: Omit<UserOperationV07, 'signature'>;\n entryPoint: { address: Address };\n chainId: number;\n address: Address;\n name: 'HybridDeleGator' | 'MultiSigDeleGator';\n version?: string;\n}) => {\n const typedData = prepareSignUserOperationTypedData({\n userOperation,\n entryPoint,\n chainId,\n name,\n address,\n version,\n });\n\n return signTypedData({\n privateKey,\n ...typedData,\n });\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../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":["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: '0x' 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: '0x',\n };\n};\n","import { isHex, concat, 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 = concat(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: '0x',\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 { concat, 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 = concat(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: '0x',\n };\n};\n","import { 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: args,\n args: '0x',\n };\n};\n","import { concat, toHex } from 'viem';\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 = concat([\n toHex(afterThreshold, {\n size: 16,\n }),\n toHex(beforeThreshold, {\n size: 16,\n }),\n ]);\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: '0x',\n };\n};\n","import { concat, isAddress, isHex, pad, 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 = concat([contractAddress, pad(salt, { size: 32 }), 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: '0x',\n };\n};\n","import { type Address, isAddress, encodePacked } 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 = encodePacked(\n ['uint8', 'address', 'address', 'uint256', 'uint256'],\n [changeType, tokenAddress, recipient, tokenId, balance],\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: '0x',\n };\n};\n","import { type Address, isAddress, encodePacked } 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 = encodePacked(\n ['uint8', 'address', 'address', 'uint256'],\n [changeType, tokenAddress, recipient, balance],\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: '0x',\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: '0x',\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: '0x',\n };\n};\n","import type { Address } from 'viem';\nimport { concat, isAddress, toHex } 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 = concat([tokenAddress, toHex(maxAmount, { size: 32 })]);\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: '0x',\n };\n};\n","import { type Address, isAddress, encodePacked } 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 = encodePacked(\n ['uint8', 'address', 'address', 'uint256'],\n [changeType, tokenAddress, recipient, amount],\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: '0x',\n };\n};\n","import { type Address, isAddress, toHex, concat } 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 = concat([tokenAddress, toHex(tokenId, { size: 32 })]);\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: '0x',\n };\n};\n","import { encodeAbiParameters, 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 // Encode the executions using the approach implemented in ExecutionLib.sol encodeBatch()\n const terms = encodeAbiParameters(\n [\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'target' },\n { type: 'uint256', name: 'value' },\n { type: 'bytes', name: 'callData' },\n ],\n },\n ],\n [executions],\n );\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: '0x',\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: '0x',\n };\n};\n","import { encodeAbiParameters, 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 // Encode the executions using the approach implemented in ExecutionLib.sol encodeBatch()\n const terms = encodeAbiParameters(\n [\n {\n type: 'tuple[]',\n components: [\n { type: 'address', name: 'target' },\n { type: 'uint256', name: 'value' },\n { type: 'bytes', name: 'callData' },\n ],\n },\n ],\n [executions],\n );\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: '0x',\n };\n};\n","import { isAddress, concat, toHex } 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 = concat([\n execution.target,\n toHex(execution.value, { size: 32 }),\n execution.callData,\n ]);\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: '0x',\n };\n};\n","import { maxUint256, toHex } 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 = toHex(idBigInt, { size: 32 });\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: '0x',\n };\n};\n","import { type Hex, toHex, pad } from 'viem';\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: Hex = pad(toHex(limit), { size: 32 });\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: '0x',\n };\n};\n","import type { Hex } from 'viem';\nimport { concat, isAddress, pad, toHex } 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 // Each config requires 116 bytes:\n // - 20 bytes for token address\n // - 32 bytes for periodAmount\n // - 32 bytes for periodDuration\n // - 32 bytes for startDate\n const termsArray = config.tokenConfigs.reduce<Hex[]>(\n (acc, { token, periodAmount, periodDuration, startDate }) => [\n ...acc,\n pad(token, { size: 20 }),\n toHex(periodAmount, { size: 32 }),\n toHex(periodDuration, { size: 32 }),\n toHex(startDate, { size: 32 }),\n ],\n [],\n );\n\n const terms = concat(termsArray);\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: '0x',\n };\n};\n","import { type Address, isAddress, encodePacked } 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 = encodePacked(\n ['uint8', 'address', 'uint256'],\n [changeType, recipient, balance],\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: '0x',\n };\n};\n","import { type Address, encodePacked, 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 = encodePacked(['address', 'uint256'], [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: '0x',\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: '0x',\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: '0x',\n };\n};\n","import { encodePacked } from 'viem';\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 = encodePacked(['uint256'], [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: '0x',\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: '0x',\n };\n};\n","import { 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 = 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: '0x',\n };\n};\n","import { type Address, concat, 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 = concat(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: '0x',\n };\n};\n","import { concat, isAddress, toHex, 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 = concat([\n tokenAddress,\n recipient,\n toHex(amount, { size: 32 }),\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: '0x',\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: '0x',\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: '0x',\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';\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 CoreCaveatMap = {\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\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 { SmartAccountsEnvironment } from '../../types';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type {\n erc20PeriodTransfer,\n Erc20PeriodTransferBuilderConfig,\n} from '../erc20PeriodTransferBuilder';\n\nexport type Erc20PeriodicScopeConfig = {\n type: typeof 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 { SmartAccountsEnvironment } from '../../types';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type {\n erc20Streaming,\n Erc20StreamingBuilderConfig,\n} from '../erc20StreamingBuilder';\n\nexport type Erc20StreamingScopeConfig = {\n type: typeof 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 { SmartAccountsEnvironment } from '../../types';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type {\n erc20TransferAmount,\n Erc20TransferAmountBuilderConfig,\n} from '../erc20TransferAmountBuilder';\n\nexport type Erc20TransferScopeConfig = {\n type: typeof 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 * Checks if two hexadecimal strings are equal, ignoring case sensitivity.\n *\n * @param a - The first hexadecimal string.\n * @param b - The second hexadecimal string.\n * @returns True if the hexadecimal strings are equal, false otherwise.\n */\nexport function isEqualHex(a: Hex, b: Hex): boolean {\n return isHex(a) && a.toLowerCase() === b.toLowerCase();\n}\n\n/**\n * Recursively converts all members of an object to hexadecimal format.\n * Handles various data types including functions, null, strings, booleans,\n * bigints, arrays, and objects.\n *\n * @param obj - The object to convert to hexadecimal format.\n * @returns The object with all values converted to hexadecimal format.\n */\nexport function deepHexlify(obj: any): any {\n if (typeof obj === 'function') {\n return undefined;\n }\n\n if (\n obj === null ||\n obj === undefined ||\n typeof obj === 'string' ||\n typeof obj === 'boolean'\n ) {\n return obj;\n }\n\n if (typeof obj === 'bigint') {\n return toHex(obj);\n }\n\n if (obj._isBigNumber !== null || typeof obj !== 'object') {\n return toHex(obj).replace(/^0x0/u, '0x');\n }\n\n if (Array.isArray(obj)) {\n return obj.map((member) => deepHexlify(member));\n }\n\n return Object.keys(obj).reduce(\n (set, key) =>\n Object.assign(Object.assign({}, set), {\n [key]: deepHexlify(obj[key]),\n }),\n {},\n );\n}\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 { SmartAccountsEnvironment } from '../../types';\nimport { hasProperties } from '../../utils';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type {\n erc721Transfer,\n Erc721TransferBuilderConfig,\n} from '../erc721TransferBuilder';\n\nexport type Erc721ScopeBaseConfig = {\n type: typeof 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 { 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: '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 { SmartAccountsEnvironment } from '../../types';\nimport type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';\nimport type {\n nativeTokenPeriodTransfer,\n NativeTokenPeriodTransferBuilderConfig,\n} from '../nativeTokenPeriodTransferBuilder';\n\nexport type NativeTokenPeriodicScopeConfig = {\n type: typeof 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 { SmartAccountsEnvironment } from '../../types';\nimport type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';\nimport type {\n nativeTokenStreaming,\n NativeTokenStreamingBuilderConfig,\n} from '../nativeTokenStreamingBuilder';\n\nexport type NativeTokenStreamingScopeConfig = {\n type: typeof 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 { SmartAccountsEnvironment } from '../../types';\nimport type { AllowedCalldataBuilderConfig } from '../allowedCalldataBuilder';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type { ExactCalldataBuilderConfig } from '../exactCalldataBuilder';\nimport type {\n nativeTokenTransferAmount,\n NativeTokenTransferAmountBuilderConfig,\n} from '../nativeTokenTransferAmountBuilder';\n\nexport type NativeTokenTransferScopeConfig = {\n type: typeof 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 { SmartAccountsEnvironment } from '../../types';\nimport { hasProperties } from '../../utils';\nimport { createCaveatBuilder } from '../coreCaveatBuilder';\nimport type { CoreCaveatBuilder } from '../coreCaveatBuilder';\nimport type {\n ownershipTransfer,\n OwnershipTransferBuilderConfig,\n} from '../ownershipTransferBuilder';\n\ntype OwnershipScopeBaseConfig = {\n type: typeof 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 type { SmartAccountsEnvironment } from '../../types';\n// Import caveat builder name constants\nimport { erc20PeriodTransfer } from '../erc20PeriodTransferBuilder';\nimport { erc20Streaming } from '../erc20StreamingBuilder';\nimport { erc20TransferAmount } from '../erc20TransferAmountBuilder';\nimport { erc721Transfer } from '../erc721TransferBuilder';\nimport { nativeTokenPeriodTransfer } from '../nativeTokenPeriodTransferBuilder';\nimport { nativeTokenStreaming } from '../nativeTokenStreamingBuilder';\nimport { nativeTokenTransferAmount } from '../nativeTokenTransferAmountBuilder';\nimport { ownershipTransfer } from '../ownershipTransferBuilder';\n\nexport type ScopeConfig =\n | Erc20TransferScopeConfig\n | Erc20StreamingScopeConfig\n | Erc20PeriodicScopeConfig\n | NativeTokenTransferScopeConfig\n | NativeTokenStreamingScopeConfig\n | NativeTokenPeriodicScopeConfig\n | Erc721ScopeConfig\n | OwnershipScopeConfig\n | FunctionCallScopeConfig;\n\nexport const createCaveatBuilderFromScope = (\n environment: SmartAccountsEnvironment,\n scopeConfig: ScopeConfig,\n) => {\n switch (scopeConfig.type) {\n case erc20TransferAmount:\n return createErc20TransferCaveatBuilder(environment, scopeConfig);\n case erc20Streaming:\n return createErc20StreamingCaveatBuilder(environment, scopeConfig);\n case erc20PeriodTransfer:\n return createErc20PeriodicCaveatBuilder(environment, scopeConfig);\n case nativeTokenTransferAmount:\n return createNativeTokenTransferCaveatBuilder(environment, scopeConfig);\n case nativeTokenStreaming:\n return createNativeTokenStreamingCaveatBuilder(environment, scopeConfig);\n case nativeTokenPeriodTransfer:\n return createNativeTokenPeriodicCaveatBuilder(environment, scopeConfig);\n case erc721Transfer:\n return createErc721CaveatBuilder(environment, scopeConfig);\n case ownershipTransfer:\n return createOwnershipCaveatBuilder(environment, scopeConfig);\n case 'functionCall':\n return createFunctionCallCaveatBuilder(environment, scopeConfig);\n default:\n // eslint-disable-next-line no-case-declarations\n const exhaustivenessCheck: never = scopeConfig;\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 encodePacked,\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 * Calculates the hash of an array of Caveats.\n *\n * @param input - The array of Caveats.\n * @returns The keccak256 hash of the encoded Caveat array packet.\n */\nexport const getCaveatArrayPacketHash = (input: Caveat[]): Hex => {\n let encoded: Hex = '0x';\n\n for (const caveat of input) {\n const caveatPacketHash = getCaveatPacketHash(caveat);\n encoded = encodePacked(['bytes', 'bytes32'], [encoded, caveatPacketHash]);\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 = '0x',\n): Caveat => ({\n enforcer,\n terms,\n args,\n});\n","import {\n encodeDelegations as encodeDelegationsCore,\n decodeDelegations as decodeDelegationsCore,\n hashDelegation,\n ANY_BENEFICIARY,\n DELEGATION_TYPEHASH,\n CAVEAT_TYPEHASH,\n ROOT_AUTHORITY,\n} from '@metamask/delegation-core';\nimport { hashMessage, toBytes, toHex, getAddress } 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 { Delegation, SmartAccountsEnvironment } 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 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.\n * @returns The encoded delegations.\n */\nexport const encodeDelegations = (delegations: Delegation[]): Hex => {\n const delegationStructs = delegations.map(toDelegationStruct);\n\n return encodeDelegationsCore(delegationStructs);\n};\n\n/**\n * Abi encodes permission contexts.\n *\n * @param delegations - The delegation chains to encode.\n * @returns The encoded permission contexts.\n */\nexport const encodePermissionContexts = (delegations: Delegation[][]) => {\n const encodedDelegations = delegations.map((delegationChain) =>\n encodeDelegations(delegationChain),\n );\n\n return encodedDelegations;\n};\n\n/**\n * Decodes an array of delegations from its ABI-encoded representation.\n *\n * @param encoded - The hex-encoded delegation array to decode.\n * @returns An array of decoded delegations.\n */\nexport const decodeDelegations = (encoded: Hex): Delegation[] => {\n // decodeDelegationsCore returns DelegationStruct, so we need to map it back to Delegation\n return decodeDelegationsCore(encoded).map(toDelegation);\n};\n\n/**\n * Decodes an array of encoded permission contexts into an array of delegation chains.\n *\n * @param encoded - The hex-encoded permission context to decode.\n * @returns An array of decoded delegations.\n */\nexport const decodePermissionContexts = (encoded: Hex[]): Delegation[][] => {\n const delegationChains = encoded.map(decodeDelegations);\n\n return delegationChains;\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 * Prepares a delegation hash for passkey signing.\n *\n * @param delegationHash - The delegation hash to prepare.\n * @returns The prepared hash for passkey signing.\n */\nexport const prepDelegationHashForPasskeySign = (delegationHash: Hex) => {\n return hashMessage({\n raw: toBytes(delegationHash),\n });\n};\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 getDelegationHashOffchain = (input: Delegation): Hex => {\n const delegationStruct = toDelegationStruct(input);\n\n return hashDelegation(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 getDelegationHashOffchain(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 ?? '0x',\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 ?? '0x',\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":["BalanceChangeType","concat","isHex","concat","concat","isAddress","isHex","isAddress","isAddress","isAddress","encodePacked","isAddress","encodePacked","concat","isAddress","toHex","isAddress","encodePacked","isAddress","encodePacked","isAddress","toHex","concat","isAddress","encodeAbiParameters","isAddress","isAddress","concat","toHex","toHex","toHex","pad","concat","isAddress","pad","toHex","isAddress","encodePacked","isAddress","encodePacked","encodePacked","isAddress","encodePacked","isAddress","concat","isAddress","concat","isAddress","toHex","isHex","toHex","isHex","toHex","allowedCalldata","exactCalldata","allowedCalldata","exactCalldata","allowedCalldata","exactCalldata","allowedCalldata","exactCalldata","encodePacked","encodeAbiParameters","toHex","CAVEAT_TYPEHASH","toHex","toHex"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/actions/index.ts","../src/actions/erc7710RedeemDelegationAction.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 PermissionRequestParameter,\n type RequestExecutionPermissionsParameters,\n type RequestExecutionPermissionsReturnType,\n} from './erc7715RequestExecutionPermissionsAction';\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} 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 {\n createExecution,\n encodeExecutionCalldatas,\n ExecutionMode,\n} from '../executions';\nimport { getSmartAccountsEnvironment } from '../smartAccountsEnvironment';\nimport type { Call } from '../types';\n\nexport type DelegatedCall = Call &\n OneOf<{ permissionsContext: Hex; delegationManager: Hex } | object>;\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 permissionsContext: Hex;\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 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 [args.permissionsContext],\n [ExecutionMode.SingleDefault],\n encodeExecutionCalldatas([executions]),\n ],\n });\n\n const {\n value: _value,\n permissionsContext: _permissionsContext,\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 accountMetadata?: { 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 * permissionsContext: '0x...',\n * delegationManager: '0x...',\n * },\n * ],\n * accountMetadata: [{ 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.accountMetadata) {\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 uniqueAccountMetadatas = parameters.accountMetadata.filter(\n (accountMetadata) => {\n if (!isAddressEqual(accountMetadata.factory, SimpleFactory)) {\n throw new Error(\n `Invalid accountMetadata: ${accountMetadata.factory} is not allowed.`,\n );\n }\n\n // ensure that factory calls are not duplicated\n const accountKey = concat([\n accountMetadata.factory,\n accountMetadata.factoryData,\n ]);\n const isDuplicate = includedAccountKeys[accountKey];\n\n includedAccountKeys[accountKey] = true;\n return !isDuplicate;\n },\n );\n\n const factoryCalls = (\n await Promise.all(\n uniqueAccountMetadatas.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 return client.sendUserOperation(\n parameters as unknown as SendUserOperationParameters,\n );\n}\n","import type {\n GetGrantedExecutionPermissionsResult,\n MetaMaskExtensionClient,\n} 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\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 result;\n}\n","import type {\n GetSupportedExecutionPermissionsResult,\n MetaMaskExtensionClient,\n} 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\": [\"0x1\", \"0x89\"],\n * // \"ruleTypes\": [\"expiry\"]\n * // },\n * // \"erc20-token-allowance\": {\n * // \"chainIds\": [\"0x1\"],\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 result;\n}\n","import type {\n Erc20TokenPeriodicPermission,\n Erc20TokenStreamPermission,\n Erc20TokenRevocationPermission,\n NativeTokenPeriodicPermission,\n NativeTokenStreamPermission,\n PermissionRequest,\n PermissionResponse,\n PermissionTypes,\n Rule,\n Hex,\n} from '@metamask/7715-permission-types';\nimport { toHex } from 'viem';\nimport type { Address } from 'viem';\n\nimport { isDefined, toHexOrThrow } from '../utils';\nimport type { MetaMaskExtensionClient } from './erc7715Types';\n\nexport type {\n GetGrantedExecutionPermissionsResult,\n GetSupportedExecutionPermissionsResult,\n MetaMaskExtensionClient,\n MetaMaskExtensionSchema,\n SupportedPermissionInfo,\n} from './erc7715Types';\n\ntype PermissionParameter = {\n type: string;\n data: Record<string, unknown>;\n};\n\n/**\n * Represents a native token stream permission.\n * This allows for continuous token streaming with defined parameters.\n */\nexport type NativeTokenStreamPermissionParameter = PermissionParameter & {\n type: 'native-token-stream';\n data: {\n amountPerSecond: bigint;\n initialAmount?: bigint;\n maxAmount?: bigint;\n startTime?: number;\n justification?: string;\n };\n};\n\n/**\n * Represents an ERC-20 token stream permission.\n * This allows for continuous ERC-20 token streaming with defined parameters.\n */\nexport type Erc20TokenStreamPermissionParameter = PermissionParameter & {\n type: 'erc20-token-stream';\n data: {\n tokenAddress: Address;\n amountPerSecond: bigint;\n initialAmount?: bigint;\n maxAmount?: bigint;\n startTime?: number;\n justification?: string;\n };\n};\n\n/**\n * Represents a native token periodic permission.\n * This allows for periodic native token transfers with defined parameters.\n */\nexport type NativeTokenPeriodicPermissionParameter = PermissionParameter & {\n type: 'native-token-periodic';\n data: {\n periodAmount: bigint;\n periodDuration: number;\n startTime?: number;\n justification?: string;\n };\n};\n\n/**\n * Represents an ERC-20 token periodic permission.\n * This allows for periodic ERC-20 token transfers with defined parameters.\n */\nexport type Erc20TokenPeriodicPermissionParameter = PermissionParameter & {\n type: 'erc20-token-periodic';\n data: {\n tokenAddress: Address;\n periodAmount: bigint;\n periodDuration: number;\n startTime?: number;\n justification?: string;\n };\n};\n\n/**\n * Represents an ERC-20 token revocation permission.\n * This allows for revoking an ERC-20 token allowance.\n */\nexport type Erc20TokenRevocationPermissionParameter = PermissionParameter & {\n type: 'erc20-token-revocation';\n data: {\n justification?: string;\n };\n};\n\nexport type SupportedPermissionParams =\n | NativeTokenStreamPermissionParameter\n | Erc20TokenStreamPermissionParameter\n | NativeTokenPeriodicPermissionParameter\n | Erc20TokenPeriodicPermissionParameter\n | Erc20TokenRevocationPermissionParameter;\n\n/**\n * Represents a single permission request.\n */\nexport type PermissionRequestParameter = {\n chainId: number;\n // The permission to grant to the user.\n permission: SupportedPermissionParams;\n // Whether the caller allows the permission to be adjusted.\n isAdjustmentAllowed: boolean;\n // Account to assign the permission to.\n to: Hex;\n // address from which the permission should be granted.\n from?: Address | undefined | null;\n // Timestamp (in seconds) that specifies the time by which this permission MUST expire.\n expiry?: number | undefined | null;\n};\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 PermissionResponse<PermissionTypes>[];\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(formatPermissionsRequest);\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 result;\n}\n\n/**\n * Formats a permissions request for submission to the wallet.\n *\n * @param parameters - The permissions request to format.\n * @returns The formatted permissions request.\n * @internal\n */\nfunction formatPermissionsRequest(\n parameters: PermissionRequestParameter,\n): PermissionRequest<PermissionTypes> {\n const { chainId, from, expiry, isAdjustmentAllowed } = parameters;\n\n const permissionFormatter = getPermissionFormatter(\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: permissionFormatter({\n permission: parameters.permission,\n isAdjustmentAllowed,\n }),\n to: parameters.to,\n rules,\n };\n}\n\ntype PermissionFormatter = (params: {\n permission: PermissionParameter;\n isAdjustmentAllowed: boolean;\n}) => PermissionTypes;\n\n/**\n * Gets the appropriate formatter function for a specific permission type.\n *\n * @param permissionType - The type of permission to format.\n * @returns A formatter function for the specified permission type.\n */\nfunction getPermissionFormatter(permissionType: string): PermissionFormatter {\n switch (permissionType) {\n case 'native-token-stream':\n return ({ permission, isAdjustmentAllowed }) =>\n formatNativeTokenStreamPermission({\n permission: permission as NativeTokenStreamPermissionParameter,\n isAdjustmentAllowed,\n });\n case 'erc20-token-stream':\n return ({ permission, isAdjustmentAllowed }) =>\n formatErc20TokenStreamPermission({\n permission: permission as Erc20TokenStreamPermissionParameter,\n isAdjustmentAllowed,\n });\n\n case 'native-token-periodic':\n return ({ permission, isAdjustmentAllowed }) =>\n formatNativeTokenPeriodicPermission({\n permission: permission as NativeTokenPeriodicPermissionParameter,\n isAdjustmentAllowed,\n });\n case 'erc20-token-periodic':\n return ({ permission, isAdjustmentAllowed }) =>\n formatErc20TokenPeriodicPermission({\n permission: permission as Erc20TokenPeriodicPermissionParameter,\n isAdjustmentAllowed,\n });\n case 'erc20-token-revocation':\n return ({ permission, isAdjustmentAllowed }) =>\n formatErc20TokenRevocationPermission({\n permission: permission as Erc20TokenRevocationPermissionParameter,\n isAdjustmentAllowed,\n });\n default:\n throw new Error(`Unsupported permission type: ${permissionType}`);\n }\n}\n\n/**\n * Formats a native token stream permission for the wallet.\n *\n * @param permission - The native token stream permission to format.\n * @param permission.permission - The native token stream permission to format.\n * @param permission.isAdjustmentAllowed - Whether the permission is allowed to be adjusted.\n * @returns The formatted permission object.\n */\nfunction formatNativeTokenStreamPermission({\n permission,\n isAdjustmentAllowed,\n}: {\n permission: NativeTokenStreamPermissionParameter;\n isAdjustmentAllowed: boolean;\n}): NativeTokenStreamPermission {\n const {\n data: {\n initialAmount,\n justification,\n maxAmount,\n startTime,\n amountPerSecond,\n },\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 * Formats an ERC-20 token stream permission parameter into the required\n * Erc20TokenStreamPermission object, converting numeric values to hex strings\n * and including only specified optional fields.\n *\n * @param params - The parameters for formatting the ERC-20 token stream permission.\n * @param params.permission - The ERC-20 token stream permission parameter to format.\n * @param params.isAdjustmentAllowed - Whether adjustment of the stream is allowed.\n * @returns The formatted Erc20TokenStreamPermission object.\n */\nfunction formatErc20TokenStreamPermission({\n permission,\n isAdjustmentAllowed,\n}: {\n permission: Erc20TokenStreamPermissionParameter;\n isAdjustmentAllowed: boolean;\n}): Erc20TokenStreamPermission {\n const {\n data: {\n tokenAddress,\n amountPerSecond,\n initialAmount,\n startTime,\n maxAmount,\n justification,\n },\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 * Formats a native token periodic permission for submission to the wallet.\n *\n * @param params - The parameters for formatting the native token periodic permission.\n * @param params.permission - The native token periodic permission parameter to format.\n * @param params.isAdjustmentAllowed - Whether the permission is allowed to be adjusted.\n * @returns The formatted NativeTokenPeriodicPermission object.\n */\nfunction formatNativeTokenPeriodicPermission({\n permission,\n isAdjustmentAllowed,\n}: {\n permission: NativeTokenPeriodicPermissionParameter;\n isAdjustmentAllowed: boolean;\n}): NativeTokenPeriodicPermission {\n const {\n data: { periodAmount, periodDuration, startTime, justification },\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 * Formats an ERC20 token periodic permission for submission to the wallet.\n *\n * @param params - The parameters for formatting the ERC20 token periodic permission.\n * @param params.permission - The ERC20 token periodic permission parameter to format.\n * @param params.isAdjustmentAllowed - Whether the permission is allowed to be adjusted.\n * @returns The formatted Erc20TokenPeriodicPermission object.\n */\nfunction formatErc20TokenPeriodicPermission({\n permission,\n isAdjustmentAllowed,\n}: {\n permission: Erc20TokenPeriodicPermissionParameter;\n isAdjustmentAllowed: boolean;\n}): Erc20TokenPeriodicPermission {\n const {\n data: {\n tokenAddress,\n periodAmount,\n periodDuration,\n startTime,\n justification,\n },\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 * Formats an ERC-20 token revocation permission for submission to the wallet.\n *\n * @param params - The parameters for formatting the ERC-20 token revocation permission.\n * @param params.permission - The ERC-20 token revocation permission parameter to format.\n * @param params.isAdjustmentAllowed - Whether the permission is allowed to be adjusted.\n * @returns The formatted Erc20TokenRevocationPermission object.\n */\nfunction formatErc20TokenRevocationPermission({\n permission,\n isAdjustmentAllowed,\n}: {\n permission: Erc20TokenRevocationPermissionParameter;\n isAdjustmentAllowed: boolean;\n}): Erc20TokenRevocationPermission {\n const {\n data: { justification },\n } = permission;\n\n const data = {\n ...(justification ? { justification } : {}),\n };\n return {\n type: 'erc20-token-revocation',\n data,\n isAdjustmentAllowed,\n };\n}\n","import type { Address, Hex, Client } from 'viem';\n\nimport { getDelegationHashOffchain } 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 = getDelegationHashOffchain(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 = getDelegationHashOffchain(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 = getDelegationHashOffchain(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 = getDelegationHashOffchain(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 = getDelegationHashOffchain(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"]}
|
|
File without changes
|
|
File without changes
|