Commit 2925b1d2 authored by smartcontracts's avatar smartcontracts Committed by GitHub

maint(ct): clean up L1XDM tests (#2459)

Cleans up the L1CrossDomainMessenger tests using the new deploy
function. Removes some unnecessary code.
Co-authored-by: default avatarmergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
parent c74f75b3
/* External Imports */
import { ethers } from 'hardhat' import { ethers } from 'hardhat'
import { Signer, ContractFactory, Contract, BigNumber } from 'ethers' import { Contract, BigNumber } from 'ethers'
import { import { smock, FakeContract, MockContract } from '@defi-wonderland/smock'
smock, import { toHexString, applyL1ToL2Alias } from '@eth-optimism/core-utils'
MockContractFactory, import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'
FakeContract,
} from '@defi-wonderland/smock'
import {
remove0x,
toHexString,
applyL1ToL2Alias,
} from '@eth-optimism/core-utils'
/* Internal Imports */
import { expect } from '../../../setup' import { expect } from '../../../setup'
import { import {
makeAddressManager,
setProxyTarget, setProxyTarget,
NON_NULL_BYTES32, NON_NULL_BYTES32,
NON_ZERO_ADDRESS, NON_ZERO_ADDRESS,
...@@ -28,46 +18,22 @@ import { ...@@ -28,46 +18,22 @@ import {
encodeXDomainCalldata, encodeXDomainCalldata,
getEthTime, getEthTime,
setEthTime, setEthTime,
deploy,
} from '../../../helpers' } from '../../../helpers'
import { predeploys } from '../../../../src' import { predeploys } from '../../../../src'
const MAX_GAS_LIMIT = 8_000_000 const MAX_GAS_LIMIT = 8_000_000
const deployProxyXDomainMessenger = async (
addressManager: Contract,
l1XDomainMessenger: Contract
): Promise<Contract> => {
await addressManager.setAddress(
'L1CrossDomainMessenger',
l1XDomainMessenger.address
)
const proxy = await (
await ethers.getContractFactory('Lib_ResolvedDelegateProxy')
).deploy(addressManager.address, 'L1CrossDomainMessenger')
return l1XDomainMessenger.attach(proxy.address)
}
describe('L1CrossDomainMessenger', () => { describe('L1CrossDomainMessenger', () => {
let signer: Signer let signer1: SignerWithAddress
let signer2: Signer let signer2: SignerWithAddress
before(async () => { before(async () => {
;[signer, signer2] = await ethers.getSigners() ;[signer1, signer2] = await ethers.getSigners()
})
let AddressManager: Contract
before(async () => {
AddressManager = await makeAddressManager()
}) })
let Fake__TargetContract: FakeContract let Fake__TargetContract: FakeContract
let Fake__L2CrossDomainMessenger: FakeContract let Fake__L2CrossDomainMessenger: FakeContract
let Fake__StateCommitmentChain: FakeContract let Fake__StateCommitmentChain: FakeContract
let Factory__CanonicalTransactionChain: ContractFactory
let Factory__ChainStorageContainer: ContractFactory
let Factory__L1CrossDomainMessenger: ContractFactory
let CanonicalTransactionChain: Contract
before(async () => { before(async () => {
Fake__TargetContract = await smock.fake<Contract>('Helper_SimpleProxy') Fake__TargetContract = await smock.fake<Contract>('Helper_SimpleProxy')
Fake__L2CrossDomainMessenger = await smock.fake<Contract>( Fake__L2CrossDomainMessenger = await smock.fake<Contract>(
...@@ -79,6 +45,12 @@ describe('L1CrossDomainMessenger', () => { ...@@ -79,6 +45,12 @@ describe('L1CrossDomainMessenger', () => {
Fake__StateCommitmentChain = await smock.fake<Contract>( Fake__StateCommitmentChain = await smock.fake<Contract>(
'StateCommitmentChain' 'StateCommitmentChain'
) )
})
let AddressManager: Contract
let CanonicalTransactionChain: Contract
before(async () => {
AddressManager = await deploy('Lib_AddressManager')
await AddressManager.setAddress( await AddressManager.setAddress(
'L2CrossDomainMessenger', 'L2CrossDomainMessenger',
...@@ -91,32 +63,18 @@ describe('L1CrossDomainMessenger', () => { ...@@ -91,32 +63,18 @@ describe('L1CrossDomainMessenger', () => {
Fake__StateCommitmentChain Fake__StateCommitmentChain
) )
Factory__CanonicalTransactionChain = await ethers.getContractFactory( CanonicalTransactionChain = await deploy('CanonicalTransactionChain', {
'CanonicalTransactionChain' args: [
) AddressManager.address,
MAX_GAS_LIMIT,
Factory__ChainStorageContainer = await ethers.getContractFactory( L2_GAS_DISCOUNT_DIVISOR,
'ChainStorageContainer' ENQUEUE_GAS_COST,
) ],
})
Factory__L1CrossDomainMessenger = await ethers.getContractFactory(
'L1CrossDomainMessenger'
)
CanonicalTransactionChain = await Factory__CanonicalTransactionChain.deploy(
AddressManager.address,
MAX_GAS_LIMIT,
L2_GAS_DISCOUNT_DIVISOR,
ENQUEUE_GAS_COST
)
const batches = await Factory__ChainStorageContainer.deploy( const batches = await deploy('ChainStorageContainer', {
AddressManager.address, args: [AddressManager.address, 'CanonicalTransactionChain'],
'CanonicalTransactionChain' })
)
await Factory__ChainStorageContainer.deploy(
AddressManager.address,
'CanonicalTransactionChain'
)
await AddressManager.setAddress( await AddressManager.setAddress(
'ChainStorageContainer-CTC-batches', 'ChainStorageContainer-CTC-batches',
...@@ -131,12 +89,19 @@ describe('L1CrossDomainMessenger', () => { ...@@ -131,12 +89,19 @@ describe('L1CrossDomainMessenger', () => {
let L1CrossDomainMessenger: Contract let L1CrossDomainMessenger: Contract
beforeEach(async () => { beforeEach(async () => {
const xDomainMessengerImpl = await Factory__L1CrossDomainMessenger.deploy() const xDomainMessengerImpl = await deploy('L1CrossDomainMessenger')
// We use an upgradable proxy for the XDomainMessenger--deploy & set up the proxy.
L1CrossDomainMessenger = await deployProxyXDomainMessenger( await AddressManager.setAddress(
AddressManager, 'L1CrossDomainMessenger',
xDomainMessengerImpl xDomainMessengerImpl.address
) )
const proxy = await deploy('Lib_ResolvedDelegateProxy', {
args: [AddressManager.address, 'L1CrossDomainMessenger'],
})
L1CrossDomainMessenger = xDomainMessengerImpl.attach(proxy.address)
await L1CrossDomainMessenger.initialize(AddressManager.address) await L1CrossDomainMessenger.initialize(AddressManager.address)
}) })
...@@ -170,7 +135,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -170,7 +135,7 @@ describe('L1CrossDomainMessenger', () => {
const calldata = encodeXDomainCalldata( const calldata = encodeXDomainCalldata(
target, target,
await signer.getAddress(), signer1.address,
message, message,
0 0
) )
...@@ -207,14 +172,9 @@ describe('L1CrossDomainMessenger', () => { ...@@ -207,14 +172,9 @@ describe('L1CrossDomainMessenger', () => {
const oldGasLimit = 100_000 const oldGasLimit = 100_000
const newGasLimit = 200_000 const newGasLimit = 200_000
let sender: string
before(async () => {
sender = await signer.getAddress()
})
let queueIndex: number let queueIndex: number
beforeEach(async () => { beforeEach(async () => {
await L1CrossDomainMessenger.connect(signer).sendMessage( await L1CrossDomainMessenger.connect(signer1).sendMessage(
target, target,
message, message,
oldGasLimit oldGasLimit
...@@ -229,7 +189,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -229,7 +189,7 @@ describe('L1CrossDomainMessenger', () => {
await expect( await expect(
L1CrossDomainMessenger.replayMessage( L1CrossDomainMessenger.replayMessage(
ethers.constants.AddressZero, // Wrong target ethers.constants.AddressZero, // Wrong target
sender, signer1.address,
message, message,
queueIndex, queueIndex,
oldGasLimit, oldGasLimit,
...@@ -255,7 +215,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -255,7 +215,7 @@ describe('L1CrossDomainMessenger', () => {
await expect( await expect(
L1CrossDomainMessenger.replayMessage( L1CrossDomainMessenger.replayMessage(
target, target,
sender, signer1.address,
'0x', // Wrong message '0x', // Wrong message
queueIndex, queueIndex,
oldGasLimit, oldGasLimit,
...@@ -268,7 +228,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -268,7 +228,7 @@ describe('L1CrossDomainMessenger', () => {
await expect( await expect(
L1CrossDomainMessenger.replayMessage( L1CrossDomainMessenger.replayMessage(
target, target,
sender, signer1.address,
message, message,
queueIndex - 1, // Wrong queue index queueIndex - 1, // Wrong queue index
oldGasLimit, oldGasLimit,
...@@ -281,7 +241,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -281,7 +241,7 @@ describe('L1CrossDomainMessenger', () => {
await expect( await expect(
L1CrossDomainMessenger.replayMessage( L1CrossDomainMessenger.replayMessage(
target, target,
sender, signer1.address,
message, message,
queueIndex, queueIndex,
oldGasLimit + 1, // Wrong gas limit oldGasLimit + 1, // Wrong gas limit
...@@ -296,7 +256,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -296,7 +256,7 @@ describe('L1CrossDomainMessenger', () => {
await expect( await expect(
L1CrossDomainMessenger.replayMessage( L1CrossDomainMessenger.replayMessage(
target, target,
sender, signer1.address,
message, message,
queueIndex, queueIndex,
oldGasLimit, oldGasLimit,
...@@ -313,7 +273,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -313,7 +273,7 @@ describe('L1CrossDomainMessenger', () => {
await expect( await expect(
L1CrossDomainMessenger.replayMessage( L1CrossDomainMessenger.replayMessage(
target, target,
sender, signer1.address,
message, message,
queueIndex, queueIndex,
oldGasLimit, oldGasLimit,
...@@ -325,7 +285,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -325,7 +285,7 @@ describe('L1CrossDomainMessenger', () => {
applyL1ToL2Alias(L1CrossDomainMessenger.address), applyL1ToL2Alias(L1CrossDomainMessenger.address),
Fake__L2CrossDomainMessenger.address, Fake__L2CrossDomainMessenger.address,
newGasLimit, newGasLimit,
encodeXDomainCalldata(target, sender, message, queueIndex), encodeXDomainCalldata(target, signer1.address, message, queueIndex),
newQueueIndex, newQueueIndex,
newTimestamp newTimestamp
) )
...@@ -339,7 +299,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -339,7 +299,7 @@ describe('L1CrossDomainMessenger', () => {
await expect( await expect(
L1CrossDomainMessenger.replayMessage( L1CrossDomainMessenger.replayMessage(
target, target,
await signer.getAddress(), signer1.address,
message, message,
queueLength - 1, queueLength - 1,
oldGasLimit, oldGasLimit,
...@@ -350,24 +310,22 @@ describe('L1CrossDomainMessenger', () => { ...@@ -350,24 +310,22 @@ describe('L1CrossDomainMessenger', () => {
}) })
describe('xDomainMessageSender', () => { describe('xDomainMessageSender', () => {
let Mock__Factory__L1CrossDomainMessenger: MockContractFactory<ContractFactory> let Mock__L1CrossDomainMessenger: MockContract<Contract>
let Mock__L1CrossDomainMessenger
before(async () => { before(async () => {
Mock__Factory__L1CrossDomainMessenger = await smock.mock( Mock__L1CrossDomainMessenger = await (
'L1CrossDomainMessenger' await smock.mock('L1CrossDomainMessenger')
) ).deploy()
Mock__L1CrossDomainMessenger =
await Mock__Factory__L1CrossDomainMessenger.deploy()
}) })
it('should return the xDomainMsgSender address', async () => { it('should return the xDomainMsgSender address', async () => {
await Mock__L1CrossDomainMessenger.setVariable( await Mock__L1CrossDomainMessenger.setVariable(
'xDomainMsgSender', 'xDomainMsgSender',
'0x0000000000000000000000000000000000000000' NON_ZERO_ADDRESS
) )
expect( expect(
await Mock__L1CrossDomainMessenger.xDomainMessageSender() await Mock__L1CrossDomainMessenger.xDomainMessageSender()
).to.equal('0x0000000000000000000000000000000000000000') ).to.equal(NON_ZERO_ADDRESS)
}) })
}) })
...@@ -388,10 +346,17 @@ describe('L1CrossDomainMessenger', () => { ...@@ -388,10 +346,17 @@ describe('L1CrossDomainMessenger', () => {
) )
const storageKey = ethers.utils.keccak256( const storageKey = ethers.utils.keccak256(
ethers.utils.keccak256( ethers.utils.hexConcat([
calldata + remove0x(Fake__L2CrossDomainMessenger.address) ethers.utils.keccak256(
) + '00'.repeat(32) ethers.utils.hexConcat([
calldata,
Fake__L2CrossDomainMessenger.address,
])
),
ethers.constants.HashZero,
])
) )
const storageGenerator = await TrieTestGenerator.fromNodes({ const storageGenerator = await TrieTestGenerator.fromNodes({
nodes: [ nodes: [
{ {
...@@ -435,7 +400,6 @@ describe('L1CrossDomainMessenger', () => { ...@@ -435,7 +400,6 @@ describe('L1CrossDomainMessenger', () => {
describe('relayMessage', () => { describe('relayMessage', () => {
let target: string let target: string
let sender: string
let message: string let message: string
let proof: any let proof: any
let calldata: string let calldata: string
...@@ -444,11 +408,10 @@ describe('L1CrossDomainMessenger', () => { ...@@ -444,11 +408,10 @@ describe('L1CrossDomainMessenger', () => {
message = Fake__TargetContract.interface.encodeFunctionData('setTarget', [ message = Fake__TargetContract.interface.encodeFunctionData('setTarget', [
NON_ZERO_ADDRESS, NON_ZERO_ADDRESS,
]) ])
sender = await signer.getAddress()
const mockProof = await generateMockRelayMessageProof( const mockProof = await generateMockRelayMessageProof(
target, target,
sender, signer1.address,
message message
) )
proof = mockProof.proof proof = mockProof.proof
...@@ -472,21 +435,27 @@ describe('L1CrossDomainMessenger', () => { ...@@ -472,21 +435,27 @@ describe('L1CrossDomainMessenger', () => {
} }
await expect( await expect(
L1CrossDomainMessenger.relayMessage(target, sender, message, 0, proof1) L1CrossDomainMessenger.relayMessage(
target,
signer1.address,
message,
0,
proof1
)
).to.be.revertedWith('Provided message could not be verified.') ).to.be.revertedWith('Provided message could not be verified.')
}) })
it('should revert if attempting to relay a message sent to an L1 system contract', async () => { it('should revert if attempting to relay a message sent to an L1 system contract', async () => {
const maliciousProof = await generateMockRelayMessageProof( const maliciousProof = await generateMockRelayMessageProof(
CanonicalTransactionChain.address, CanonicalTransactionChain.address,
sender, signer1.address,
message message
) )
await expect( await expect(
L1CrossDomainMessenger.relayMessage( L1CrossDomainMessenger.relayMessage(
CanonicalTransactionChain.address, CanonicalTransactionChain.address,
sender, signer1.address,
message, message,
0, 0,
maliciousProof.proof maliciousProof.proof
...@@ -508,25 +477,43 @@ describe('L1CrossDomainMessenger', () => { ...@@ -508,25 +477,43 @@ describe('L1CrossDomainMessenger', () => {
} }
await expect( await expect(
L1CrossDomainMessenger.relayMessage(target, sender, message, 0, proof1) L1CrossDomainMessenger.relayMessage(
target,
signer1.address,
message,
0,
proof1
)
).to.be.revertedWith('Provided message could not be verified.') ).to.be.revertedWith('Provided message could not be verified.')
}) })
it('should revert if provided an invalid storage trie witness', async () => { it('should revert if provided an invalid storage trie witness', async () => {
await expect( await expect(
L1CrossDomainMessenger.relayMessage(target, sender, message, 0, { L1CrossDomainMessenger.relayMessage(
...proof, target,
storageTrieWitness: '0x', signer1.address,
}) message,
0,
{
...proof,
storageTrieWitness: '0x',
}
)
).to.be.reverted ).to.be.reverted
}) })
it('should revert if provided an invalid state trie witness', async () => { it('should revert if provided an invalid state trie witness', async () => {
await expect( await expect(
L1CrossDomainMessenger.relayMessage(target, sender, message, 0, { L1CrossDomainMessenger.relayMessage(
...proof, target,
stateTrieWitness: '0x', signer1.address,
}) message,
0,
{
...proof,
stateTrieWitness: '0x',
}
)
).to.be.reverted ).to.be.reverted
}) })
...@@ -535,7 +522,7 @@ describe('L1CrossDomainMessenger', () => { ...@@ -535,7 +522,7 @@ describe('L1CrossDomainMessenger', () => {
await L1CrossDomainMessenger.relayMessage( await L1CrossDomainMessenger.relayMessage(
target, target,
sender, signer1.address,
message, message,
0, 0,
proof proof
...@@ -550,12 +537,14 @@ describe('L1CrossDomainMessenger', () => { ...@@ -550,12 +537,14 @@ describe('L1CrossDomainMessenger', () => {
expect( expect(
await L1CrossDomainMessenger.relayedMessages( await L1CrossDomainMessenger.relayedMessages(
ethers.utils.keccak256( ethers.utils.keccak256(
calldata + ethers.utils.hexConcat([
remove0x(await signer.getAddress()) + calldata,
remove0x(BigNumber.from(blockNumber).toHexString()).padStart( signer1.address,
64, ethers.utils.hexZeroPad(
'0' BigNumber.from(blockNumber).toHexString(),
) 32
),
])
) )
) )
).to.equal(true) ).to.equal(true)
...@@ -565,13 +554,15 @@ describe('L1CrossDomainMessenger', () => { ...@@ -565,13 +554,15 @@ describe('L1CrossDomainMessenger', () => {
await expect( await expect(
L1CrossDomainMessenger.xDomainMessageSender() L1CrossDomainMessenger.xDomainMessageSender()
).to.be.revertedWith('xDomainMessageSender is not set') ).to.be.revertedWith('xDomainMessageSender is not set')
await L1CrossDomainMessenger.relayMessage( await L1CrossDomainMessenger.relayMessage(
target, target,
sender, signer1.address,
message, message,
0, 0,
proof proof
) )
await expect( await expect(
L1CrossDomainMessenger.xDomainMessageSender() L1CrossDomainMessenger.xDomainMessageSender()
).to.be.revertedWith('xDomainMessageSender is not set') ).to.be.revertedWith('xDomainMessageSender is not set')
...@@ -580,14 +571,20 @@ describe('L1CrossDomainMessenger', () => { ...@@ -580,14 +571,20 @@ describe('L1CrossDomainMessenger', () => {
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 L1CrossDomainMessenger.relayMessage( await L1CrossDomainMessenger.relayMessage(
target, target,
sender, signer1.address,
message, message,
0, 0,
proof proof
) )
await expect( await expect(
L1CrossDomainMessenger.relayMessage(target, sender, message, 0, proof) L1CrossDomainMessenger.relayMessage(
target,
signer1.address,
message,
0,
proof
)
).to.be.revertedWith('Provided message has already been received.') ).to.be.revertedWith('Provided message has already been received.')
}) })
...@@ -595,13 +592,20 @@ describe('L1CrossDomainMessenger', () => { ...@@ -595,13 +592,20 @@ describe('L1CrossDomainMessenger', () => {
await L1CrossDomainMessenger.pause() await L1CrossDomainMessenger.pause()
await expect( await expect(
L1CrossDomainMessenger.relayMessage(target, sender, message, 0, proof) L1CrossDomainMessenger.relayMessage(
target,
signer1.address,
message,
0,
proof
)
).to.be.revertedWith('Pausable: paused') ).to.be.revertedWith('Pausable: paused')
}) })
describe('blockMessage and allowMessage', () => { describe('blockMessage and allowMessage', () => {
it('should revert if called by an account other than the owner', async () => { it('should revert if called by an account other than the owner', async () => {
const L1CrossDomainMessenger2 = L1CrossDomainMessenger.connect(signer2) const L1CrossDomainMessenger2 = L1CrossDomainMessenger.connect(signer2)
await expect( await expect(
L1CrossDomainMessenger2.blockMessage(ethers.utils.keccak256(calldata)) L1CrossDomainMessenger2.blockMessage(ethers.utils.keccak256(calldata))
).to.be.revertedWith('Ownable: caller is not the owner') ).to.be.revertedWith('Ownable: caller is not the owner')
...@@ -617,7 +621,13 @@ describe('L1CrossDomainMessenger', () => { ...@@ -617,7 +621,13 @@ describe('L1CrossDomainMessenger', () => {
) )
await expect( await expect(
L1CrossDomainMessenger.relayMessage(target, sender, message, 0, proof) L1CrossDomainMessenger.relayMessage(
target,
signer1.address,
message,
0,
proof
)
).to.be.revertedWith('Provided message has been blocked.') ).to.be.revertedWith('Provided message has been blocked.')
}) })
...@@ -627,7 +637,13 @@ describe('L1CrossDomainMessenger', () => { ...@@ -627,7 +637,13 @@ describe('L1CrossDomainMessenger', () => {
) )
await expect( await expect(
L1CrossDomainMessenger.relayMessage(target, sender, message, 0, proof) L1CrossDomainMessenger.relayMessage(
target,
signer1.address,
message,
0,
proof
)
).to.be.revertedWith('Provided message has been blocked.') ).to.be.revertedWith('Provided message has been blocked.')
await L1CrossDomainMessenger.allowMessage( await L1CrossDomainMessenger.allowMessage(
...@@ -635,7 +651,13 @@ describe('L1CrossDomainMessenger', () => { ...@@ -635,7 +651,13 @@ describe('L1CrossDomainMessenger', () => {
) )
await expect( await expect(
L1CrossDomainMessenger.relayMessage(target, sender, message, 0, proof) L1CrossDomainMessenger.relayMessage(
target,
signer1.address,
message,
0,
proof
)
).to.not.be.reverted ).to.not.be.reverted
}) })
}) })
......
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