CrossChainBridge
Inherits: Policy, RolesConsumer, ILayerZeroReceiver, ILayerZeroUserApplicationConfig
Message bridge for cross-chain OHM transfers.
Uses LayerZero as communication protocol.
Each chain needs to setTrustedRemoteAddress for each remote address
it intends to receive from.
State Variables
MINTR
MINTRv1 public MINTR
lzEndpoint
ILayerZeroEndpoint public immutable lzEndpoint
ohm
ERC20 public ohm
bridgeActive
Flag to determine if bridge is allowed to send messages or not
bool public bridgeActive
failedMessages
Storage for failed messages on receive.
chainID => source address => endpoint nonce
mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages
trustedRemoteLookup
Trusted remote paths. Must be set by admin.
mapping(uint16 => bytes) public trustedRemoteLookup
precrime
LZ precrime address. Currently unused.
address public precrime
Functions
constructor
constructor(Kernel kernel_, address endpoint_) Policy(kernel_);
configureDependencies
Define module dependencies for this policy.
function configureDependencies() external override returns (Keycode[] memory dependencies);
Returns
| Name | Type | Description |
|---|---|---|
dependencies | Keycode[] | - Keycode array of module dependencies. |
requestPermissions
Function called by kernel to set module function permissions.
function requestPermissions() external view override returns (Permissions[] memory permissions);
Returns
| Name | Type | Description |
|---|---|---|
permissions | Permissions[] | requests - Array of keycodes and function selectors for requested permissions. |
sendOhm
Send OHM to an eligible chain
function sendOhm(uint16 dstChainId_, address to_, uint256 amount_) external payable;
_receiveMessage
Implementation of receiving an LZ message
Function must be public to be called by low-level call in lzReceive
function _receiveMessage(uint16 srcChainId_, bytes memory, uint64, bytes memory payload_) internal;
lzReceive
function lzReceive(uint16 srcChainId_, bytes calldata srcAddress_, uint64 nonce_, bytes calldata payload_)
public
virtual
override;
receiveMessage
Implementation of receiving an LZ message
Function must be public to be called by low-level call in lzReceive
function receiveMessage(uint16 srcChainId_, bytes memory srcAddress_, uint64 nonce_, bytes memory payload_) public;
retryMessage
Retry a failed receive message
function retryMessage(uint16 srcChainId_, bytes calldata srcAddress_, uint64 nonce_, bytes calldata payload_)
public
payable
virtual;
_sendMessage
Internal function for sending a message across chains.
Params defined in ILayerZeroEndpoint send function.
function _sendMessage(
uint16 dstChainId_,
bytes memory payload_,
address payable refundAddress_,
address zroPaymentAddress_,
bytes memory adapterParams_,
uint256 nativeFee_
) internal;
estimateSendFee
Function to estimate how much gas is needed to send OHM
Should be called by frontend before making sendOhm call.
function estimateSendFee(uint16 dstChainId_, address to_, uint256 amount_, bytes calldata adapterParams_)
external
view
returns (uint256 nativeFee, uint256 zroFee);
Returns
| Name | Type | Description |
|---|---|---|
nativeFee | uint256 | - Native token amount to send to sendOhm |
zroFee | uint256 | - Fee paid in ZRO token. Unused. |
setConfig
Generic config for LayerZero User Application
function setConfig(uint16 version_, uint16 chainId_, uint256 configType_, bytes calldata config_)
external
override
onlyRole("bridge_admin");
setSendVersion
Set send version of endpoint to be used by LayerZero User Application
function setSendVersion(uint16 version_) external override onlyRole("bridge_admin");
setReceiveVersion
Set receive version of endpoint to be used by LayerZero User Application
function setReceiveVersion(uint16 version_) external override onlyRole("bridge_admin");
forceResumeReceive
Retries a received message. Used as last resort if retryPayload fails.
Unblocks queue and DESTROYS transaction forever. USE WITH CAUTION.
function forceResumeReceive(uint16 srcChainId_, bytes calldata srcAddress_)
external
override
onlyRole("bridge_admin");
setTrustedRemote
Sets the trusted path for the cross-chain communication
path_ = abi.encodePacked(remoteAddress, localAddress)
function setTrustedRemote(uint16 srcChainId_, bytes calldata path_) external onlyRole("bridge_admin");
setTrustedRemoteAddress
Convenience function for setting trusted paths between EVM addresses
function setTrustedRemoteAddress(uint16 remoteChainId_, bytes calldata remoteAddress_)
external
onlyRole("bridge_admin");
setPrecrime
Sets precrime address
function setPrecrime(address precrime_) external onlyRole("bridge_admin");
setBridgeStatus
Activate or deactivate the bridge
function setBridgeStatus(bool isActive_) external onlyRole("bridge_admin");
getConfig
Gets endpoint config for this contract
function getConfig(uint16 version_, uint16 chainId_, address, uint256 configType_)
external
view
returns (bytes memory);
getTrustedRemoteAddress
Get trusted remote for the given chain as an
function getTrustedRemoteAddress(uint16 remoteChainId_) external view returns (bytes memory);
isTrustedRemote
function isTrustedRemote(uint16 srcChainId_, bytes calldata srcAddress_) external view returns (bool);
Events
BridgeTransferred
event BridgeTransferred(address indexed sender_, uint256 amount_, uint16 indexed dstChain_);
BridgeReceived
event BridgeReceived(address indexed receiver_, uint256 amount_, uint16 indexed srcChain_);
MessageFailed
event MessageFailed(uint16 srcChainId_, bytes srcAddress_, uint64 nonce_, bytes payload_, bytes reason_);
RetryMessageSuccess
event RetryMessageSuccess(uint16 srcChainId_, bytes srcAddress_, uint64 nonce_, bytes32 payloadHash_);
SetPrecrime
event SetPrecrime(address precrime_);
SetTrustedRemote
event SetTrustedRemote(uint16 remoteChainId_, bytes path_);
SetTrustedRemoteAddress
event SetTrustedRemoteAddress(uint16 remoteChainId_, bytes remoteAddress_);
SetMinDstGas
event SetMinDstGas(uint16 dstChainId_, uint16 type_, uint256 _minDstGas);
BridgeStatusSet
event BridgeStatusSet(bool isActive_);
Errors
Bridge_InsufficientAmount
error Bridge_InsufficientAmount();
Bridge_InvalidCaller
error Bridge_InvalidCaller();
Bridge_InvalidMessageSource
error Bridge_InvalidMessageSource();
Bridge_NoStoredMessage
error Bridge_NoStoredMessage();
Bridge_InvalidPayload
error Bridge_InvalidPayload();
Bridge_DestinationNotTrusted
error Bridge_DestinationNotTrusted();
Bridge_NoTrustedPath
error Bridge_NoTrustedPath();
Bridge_Deactivated
error Bridge_Deactivated();
Bridge_TrustedRemoteUninitialized
error Bridge_TrustedRemoteUninitialized();