53 lines
1.9 KiB
JavaScript
53 lines
1.9 KiB
JavaScript
const { ethers, entrypoint } = require('hardhat');
|
|
const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
|
|
|
|
const { getDomain } = require('../helpers/eip712');
|
|
const { ERC4337Helper } = require('../helpers/erc4337');
|
|
const { PackedUserOperation } = require('../helpers/eip712-types');
|
|
|
|
const { shouldBehaveLikeAccountCore, shouldBehaveLikeAccountHolder } = require('./Account.behavior');
|
|
const { shouldBehaveLikeERC1271 } = require('../utils/cryptography/ERC1271.behavior');
|
|
const { shouldBehaveLikeERC7821 } = require('./extensions/ERC7821.behavior');
|
|
|
|
async function fixture() {
|
|
// EOAs and environment
|
|
const [beneficiary, other] = await ethers.getSigners();
|
|
const target = await ethers.deployContract('CallReceiverMock');
|
|
|
|
// ERC-4337 signer
|
|
const signer = ethers.Wallet.createRandom(ethers.provider);
|
|
|
|
// ERC-4337 account
|
|
const helper = new ERC4337Helper();
|
|
const mock = await helper.newAccount('$AccountERC7702Mock', ['AccountERC7702Mock', '1'], { erc7702signer: signer });
|
|
|
|
// ERC-4337 Entrypoint domain
|
|
const entrypointDomain = await getDomain(entrypoint.v08);
|
|
|
|
// domain cannot be fetched using getDomain(mock) before the mock is deployed
|
|
const domain = {
|
|
name: 'AccountERC7702Mock',
|
|
version: '1',
|
|
chainId: entrypointDomain.chainId,
|
|
verifyingContract: mock.address,
|
|
};
|
|
|
|
const signUserOp = userOp =>
|
|
signer
|
|
.signTypedData(entrypointDomain, { PackedUserOperation }, userOp.packed)
|
|
.then(signature => Object.assign(userOp, { signature }));
|
|
|
|
return { helper, mock, domain, signer, target, beneficiary, other, signUserOp };
|
|
}
|
|
|
|
describe('AccountERC7702', function () {
|
|
beforeEach(async function () {
|
|
Object.assign(this, await loadFixture(fixture));
|
|
});
|
|
|
|
shouldBehaveLikeAccountCore();
|
|
shouldBehaveLikeAccountHolder();
|
|
shouldBehaveLikeERC1271({ erc7739: true });
|
|
shouldBehaveLikeERC7821({ deployable: false });
|
|
});
|