From b55a6461f7bc665254825b7627cf0e2fb91c716f Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Wed, 8 Feb 2023 08:58:20 +0800 Subject: [PATCH] feat(protocol): check message.to on source chain as well (#13107) --- packages/protocol/contracts/bridge/Bridge.sol | 10 +++++++--- .../contracts/bridge/libs/LibBridgeSend.sol | 14 ++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/protocol/contracts/bridge/Bridge.sol b/packages/protocol/contracts/bridge/Bridge.sol index 72670a77fb..d9ac52cccf 100644 --- a/packages/protocol/contracts/bridge/Bridge.sol +++ b/packages/protocol/contracts/bridge/Bridge.sol @@ -151,9 +151,13 @@ contract Bridge is EssentialContract, IBridge { return state.ctx; } - function isDestChainEnabled(uint256 _chainId) public view returns (bool) { - return - LibBridgeSend.isDestChainEnabled(AddressResolver(this), _chainId); + function isDestChainEnabled( + uint256 _chainId + ) public view returns (bool enabled) { + (enabled, ) = LibBridgeSend.isDestChainEnabled( + AddressResolver(this), + _chainId + ); } function hashMessage( diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol b/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol index 93bd6a6cd9..97e9b2fc31 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol @@ -38,11 +38,16 @@ library LibBridgeSend { IBridge.Message memory message ) internal returns (bytes32 msgHash) { require(message.owner != address(0), "B:owner"); + + (bool destChainEnabled, address destChain) = isDestChainEnabled( + resolver, + message.destChainId + ); require( - message.destChainId != block.chainid && - isDestChainEnabled(resolver, message.destChainId), + destChainEnabled && message.destChainId != block.chainid, "B:destChainId" ); + require(message.to != address(0) && message.to != destChain, "B:to"); uint256 expectedAmount = message.depositValue + message.callValue + @@ -72,8 +77,9 @@ library LibBridgeSend { function isDestChainEnabled( AddressResolver resolver, uint256 chainId - ) internal view returns (bool) { - return resolver.resolve(chainId, "bridge", true) != address(0); + ) internal view returns (bool enabled, address destBridge) { + destBridge = resolver.resolve(chainId, "bridge", true); + enabled = destBridge != address(0); } function isMessageSent(