118 lines
4.4 KiB
Solidity
118 lines
4.4 KiB
Solidity
|
// SPDX-License-Identifier: MIT
|
||
|
|
||
|
pragma solidity >=0.8.9;
|
||
|
|
||
|
import "rubic-bridge-base/contracts/libraries/SmartApprove.sol";
|
||
|
|
||
|
import "../../interfaces/IBridge.sol";
|
||
|
import "../../interfaces/IMessageBus.sol";
|
||
|
|
||
|
import "./MsgDataTypes.sol";
|
||
|
|
||
|
library MessageSenderLib {
|
||
|
// ============== Internal library functions called by apps ==============
|
||
|
|
||
|
/**
|
||
|
* @notice Sends a message associated with a transfer to a contract on another chain.
|
||
|
* @param _receiver The address of the destination app contract.
|
||
|
* @param _token The address of the token to be sent.
|
||
|
* @param _amount The amount of tokens to be sent.
|
||
|
* @param _dstChainId The destination chain ID.
|
||
|
* @param _nonce A number input to guarantee uniqueness of transferId. Can be timestamp in practice.
|
||
|
* @param _maxSlippage The max slippage accepted, given as percentage in point (pip). Eg. 5000 means 0.5%.
|
||
|
* Must be greater than minimalMaxSlippage. Receiver is guaranteed to receive at least
|
||
|
* (100% - max slippage percentage) * amount or the transfer can be refunded.
|
||
|
* Only applicable to the {MsgDataTypes.BridgeSendType.Liquidity}.
|
||
|
* @param _message Arbitrary message bytes to be decoded by the destination app contract.
|
||
|
* If message is empty, only the token transfer will be sent
|
||
|
* param _bridgeSendType One of the {MsgDataTypes.BridgeSendType} enum.
|
||
|
* @param _messageBus The address of the MessageBus on this chain.
|
||
|
* @param _fee The fee amount to pay to MessageBus.
|
||
|
* @return The transfer ID.
|
||
|
*/
|
||
|
function sendMessageWithTransfer(
|
||
|
address _receiver,
|
||
|
address _token,
|
||
|
uint256 _amount,
|
||
|
uint64 _dstChainId,
|
||
|
uint64 _nonce,
|
||
|
uint32 _maxSlippage,
|
||
|
bytes memory _message,
|
||
|
address _messageBus,
|
||
|
uint256 _fee
|
||
|
) internal returns (bytes32) {
|
||
|
return
|
||
|
sendMessageWithLiquidityBridgeTransfer(
|
||
|
_receiver,
|
||
|
_token,
|
||
|
_amount,
|
||
|
_dstChainId,
|
||
|
_nonce,
|
||
|
_maxSlippage,
|
||
|
_message,
|
||
|
_messageBus,
|
||
|
_fee
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @notice Sends a message to an app on another chain via MessageBus with an associated liquidity bridge transfer.
|
||
|
* @param _receiver The address of the destination app contract.
|
||
|
* @param _token The address of the token to be sent.
|
||
|
* @param _amount The amount of tokens to be sent.
|
||
|
* @param _dstChainId The destination chain ID.
|
||
|
* @param _nonce A number input to guarantee uniqueness of transferId. Can be timestamp in practice.
|
||
|
* @param _maxSlippage The max slippage accepted, given as percentage in point (pip). Eg. 5000 means 0.5%.
|
||
|
* Must be greater than minimalMaxSlippage. Receiver is guaranteed to receive at least
|
||
|
* (100% - max slippage percentage) * amount or the transfer can be refunded.
|
||
|
* @param _message Arbitrary message bytes to be decoded by the destination app contract.
|
||
|
* If message is empty, only the token transfer will be sent
|
||
|
* @param _messageBus The address of the MessageBus on this chain.
|
||
|
* @param _fee The fee amount to pay to MessageBus.
|
||
|
* @return The transfer ID.
|
||
|
*/
|
||
|
function sendMessageWithLiquidityBridgeTransfer(
|
||
|
address _receiver,
|
||
|
address _token,
|
||
|
uint256 _amount,
|
||
|
uint64 _dstChainId,
|
||
|
uint64 _nonce,
|
||
|
uint32 _maxSlippage,
|
||
|
bytes memory _message,
|
||
|
address _messageBus,
|
||
|
uint256 _fee
|
||
|
) internal returns (bytes32) {
|
||
|
address bridge = IMessageBus(_messageBus).liquidityBridge();
|
||
|
SmartApprove.smartApprove(_token, _amount, bridge);
|
||
|
IBridge(bridge).send(
|
||
|
_receiver,
|
||
|
_token,
|
||
|
_amount,
|
||
|
_dstChainId,
|
||
|
_nonce,
|
||
|
_maxSlippage
|
||
|
);
|
||
|
bytes32 transferId = keccak256(
|
||
|
abi.encodePacked(
|
||
|
address(this),
|
||
|
_receiver,
|
||
|
_token,
|
||
|
_amount,
|
||
|
_dstChainId,
|
||
|
_nonce,
|
||
|
uint64(block.chainid)
|
||
|
)
|
||
|
);
|
||
|
if (_message.length > 0) {
|
||
|
IMessageBus(_messageBus).sendMessageWithTransfer{value: _fee}(
|
||
|
_receiver,
|
||
|
_dstChainId,
|
||
|
bridge,
|
||
|
transferId,
|
||
|
_message
|
||
|
);
|
||
|
}
|
||
|
return transferId;
|
||
|
}
|
||
|
}
|