61 lines
2.3 KiB
JavaScript
61 lines
2.3 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 } = require('../Account.behavior');
|
|
const { shouldBehaveLikeAccountERC7579 } = require('./AccountERC7579.behavior');
|
|
const { shouldBehaveLikeERC1271 } = require('../../utils/cryptography/ERC1271.behavior');
|
|
|
|
async function fixture() {
|
|
// EOAs and environment
|
|
const [other] = await ethers.getSigners();
|
|
const target = await ethers.deployContract('CallReceiverMock');
|
|
const anotherTarget = await ethers.deployContract('CallReceiverMock');
|
|
|
|
// ERC-7579 validator
|
|
const validator = await ethers.deployContract('$ERC7579ValidatorMock');
|
|
|
|
// ERC-4337 signer
|
|
const signer = ethers.Wallet.createRandom();
|
|
|
|
// ERC-4337 account
|
|
const helper = new ERC4337Helper();
|
|
const mock = await helper.newAccount('$AccountERC7579Mock', [
|
|
validator,
|
|
ethers.solidityPacked(['address'], [signer.address]),
|
|
]);
|
|
|
|
// ERC-4337 Entrypoint domain
|
|
const entrypointDomain = await getDomain(entrypoint.v08);
|
|
|
|
return { helper, validator, mock, entrypointDomain, signer, target, anotherTarget, other };
|
|
}
|
|
|
|
describe('AccountERC7579', function () {
|
|
beforeEach(async function () {
|
|
Object.assign(this, await loadFixture(fixture));
|
|
|
|
this.signer.signMessage = message =>
|
|
ethers.Wallet.prototype.signMessage
|
|
.bind(this.signer)(message)
|
|
.then(sign => ethers.concat([this.validator.target, sign]));
|
|
this.signer.signTypedData = (domain, types, values) =>
|
|
ethers.Wallet.prototype.signTypedData
|
|
.bind(this.signer)(domain, types, values)
|
|
.then(sign => ethers.concat([this.validator.target, sign]));
|
|
this.signUserOp = userOp =>
|
|
ethers.Wallet.prototype.signTypedData
|
|
.bind(this.signer)(this.entrypointDomain, { PackedUserOperation }, userOp.packed)
|
|
.then(signature => Object.assign(userOp, { signature }));
|
|
|
|
this.userOp = { nonce: ethers.zeroPadBytes(ethers.hexlify(this.validator.target), 32) };
|
|
});
|
|
|
|
shouldBehaveLikeAccountCore();
|
|
shouldBehaveLikeAccountERC7579();
|
|
shouldBehaveLikeERC1271();
|
|
});
|