Vendor entrypoint bytecode (#5362)

pull/5365/head
Hadrien Croubois 2 months ago committed by GitHub
parent ad906fe39b
commit 5df10703cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      foundry.toml
  2. 14
      test/account/utils/draft-ERC4337Utils.test.js
  3. 1
      test/bin/EntryPoint070.abi
  4. BIN
      test/bin/EntryPoint070.bytecode
  5. 1
      test/bin/SenderCreator070.abi
  6. BIN
      test/bin/SenderCreator070.bytecode
  7. 31
      test/helpers/erc4337-entrypoint.js

@ -8,6 +8,7 @@ out = 'out'
libs = ['node_modules', 'lib'] libs = ['node_modules', 'lib']
test = 'test' test = 'test'
cache_path = 'cache_forge' cache_path = 'cache_forge'
fs_permissions = [{ access = "read", path = "./test/bin" }]
[fuzz] [fuzz]
runs = 5000 runs = 5000

@ -3,11 +3,13 @@ const { expect } = require('chai');
const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers'); const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
const { packValidationData, UserOperation } = require('../../helpers/erc4337'); const { packValidationData, UserOperation } = require('../../helpers/erc4337');
const { deployEntrypoint } = require('../../helpers/erc4337-entrypoint');
const { MAX_UINT48 } = require('../../helpers/constants'); const { MAX_UINT48 } = require('../../helpers/constants');
const ADDRESS_ONE = '0x0000000000000000000000000000000000000001'; const ADDRESS_ONE = '0x0000000000000000000000000000000000000001';
const fixture = async () => { const fixture = async () => {
const [authorizer, sender, entrypoint, factory, paymaster] = await ethers.getSigners(); const { entrypoint } = await deployEntrypoint();
const [authorizer, sender, factory, paymaster] = await ethers.getSigners();
const utils = await ethers.deployContract('$ERC4337Utils'); const utils = await ethers.deployContract('$ERC4337Utils');
const SIG_VALIDATION_SUCCESS = await utils.$SIG_VALIDATION_SUCCESS(); const SIG_VALIDATION_SUCCESS = await utils.$SIG_VALIDATION_SUCCESS();
const SIG_VALIDATION_FAILED = await utils.$SIG_VALIDATION_FAILED(); const SIG_VALIDATION_FAILED = await utils.$SIG_VALIDATION_FAILED();
@ -167,11 +169,19 @@ describe('ERC4337Utils', function () {
describe('hash', function () { describe('hash', function () {
it('returns the operation hash with specified entrypoint and chainId', async function () { it('returns the operation hash with specified entrypoint and chainId', async function () {
const userOp = new UserOperation({ sender: this.sender, nonce: 1 }); const userOp = new UserOperation({ sender: this.sender, nonce: 1 });
const chainId = 0xdeadbeef; const chainId = await ethers.provider.getNetwork().then(({ chainId }) => chainId);
const otherChainId = 0xdeadbeef;
// check that helper matches entrypoint logic
expect(this.entrypoint.getUserOpHash(userOp.packed)).to.eventually.equal(userOp.hash(this.entrypoint, chainId));
// check library against helper
expect(this.utils.$hash(userOp.packed, this.entrypoint, chainId)).to.eventually.equal( expect(this.utils.$hash(userOp.packed, this.entrypoint, chainId)).to.eventually.equal(
userOp.hash(this.entrypoint, chainId), userOp.hash(this.entrypoint, chainId),
); );
expect(this.utils.$hash(userOp.packed, this.entrypoint, otherChainId)).to.eventually.equal(
userOp.hash(this.entrypoint, otherChainId),
);
}); });
}); });

File diff suppressed because one or more lines are too long

Binary file not shown.

@ -0,0 +1 @@
[{"inputs":[{"internalType":"bytes","name":"initCode","type":"bytes"}],"name":"createSender","outputs":[{"internalType":"address","name":"sender","type":"address"}],"stateMutability":"nonpayable","type":"function"}]

@ -0,0 +1,31 @@
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,
};
Loading…
Cancel
Save