Skip to content

Commit 104ea46

Browse files
authored
Msg improvements (#132)
1 parent 2917a1b commit 104ea46

19 files changed

+684
-453
lines changed

contracts/interfaces/IBridge.sol

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ interface IBridge {
2323

2424
function withdraws(bytes32 withdrawId) external view returns (bool);
2525

26+
function withdraw(
27+
bytes calldata _wdmsg,
28+
bytes[] calldata _sigs,
29+
address[] calldata _signers,
30+
uint256[] calldata _powers
31+
) external;
32+
2633
/**
2734
* @notice Verifies that a message is signed by a quorum among the signers.
2835
* @param _msg signed message

contracts/message/apps/BatchTransfer.sol

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ contract BatchTransfer is MessageSenderApp, MessageReceiverApp {
5252
uint256 _amount,
5353
uint64 _dstChainId,
5454
uint32 _maxSlippage,
55-
MessageSenderLib.BridgeType _bridgeType,
55+
MsgDataTypes.BridgeType _bridgeType,
5656
address[] calldata _accounts,
5757
uint256[] calldata _amounts
5858
) external payable onlyEOA {
@@ -90,11 +90,12 @@ contract BatchTransfer is MessageSenderApp, MessageReceiverApp {
9090
function executeMessageWithTransferRefund(
9191
address _token,
9292
uint256 _amount,
93-
bytes calldata _message
94-
) external payable override onlyMessageBus returns (bool) {
93+
bytes calldata _message,
94+
address // executor
95+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
9596
TransferRequest memory transfer = abi.decode((_message), (TransferRequest));
9697
IERC20(_token).safeTransfer(transfer.sender, _amount);
97-
return true;
98+
return ExecuctionStatus.Success;
9899
}
99100

100101
// ============== functions on destination chain ==============
@@ -103,12 +104,13 @@ contract BatchTransfer is MessageSenderApp, MessageReceiverApp {
103104
function executeMessage(
104105
address _sender,
105106
uint64 _srcChainId,
106-
bytes memory _message
107-
) external payable override onlyMessageBus returns (bool) {
107+
bytes memory _message,
108+
address // executor
109+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
108110
TransferReceipt memory receipt = abi.decode((_message), (TransferReceipt));
109111
require(status[receipt.nonce].h == keccak256(abi.encodePacked(_sender, _srcChainId)), "invalid message");
110112
status[receipt.nonce].status = receipt.status;
111-
return true;
113+
return ExecuctionStatus.Success;
112114
}
113115

114116
// handler function required by MsgReceiverApp
@@ -117,8 +119,9 @@ contract BatchTransfer is MessageSenderApp, MessageReceiverApp {
117119
address _token,
118120
uint256 _amount,
119121
uint64 _srcChainId,
120-
bytes memory _message
121-
) external payable override onlyMessageBus returns (bool) {
122+
bytes memory _message,
123+
address // executor
124+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
122125
TransferRequest memory transfer = abi.decode((_message), (TransferRequest));
123126
uint256 totalAmt;
124127
for (uint256 i = 0; i < transfer.accounts.length; i++) {
@@ -133,7 +136,7 @@ contract BatchTransfer is MessageSenderApp, MessageReceiverApp {
133136
bytes memory message = abi.encode(TransferReceipt({nonce: transfer.nonce, status: TransferStatus.Success}));
134137
// MsgSenderApp util function
135138
sendMessage(_sender, _srcChainId, message, msg.value);
136-
return true;
139+
return ExecuctionStatus.Success;
137140
}
138141

139142
// handler function required by MsgReceiverApp
@@ -143,12 +146,13 @@ contract BatchTransfer is MessageSenderApp, MessageReceiverApp {
143146
address _token,
144147
uint256 _amount,
145148
uint64 _srcChainId,
146-
bytes memory _message
147-
) external payable override onlyMessageBus returns (bool) {
149+
bytes memory _message,
150+
address // executor
151+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
148152
TransferRequest memory transfer = abi.decode((_message), (TransferRequest));
149153
IERC20(_token).safeTransfer(transfer.sender, _amount);
150154
bytes memory message = abi.encode(TransferReceipt({nonce: transfer.nonce, status: TransferStatus.Fail}));
151155
sendMessage(_sender, _srcChainId, message, msg.value);
152-
return true;
156+
return ExecuctionStatus.Success;
153157
}
154158
}

contracts/message/apps/MsgTest.sol

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// SPDX-License-Identifier: GPL-3.0-only
2+
3+
pragma solidity >=0.8.9;
4+
5+
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
6+
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7+
import "../framework/MessageSenderApp.sol";
8+
import "../framework/MessageReceiverApp.sol";
9+
10+
/** @title Application to test message with transfer refund flow */
11+
contract MsgTest is MessageSenderApp, MessageReceiverApp {
12+
using SafeERC20 for IERC20;
13+
uint64 nonce;
14+
15+
event MessageReceivedWithTransfer(
16+
address token,
17+
uint256 amount,
18+
address sender,
19+
uint64 srcChainId,
20+
address receiver,
21+
bytes message
22+
);
23+
event Refunded(address receiver, address token, uint256 amount, bytes message);
24+
event MessageReceived(address sender, uint64 srcChainId, uint256 nonce, bytes message);
25+
26+
constructor(address _messageBus) {
27+
messageBus = _messageBus;
28+
}
29+
30+
function sendMessageWithTransfer(
31+
address _receiver,
32+
address _token,
33+
uint256 _amount,
34+
uint64 _dstChainId,
35+
uint32 _maxSlippage,
36+
bytes calldata _message,
37+
MsgDataTypes.BridgeType _bridgeType
38+
) external payable {
39+
IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
40+
bytes memory message = abi.encode(msg.sender, _message);
41+
sendMessageWithTransfer(
42+
_receiver,
43+
_token,
44+
_amount,
45+
_dstChainId,
46+
nonce,
47+
_maxSlippage,
48+
message,
49+
_bridgeType,
50+
msg.value
51+
);
52+
nonce++;
53+
}
54+
55+
function executeMessageWithTransfer(
56+
address _sender,
57+
address _token,
58+
uint256 _amount,
59+
uint64 _srcChainId,
60+
bytes memory _message,
61+
address // executor
62+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
63+
(address receiver, bytes memory message) = abi.decode((_message), (address, bytes));
64+
IERC20(_token).safeTransfer(receiver, _amount);
65+
emit MessageReceivedWithTransfer(_token, _amount, _sender, _srcChainId, receiver, message);
66+
return ExecuctionStatus.Success;
67+
}
68+
69+
function executeMessageWithTransferRefund(
70+
address _token,
71+
uint256 _amount,
72+
bytes calldata _message,
73+
address // executor
74+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
75+
(address receiver, bytes memory message) = abi.decode((_message), (address, bytes));
76+
IERC20(_token).safeTransfer(receiver, _amount);
77+
emit Refunded(receiver, _token, _amount, message);
78+
return ExecuctionStatus.Success;
79+
}
80+
81+
function sendMessage(
82+
address _receiver,
83+
uint64 _dstChainId,
84+
bytes calldata _message
85+
) external payable {
86+
bytes memory message = abi.encode(nonce, _message);
87+
nonce++;
88+
sendMessage(_receiver, _dstChainId, message, msg.value);
89+
}
90+
91+
function executeMessage(
92+
address _sender,
93+
uint64 _srcChainId,
94+
bytes calldata _message,
95+
address // executor
96+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
97+
(uint256 n, bytes memory message) = abi.decode((_message), (uint64, bytes));
98+
emit MessageReceived(_sender, _srcChainId, n, message);
99+
return ExecuctionStatus.Success;
100+
}
101+
}

contracts/message/apps/NFTBridge.sol

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,9 @@ contract NFTBridge is MessageReceiverApp {
135135
function executeMessage(
136136
address,
137137
uint64 srcChid,
138-
bytes memory _message
139-
) external payable override onlyMessageBus returns (bool) {
138+
bytes memory _message,
139+
address // executor
140+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
140141
// withdraw original locked nft back to user, or mint new nft depending on msg.type
141142
NFTMsg memory nftMsg = abi.decode((_message), (NFTMsg));
142143
if (nftMsg.msgType == MsgType.Mint) {
@@ -147,7 +148,7 @@ contract NFTBridge is MessageReceiverApp {
147148
revert("invalid message type");
148149
}
149150
emit Received(nftMsg.user, nftMsg.nft, nftMsg.id, srcChid);
150-
return true;
151+
return ExecuctionStatus.Success;
151152
}
152153

153154
// only owner

contracts/message/apps/TestRefund.sol

Lines changed: 0 additions & 88 deletions
This file was deleted.

contracts/message/apps/TransferMsg.sol

Lines changed: 0 additions & 29 deletions
This file was deleted.

contracts/message/apps/TransferSwap.sol

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ contract TransferSwap is MessageSenderApp, MessageReceiverApp {
234234
_nonce,
235235
_maxBridgeSlippage,
236236
message,
237-
MessageSenderLib.BridgeType.Liquidity,
237+
MsgDataTypes.BridgeType.Liquidity,
238238
_fee
239239
);
240240
emit SwapRequestSent(id, _dstChainId, _amountIn, _srcSwap.path[0], _dstSwap.path[_dstSwap.path.length - 1]);
@@ -254,8 +254,9 @@ contract TransferSwap is MessageSenderApp, MessageReceiverApp {
254254
address _token,
255255
uint256 _amount,
256256
uint64 _srcChainId,
257-
bytes memory _message
258-
) external payable override onlyMessageBus returns (bool) {
257+
bytes memory _message,
258+
address // executor
259+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
259260
SwapRequest memory m = abi.decode((_message), (SwapRequest));
260261
require(_token == m.swap.path[0], "bridged token must be the same as the first token in destination swap path");
261262
bytes32 id = _computeSwapRequestId(m.receiver, _srcChainId, uint64(block.chainid), _message);
@@ -281,8 +282,8 @@ contract TransferSwap is MessageSenderApp, MessageReceiverApp {
281282
status = SwapStatus.Succeeded;
282283
}
283284
emit SwapRequestDone(id, dstAmount, status);
284-
// always return true since swap failure is already handled in-place
285-
return true;
285+
// always return success since swap failure is already handled in-place
286+
return ExecuctionStatus.Success;
286287
}
287288

288289
/**
@@ -295,14 +296,15 @@ contract TransferSwap is MessageSenderApp, MessageReceiverApp {
295296
address, // _token
296297
uint256, // _amount
297298
uint64 _srcChainId,
298-
bytes memory _message
299-
) external payable override onlyMessageBus returns (bool) {
299+
bytes memory _message,
300+
address // executor
301+
) external payable override onlyMessageBus returns (ExecuctionStatus) {
300302
SwapRequest memory m = abi.decode((_message), (SwapRequest));
301303
bytes32 id = _computeSwapRequestId(m.receiver, _srcChainId, uint64(block.chainid), _message);
302304
emit SwapRequestDone(id, 0, SwapStatus.Failed);
303-
// always return false to mark this transfer as failed since if this function is called then there nothing more
305+
// always return fail to mark this transfer as failed since if this function is called then there nothing more
304306
// we can do in this app as the swap failures are already handled in executeMessageWithTransfer
305-
return false;
307+
return ExecuctionStatus.Fail;
306308
}
307309

308310
function _trySwap(SwapInfo memory _swap, uint256 _amount) private returns (bool ok, uint256 amountOut) {

0 commit comments

Comments
 (0)