Automatically deploy entrypoint, and make it available in the hre (#5391)
This commit is contained in:
31
hardhat/common-contracts.js
Normal file
31
hardhat/common-contracts.js
Normal file
@ -0,0 +1,31 @@
|
||||
const { task } = require('hardhat/config');
|
||||
const { TASK_TEST_SETUP_TEST_ENVIRONMENT } = require('hardhat/builtin-tasks/task-names');
|
||||
const { setCode } = require('@nomicfoundation/hardhat-network-helpers');
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const INSTANCES = {
|
||||
entrypoint: {
|
||||
address: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
|
||||
abi: JSON.parse(fs.readFileSync(path.resolve(__dirname, '../test/bin/EntryPoint070.abi'), 'utf-8')),
|
||||
bytecode: fs.readFileSync(path.resolve(__dirname, '../test/bin/EntryPoint070.bytecode'), 'hex'),
|
||||
},
|
||||
senderCreator: {
|
||||
address: '0xEFC2c1444eBCC4Db75e7613d20C6a62fF67A167C',
|
||||
abi: JSON.parse(fs.readFileSync(path.resolve(__dirname, '../test/bin/SenderCreator070.abi'), 'utf-8')),
|
||||
bytecode: fs.readFileSync(path.resolve(__dirname, '../test/bin/SenderCreator070.bytecode'), 'hex'),
|
||||
},
|
||||
};
|
||||
|
||||
task(TASK_TEST_SETUP_TEST_ENVIRONMENT).setAction((_, env, runSuper) =>
|
||||
runSuper().then(() =>
|
||||
Promise.all(
|
||||
Object.entries(INSTANCES).map(([name, { address, abi, bytecode }]) =>
|
||||
setCode(address, '0x' + bytecode.replace(/0x/, '')).then(() =>
|
||||
env.ethers.getContractAt(abi, address).then(instance => (env[name] = instance)),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
@ -1,19 +1,18 @@
|
||||
const { ethers } = require('hardhat');
|
||||
const { ethers, entrypoint } = require('hardhat');
|
||||
const { expect } = require('chai');
|
||||
const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
|
||||
|
||||
const { packValidationData, UserOperation } = require('../../helpers/erc4337');
|
||||
const { deployEntrypoint } = require('../../helpers/erc4337-entrypoint');
|
||||
const { MAX_UINT48 } = require('../../helpers/constants');
|
||||
const ADDRESS_ONE = '0x0000000000000000000000000000000000000001';
|
||||
|
||||
const fixture = async () => {
|
||||
const { entrypoint } = await deployEntrypoint();
|
||||
const [authorizer, sender, factory, paymaster] = await ethers.getSigners();
|
||||
const utils = await ethers.deployContract('$ERC4337Utils');
|
||||
const SIG_VALIDATION_SUCCESS = await utils.$SIG_VALIDATION_SUCCESS();
|
||||
const SIG_VALIDATION_FAILED = await utils.$SIG_VALIDATION_FAILED();
|
||||
return { utils, authorizer, sender, entrypoint, factory, paymaster, SIG_VALIDATION_SUCCESS, SIG_VALIDATION_FAILED };
|
||||
|
||||
return { utils, authorizer, sender, factory, paymaster, SIG_VALIDATION_SUCCESS, SIG_VALIDATION_FAILED };
|
||||
};
|
||||
|
||||
describe('ERC4337Utils', function () {
|
||||
@ -173,14 +172,14 @@ describe('ERC4337Utils', function () {
|
||||
const otherChainId = 0xdeadbeef;
|
||||
|
||||
// check that helper matches entrypoint logic
|
||||
expect(this.entrypoint.getUserOpHash(userOp.packed)).to.eventually.equal(userOp.hash(this.entrypoint, chainId));
|
||||
expect(entrypoint.getUserOpHash(userOp.packed)).to.eventually.equal(userOp.hash(entrypoint, chainId));
|
||||
|
||||
// check library against helper
|
||||
expect(this.utils.$hash(userOp.packed, this.entrypoint, chainId)).to.eventually.equal(
|
||||
userOp.hash(this.entrypoint, chainId),
|
||||
expect(this.utils.$hash(userOp.packed, entrypoint, chainId)).to.eventually.equal(
|
||||
userOp.hash(entrypoint, chainId),
|
||||
);
|
||||
expect(this.utils.$hash(userOp.packed, this.entrypoint, otherChainId)).to.eventually.equal(
|
||||
userOp.hash(this.entrypoint, otherChainId),
|
||||
expect(this.utils.$hash(userOp.packed, entrypoint, otherChainId)).to.eventually.equal(
|
||||
userOp.hash(entrypoint, otherChainId),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@ -1,31 +0,0 @@
|
||||
const { ethers } = require('hardhat');
|
||||
const { setCode } = require('@nomicfoundation/hardhat-network-helpers');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const INSTANCES = {
|
||||
entrypoint: {
|
||||
address: '0x0000000071727De22E5E9d8BAf0edAc6f37da032',
|
||||
abi: JSON.parse(fs.readFileSync(path.resolve(__dirname, '../bin/EntryPoint070.abi'), 'utf-8')),
|
||||
bytecode: fs.readFileSync(path.resolve(__dirname, '../bin/EntryPoint070.bytecode'), 'hex'),
|
||||
},
|
||||
sendercreator: {
|
||||
address: '0xEFC2c1444eBCC4Db75e7613d20C6a62fF67A167C',
|
||||
abi: JSON.parse(fs.readFileSync(path.resolve(__dirname, '../bin/SenderCreator070.abi'), 'utf-8')),
|
||||
bytecode: fs.readFileSync(path.resolve(__dirname, '../bin/SenderCreator070.bytecode'), 'hex'),
|
||||
},
|
||||
};
|
||||
|
||||
function deployEntrypoint() {
|
||||
return Promise.all(
|
||||
Object.entries(INSTANCES).map(([name, { address, abi, bytecode }]) =>
|
||||
setCode(address, '0x' + bytecode.replace(/0x/, ''))
|
||||
.then(() => ethers.getContractAt(abi, address))
|
||||
.then(instance => ({ [name]: instance })),
|
||||
),
|
||||
).then(namedInstances => Object.assign(...namedInstances));
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
deployEntrypoint,
|
||||
};
|
||||
Reference in New Issue
Block a user