MOS is a message cross-chain system. It has two core functions
Users initiate cross-chain requests and emit cross-chain log messages by using the transferOut method
The messenger listens for cross-chain logs, and on the destination chain, completes the execution of cross-chain messages that have passed light client verification through the transferIn method
The interfaces for MOS are as follows:
interface IMOSV3 {
enum ChainType{
NULL,
EVM,
NEAR
}
enum MessageType {
CALLDATA,
MESSAGE
}
// @notice This is the configuration you need across the chain.
// @param relay - When it is true, the relay chain is required to perform a special execution to continue across the chain.
// @param msgType - Different execution patterns of messages across chains.
// @param target - The contract address of the target chain.
// @param payload - Cross-chain content.
// @param gasLimit - The gasLimit allowed to be consumed by an operation performed on the target chain.
// @param value - Collateral value cross-chain, currently not supported, default is 0.
struct MessageData {
bool relay;
MessageType msgType;
bytes target;
bytes payload;
uint256 gasLimit;
uint256 value;
}
// @notice Gets the fee to cross to the target chain.
// @param toChain - Target chain chainID.
// @param feeToken - Token address that supports payment fee,if it's native, it's address(0).
// @param gasLimit - The gasLimit allowed to be consumed by an operation performed on the target chain.
function getMessageFee(uint256 toChain, address feeToken, uint256 gasLimit) external view returns(uint256, address);
// @notice Initiate cross-chain transactions. Generate cross-chain logs.
// @param toChain - Target chain chainID.
// @param messageData - Structure MessageData encoding.
// @param feeToken - In what Token would you like to pay the fee.
function transferOut(uint256 toChain, bytes memory messageData, address feeToken) external payable returns(bytes32);
// @notice Add the fromaddress permission.
// @param fromChain - The chainID of the source chain.
// @param fromAddress - The call address of the source chain.
// @param tag - Permission,false: revoke permission.
function addRemoteCaller(uint256 fromChain, bytes memory fromAddress, bool tag) external;
// @notice Query whether the contract has execution permission.
// @param mosAddress - This is the mos query address.
// @param fromChainId - The call chain id of the source chain.
// @param fromAddress - The call address of the source chain.
function getExecutePermission(address mosAddress,uint256 fromChainId,bytes memory fromAddress) external view returns(bool);
event mapMessageOut(uint256 indexed fromChain, uint256 indexed toChain, bytes32 orderId, bytes fromAddrss, bytes callData);
event mapMessageIn(uint256 indexed fromChain, uint256 indexed toChain, bytes32 orderId, bytes fromAddrss, bytes callData, bool result, bytes reason);
}
The differences between MOS on other EVM chains and Relay
Our message cross-chain process follows a fixed path from source chain -> Map Relay chain -> destination chain. So we call the MOS contract deployed on the Map Relay chain MosRelay.
The biggest difference between MosRelay and MOS on other EVMs is the transferIn method. If MosRelay is not the destination chain, the transferIn method will continue to emit a cross-chain log to facilitate the messenger listening to the destination chain for verification and execution of the message.