AccountP256.test.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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 { NonNativeSigner, P256SigningKey } = require('../helpers/signers');
  6. const { PackedUserOperation } = require('../helpers/eip712-types');
  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(P256SigningKey.random());
  16. // ERC-4337 account
  17. const helper = new ERC4337Helper();
  18. const mock = await helper.newAccount('$AccountP256Mock', [
  19. signer.signingKey.publicKey.qx,
  20. signer.signingKey.publicKey.qy,
  21. 'AccountP256',
  22. '1',
  23. ]);
  24. // ERC-4337 Entrypoint domain
  25. const entrypointDomain = await getDomain(predeploy.entrypoint.v08);
  26. // domain cannot be fetched using getDomain(mock) before the mock is deployed
  27. const domain = {
  28. name: 'AccountP256',
  29. version: '1',
  30. chainId: entrypointDomain.chainId,
  31. verifyingContract: mock.address,
  32. };
  33. const signUserOp = userOp =>
  34. signer
  35. .signTypedData(entrypointDomain, { PackedUserOperation }, userOp.packed)
  36. .then(signature => Object.assign(userOp, { signature }));
  37. return { helper, mock, domain, signer, target, beneficiary, other, signUserOp };
  38. }
  39. describe('AccountP256', function () {
  40. beforeEach(async function () {
  41. Object.assign(this, await loadFixture(fixture));
  42. });
  43. shouldBehaveLikeAccountCore();
  44. shouldBehaveLikeAccountHolder();
  45. shouldBehaveLikeERC1271({ erc7739: true });
  46. shouldBehaveLikeERC7821();
  47. });