Commit 0ee43c7d authored by smartcontracts's avatar smartcontracts Committed by GitHub

maint(ct): clean up L2xDM tests (#2475)

Cleans up the L2CrossDomainMessenger tests in the same manner as
previous cleanup PRs.
Co-authored-by: default avatarmergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
parent 0fa1c9bb
/* External Imports */ import { ethers } from 'hardhat'
import hre, { ethers } from 'hardhat' import { Contract } from 'ethers'
import { Signer, ContractFactory, Contract } from 'ethers'
import { applyL1ToL2Alias } from '@eth-optimism/core-utils' import { applyL1ToL2Alias } from '@eth-optimism/core-utils'
import { import { smock, FakeContract, MockContract } from '@defi-wonderland/smock'
smock, import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'
MockContractFactory,
FakeContract,
} from '@defi-wonderland/smock'
/* Internal Imports */
import { expect } from '../../../setup' import { expect } from '../../../setup'
import { predeploys } from '../../../../src'
import { import {
impersonate,
deploy,
NON_NULL_BYTES32, NON_NULL_BYTES32,
NON_ZERO_ADDRESS, NON_ZERO_ADDRESS,
encodeXDomainCalldata, encodeXDomainCalldata,
} from '../../../helpers' } from '../../../helpers'
import { predeploys } from '../../../../src'
describe('L2CrossDomainMessenger', () => { describe('L2CrossDomainMessenger', () => {
let signer: Signer let signer: SignerWithAddress
before(async () => { before(async () => {
;[signer] = await ethers.getSigners() ;[signer] = await ethers.getSigners()
}) })
...@@ -37,49 +34,27 @@ describe('L2CrossDomainMessenger', () => { ...@@ -37,49 +34,27 @@ describe('L2CrossDomainMessenger', () => {
) )
}) })
let impersonatedL1CrossDomainMessengerSender: Signer let impersonatedL1CrossDomainMessengerSender: SignerWithAddress
before(async () => {
const impersonatedAddress = applyL1ToL2Alias(
Fake__L1CrossDomainMessenger.address
)
await hre.network.provider.request({
method: 'hardhat_impersonateAccount',
params: [impersonatedAddress],
})
await hre.network.provider.request({
method: 'hardhat_setBalance',
params: [impersonatedAddress, '0xFFFFFFFFFFFFFFFFF'],
})
impersonatedL1CrossDomainMessengerSender = await ethers.getSigner(
impersonatedAddress
)
})
let Factory__L2CrossDomainMessenger: ContractFactory
before(async () => { before(async () => {
Factory__L2CrossDomainMessenger = await ethers.getContractFactory( impersonatedL1CrossDomainMessengerSender = await impersonate(
'L2CrossDomainMessenger' applyL1ToL2Alias(Fake__L1CrossDomainMessenger.address),
'0xFFFFFFFFFFFFFFFFF'
) )
}) })
let L2CrossDomainMessenger: Contract let L2CrossDomainMessenger: Contract
beforeEach(async () => { beforeEach(async () => {
L2CrossDomainMessenger = await Factory__L2CrossDomainMessenger.deploy( L2CrossDomainMessenger = await deploy('L2CrossDomainMessenger', {
Fake__L1CrossDomainMessenger.address args: [Fake__L1CrossDomainMessenger.address],
) })
}) })
describe('xDomainMessageSender', () => { describe('xDomainMessageSender', () => {
let Mock__Factory__L2CrossDomainMessenger: MockContractFactory<ContractFactory> let Mock__L2CrossDomainMessenger: MockContract<Contract>
let Mock__L2CrossDomainMessenger
before(async () => { before(async () => {
Mock__Factory__L2CrossDomainMessenger = await smock.mock( Mock__L2CrossDomainMessenger = await (
'L2CrossDomainMessenger' await smock.mock('L2CrossDomainMessenger')
) ).deploy(Fake__L1CrossDomainMessenger.address)
Mock__L2CrossDomainMessenger =
await Mock__Factory__L2CrossDomainMessenger.deploy(
Fake__L1CrossDomainMessenger.address
)
}) })
it('should return the xDomainMsgSender address', async () => { it('should return the xDomainMsgSender address', async () => {
...@@ -87,6 +62,7 @@ describe('L2CrossDomainMessenger', () => { ...@@ -87,6 +62,7 @@ describe('L2CrossDomainMessenger', () => {
'xDomainMsgSender', 'xDomainMsgSender',
'0x0000000000000000000000000000000000000000' '0x0000000000000000000000000000000000000000'
) )
expect( expect(
await Mock__L2CrossDomainMessenger.xDomainMessageSender() await Mock__L2CrossDomainMessenger.xDomainMessageSender()
).to.equal('0x0000000000000000000000000000000000000000') ).to.equal('0x0000000000000000000000000000000000000000')
...@@ -94,49 +70,53 @@ describe('L2CrossDomainMessenger', () => { ...@@ -94,49 +70,53 @@ describe('L2CrossDomainMessenger', () => {
}) })
describe('sendMessage', () => { describe('sendMessage', () => {
const target = NON_ZERO_ADDRESS
const message = NON_NULL_BYTES32
const gasLimit = 100_000
it('should be able to send a single message', async () => { it('should be able to send a single message', async () => {
await expect( await expect(
L2CrossDomainMessenger.sendMessage(target, message, gasLimit) L2CrossDomainMessenger.sendMessage(
NON_ZERO_ADDRESS,
NON_NULL_BYTES32,
100_000
)
).to.not.be.reverted ).to.not.be.reverted
expect( expect(
Fake__OVM_L2ToL1MessagePasser.passMessageToL1.getCall(0).args[0] Fake__OVM_L2ToL1MessagePasser.passMessageToL1.getCall(0).args[0]
).to.deep.equal( ).to.deep.equal(
encodeXDomainCalldata(target, await signer.getAddress(), message, 0) encodeXDomainCalldata(
NON_ZERO_ADDRESS,
await signer.getAddress(),
NON_NULL_BYTES32,
0
)
) )
}) })
it('should be able to send the same message twice', async () => { it('should be able to send the same message twice', async () => {
await L2CrossDomainMessenger.sendMessage(target, message, gasLimit) await L2CrossDomainMessenger.sendMessage(
NON_ZERO_ADDRESS,
NON_NULL_BYTES32,
100_000
)
await expect( await expect(
L2CrossDomainMessenger.sendMessage(target, message, gasLimit) L2CrossDomainMessenger.sendMessage(
NON_ZERO_ADDRESS,
NON_NULL_BYTES32,
100_000
)
).to.not.be.reverted ).to.not.be.reverted
}) })
}) })
describe('relayMessage', () => { describe('relayMessage', () => {
let target: string
let message: string
let sender: string
before(async () => {
target = Fake__TargetContract.address
message = Fake__TargetContract.interface.encodeFunctionData('setTarget', [
NON_ZERO_ADDRESS,
])
sender = await signer.getAddress()
})
it('should revert if the L1 message sender is not the L1CrossDomainMessenger', async () => { it('should revert if the L1 message sender is not the L1CrossDomainMessenger', async () => {
await expect( await expect(
L2CrossDomainMessenger.connect(signer).relayMessage( L2CrossDomainMessenger.connect(signer).relayMessage(
target, Fake__TargetContract.address,
sender, signer.address,
message, Fake__TargetContract.interface.encodeFunctionData('setTarget', [
NON_ZERO_ADDRESS,
]),
0 0
) )
).to.be.revertedWith('Provided message could not be verified.') ).to.be.revertedWith('Provided message could not be verified.')
...@@ -145,7 +125,14 @@ describe('L2CrossDomainMessenger', () => { ...@@ -145,7 +125,14 @@ describe('L2CrossDomainMessenger', () => {
it('should send a call to the target contract', async () => { it('should send a call to the target contract', async () => {
await L2CrossDomainMessenger.connect( await L2CrossDomainMessenger.connect(
impersonatedL1CrossDomainMessengerSender impersonatedL1CrossDomainMessengerSender
).relayMessage(target, sender, message, 0) ).relayMessage(
Fake__TargetContract.address,
signer.address,
Fake__TargetContract.interface.encodeFunctionData('setTarget', [
NON_ZERO_ADDRESS,
]),
0
)
expect(Fake__TargetContract.setTarget.getCall(0).args[0]).to.deep.equal( expect(Fake__TargetContract.setTarget.getCall(0).args[0]).to.deep.equal(
NON_ZERO_ADDRESS NON_ZERO_ADDRESS
...@@ -159,7 +146,14 @@ describe('L2CrossDomainMessenger', () => { ...@@ -159,7 +146,14 @@ describe('L2CrossDomainMessenger', () => {
await L2CrossDomainMessenger.connect( await L2CrossDomainMessenger.connect(
impersonatedL1CrossDomainMessengerSender impersonatedL1CrossDomainMessengerSender
).relayMessage(target, sender, message, 0) ).relayMessage(
Fake__TargetContract.address,
signer.address,
Fake__TargetContract.interface.encodeFunctionData('setTarget', [
NON_ZERO_ADDRESS,
]),
0
)
await expect( await expect(
L2CrossDomainMessenger.xDomainMessageSender() L2CrossDomainMessenger.xDomainMessageSender()
...@@ -169,45 +163,72 @@ describe('L2CrossDomainMessenger', () => { ...@@ -169,45 +163,72 @@ describe('L2CrossDomainMessenger', () => {
it('should revert if trying to send the same message twice', async () => { it('should revert if trying to send the same message twice', async () => {
await L2CrossDomainMessenger.connect( await L2CrossDomainMessenger.connect(
impersonatedL1CrossDomainMessengerSender impersonatedL1CrossDomainMessengerSender
).relayMessage(target, sender, message, 0) ).relayMessage(
Fake__TargetContract.address,
signer.address,
Fake__TargetContract.interface.encodeFunctionData('setTarget', [
NON_ZERO_ADDRESS,
]),
0
)
await expect( await expect(
L2CrossDomainMessenger.connect( L2CrossDomainMessenger.connect(
impersonatedL1CrossDomainMessengerSender impersonatedL1CrossDomainMessengerSender
).relayMessage(target, sender, message, 0) ).relayMessage(
Fake__TargetContract.address,
signer.address,
Fake__TargetContract.interface.encodeFunctionData('setTarget', [
NON_ZERO_ADDRESS,
]),
0
)
).to.be.revertedWith('Provided message has already been received.') ).to.be.revertedWith('Provided message has already been received.')
}) })
it('should not make a call if the target is the L2 MessagePasser', async () => { it('should not make a call if the target is the L2 MessagePasser', async () => {
target = predeploys.OVM_L2ToL1MessagePasser
message = Fake__OVM_L2ToL1MessagePasser.interface.encodeFunctionData(
'passMessageToL1(bytes)',
[NON_NULL_BYTES32]
)
const resProm = L2CrossDomainMessenger.connect( const resProm = L2CrossDomainMessenger.connect(
impersonatedL1CrossDomainMessengerSender impersonatedL1CrossDomainMessengerSender
).relayMessage(target, sender, message, 0) ).relayMessage(
predeploys.OVM_L2ToL1MessagePasser,
signer.address,
Fake__OVM_L2ToL1MessagePasser.interface.encodeFunctionData(
'passMessageToL1(bytes)',
[NON_NULL_BYTES32]
),
0
)
// The call to relayMessage() should succeed. // The call to relayMessage() should succeed.
await expect(resProm).to.not.be.reverted await expect(resProm).to.not.be.reverted
// There should be no 'relayedMessage' event logged in the receipt. // There should be no 'relayedMessage' event logged in the receipt.
const logs = ( expect(
await Fake__OVM_L2ToL1MessagePasser.provider.getTransactionReceipt( (
( await Fake__OVM_L2ToL1MessagePasser.provider.getTransactionReceipt(
await resProm (
).hash await resProm
) ).hash
).logs )
expect(logs).to.deep.equal([]) ).logs
).to.deep.equal([])
// The message should be registered as successful. // The message should be registered as successful.
expect( expect(
await L2CrossDomainMessenger.successfulMessages( await L2CrossDomainMessenger.successfulMessages(
ethers.utils.solidityKeccak256( ethers.utils.solidityKeccak256(
['bytes'], ['bytes'],
[encodeXDomainCalldata(target, sender, message, 0)] [
encodeXDomainCalldata(
predeploys.OVM_L2ToL1MessagePasser,
signer.address,
Fake__OVM_L2ToL1MessagePasser.interface.encodeFunctionData(
'passMessageToL1(bytes)',
[NON_NULL_BYTES32]
),
0
),
]
) )
) )
).to.be.true ).to.be.true
......
import { toRpcHexString } from '@eth-optimism/core-utils'
import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'
import { BigNumber } from 'ethers'
import hre from 'hardhat'
export const impersonate = async (
address: string,
balance?: string | number | BigNumber
): Promise<SignerWithAddress> => {
await hre.network.provider.request({
method: 'hardhat_impersonateAccount',
params: [address],
})
if (balance !== undefined) {
await hre.network.provider.request({
method: 'hardhat_setBalance',
params: [address, toRpcHexString(BigNumber.from(balance))],
})
}
return hre.ethers.getSigner(address)
}
export * from './eth-time' export * from './eth-time'
export * from './deploy' export * from './deploy'
export * from './impersonation'
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment