Account.test.js 1.9 KB

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