AccountECDSA.test.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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, shouldBehaveLikeAccountHolder } = require('./Account.behavior');
  7. const { shouldBehaveLikeERC1271 } = require('../utils/cryptography/ERC1271.behavior');
  8. const { shouldBehaveLikeERC7821 } = require('./extensions/ERC7821.behavior');
  9. async function fixture() {
  10. // EOAs and environment
  11. const [beneficiary, other] = await ethers.getSigners();
  12. const target = await ethers.deployContract('CallReceiverMock');
  13. // ERC-4337 signer
  14. const signer = ethers.Wallet.createRandom();
  15. // ERC-4337 account
  16. const helper = new ERC4337Helper();
  17. const mock = await helper.newAccount('$AccountECDSAMock', [signer, 'AccountECDSA', '1']);
  18. // ERC-4337 Entrypoint domain
  19. const entrypointDomain = await getDomain(predeploy.entrypoint.v08);
  20. // domain cannot be fetched using getDomain(mock) before the mock is deployed
  21. const domain = {
  22. name: 'AccountECDSA',
  23. version: '1',
  24. chainId: entrypointDomain.chainId,
  25. verifyingContract: mock.address,
  26. };
  27. const signUserOp = userOp =>
  28. signer
  29. .signTypedData(entrypointDomain, { PackedUserOperation }, userOp.packed)
  30. .then(signature => Object.assign(userOp, { signature }));
  31. return { helper, mock, domain, signer, target, beneficiary, other, signUserOp };
  32. }
  33. describe('AccountECDSA', function () {
  34. beforeEach(async function () {
  35. Object.assign(this, await loadFixture(fixture));
  36. });
  37. shouldBehaveLikeAccountCore();
  38. shouldBehaveLikeAccountHolder();
  39. shouldBehaveLikeERC1271({ erc7739: true });
  40. shouldBehaveLikeERC7821();
  41. });