Commit b7b77d6c authored by smartcontracts's avatar smartcontracts Committed by GitHub

fix(ctb): tweak XDM.baseGas (#3023)

Tweaks the CrossDomainMessenger.baseGas function to more accurately
reflect the actual cost of performing a deposit on L2. I've been able to
use the SDK to successfully complete deposits with these values.
Co-authored-by: default avatarmergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: default avatarMark Tyneway <mark.tyneway@gmail.com>
parent bbd6243e
---
'@eth-optimism/contracts-bedrock': patch
---
Updates CrossDomainMessenger.baseGas to more accurately reflect gas costs
GasBenchMark_L1CrossDomainMessenger:test_L1MessengerSendMessage_benchmark_0() (gas: 158650) GasBenchMark_L1CrossDomainMessenger:test_L1MessengerSendMessage_benchmark_0() (gas: 262334)
GasBenchMark_L1CrossDomainMessenger:test_L1MessengerSendMessage_benchmark_1() (gas: 75059) GasBenchMark_L1CrossDomainMessenger:test_L1MessengerSendMessage_benchmark_1() (gas: 75318)
GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 249871) GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 353380)
GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 116125) GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 116384)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 249893) GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 353402)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 116100) GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 116359)
GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 45413) GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 45413)
GasBenchMark_L2OutputOracle:test_appendL2Output_benchmark() (gas: 68673) GasBenchMark_L2OutputOracle:test_appendL2Output_benchmark() (gas: 68673)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark() (gas: 75069) GasBenchMark_OptimismPortal:test_depositTransaction_benchmark() (gas: 75069)
...@@ -35,23 +35,23 @@ L1BlockTest:test_updateValues() (gas: 28216) ...@@ -35,23 +35,23 @@ L1BlockTest:test_updateValues() (gas: 28216)
L1BlockNumberTest:test_fallback() (gas: 18774) L1BlockNumberTest:test_fallback() (gas: 18774)
L1BlockNumberTest:test_getL1BlockNumber() (gas: 10657) L1BlockNumberTest:test_getL1BlockNumber() (gas: 10657)
L1BlockNumberTest:test_receive() (gas: 25437) L1BlockNumberTest:test_receive() (gas: 25437)
L1CrossDomainMessenger_Test:testCannot_L1MessengerPause() (gas: 24517) L1CrossDomainMessenger_Test:testCannot_L1MessengerPause() (gas: 24561)
L1CrossDomainMessenger_Test:testCannot_L1MessengerUnpause() (gas: 24509) L1CrossDomainMessenger_Test:testCannot_L1MessengerUnpause() (gas: 24508)
L1CrossDomainMessenger_Test:test_L1MessengerMessageVersion() (gas: 24716) L1CrossDomainMessenger_Test:test_L1MessengerMessageVersion() (gas: 24748)
L1CrossDomainMessenger_Test:test_L1MessengerPause() (gas: 47995) L1CrossDomainMessenger_Test:test_L1MessengerPause() (gas: 48017)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 77773) L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 77750)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 67822) L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 67778)
L1CrossDomainMessenger_Test:test_L1MessengerRelayShouldRevertIfPaused() (gas: 60472) L1CrossDomainMessenger_Test:test_L1MessengerRelayShouldRevertIfPaused() (gas: 60471)
L1CrossDomainMessenger_Test:test_L1MessengerReplayMessageWithValue() (gas: 38149) L1CrossDomainMessenger_Test:test_L1MessengerReplayMessageWithValue() (gas: 38127)
L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 196878) L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 297745)
L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1273626) L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1490048)
L1CrossDomainMessenger_Test:test_L1MessengerUnpause() (gas: 40890) L1CrossDomainMessenger_Test:test_L1MessengerUnpause() (gas: 40889)
L1CrossDomainMessenger_Test:test_L1MessengerXDomainSenderReverts() (gas: 24272) L1CrossDomainMessenger_Test:test_L1MessengerXDomainSenderReverts() (gas: 24249)
L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 86214) L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 86146)
L1StandardBridge_Test:test_depositERC20() (gas: 475008) L1StandardBridge_Test:test_depositERC20() (gas: 578867)
L1StandardBridge_Test:test_depositERC20To() (gas: 477189) L1StandardBridge_Test:test_depositERC20To() (gas: 581048)
L1StandardBridge_Test:test_depositETH() (gas: 268941) L1StandardBridge_Test:test_depositETH() (gas: 372975)
L1StandardBridge_Test:test_depositETHTo() (gas: 226763) L1StandardBridge_Test:test_depositETHTo() (gas: 330097)
L1StandardBridge_Test:test_finalizeERC20Withdrawal() (gas: 490759) L1StandardBridge_Test:test_finalizeERC20Withdrawal() (gas: 490759)
L1StandardBridge_Test:test_finalizeETHWithdrawal() (gas: 64409) L1StandardBridge_Test:test_finalizeETHWithdrawal() (gas: 64409)
L1StandardBridge_Test:test_initialize() (gas: 26336) L1StandardBridge_Test:test_initialize() (gas: 26336)
...@@ -59,17 +59,17 @@ L1StandardBridge_Test:test_onlyEOADepositERC20() (gas: 22363) ...@@ -59,17 +59,17 @@ L1StandardBridge_Test:test_onlyEOADepositERC20() (gas: 22363)
L1StandardBridge_Test:test_onlyEOADepositETH() (gas: 40882) L1StandardBridge_Test:test_onlyEOADepositETH() (gas: 40882)
L1StandardBridge_Test:test_onlyL2BridgeFinalizeERC20Withdrawal() (gas: 36271) L1StandardBridge_Test:test_onlyL2BridgeFinalizeERC20Withdrawal() (gas: 36271)
L1StandardBridge_Test:test_onlyPortalFinalizeERC20Withdrawal() (gas: 35600) L1StandardBridge_Test:test_onlyPortalFinalizeERC20Withdrawal() (gas: 35600)
L1StandardBridge_Test:test_receive() (gas: 413601) L1StandardBridge_Test:test_receive() (gas: 519560)
L2CrossDomainMessenger_Test:testCannot_L2MessengerPause() (gas: 10821) L2CrossDomainMessenger_Test:testCannot_L2MessengerPause() (gas: 10800)
L2CrossDomainMessenger_Test:test_L2MessengerMessageVersion() (gas: 8445) L2CrossDomainMessenger_Test:test_L2MessengerMessageVersion() (gas: 8477)
L2CrossDomainMessenger_Test:test_L2MessengerPause() (gas: 31815) L2CrossDomainMessenger_Test:test_L2MessengerPause() (gas: 31772)
L2CrossDomainMessenger_Test:test_L2MessengerRelayMessageSucceeds() (gas: 57332) L2CrossDomainMessenger_Test:test_L2MessengerRelayMessageSucceeds() (gas: 57309)
L2CrossDomainMessenger_Test:test_L2MessengerRelayMessageToSystemContract() (gas: 36159) L2CrossDomainMessenger_Test:test_L2MessengerRelayMessageToSystemContract() (gas: 36137)
L2CrossDomainMessenger_Test:test_L2MessengerRelayShouldRevertIfPaused() (gas: 41664) L2CrossDomainMessenger_Test:test_L2MessengerRelayShouldRevertIfPaused() (gas: 41600)
L2CrossDomainMessenger_Test:test_L2MessengerSendMessage() (gas: 119627) L2CrossDomainMessenger_Test:test_L2MessengerSendMessage() (gas: 120536)
L2CrossDomainMessenger_Test:test_L2MessengerTwiceSendMessage() (gas: 133248) L2CrossDomainMessenger_Test:test_L2MessengerTwiceSendMessage() (gas: 133720)
L2CrossDomainMessenger_Test:test_L2MessengerXDomainSenderReverts() (gas: 10599) L2CrossDomainMessenger_Test:test_L2MessengerXDomainSenderReverts() (gas: 10576)
L2CrossDomainMessenger_Test:test_L2MessengerxDomainMessageSenderResets() (gas: 54844) L2CrossDomainMessenger_Test:test_L2MessengerxDomainMessageSenderResets() (gas: 54776)
L2OutputOracleTest:testCannot_AppendWithUnmatchedBlockhash() (gas: 26811) L2OutputOracleTest:testCannot_AppendWithUnmatchedBlockhash() (gas: 26811)
L2OutputOracleTest:testCannot_appendEmptyOutput() (gas: 24086) L2OutputOracleTest:testCannot_appendEmptyOutput() (gas: 24086)
L2OutputOracleTest:testCannot_appendFutureTimetamp() (gas: 26075) L2OutputOracleTest:testCannot_appendFutureTimetamp() (gas: 26075)
...@@ -93,14 +93,14 @@ L2OutputOracleUpgradeable_Test:test_cannotInitImpl() (gas: 19451) ...@@ -93,14 +93,14 @@ L2OutputOracleUpgradeable_Test:test_cannotInitImpl() (gas: 19451)
L2OutputOracleUpgradeable_Test:test_cannotInitProxy() (gas: 24516) L2OutputOracleUpgradeable_Test:test_cannotInitProxy() (gas: 24516)
L2OutputOracleUpgradeable_Test:test_initValuesOnProxy() (gas: 38865) L2OutputOracleUpgradeable_Test:test_initValuesOnProxy() (gas: 38865)
L2OutputOracleUpgradeable_Test:test_upgrading() (gas: 230843) L2OutputOracleUpgradeable_Test:test_upgrading() (gas: 230843)
L2StandardBridge_Test:test_ERC20BridgeFailed_whenLocalTokenIsBridge() (gas: 133200) L2StandardBridge_Test:test_ERC20BridgeFailed_whenLocalTokenIsBridge() (gas: 133459)
L2StandardBridge_Test:test_cannotWithdrawEthWithoutSendingIt() (gas: 21656) L2StandardBridge_Test:test_cannotWithdrawEthWithoutSendingIt() (gas: 21656)
L2StandardBridge_Test:test_finalizeDeposit() (gas: 93203) L2StandardBridge_Test:test_finalizeDeposit() (gas: 93203)
L2StandardBridge_Test:test_finalizeDeposit_failsToCompleteOutboundTransfer() (gas: 140210) L2StandardBridge_Test:test_finalizeDeposit_failsToCompleteOutboundTransfer() (gas: 140469)
L2StandardBridge_Test:test_initialize() (gas: 14802) L2StandardBridge_Test:test_initialize() (gas: 14802)
L2StandardBridge_Test:test_receive() (gas: 136605) L2StandardBridge_Test:test_receive() (gas: 136864)
L2StandardBridge_Test:test_withdraw() (gas: 352813) L2StandardBridge_Test:test_withdraw() (gas: 353020)
L2StandardBridge_Test:test_withdrawTo() (gas: 353498) L2StandardBridge_Test:test_withdrawTo() (gas: 353705)
L2StandardBridge_Test:test_withdraw_onlyEOA() (gas: 252006) L2StandardBridge_Test:test_withdraw_onlyEOA() (gas: 252006)
L2ToL1MessagePasserTest:test_burn() (gas: 112037) L2ToL1MessagePasserTest:test_burn() (gas: 112037)
L2ToL1MessagePasserTest:test_initiateWithdrawal_fromContract() (gas: 67892) L2ToL1MessagePasserTest:test_initiateWithdrawal_fromContract() (gas: 67892)
...@@ -270,4 +270,4 @@ SequencerFeeVault_Test:test_constructor() (gas: 7656) ...@@ -270,4 +270,4 @@ SequencerFeeVault_Test:test_constructor() (gas: 7656)
SequencerFeeVault_Test:test_minWithdrawalAmount() (gas: 5407) SequencerFeeVault_Test:test_minWithdrawalAmount() (gas: 5407)
SequencerFeeVault_Test:test_receive() (gas: 17338) SequencerFeeVault_Test:test_receive() (gas: 17338)
SequencerFeeVault_Test:test_revertWithdraw() (gas: 9332) SequencerFeeVault_Test:test_revertWithdraw() (gas: 9332)
SequencerFeeVault_Test:test_withdraw() (gas: 147323) SequencerFeeVault_Test:test_withdraw() (gas: 147582)
...@@ -71,7 +71,7 @@ contract L1CrossDomainMessenger_Test is Messenger_Initializer { ...@@ -71,7 +71,7 @@ contract L1CrossDomainMessenger_Test is Messenger_Initializer {
OptimismPortal.depositTransaction.selector, OptimismPortal.depositTransaction.selector,
PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER, PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,
0, 0,
100 + L1Messenger.baseGas(hex"ff"), L1Messenger.baseGas(hex"ff", 100),
false, false,
Encoding.encodeCrossDomainMessage( Encoding.encodeCrossDomainMessage(
L1Messenger.messageNonce(), L1Messenger.messageNonce(),
...@@ -91,7 +91,7 @@ contract L1CrossDomainMessenger_Test is Messenger_Initializer { ...@@ -91,7 +91,7 @@ contract L1CrossDomainMessenger_Test is Messenger_Initializer {
PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER, PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER,
0, 0,
0, 0,
100 + L1Messenger.baseGas(hex"ff"), L1Messenger.baseGas(hex"ff", 100),
false, false,
Encoding.encodeCrossDomainMessage( Encoding.encodeCrossDomainMessage(
L1Messenger.messageNonce(), L1Messenger.messageNonce(),
......
...@@ -44,7 +44,7 @@ contract L2CrossDomainMessenger_Test is Messenger_Initializer { ...@@ -44,7 +44,7 @@ contract L2CrossDomainMessenger_Test is Messenger_Initializer {
abi.encodeWithSelector( abi.encodeWithSelector(
L2ToL1MessagePasser.initiateWithdrawal.selector, L2ToL1MessagePasser.initiateWithdrawal.selector,
address(L1Messenger), address(L1Messenger),
100 + L2Messenger.baseGas(hex"ff"), L2Messenger.baseGas(hex"ff", 100),
Encoding.encodeCrossDomainMessage( Encoding.encodeCrossDomainMessage(
L2Messenger.messageNonce(), L2Messenger.messageNonce(),
alice, alice,
...@@ -63,7 +63,7 @@ contract L2CrossDomainMessenger_Test is Messenger_Initializer { ...@@ -63,7 +63,7 @@ contract L2CrossDomainMessenger_Test is Messenger_Initializer {
address(L2Messenger), address(L2Messenger),
address(L1Messenger), address(L1Messenger),
0, 0,
100 + L2Messenger.baseGas(hex"ff"), L2Messenger.baseGas(hex"ff", 100),
Encoding.encodeCrossDomainMessage( Encoding.encodeCrossDomainMessage(
L2Messenger.messageNonce(), L2Messenger.messageNonce(),
alice, alice,
......
...@@ -64,14 +64,24 @@ abstract contract CrossDomainMessenger is ...@@ -64,14 +64,24 @@ abstract contract CrossDomainMessenger is
uint16 public constant MESSAGE_VERSION = 1; uint16 public constant MESSAGE_VERSION = 1;
/** /**
* @notice Dynamic overhead applied to the base gas for a message. * @notice Constant overhead added to the base gas for a message.
*/ */
uint32 public constant MIN_GAS_DYNAMIC_OVERHEAD = 1; uint32 public constant MIN_GAS_CONSTANT_OVERHEAD = 200_000;
/** /**
* @notice Constant overhead added to the base gas for a message. * @notice Numerator for dynamic overhead added to the base gas for a message.
*/
uint32 public constant MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR = 1016;
/**
* @notice Denominator for dynamic overhead added to the base gas for a message.
*/
uint32 public constant MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR = 1000;
/**
* @notice Extra gas added to base gas for each byte of calldata in a message.
*/ */
uint32 public constant MIN_GAS_CONSTANT_OVERHEAD = 100_000; uint32 public constant MIN_GAS_CALLDATA_OVERHEAD = 16;
/** /**
* @notice Minimum amount of gas required to relay a message. * @notice Minimum amount of gas required to relay a message.
...@@ -181,12 +191,20 @@ abstract contract CrossDomainMessenger is ...@@ -181,12 +191,20 @@ abstract contract CrossDomainMessenger is
* will not run out of gas is important because this ensures that a message can always * will not run out of gas is important because this ensures that a message can always
* be replayed on the other chain if it fails to execute completely. * be replayed on the other chain if it fails to execute completely.
* *
* @param _message Message to compute the amount of required gas for. * @param _message Message to compute the amount of required gas for.
* @param _minGasLimit Minimum desired gas limit when message goes to target.
* *
* @return Amount of gas required to guarantee message receipt. * @return Amount of gas required to guarantee message receipt.
*/ */
function baseGas(bytes memory _message) public pure returns (uint32) { function baseGas(bytes memory _message, uint32 _minGasLimit) public pure returns (uint32) {
return (uint32(_message.length) * MIN_GAS_DYNAMIC_OVERHEAD) + MIN_GAS_CONSTANT_OVERHEAD; return
// Dynamic overhead
((_minGasLimit * MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR) /
MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR) +
// Calldata overhead
(uint32(_message.length) * MIN_GAS_CALLDATA_OVERHEAD) +
// Constant overhead
MIN_GAS_CONSTANT_OVERHEAD;
} }
/** /**
...@@ -207,7 +225,7 @@ abstract contract CrossDomainMessenger is ...@@ -207,7 +225,7 @@ abstract contract CrossDomainMessenger is
// the minimum gas limit specified by the user. // the minimum gas limit specified by the user.
_sendMessage( _sendMessage(
otherMessenger, otherMessenger,
_minGasLimit + baseGas(_message), baseGas(_message, _minGasLimit),
msg.value, msg.value,
abi.encodeWithSelector( abi.encodeWithSelector(
this.relayMessage.selector, this.relayMessage.selector,
......
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