Commit 73059962 authored by Mark Tyneway's avatar Mark Tyneway

contracts-bedrock: fuzz optimism portal

Migrate away from using magic variables and towards fuzzing in the
`OptimismPortal` instead. This improves test coverage while moving
away from an antipattern which is defining variables far away from
where they are used. Its good to fuzz in place of this or have
explicit visibility into what variables are used.
parent 6f57e9c7
......@@ -485,26 +485,17 @@ OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayPro
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_succeeds() (gas: 227596)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 166699)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_succeeds() (gas: 154430)
OptimismPortal_Test:test_constructor_succeeds() (gas: 28164)
OptimismPortal_Test:test_depositTransaction_contractCreation_reverts() (gas: 14292)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract_succeeds() (gas: 76814)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForEOA_succeeds() (gas: 77115)
OptimismPortal_Test:test_depositTransaction_largeData_reverts() (gas: 512149)
OptimismPortal_Test:test_depositTransaction_noValueContract_succeeds() (gas: 76767)
OptimismPortal_Test:test_depositTransaction_noValueEOA_succeeds() (gas: 77112)
OptimismPortal_Test:test_constructor_succeeds() (gas: 28208)
OptimismPortal_Test:test_depositTransaction_contractCreation_reverts() (gas: 14260)
OptimismPortal_Test:test_depositTransaction_largeData_reverts() (gas: 512156)
OptimismPortal_Test:test_depositTransaction_smallGasLimit_reverts() (gas: 14528)
OptimismPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation_succeeds() (gas: 83773)
OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation_succeeds() (gas: 75929)
OptimismPortal_Test:test_depositTransaction_withEthValueFromContract_succeeds() (gas: 83476)
OptimismPortal_Test:test_depositTransaction_withEthValueFromEOA_succeeds() (gas: 84069)
OptimismPortal_Test:test_isOutputFinalized_succeeds() (gas: 127617)
OptimismPortal_Test:test_minimumGasLimit_succeeds() (gas: 17430)
OptimismPortal_Test:test_isOutputFinalized_succeeds() (gas: 127638)
OptimismPortal_Test:test_minimumGasLimit_succeeds() (gas: 17641)
OptimismPortal_Test:test_pause_onlyGuardian_reverts() (gas: 24487)
OptimismPortal_Test:test_pause_succeeds() (gas: 27344)
OptimismPortal_Test:test_pause_succeeds() (gas: 27323)
OptimismPortal_Test:test_receive_succeeds() (gas: 127564)
OptimismPortal_Test:test_simple_isOutputFinalized_succeeds() (gas: 35651)
OptimismPortal_Test:test_unpause_onlyGuardian_reverts() (gas: 31514)
OptimismPortal_Test:test_unpause_succeeds() (gas: 27451)
OptimismPortal_Test:test_unpause_onlyGuardian_reverts() (gas: 31558)
OptimismPortal_Test:test_unpause_succeeds() (gas: 27407)
OptimistAllowlistTest:test_constructor_succeeds() (gas: 16407)
OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestorWithFalsyValue_fails() (gas: 49650)
OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestor_succeeds() (gas: 49254)
......
......@@ -163,145 +163,258 @@ contract OptimismPortal_Test is Portal_Initializer {
}
/// @dev Tests that `depositTransaction` succeeds for an EOA depositing a tx with 0 value.
function test_depositTransaction_noValueEOA_succeeds() external {
// EOA emulation
vm.prank(address(this), address(this));
vm.expectEmit(true, true, false, true);
emitTransactionDeposited(
address(this), NON_ZERO_ADDRESS, ZERO_VALUE, ZERO_VALUE, NON_ZERO_GASLIMIT, false, NON_ZERO_DATA
function testFuzz_depositTransaction_noValueEOA_succeeds(
address _to,
uint64 _gasLimit,
bytes memory _data
)
external
{
_gasLimit = uint64(
bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
);
op.depositTransaction(NON_ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, false, NON_ZERO_DATA);
// EOA emulation
vm.expectEmit(address(op));
emitTransactionDeposited({
_from: address(this),
_to: _to,
_value: 0,
_mint: 0,
_gasLimit: _gasLimit,
_isCreation: false,
_data: _data
});
vm.prank(address(this), address(this));
op.depositTransaction({ _to: _to, _value: 0, _gasLimit: _gasLimit, _isCreation: false, _data: _data });
}
/// @dev Tests that `depositTransaction` succeeds for a contract depositing a tx with 0 value.
function test_depositTransaction_noValueContract_succeeds() external {
vm.expectEmit(true, true, false, true);
emitTransactionDeposited(
AddressAliasHelper.applyL1ToL2Alias(address(this)),
NON_ZERO_ADDRESS,
ZERO_VALUE,
ZERO_VALUE,
NON_ZERO_GASLIMIT,
false,
NON_ZERO_DATA
function testFuzz_depositTransaction_noValueContract_succeeds(
address _to,
uint64 _gasLimit,
bytes memory _data
)
external
{
_gasLimit = uint64(
bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
);
op.depositTransaction(NON_ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, false, NON_ZERO_DATA);
vm.expectEmit(address(op));
emitTransactionDeposited({
_from: AddressAliasHelper.applyL1ToL2Alias(address(this)),
_to: _to,
_value: 0,
_mint: 0,
_gasLimit: _gasLimit,
_isCreation: false,
_data: _data
});
op.depositTransaction({ _to: _to, _value: 0, _gasLimit: _gasLimit, _isCreation: false, _data: _data });
}
/// @dev Tests that `depositTransaction` succeeds for an EOA
/// depositing a contract creation with 0 value.
function test_depositTransaction_createWithZeroValueForEOA_succeeds() external {
// EOA emulation
vm.prank(address(this), address(this));
vm.expectEmit(true, true, false, true);
emitTransactionDeposited(
address(this), ZERO_ADDRESS, ZERO_VALUE, ZERO_VALUE, NON_ZERO_GASLIMIT, true, NON_ZERO_DATA
function testFuzz_depositTransaction_createWithZeroValueForEOA_succeeds(
uint64 _gasLimit,
bytes memory _data
)
external
{
_gasLimit = uint64(
bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
);
op.depositTransaction(ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, true, NON_ZERO_DATA);
vm.expectEmit(address(op));
emitTransactionDeposited({
_from: address(this),
_to: address(0),
_value: 0,
_mint: 0,
_gasLimit: _gasLimit,
_isCreation: true,
_data: _data
});
// EOA emulation
vm.prank(address(this), address(this));
op.depositTransaction({ _to: address(0), _value: 0, _gasLimit: _gasLimit, _isCreation: true, _data: _data });
}
/// @dev Tests that `depositTransaction` succeeds for a contract
/// depositing a contract creation with 0 value.
function test_depositTransaction_createWithZeroValueForContract_succeeds() external {
vm.expectEmit(true, true, false, true);
emitTransactionDeposited(
AddressAliasHelper.applyL1ToL2Alias(address(this)),
ZERO_ADDRESS,
ZERO_VALUE,
ZERO_VALUE,
NON_ZERO_GASLIMIT,
true,
NON_ZERO_DATA
function testFuzz_depositTransaction_createWithZeroValueForContract_succeeds(
uint64 _gasLimit,
bytes memory _data
)
external
{
_gasLimit = uint64(
bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
);
op.depositTransaction(ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, true, NON_ZERO_DATA);
vm.expectEmit(address(op));
emitTransactionDeposited({
_from: AddressAliasHelper.applyL1ToL2Alias(address(this)),
_to: address(0),
_value: 0,
_mint: 0,
_gasLimit: _gasLimit,
_isCreation: true,
_data: _data
});
op.depositTransaction({ _to: address(0), _value: 0, _gasLimit: _gasLimit, _isCreation: true, _data: _data });
}
/// @dev Tests that `depositTransaction` succeeds for an EOA depositing a tx with ETH.
function test_depositTransaction_withEthValueFromEOA_succeeds() external {
// EOA emulation
vm.prank(address(this), address(this));
vm.expectEmit(true, true, false, true);
emitTransactionDeposited(
address(this), NON_ZERO_ADDRESS, NON_ZERO_VALUE, ZERO_VALUE, NON_ZERO_GASLIMIT, false, NON_ZERO_DATA
function testFuzz_depositTransaction_withEthValueFromEOA_succeeds(
address _to,
uint256 _value,
uint64 _gasLimit,
bool _isCreation,
bytes memory _data
)
external
{
_gasLimit = uint64(
bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
);
if (_isCreation) _to = address(0);
op.depositTransaction{ value: NON_ZERO_VALUE }(
NON_ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, false, NON_ZERO_DATA
);
assertEq(address(op).balance, NON_ZERO_VALUE);
// EOA emulation
vm.deal(address(this), _value);
vm.expectEmit(address(op));
emitTransactionDeposited({
_from: address(this),
_to: _to,
_value: _value,
_mint: _value,
_gasLimit: _gasLimit,
_isCreation: _isCreation,
_data: _data
});
vm.prank(address(this), address(this));
op.depositTransaction{ value: _value }({
_to: _to,
_value: _value,
_gasLimit: _gasLimit,
_isCreation: _isCreation,
_data: _data
});
assertEq(address(op).balance, _value);
}
/// @dev Tests that `depositTransaction` succeeds for a contract depositing a tx with ETH.
function test_depositTransaction_withEthValueFromContract_succeeds() external {
vm.expectEmit(true, true, false, true);
emitTransactionDeposited(
AddressAliasHelper.applyL1ToL2Alias(address(this)),
NON_ZERO_ADDRESS,
NON_ZERO_VALUE,
ZERO_VALUE,
NON_ZERO_GASLIMIT,
false,
NON_ZERO_DATA
function testFuzz_depositTransaction_withEthValueFromContract_succeeds(
address _to,
uint256 _value,
uint64 _gasLimit,
bytes memory _data
)
external
{
_gasLimit = uint64(
bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
);
op.depositTransaction{ value: NON_ZERO_VALUE }(
NON_ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, false, NON_ZERO_DATA
);
vm.deal(address(this), _value);
vm.expectEmit(address(op));
emitTransactionDeposited({
_from: AddressAliasHelper.applyL1ToL2Alias(address(this)),
_to: _to,
_value: _value,
_mint: _value,
_gasLimit: _gasLimit,
_isCreation: false,
_data: _data
});
op.depositTransaction{ value: _value }({
_to: _to,
_value: _value,
_gasLimit: _gasLimit,
_isCreation: false,
_data: _data
});
}
/// @dev Tests that `depositTransaction` succeeds for an EOA depositing a contract creation with ETH.
function test_depositTransaction_withEthValueAndEOAContractCreation_succeeds() external {
// EOA emulation
vm.prank(address(this), address(this));
vm.expectEmit(true, true, false, true);
emitTransactionDeposited(
address(this), ZERO_ADDRESS, NON_ZERO_VALUE, ZERO_VALUE, NON_ZERO_GASLIMIT, true, hex""
function testFuzz_depositTransaction_withEthValueAndEOAContractCreation_succeeds(
uint256 _mint,
uint64 _gasLimit,
bytes memory _data
)
external
{
_gasLimit = uint64(
bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
);
op.depositTransaction{ value: NON_ZERO_VALUE }(ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, true, hex"");
assertEq(address(op).balance, NON_ZERO_VALUE);
}
vm.deal(address(this), _mint);
/// @dev Tests that `depositTransaction` succeeds for a contract depositing a contract creation with ETH.
function test_depositTransaction_withEthValueAndContractContractCreation_succeeds() external {
vm.expectEmit(true, true, false, true);
emitTransactionDeposited(
AddressAliasHelper.applyL1ToL2Alias(address(this)),
ZERO_ADDRESS,
NON_ZERO_VALUE,
ZERO_VALUE,
NON_ZERO_GASLIMIT,
true,
NON_ZERO_DATA
);
vm.expectEmit(address(op));
emitTransactionDeposited({
_from: address(this),
_to: address(0),
_value: 0,
_mint: _mint,
_gasLimit: _gasLimit,
_isCreation: true,
_data: _data
});
op.depositTransaction{ value: NON_ZERO_VALUE }(ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, true, NON_ZERO_DATA);
assertEq(address(op).balance, NON_ZERO_VALUE);
// EOA emulation
vm.prank(address(this), address(this));
op.depositTransaction{ value: _mint }({
_to: address(0),
_value: 0,
_gasLimit: _gasLimit,
_isCreation: true,
_data: _data
});
assertEq(address(op).balance, _mint);
}
/// @dev Tests that `isOutputFinalized` succeeds for an EOA depositing a tx with ETH and data.
function test_simple_isOutputFinalized_succeeds() external {
uint256 ts = block.timestamp;
vm.mockCall(
address(op.L2_ORACLE()),
abi.encodeWithSelector(L2OutputOracle.getL2Output.selector),
abi.encode(Types.OutputProposal(bytes32(uint256(1)), uint128(ts), uint128(startingBlockNumber)))
/// @dev Tests that `depositTransaction` succeeds for a contract depositing a contract creation with ETH.
function testFuzz_depositTransaction_withEthValueAndContractContractCreation_succeeds(
uint256 _mint,
uint64 _gasLimit,
bytes memory _data
)
external
{
_gasLimit = uint64(
bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
);
// warp to the finalization period
vm.warp(ts + oracle.FINALIZATION_PERIOD_SECONDS());
assertEq(op.isOutputFinalized(0), false);
vm.deal(address(this), _mint);
// warp past the finalization period
vm.warp(ts + oracle.FINALIZATION_PERIOD_SECONDS() + 1);
assertEq(op.isOutputFinalized(0), true);
vm.expectEmit(address(op));
emitTransactionDeposited({
_from: AddressAliasHelper.applyL1ToL2Alias(address(this)),
_to: address(0),
_value: 0,
_mint: _mint,
_gasLimit: _gasLimit,
_isCreation: true,
_data: _data
});
op.depositTransaction{ value: _mint }({
_to: address(0),
_value: 0,
_gasLimit: _gasLimit,
_isCreation: true,
_data: _data
});
assertEq(address(op).balance, _mint);
}
/// @dev Tests `isOutputFinalized` for a finalized output.
......
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