erc7579.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. const { ethers } = require('hardhat');
  2. const MODULE_TYPE_VALIDATOR = 1;
  3. const MODULE_TYPE_EXECUTOR = 2;
  4. const MODULE_TYPE_FALLBACK = 3;
  5. const MODULE_TYPE_HOOK = 4;
  6. const EXEC_TYPE_DEFAULT = '0x00';
  7. const EXEC_TYPE_TRY = '0x01';
  8. const CALL_TYPE_CALL = '0x00';
  9. const CALL_TYPE_BATCH = '0x01';
  10. const CALL_TYPE_DELEGATE = '0xff';
  11. const encodeMode = ({
  12. callType = '0x00',
  13. execType = '0x00',
  14. selector = '0x00000000',
  15. payload = '0x00000000000000000000000000000000000000000000',
  16. } = {}) =>
  17. ethers.solidityPacked(
  18. ['bytes1', 'bytes1', 'bytes4', 'bytes4', 'bytes22'],
  19. [callType, execType, '0x00000000', selector, payload],
  20. );
  21. const encodeSingle = (target, value = 0n, data = '0x') =>
  22. ethers.solidityPacked(['address', 'uint256', 'bytes'], [target.target ?? target.address ?? target, value, data]);
  23. const encodeBatch = (...entries) =>
  24. ethers.AbiCoder.defaultAbiCoder().encode(
  25. ['(address,uint256,bytes)[]'],
  26. [
  27. entries.map(entry =>
  28. Array.isArray(entry)
  29. ? [entry[0].target ?? entry[0].address ?? entry[0], entry[1] ?? 0n, entry[2] ?? '0x']
  30. : [entry.target.target ?? entry.target.address ?? entry.target, entry.value ?? 0n, entry.data ?? '0x'],
  31. ),
  32. ],
  33. );
  34. const encodeDelegate = (target, data = '0x') =>
  35. ethers.solidityPacked(['address', 'bytes'], [target.target ?? target.address ?? target, data]);
  36. module.exports = {
  37. MODULE_TYPE_VALIDATOR,
  38. MODULE_TYPE_EXECUTOR,
  39. MODULE_TYPE_FALLBACK,
  40. MODULE_TYPE_HOOK,
  41. EXEC_TYPE_DEFAULT,
  42. EXEC_TYPE_TRY,
  43. CALL_TYPE_CALL,
  44. CALL_TYPE_BATCH,
  45. CALL_TYPE_DELEGATE,
  46. encodeMode,
  47. encodeSingle,
  48. encodeBatch,
  49. encodeDelegate,
  50. };