diff --git a/lcov.info b/lcov.info index 3eb0293..7254969 100644 --- a/lcov.info +++ b/lcov.info @@ -139,8 +139,8 @@ end_of_record TN: SF:src/MultiBridgeMessageSender.sol FN:153,MultiBridgeMessageSender.remoteCall -FNDA:33,MultiBridgeMessageSender.remoteCall -DA:164,28 +FNDA:34,MultiBridgeMessageSender.remoteCall +DA:164,29 FN:181,MultiBridgeMessageSender.addSenderAdapters FNDA:9,MultiBridgeMessageSender.addSenderAdapters DA:182,8 @@ -188,86 +188,86 @@ DA:241,7 DA:243,4 DA:244,4 FN:251,MultiBridgeMessageSender._remoteCall -FNDA:28,MultiBridgeMessageSender._remoteCall -DA:252,28 -DA:262,14 -DA:264,14 -DA:273,14 -DA:274,14 -DA:275,14 -DA:277,14 +FNDA:29,MultiBridgeMessageSender._remoteCall +DA:252,29 +DA:262,15 +DA:264,15 +DA:273,15 +DA:274,15 +DA:275,15 +DA:277,15 BRDA:277,3,0,1 -BRDA:277,3,1,13 +BRDA:277,3,1,14 DA:278,1 -DA:281,13 -DA:294,13 -BRDA:294,4,0,12 +DA:281,14 +DA:294,14 +BRDA:294,4,0,13 BRDA:294,4,1,13 -DA:295,12 +DA:295,13 FN:299,MultiBridgeMessageSender._checkAndProcessArgs -FNDA:28,MultiBridgeMessageSender._checkAndProcessArgs -DA:307,28 +FNDA:29,MultiBridgeMessageSender._checkAndProcessArgs +DA:307,29 BRDA:307,5,0,1 -BRDA:307,5,1,27 +BRDA:307,5,1,28 DA:308,1 -DA:311,27 +DA:311,28 BRDA:311,6,0,1 -BRDA:311,6,1,26 +BRDA:311,6,1,27 DA:312,1 -DA:315,26 +DA:315,27 BRDA:315,7,0,1 -BRDA:315,7,1,25 +BRDA:315,7,1,26 DA:316,1 -DA:319,25 +DA:319,26 BRDA:319,8,0,4 -BRDA:319,8,1,21 +BRDA:319,8,1,22 DA:320,4 -DA:323,21 -DA:325,21 +DA:323,22 +DA:325,22 BRDA:325,9,0,1 -BRDA:325,9,1,20 +BRDA:325,9,1,21 DA:326,1 -DA:329,20 -DA:331,18 +DA:329,21 +DA:331,19 BRDA:331,10,0,1 -BRDA:331,10,1,17 +BRDA:331,10,1,18 DA:332,1 -DA:335,17 +DA:335,18 BRDA:335,11,0,1 -BRDA:335,11,1,16 +BRDA:335,11,1,17 DA:336,1 -DA:339,16 +DA:339,17 BRDA:339,12,0,1 -BRDA:339,12,1,15 +BRDA:339,12,1,16 DA:340,1 -DA:342,15 -DA:343,15 -DA:344,30 -DA:346,30 -DA:349,15 +DA:342,16 +DA:343,16 +DA:344,32 +DA:346,32 +DA:349,16 BRDA:349,13,0,1 -BRDA:349,13,1,14 +BRDA:349,13,1,15 DA:350,1 FN:354,MultiBridgeMessageSender._dispatchMessages -FNDA:14,MultiBridgeMessageSender._dispatchMessages -DA:361,14 -DA:362,14 -DA:363,14 -DA:365,14 -DA:367,28 -DA:378,28 -DA:381,14 +FNDA:15,MultiBridgeMessageSender._dispatchMessages +DA:361,15 +DA:362,15 +DA:363,15 +DA:365,15 +DA:367,30 +DA:378,30 +DA:381,15 FN:384,MultiBridgeMessageSender._filterAdapters -FNDA:27,MultiBridgeMessageSender._filterAdapters -DA:389,27 +FNDA:28,MultiBridgeMessageSender._filterAdapters +DA:389,28 BRDA:389,14,0,1 -BRDA:389,14,1,26 +BRDA:389,14,1,27 DA:390,1 -DA:393,26 -DA:394,26 -DA:395,26 -DA:396,26 -DA:397,38 +DA:393,27 +DA:394,27 +DA:395,27 +DA:396,27 +DA:397,39 DA:398,15 DA:399,15 DA:400,15 @@ -285,15 +285,15 @@ BRDA:412,17,0,1 BRDA:412,17,1,2 DA:414,1 DA:419,12 -DA:422,57 -DA:423,35 +DA:422,60 +DA:423,37 BRDA:423,18,0,1 -BRDA:423,18,1,34 +BRDA:423,18,1,36 DA:424,1 -DA:426,34 -DA:428,34 -DA:429,34 -DA:432,22 +DA:426,36 +DA:428,36 +DA:429,36 +DA:432,23 FN:437,MultiBridgeMessageSender._checkAdaptersOrder FNDA:15,MultiBridgeMessageSender._checkAdaptersOrder DA:438,15 @@ -318,17 +318,17 @@ FN:458,MultiBridgeMessageSender._logSenderAdapterUpdates FNDA:8,MultiBridgeMessageSender._logSenderAdapterUpdates DA:459,8 FN:465,MultiBridgeMessageSender._safeTransferETH -FNDA:12,MultiBridgeMessageSender._safeTransferETH -DA:466,12 -DA:467,12 -BRDA:467,22,0,- +FNDA:13,MultiBridgeMessageSender._safeTransferETH +DA:466,13 +DA:467,13 +BRDA:467,22,0,1 BRDA:467,22,1,12 FNF:10 FNH:10 LF:119 LH:119 BRF:46 -BRH:44 +BRH:45 end_of_record TN: SF:src/adapters/BaseReceiverAdapter.sol @@ -363,9 +363,9 @@ DA:66,2 DA:67,2 DA:70,2 FN:82,BaseSenderAdapter._getNewMessageId -FNDA:29,BaseSenderAdapter._getNewMessageId -DA:83,29 -DA:84,29 +FNDA:31,BaseSenderAdapter._getNewMessageId +DA:83,31 +DA:84,31 FNF:2 FNH:2 LF:10 @@ -417,20 +417,20 @@ end_of_record TN: SF:src/adapters/axelar/AxelarSenderAdapter.sol FN:48,AxelarSenderAdapter.dispatchMessage -FNDA:17,AxelarSenderAdapter.dispatchMessage -DA:55,16 -DA:57,16 +FNDA:18,AxelarSenderAdapter.dispatchMessage +DA:55,17 +DA:57,17 BRDA:57,0,0,1 -BRDA:57,0,1,15 +BRDA:57,0,1,16 DA:58,1 -DA:61,15 -DA:63,15 +DA:61,16 +DA:63,16 BRDA:63,1,0,1 -BRDA:63,1,1,14 +BRDA:63,1,1,15 DA:64,1 -DA:67,14 -DA:68,14 -DA:70,13 +DA:67,15 +DA:68,15 +DA:70,14 FN:76,AxelarSenderAdapter.setChainIdMap FNDA:5,AxelarSenderAdapter.setChainIdMap DA:77,4 @@ -448,12 +448,12 @@ DA:89,2 DA:91,2 DA:94,2 FN:109,AxelarSenderAdapter._callContract -FNDA:14,AxelarSenderAdapter._callContract -DA:116,14 -DA:117,14 -DA:118,14 -DA:120,14 -DA:124,13 +FNDA:15,AxelarSenderAdapter._callContract +DA:116,15 +DA:117,15 +DA:118,15 +DA:120,15 +DA:124,14 FNF:3 FNH:3 LF:24 @@ -464,17 +464,17 @@ end_of_record TN: SF:src/adapters/axelar/libraries/StringAddressConversion.sol FN:7,StringAddressConversion.toString -FNDA:15,StringAddressConversion.toString -DA:8,15 -DA:9,15 -DA:10,15 -DA:11,15 -DA:13,15 -DA:14,15 -DA:16,15 -DA:17,300 -DA:18,300 -DA:20,15 +FNDA:16,StringAddressConversion.toString +DA:8,16 +DA:9,16 +DA:10,16 +DA:11,16 +DA:13,16 +DA:14,16 +DA:16,16 +DA:17,320 +DA:18,320 +DA:20,16 FN:23,StringAddressConversion.toAddress FNDA:8,StringAddressConversion.toAddress DA:24,8 @@ -544,21 +544,21 @@ end_of_record TN: SF:src/adapters/wormhole/WormholeSenderAdapter.sol FN:41,WormholeSenderAdapter.dispatchMessage -FNDA:18,WormholeSenderAdapter.dispatchMessage -DA:48,17 -DA:50,17 +FNDA:19,WormholeSenderAdapter.dispatchMessage +DA:48,18 +DA:50,18 BRDA:50,0,0,1 -BRDA:50,0,1,16 +BRDA:50,0,1,17 DA:51,1 -DA:54,16 -DA:56,16 +DA:54,17 +DA:56,17 BRDA:56,1,0,1 -BRDA:56,1,1,15 +BRDA:56,1,1,16 DA:57,1 -DA:60,15 -DA:61,15 -DA:63,15 -DA:72,14 +DA:60,16 +DA:61,16 +DA:63,16 +DA:72,15 FN:78,WormholeSenderAdapter.setChainIdMap FNDA:5,WormholeSenderAdapter.setChainIdMap DA:79,4 @@ -768,8 +768,8 @@ end_of_record TN: SF:src/libraries/Message.sol FN:41,MessageLibrary.computeMsgId -FNDA:15,MessageLibrary.computeMsgId -DA:42,15 +FNDA:16,MessageLibrary.computeMsgId +DA:42,16 FN:55,MessageLibrary.extractExecutionParams FNDA:2,MessageLibrary.extractExecutionParams DA:56,2 diff --git a/test/unit-tests/MultiBridgeMessageSender.t.sol b/test/unit-tests/MultiBridgeMessageSender.t.sol index a61f997..f5c9887 100644 --- a/test/unit-tests/MultiBridgeMessageSender.t.sol +++ b/test/unit-tests/MultiBridgeMessageSender.t.sol @@ -16,6 +16,12 @@ import "src/libraries/Error.sol"; import "src/libraries/Message.sol"; import {MultiBridgeMessageSender} from "src/MultiBridgeMessageSender.sol"; +contract EthReceiverRevert { + receive() external payable { + revert(); + } +} + contract MultiBridgeMessageSenderTest is Setup { using MessageLibrary for MessageLibrary.Message; @@ -39,6 +45,8 @@ contract MultiBridgeMessageSenderTest is Setup { address wormholeAdapterAddr; address axelarAdapterAddr; + address revertingReceiver; + /// @dev initializes the setup function setUp() public override { super.setUp(); @@ -49,6 +57,8 @@ contract MultiBridgeMessageSenderTest is Setup { senderGAC = MessageSenderGAC(contractAddress[SRC_CHAIN_ID]["GAC"]); wormholeAdapterAddr = contractAddress[SRC_CHAIN_ID]["WORMHOLE_SENDER_ADAPTER"]; axelarAdapterAddr = contractAddress[SRC_CHAIN_ID]["AXELAR_SENDER_ADAPTER"]; + + revertingReceiver = address(new EthReceiverRevert()); } /// @dev constructor @@ -110,6 +120,36 @@ contract MultiBridgeMessageSenderTest is Setup { assertEq(sender.nonce(), 1); } + /// @dev perform remote call with invalid refund receiver + function test_remote_call_reverting_refund_receiver() public { + vm.startPrank(caller); + + // Wormhole requires exact fees to be passed in + (uint256 wormholeFee,) = IWormholeRelayer(POLYGON_RELAYER).quoteEVMDeliveryPrice( + _wormholeChainId(DST_CHAIN_ID), 0, senderGAC.msgDeliveryGasLimit() + ); + (, uint256[] memory fees) = + _sortTwoAdaptersWithFees(axelarAdapterAddr, wormholeAdapterAddr, 0.01 ether, wormholeFee); + bool[] memory adapterSuccess = new bool[](2); + adapterSuccess[0] = true; + adapterSuccess[1] = true; + + uint256 expiration = EXPIRATION_CONSTANT; + + vm.expectRevert("safeTransferETH: ETH transfer failed"); + sender.remoteCall{value: fees[0] + fees[1] + 1 ether}( + DST_CHAIN_ID, + address(42), + bytes("42"), + 0, + expiration, + revertingReceiver, + fees, + DEFAULT_SUCCESS_THRESHOLD, + new address[](0) + ); + } + /// @dev perform remote call, checking for refund function test_remote_call_refund() public { vm.startPrank(caller);