Skip to content

Commit

Permalink
Remove utilities that depend on the entrypoint
Browse files Browse the repository at this point in the history
  • Loading branch information
Amxx committed Feb 3, 2025
1 parent c1cedc6 commit 5e16a62
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 97 deletions.
5 changes: 0 additions & 5 deletions .changeset/chilly-guests-jam.md

This file was deleted.

25 changes: 0 additions & 25 deletions contracts/account/utils/draft-ERC4337Utils.sol
Original file line number Diff line number Diff line change
Expand Up @@ -163,29 +163,4 @@ library ERC4337Utils {
function paymasterData(PackedUserOperation calldata self) internal pure returns (bytes calldata) {
return self.paymasterAndData.length < 52 ? Calldata.emptyBytes() : self.paymasterAndData[52:];
}

/// @dev Deposit ether into the entrypoint.
function depositTo(address to, uint256 value) internal {
ENTRYPOINT_V07.depositTo{value: value}(to);
}

/// @dev Withdraw ether from the entrypoint.
function withdrawTo(address payable to, uint256 value) internal {
ENTRYPOINT_V07.withdrawTo(to, value);
}

/// @dev Add stake to the entrypoint.
function addStake(uint256 value, uint32 unstakeDelaySec) internal {
ENTRYPOINT_V07.addStake{value: value}(unstakeDelaySec);
}

/// @dev Unlock stake on the entrypoint.
function unlockStake() internal {
ENTRYPOINT_V07.unlockStake();
}

/// @dev Withdraw unlocked stake from the entrypoint.
function withdrawStake(address payable to) internal {
ENTRYPOINT_V07.withdrawStake(to);
}
}
75 changes: 8 additions & 67 deletions test/account/utils/draft-ERC4337Utils.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,28 @@ const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');

const { packValidationData, UserOperation } = require('../../helpers/erc4337');
const { MAX_UINT48 } = require('../../helpers/constants');
const time = require('../../helpers/time');
const ADDRESS_ONE = '0x0000000000000000000000000000000000000001';

const fixture = async () => {
const [authorizer, sender, factory, paymaster, other] = await ethers.getSigners();
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, factory, paymaster, other, SIG_VALIDATION_SUCCESS, SIG_VALIDATION_FAILED };
return { utils, authorizer, sender, factory, paymaster, SIG_VALIDATION_SUCCESS, SIG_VALIDATION_FAILED };
};

describe('ERC4337Utils', function () {
beforeEach(async function () {
Object.assign(this, await loadFixture(fixture));
});

describe('entrypoint', function () {
it('v0.7.0', async function () {
await expect(this.utils.$ENTRYPOINT_V07()).to.eventually.equal(entrypoint);
});
});

describe('parseValidationData', function () {
it('parses the validation data', async function () {
const authorizer = this.authorizer;
Expand Down Expand Up @@ -285,68 +290,4 @@ describe('ERC4337Utils', function () {
});
});
});

describe('stake management', function () {
const unstakeDelaySec = 3600n;

beforeEach(async function () {
await this.authorizer.sendTransaction({ to: this.utils, value: ethers.parseEther('1') });
});

it('deposit & withdraw', async function () {
await expect(entrypoint.balanceOf(this.utils)).to.eventually.equal(0n);

// deposit
await expect(this.utils.$depositTo(this.utils, 42n)).to.changeEtherBalances(
[this.utils, entrypoint],
[-42n, 42n],
);

await expect(entrypoint.balanceOf(this.utils)).to.eventually.equal(42n);

// withdraw
await expect(this.utils.$withdrawTo(this.other, 17n)).to.changeEtherBalances(
[entrypoint, this.other],
[-17n, 17n],
);

await expect(entrypoint.balanceOf(this.utils)).to.eventually.equal(25n); // 42 - 17
});

it('stake, unlock & withdraw stake', async function () {
await expect(entrypoint.deposits(this.utils)).to.eventually.deep.equal([0n, false, 0n, 0n, 0n]);

// stake
await expect(this.utils.$addStake(42n, unstakeDelaySec)).to.changeEtherBalances(
[this.utils, entrypoint],
[-42n, 42n],
);

await expect(entrypoint.deposits(this.utils)).to.eventually.deep.equal([0n, true, 42n, unstakeDelaySec, 0n]);

// unlock
const unlockTx = this.utils.$unlockStake();
await expect(unlockTx).to.changeEtherBalances([this.utils, entrypoint], [0n, 0n]); // no ether movement

const timestamp = await time.clockFromReceipt.timestamp(unlockTx);
await expect(entrypoint.deposits(this.utils)).to.eventually.deep.equal([
0n,
false,
42n,
unstakeDelaySec,
timestamp + unstakeDelaySec,
]);

// wait
await time.increaseBy.timestamp(unstakeDelaySec);

// withdraw stake
await expect(this.utils.$withdrawStake(this.other)).to.changeEtherBalances(
[this.utils, entrypoint, this.other],
[0n, -42n, 42n],
);

await expect(entrypoint.deposits(this.utils)).to.eventually.deep.equal([0n, false, 0n, 0n, 0n]);
});
});
});

0 comments on commit 5e16a62

Please sign in to comment.