From 8cb9a64bfeaf4af0116bc130be9d3b1a01afe715 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Tue, 19 Dec 2023 20:19:41 +0800 Subject: [PATCH] fix(protocol): fix Bridge bug in retrying message (#15403) --- packages/protocol/contracts/bridge/Bridge.sol | 12 +++++++----- packages/protocol/test/bridge/Bridge.t.sol | 9 ++++++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/protocol/contracts/bridge/Bridge.sol b/packages/protocol/contracts/bridge/Bridge.sol index 41e5067166..571a7b8656 100644 --- a/packages/protocol/contracts/bridge/Bridge.sol +++ b/packages/protocol/contracts/bridge/Bridge.sol @@ -270,15 +270,17 @@ contract Bridge is EssentialContract, IBridge { revert B_NON_RETRIABLE(); } - ISignalService signalService = ISignalService(resolve("signal_service", false)); - // Attempt to invoke the messageCall. if (_invokeMessageCall(message, msgHash, gasleft())) { // Update the message status to "DONE" on successful invocation. - _updateMessageStatus(signalService, msgHash, Status.DONE); - } else { + _updateMessageStatus( + ISignalService(resolve("signal_service", false)), msgHash, Status.DONE + ); + } else if (isLastAttempt) { // Update the message status to "FAILED" - _updateMessageStatus(signalService, msgHash, Status.FAILED); + _updateMessageStatus( + ISignalService(resolve("signal_service", false)), msgHash, Status.FAILED + ); } } diff --git a/packages/protocol/test/bridge/Bridge.t.sol b/packages/protocol/test/bridge/Bridge.t.sol index 1f57b0ef7c..7ea132752b 100644 --- a/packages/protocol/test/bridge/Bridge.t.sol +++ b/packages/protocol/test/bridge/Bridge.t.sol @@ -420,12 +420,15 @@ contract BridgeTest is TaikoTest { assertEq(status == Bridge.Status.RETRIABLE, true); vm.stopPrank(); - vm.prank(message.owner); - - destChainBridge.retryMessage(message, true); + vm.prank(message.owner); + destChainBridge.retryMessage(message, false); Bridge.Status postRetryStatus = destChainBridge.messageStatus(msgHash); + assertEq(postRetryStatus == Bridge.Status.RETRIABLE, true); + vm.prank(message.owner); + destChainBridge.retryMessage(message, true); + postRetryStatus = destChainBridge.messageStatus(msgHash); assertEq(postRetryStatus == Bridge.Status.FAILED, true); }