UNPKG

@metamask/delegation-toolkit

Version:

The Delegation Toolkit built on top of Viem - a library for interacting with DeleGator Smart Accounts

1 lines 18.7 kB
{"version":3,"sources":["/home/runner/work/delegation-toolkit/delegation-toolkit/packages/delegation-toolkit/dist/chunk-CTZHYDS4.cjs","../src/write.ts","../src/delegatorEnvironment.ts"],"names":["SimpleFactory","DelegationManager"],"mappings":"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","file":"/home/runner/work/delegation-toolkit/delegation-toolkit/packages/delegation-toolkit/dist/chunk-CTZHYDS4.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 * @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.abi,\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 * @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.abi,\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 * @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 { DELEGATOR_CONTRACTS } from '@metamask/delegation-deployments';\nimport type { Chain, Hex, PublicClient, WalletClient } from 'viem';\n\nimport type { ContractMetaData, DeleGatorEnvironment } 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, DeleGatorEnvironment> = new Map();\n\nconst getContractOverrideKey = (chainId: number, version: SupportedVersion) =>\n `${version}:${chainId}`;\n\n/**\n * Overrides the deployed environment for a specific chain and version.\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: DeleGatorEnvironment,\n) {\n contractOverrideMap.set(\n getContractOverrideKey(chainId, version),\n environment,\n );\n}\n\n/**\n * Gets the DeleGator environment for the specified chain and version.\n * @param chainId - The chain ID to get the environment for.\n * @param version - The version of the environment to get.\n * @returns The DeleGator environment.\n */\nexport function getDeleGatorEnvironment(\n chainId: number,\n version: SupportedVersion = PREFERRED_VERSION,\n): DeleGatorEnvironment {\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 getDeleGatorEnvironmentV1(contracts);\n}\n\n/**\n * Creates a DeleGator environment from contract addresses.\n * @param contracts - The contract addresses to create the environment from.\n * @returns The created DeleGator environment.\n */\nexport function getDeleGatorEnvironmentV1(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 DeleGatorEnvironment;\n}\n\nexport type DeployedContract = {\n name: string;\n address: string;\n};\n\n/**\n * Deploys the contracts needed for the Delegation Framework and DeleGator SCA to be functional as well as all Caveat Enforcers.\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 when all contracts are deployed.\n */\nexport async function deployDeleGatorEnvironment(\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 AllowedCalldataEnforcer,\n AllowedTargetsEnforcer,\n AllowedMethodsEnforcer,\n ArgsEqualityCheckEnforcer,\n DeployedEnforcer,\n TimestampEnforcer,\n BlockNumberEnforcer,\n LimitedCallsEnforcer,\n ERC20BalanceChangeEnforcer,\n ERC20TransferAmountEnforcer,\n ERC20StreamingEnforcer,\n ERC721BalanceChangeEnforcer,\n ERC721TransferEnforcer,\n ERC1155BalanceChangeEnforcer,\n IdEnforcer,\n NonceEnforcer,\n ValueLteEnforcer,\n NativeTokenTransferAmountEnforcer,\n NativeBalanceChangeEnforcer,\n NativeTokenStreamingEnforcer,\n OwnershipTransferEnforcer,\n RedeemerEnforcer,\n SpecificActionERC20TransferBatchEnforcer,\n ERC20PeriodTransferEnforcer,\n NativeTokenPeriodTransferEnforcer,\n ExactCalldataBatchEnforcer,\n ExactCalldataEnforcer,\n ExactExecutionEnforcer,\n ExactExecutionBatchEnforcer,\n MultiTokenPeriodEnforcer,\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 DelegationManager,\n [walletClient.account?.address],\n );\n\n // - NativeTokenPaymentEnforcer DelegationManager and ArgsEqualityCheckEnforcer as constructor args\n await deployContractCurried(\n 'NativeTokenPaymentEnforcer',\n NativeTokenPaymentEnforcer,\n [delegationManager.address, deployedContracts.ArgsEqualityCheckEnforcer],\n );\n\n const entryPoint = await deployContractCurried('EntryPoint', EntryPoint);\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 SCL_RIP7212,\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 ...HybridDeleGator,\n bytecode: HybridDeleGator.bytecode.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('MultiSigDeleGatorImpl', MultiSigDeleGator, [\n delegationManager.address,\n entryPoint.address,\n ]);\n\n await deployContractCurried(\n 'EIP7702StatelessDeleGatorImpl',\n EIP7702StatelessDeleGator,\n [delegationManager.address, entryPoint.address],\n );\n\n // Format deployments\n return getDeleGatorEnvironmentV1(deployedContracts);\n}\n"]}