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 ...@@ -485,26 +485,17 @@ OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayPro
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_succeeds() (gas: 227596) OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_succeeds() (gas: 227596)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 166699) OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 166699)
OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_succeeds() (gas: 154430) OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_succeeds() (gas: 154430)
OptimismPortal_Test:test_constructor_succeeds() (gas: 28164) OptimismPortal_Test:test_constructor_succeeds() (gas: 28208)
OptimismPortal_Test:test_depositTransaction_contractCreation_reverts() (gas: 14292) OptimismPortal_Test:test_depositTransaction_contractCreation_reverts() (gas: 14260)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract_succeeds() (gas: 76814) OptimismPortal_Test:test_depositTransaction_largeData_reverts() (gas: 512156)
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_depositTransaction_smallGasLimit_reverts() (gas: 14528) OptimismPortal_Test:test_depositTransaction_smallGasLimit_reverts() (gas: 14528)
OptimismPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation_succeeds() (gas: 83773) OptimismPortal_Test:test_isOutputFinalized_succeeds() (gas: 127638)
OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation_succeeds() (gas: 75929) OptimismPortal_Test:test_minimumGasLimit_succeeds() (gas: 17641)
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_pause_onlyGuardian_reverts() (gas: 24487) 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_receive_succeeds() (gas: 127564)
OptimismPortal_Test:test_simple_isOutputFinalized_succeeds() (gas: 35651) OptimismPortal_Test:test_unpause_onlyGuardian_reverts() (gas: 31558)
OptimismPortal_Test:test_unpause_onlyGuardian_reverts() (gas: 31514) OptimismPortal_Test:test_unpause_succeeds() (gas: 27407)
OptimismPortal_Test:test_unpause_succeeds() (gas: 27451)
OptimistAllowlistTest:test_constructor_succeeds() (gas: 16407) OptimistAllowlistTest:test_constructor_succeeds() (gas: 16407)
OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestorWithFalsyValue_fails() (gas: 49650) OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestorWithFalsyValue_fails() (gas: 49650)
OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestor_succeeds() (gas: 49254) OptimistAllowlistTest:test_isAllowedToMint_fromAllowlistAttestor_succeeds() (gas: 49254)
......
...@@ -163,145 +163,258 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -163,145 +163,258 @@ contract OptimismPortal_Test is Portal_Initializer {
} }
/// @dev Tests that `depositTransaction` succeeds for an EOA depositing a tx with 0 value. /// @dev Tests that `depositTransaction` succeeds for an EOA depositing a tx with 0 value.
function test_depositTransaction_noValueEOA_succeeds() external { function testFuzz_depositTransaction_noValueEOA_succeeds(
// EOA emulation address _to,
vm.prank(address(this), address(this)); uint64 _gasLimit,
vm.expectEmit(true, true, false, true); bytes memory _data
emitTransactionDeposited( )
address(this), NON_ZERO_ADDRESS, ZERO_VALUE, ZERO_VALUE, NON_ZERO_GASLIMIT, false, NON_ZERO_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. /// @dev Tests that `depositTransaction` succeeds for a contract depositing a tx with 0 value.
function test_depositTransaction_noValueContract_succeeds() external { function testFuzz_depositTransaction_noValueContract_succeeds(
vm.expectEmit(true, true, false, true); address _to,
emitTransactionDeposited( uint64 _gasLimit,
AddressAliasHelper.applyL1ToL2Alias(address(this)), bytes memory _data
NON_ZERO_ADDRESS, )
ZERO_VALUE, external
ZERO_VALUE, {
NON_ZERO_GASLIMIT, _gasLimit = uint64(
false, bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
NON_ZERO_DATA
); );
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 /// @dev Tests that `depositTransaction` succeeds for an EOA
/// depositing a contract creation with 0 value. /// depositing a contract creation with 0 value.
function test_depositTransaction_createWithZeroValueForEOA_succeeds() external { function testFuzz_depositTransaction_createWithZeroValueForEOA_succeeds(
// EOA emulation uint64 _gasLimit,
vm.prank(address(this), address(this)); bytes memory _data
)
vm.expectEmit(true, true, false, true); external
emitTransactionDeposited( {
address(this), ZERO_ADDRESS, ZERO_VALUE, ZERO_VALUE, NON_ZERO_GASLIMIT, true, NON_ZERO_DATA _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 /// @dev Tests that `depositTransaction` succeeds for a contract
/// depositing a contract creation with 0 value. /// depositing a contract creation with 0 value.
function test_depositTransaction_createWithZeroValueForContract_succeeds() external { function testFuzz_depositTransaction_createWithZeroValueForContract_succeeds(
vm.expectEmit(true, true, false, true); uint64 _gasLimit,
emitTransactionDeposited( bytes memory _data
AddressAliasHelper.applyL1ToL2Alias(address(this)), )
ZERO_ADDRESS, external
ZERO_VALUE, {
ZERO_VALUE, _gasLimit = uint64(
NON_ZERO_GASLIMIT, bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
true,
NON_ZERO_DATA
); );
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. /// @dev Tests that `depositTransaction` succeeds for an EOA depositing a tx with ETH.
function test_depositTransaction_withEthValueFromEOA_succeeds() external { function testFuzz_depositTransaction_withEthValueFromEOA_succeeds(
// EOA emulation address _to,
vm.prank(address(this), address(this)); uint256 _value,
uint64 _gasLimit,
vm.expectEmit(true, true, false, true); bool _isCreation,
emitTransactionDeposited( bytes memory _data
address(this), NON_ZERO_ADDRESS, NON_ZERO_VALUE, ZERO_VALUE, NON_ZERO_GASLIMIT, false, NON_ZERO_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 }( // EOA emulation
NON_ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, false, NON_ZERO_DATA vm.deal(address(this), _value);
);
assertEq(address(op).balance, NON_ZERO_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. /// @dev Tests that `depositTransaction` succeeds for a contract depositing a tx with ETH.
function test_depositTransaction_withEthValueFromContract_succeeds() external { function testFuzz_depositTransaction_withEthValueFromContract_succeeds(
vm.expectEmit(true, true, false, true); address _to,
emitTransactionDeposited( uint256 _value,
AddressAliasHelper.applyL1ToL2Alias(address(this)), uint64 _gasLimit,
NON_ZERO_ADDRESS, bytes memory _data
NON_ZERO_VALUE, )
ZERO_VALUE, external
NON_ZERO_GASLIMIT, {
false, _gasLimit = uint64(
NON_ZERO_DATA bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
); );
op.depositTransaction{ value: NON_ZERO_VALUE }( vm.deal(address(this), _value);
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: _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. /// @dev Tests that `depositTransaction` succeeds for an EOA depositing a contract creation with ETH.
function test_depositTransaction_withEthValueAndEOAContractCreation_succeeds() external { function testFuzz_depositTransaction_withEthValueAndEOAContractCreation_succeeds(
// EOA emulation uint256 _mint,
vm.prank(address(this), address(this)); uint64 _gasLimit,
bytes memory _data
vm.expectEmit(true, true, false, true); )
emitTransactionDeposited( external
address(this), ZERO_ADDRESS, NON_ZERO_VALUE, ZERO_VALUE, NON_ZERO_GASLIMIT, true, hex"" {
_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""); vm.deal(address(this), _mint);
assertEq(address(op).balance, NON_ZERO_VALUE);
}
/// @dev Tests that `depositTransaction` succeeds for a contract depositing a contract creation with ETH. vm.expectEmit(address(op));
function test_depositTransaction_withEthValueAndContractContractCreation_succeeds() external { emitTransactionDeposited({
vm.expectEmit(true, true, false, true); _from: address(this),
emitTransactionDeposited( _to: address(0),
AddressAliasHelper.applyL1ToL2Alias(address(this)), _value: 0,
ZERO_ADDRESS, _mint: _mint,
NON_ZERO_VALUE, _gasLimit: _gasLimit,
ZERO_VALUE, _isCreation: true,
NON_ZERO_GASLIMIT, _data: _data
true, });
NON_ZERO_DATA
);
op.depositTransaction{ value: NON_ZERO_VALUE }(ZERO_ADDRESS, ZERO_VALUE, NON_ZERO_GASLIMIT, true, NON_ZERO_DATA); // EOA emulation
assertEq(address(op).balance, NON_ZERO_VALUE); 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. /// @dev Tests that `depositTransaction` succeeds for a contract depositing a contract creation with ETH.
function test_simple_isOutputFinalized_succeeds() external { function testFuzz_depositTransaction_withEthValueAndContractContractCreation_succeeds(
uint256 ts = block.timestamp; uint256 _mint,
vm.mockCall( uint64 _gasLimit,
address(op.L2_ORACLE()), bytes memory _data
abi.encodeWithSelector(L2OutputOracle.getL2Output.selector), )
abi.encode(Types.OutputProposal(bytes32(uint256(1)), uint128(ts), uint128(startingBlockNumber))) external
{
_gasLimit = uint64(
bound(_gasLimit, op.minimumGasLimit(uint64(_data.length)), systemConfig.resourceConfig().maxResourceLimit)
); );
// warp to the finalization period vm.deal(address(this), _mint);
vm.warp(ts + oracle.FINALIZATION_PERIOD_SECONDS());
assertEq(op.isOutputFinalized(0), false);
// warp past the finalization period vm.expectEmit(address(op));
vm.warp(ts + oracle.FINALIZATION_PERIOD_SECONDS() + 1); emitTransactionDeposited({
assertEq(op.isOutputFinalized(0), true); _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. /// @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