AccountERC7579Hooked.test.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. const { ethers, predeploy } = require('hardhat');
  2. const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
  3. const { getDomain } = require('../../helpers/eip712');
  4. const { ERC4337Helper } = require('../../helpers/erc4337');
  5. const { PackedUserOperation } = require('../../helpers/eip712-types');
  6. const { shouldBehaveLikeAccountCore } = require('../Account.behavior');
  7. const { shouldBehaveLikeAccountERC7579 } = require('./AccountERC7579.behavior');
  8. const { shouldBehaveLikeERC1271 } = require('../../utils/cryptography/ERC1271.behavior');
  9. async function fixture() {
  10. // EOAs and environment
  11. const [other] = await ethers.getSigners();
  12. const target = await ethers.deployContract('CallReceiverMock');
  13. const anotherTarget = await ethers.deployContract('CallReceiverMock');
  14. // ERC-7579 validator
  15. const validator = await ethers.deployContract('$ERC7579ValidatorMock');
  16. // ERC-4337 signer
  17. const signer = ethers.Wallet.createRandom();
  18. // ERC-4337 account
  19. const helper = new ERC4337Helper();
  20. const mock = await helper.newAccount('$AccountERC7579HookedMock', [
  21. validator,
  22. ethers.solidityPacked(['address'], [signer.address]),
  23. ]);
  24. // ERC-4337 Entrypoint domain
  25. const entrypointDomain = await getDomain(predeploy.entrypoint.v08);
  26. return { helper, validator, mock, entrypointDomain, signer, target, anotherTarget, other };
  27. }
  28. describe('AccountERC7579Hooked', function () {
  29. beforeEach(async function () {
  30. Object.assign(this, await loadFixture(fixture));
  31. this.signer.signMessage = message =>
  32. ethers.Wallet.prototype.signMessage
  33. .bind(this.signer)(message)
  34. .then(sign => ethers.concat([this.validator.target, sign]));
  35. this.signer.signTypedData = (domain, types, values) =>
  36. ethers.Wallet.prototype.signTypedData
  37. .bind(this.signer)(domain, types, values)
  38. .then(sign => ethers.concat([this.validator.target, sign]));
  39. this.signUserOp = userOp =>
  40. ethers.Wallet.prototype.signTypedData
  41. .bind(this.signer)(this.entrypointDomain, { PackedUserOperation }, userOp.packed)
  42. .then(signature => Object.assign(userOp, { signature }));
  43. this.userOp = { nonce: ethers.zeroPadBytes(ethers.hexlify(this.validator.target), 32) };
  44. });
  45. shouldBehaveLikeAccountCore();
  46. shouldBehaveLikeAccountERC7579({ withHooks: true });
  47. shouldBehaveLikeERC1271();
  48. });