1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- const { ethers, config } = require('hardhat');
- const { expect } = require('chai');
- const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
- // [NOTE]
- //
- // ethers.getSigners() returns object than cannot currently send type-4 transaction, or sign authorization. Therefore,
- // we have to instantiate the eoa AND the relayer manually using ethers 6.14.0 wallets. This can be improved when
- // @nomicfoundation/hardhat-ethers starts instantiating signers with 7702 support.
- const relayAuthorization = authorization =>
- ethers.Wallet.fromPhrase(config.networks.hardhat.accounts.mnemonic, ethers.provider).sendTransaction({
- to: ethers.ZeroAddress,
- authorizationList: [authorization],
- gasLimit: 46_000n,
- });
- const fixture = async () => {
- const eoa = ethers.Wallet.createRandom(ethers.provider);
- const mock = await ethers.deployContract('$EIP7702Utils');
- return { eoa, mock };
- };
- describe('EIP7702Utils', function () {
- beforeEach(async function () {
- Object.assign(this, await loadFixture(fixture));
- });
- describe('fetchDelegate', function () {
- it('EOA without delegation', async function () {
- await expect(this.mock.$fetchDelegate(this.eoa)).to.eventually.equal(ethers.ZeroAddress);
- });
- it('EOA with delegation', async function () {
- // set delegation
- await this.eoa.authorize({ address: this.mock }).then(relayAuthorization);
- await expect(this.mock.$fetchDelegate(this.eoa)).to.eventually.equal(this.mock);
- });
- it('EOA with revoked delegation', async function () {
- // set delegation
- await this.eoa.authorize({ address: this.mock }).then(relayAuthorization);
- // reset delegation
- await this.eoa.authorize({ address: ethers.ZeroAddress }).then(relayAuthorization);
- await expect(this.mock.$fetchDelegate(this.eoa)).to.eventually.equal(ethers.ZeroAddress);
- });
- it('other smart contract', async function () {
- await expect(this.mock.$fetchDelegate(this.mock)).to.eventually.equal(ethers.ZeroAddress);
- });
- });
- });
|