The home for Hyperlane core contracts, sdk packages, and other infrastructure
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hyperlane-monorepo/solidity/contracts/GasRouter.sol

110 lines
3.7 KiB

// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;
import {Router} from "./Router.sol";
import {IGPMetadata} from "./libs/hooks/IGPMetadata.sol";
abstract contract GasRouter is Router {
// ============ Mutable Storage ============
mapping(uint32 => uint256) public destinationGas;
// ============ Events ============
/**
* @notice Emitted when a domain's destination gas is set.
* @param domain The domain of the router.
* @param gas The gas amount used by the handle function of the domain's router.
*/
event DestinationGasSet(uint32 indexed domain, uint256 gas);
struct GasRouterConfig {
uint32 domain;
uint256 gas;
}
/**
* @notice Sets the gas amount dispatched for each configured domain.
* @param gasConfigs The array of GasRouterConfig structs
*/
function setDestinationGas(GasRouterConfig[] calldata gasConfigs)
external
onlyOwner
{
for (uint256 i = 0; i < gasConfigs.length; i += 1) {
_setDestinationGas(gasConfigs[i].domain, gasConfigs[i].gas);
}
}
/**
* @notice Returns the gas payment required to dispatch a message to the given domain's router.
* @param _destinationDomain The domain of the router.
* @return _gasPayment Payment computed by the registered InterchainGasPaymaster.
*/
function quoteGasPayment(uint32 _destinationDomain)
external
view
returns (uint256 _gasPayment)
{
return
mailbox.quoteDispatch(
_destinationDomain,
_mustHaveRemoteRouter(_destinationDomain),
"",
IGPMetadata.formatMetadata(
destinationGas[_destinationDomain],
address(this)
)
);
}
function _setDestinationGas(uint32 domain, uint256 gas) internal {
destinationGas[domain] = gas;
emit DestinationGasSet(domain, gas);
}
/**
* @dev Uses the destinationGas mapping to populate the gas amount for the message.
* @notice Dispatches a message to an enrolled router via the local router's Mailbox
* and pays for it to be relayed to the destination.
* @dev Reverts if there is no enrolled router for _destinationDomain.
* @param _destinationDomain The domain of the chain to which to send the message.
* @param _messageBody Raw bytes content of message.
* @param _gasPayment The amount of native tokens to pay for the message to be relayed.
* @param _gasPaymentRefundAddress The address to refund any gas overpayment to.
*/
function _dispatchWithGas(
uint32 _destinationDomain,
bytes memory _messageBody,
uint256 _gasPayment,
address _gasPaymentRefundAddress
) internal returns (bytes32 _messageId) {
return
_dispatchWithGas(
_destinationDomain,
_messageBody,
destinationGas[_destinationDomain],
_gasPayment,
_gasPaymentRefundAddress
);
}
/**
* @dev Passes `msg.value` as gas payment and `msg.sender` as gas payment refund address.
* @dev Uses the destinationGas mapping to populate the gas amount for the message.
* @param _destinationDomain The domain of the chain to send the message.
* @param _messageBody Raw bytes content of message.
*/
function _dispatchWithGas(
uint32 _destinationDomain,
bytes memory _messageBody
) internal returns (bytes32 _messageId) {
return
_dispatchWithGas(
_destinationDomain,
_messageBody,
msg.value,
msg.sender
);
}
}