From 7222997f223e2e69d1db16de743899baf48f35b2 Mon Sep 17 00:00:00 2001 From: Alessandro Manfredi Date: Wed, 19 Jun 2024 14:43:54 +0200 Subject: [PATCH] feat(arbitrary_message): adds resendDataWithHashi and rn _maybeRelayDataWithHashi into _maybeSendDataWithHashi --- .../upgradeable_contracts/BasicBridge.sol | 31 ++++++++++++------- .../arbitrary_message/BasicForeignAMB.sol | 1 + .../arbitrary_message/BasicHomeAMB.sol | 1 + .../arbitrary_message/MessageDelivery.sol | 2 +- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/contracts/upgradeable_contracts/BasicBridge.sol b/contracts/upgradeable_contracts/BasicBridge.sol index ed0d10e4..bdfa555b 100644 --- a/contracts/upgradeable_contracts/BasicBridge.sol +++ b/contracts/upgradeable_contracts/BasicBridge.sol @@ -3,7 +3,6 @@ pragma solidity 0.4.24; import "./Upgradeable.sol"; import "./InitializableBridge.sol"; import "openzeppelin-solidity/contracts/AddressUtils.sol"; -import "../libraries/ArbitraryMessage.sol"; import "./Validatable.sol"; import "./Ownable.sol"; import "./Claimable.sol"; @@ -81,20 +80,30 @@ contract BasicBridge is boolStorage[keccak256(abi.encodePacked("messagesApprovedByHashi", msgId))] = status; } - function _maybeRelayDataWithHashi(bytes data) internal { + function resendDataWithHashi(bytes data) external { + require(boolStorage[keccak256(data)]); + _dispatchMessageWithHashi(data); + } + + function _maybeSendDataWithHashi(bytes data) internal { if (HASHI_IS_ENABLED) { - IHashiManager manager = hashiManager(); - IYaho(manager.yaho()).dispatchMessage( - manager.targetChainId(), - manager.threshold(), - manager.targetAddress(), - data, - manager.reporters(), - manager.adapters() - ); + boolStorage[keccak256(data)] = true; + _dispatchMessageWithHashi(data); } } + function _dispatchMessageWithHashi(bytes data) internal { + IHashiManager manager = hashiManager(); + IYaho(manager.yaho()).dispatchMessage( + manager.targetChainId(), + manager.threshold(), + manager.targetAddress(), + data, + manager.reporters(), + manager.adapters() + ); + } + function _validateHashiMessage(uint256 chainId, uint256 threshold, address sender, address[] adapters) internal { IHashiManager manager = hashiManager(); require( diff --git a/contracts/upgradeable_contracts/arbitrary_message/BasicForeignAMB.sol b/contracts/upgradeable_contracts/arbitrary_message/BasicForeignAMB.sol index 411eeb55..80045e20 100644 --- a/contracts/upgradeable_contracts/arbitrary_message/BasicForeignAMB.sol +++ b/contracts/upgradeable_contracts/arbitrary_message/BasicForeignAMB.sol @@ -122,6 +122,7 @@ contract BasicForeignAMB is BasicAMB, MessageRelay, MessageDelivery { ) external returns (bytes) { _validateHashiMessage(chainId, threshold, sender, adapters); (bytes32 msgId, ) = ArbitraryMessage.unpackData(data); + require(!isApprovedByHashi(msgId)); _setHashiApprovalForMessage(msgId, true); } diff --git a/contracts/upgradeable_contracts/arbitrary_message/BasicHomeAMB.sol b/contracts/upgradeable_contracts/arbitrary_message/BasicHomeAMB.sol index 2d660a5d..3a1f3221 100644 --- a/contracts/upgradeable_contracts/arbitrary_message/BasicHomeAMB.sol +++ b/contracts/upgradeable_contracts/arbitrary_message/BasicHomeAMB.sol @@ -54,6 +54,7 @@ contract BasicHomeAMB is BasicAMB, MessageDelivery { ) external returns (bytes) { _validateHashiMessage(chainId, threshold, sender, adapters); (bytes32 msgId, ) = ArbitraryMessage.unpackData(data); + require(!isApprovedByHashi(msgId)); _setHashiApprovalForMessage(msgId, true); } diff --git a/contracts/upgradeable_contracts/arbitrary_message/MessageDelivery.sol b/contracts/upgradeable_contracts/arbitrary_message/MessageDelivery.sol index 32bde478..ba1a1b0c 100644 --- a/contracts/upgradeable_contracts/arbitrary_message/MessageDelivery.sol +++ b/contracts/upgradeable_contracts/arbitrary_message/MessageDelivery.sol @@ -63,7 +63,7 @@ contract MessageDelivery is BasicAMB, MessageProcessor { bytes memory eventData = abi.encodePacked(header, _data); emitEventOnMessageRequest(_messageId, eventData); - _maybeRelayDataWithHashi(eventData); + _maybeSendDataWithHashi(eventData); return _messageId; }