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.
161 lines
5.1 KiB
161 lines
5.1 KiB
1 year ago
|
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||
|
pragma solidity >=0.8.0;
|
||
|
|
||
|
/*@@@@@@@ @@@@@@@@@
|
||
|
@@@@@@@@@ @@@@@@@@@
|
||
|
@@@@@@@@@ @@@@@@@@@
|
||
|
@@@@@@@@@ @@@@@@@@@
|
||
|
@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
@@@@@ HYPERLANE @@@@@@@
|
||
|
@@@@@@@@@@@@@@@@@@@@@@@@@
|
||
|
@@@@@@@@@ @@@@@@@@@
|
||
|
@@@@@@@@@ @@@@@@@@@
|
||
|
@@@@@@@@@ @@@@@@@@@
|
||
|
@@@@@@@@@ @@@@@@@@*/
|
||
|
|
||
|
/**
|
||
|
* Format of metadata:
|
||
|
*
|
||
|
* [0:1] variant
|
||
|
* [2:33] msg.value
|
||
|
* [34:65] Gas limit for message (IGP)
|
||
|
* [66:85] Refund address for message (IGP)
|
||
|
* [86:] Custom metadata
|
||
|
*/
|
||
1 year ago
|
library StandardHookMetadata {
|
||
1 year ago
|
uint8 private constant VARIANT_OFFSET = 0;
|
||
|
uint8 private constant MSG_VALUE_OFFSET = 2;
|
||
|
uint8 private constant GAS_LIMIT_OFFSET = 34;
|
||
|
uint8 private constant REFUND_ADDRESS_OFFSET = 66;
|
||
|
uint256 private constant MIN_METADATA_LENGTH = 86;
|
||
|
|
||
|
uint16 public constant VARIANT = 1;
|
||
|
|
||
|
/**
|
||
|
* @notice Returns the variant of the metadata.
|
||
|
* @param _metadata ABI encoded global hook metadata.
|
||
|
* @return variant of the metadata as uint8.
|
||
|
*/
|
||
|
function variant(bytes calldata _metadata) internal pure returns (uint16) {
|
||
|
if (_metadata.length < VARIANT_OFFSET + 2) return 0;
|
||
|
return uint16(bytes2(_metadata[VARIANT_OFFSET:VARIANT_OFFSET + 2]));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @notice Returns the specified value for the message.
|
||
|
* @param _metadata ABI encoded global hook metadata.
|
||
1 year ago
|
* @param _default Default fallback value.
|
||
1 year ago
|
* @return Value for the message as uint256.
|
||
|
*/
|
||
|
function msgValue(bytes calldata _metadata, uint256 _default)
|
||
|
internal
|
||
|
pure
|
||
|
returns (uint256)
|
||
|
{
|
||
|
if (_metadata.length < MSG_VALUE_OFFSET + 32) return _default;
|
||
|
return
|
||
|
uint256(bytes32(_metadata[MSG_VALUE_OFFSET:MSG_VALUE_OFFSET + 32]));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @notice Returns the specified gas limit for the message.
|
||
|
* @param _metadata ABI encoded global hook metadata.
|
||
1 year ago
|
* @param _default Default fallback gas limit.
|
||
1 year ago
|
* @return Gas limit for the message as uint256.
|
||
|
*/
|
||
|
function gasLimit(bytes calldata _metadata, uint256 _default)
|
||
|
internal
|
||
|
pure
|
||
|
returns (uint256)
|
||
|
{
|
||
|
if (_metadata.length < GAS_LIMIT_OFFSET + 32) return _default;
|
||
|
return
|
||
|
uint256(bytes32(_metadata[GAS_LIMIT_OFFSET:GAS_LIMIT_OFFSET + 32]));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @notice Returns the specified refund address for the message.
|
||
|
* @param _metadata ABI encoded global hook metadata.
|
||
1 year ago
|
* @param _default Default fallback refund address.
|
||
1 year ago
|
* @return Refund address for the message as address.
|
||
|
*/
|
||
|
function refundAddress(bytes calldata _metadata, address _default)
|
||
|
internal
|
||
|
pure
|
||
|
returns (address)
|
||
|
{
|
||
|
if (_metadata.length < REFUND_ADDRESS_OFFSET + 20) return _default;
|
||
|
return
|
||
|
address(
|
||
|
bytes20(
|
||
|
_metadata[REFUND_ADDRESS_OFFSET:REFUND_ADDRESS_OFFSET + 20]
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @notice Returns the specified refund address for the message.
|
||
|
* @param _metadata ABI encoded global hook metadata.
|
||
|
* @return Refund address for the message as address.
|
||
|
*/
|
||
|
function getCustomMetadata(bytes calldata _metadata)
|
||
|
internal
|
||
|
pure
|
||
|
returns (bytes calldata)
|
||
|
{
|
||
|
if (_metadata.length < MIN_METADATA_LENGTH) return _metadata[0:0];
|
||
|
return _metadata[MIN_METADATA_LENGTH:];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @notice Formats the specified gas limit and refund address into global hook metadata.
|
||
|
* @param _msgValue msg.value for the message.
|
||
|
* @param _gasLimit Gas limit for the message.
|
||
|
* @param _refundAddress Refund address for the message.
|
||
|
* @param _customMetadata Additional metadata to include in the global hook metadata.
|
||
|
* @return ABI encoded global hook metadata.
|
||
|
*/
|
||
|
function formatMetadata(
|
||
|
uint256 _msgValue,
|
||
|
uint256 _gasLimit,
|
||
|
address _refundAddress,
|
||
|
bytes memory _customMetadata
|
||
|
) internal pure returns (bytes memory) {
|
||
|
return
|
||
|
abi.encodePacked(
|
||
|
VARIANT,
|
||
|
_msgValue,
|
||
|
_gasLimit,
|
||
|
_refundAddress,
|
||
|
_customMetadata
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @notice Formats the specified gas limit and refund address into global hook metadata.
|
||
|
* @param _msgValue msg.value for the message.
|
||
|
* @return ABI encoded global hook metadata.
|
||
|
*/
|
||
|
function formatMetadata(uint256 _msgValue)
|
||
|
internal
|
||
|
view
|
||
|
returns (bytes memory)
|
||
|
{
|
||
1 year ago
|
return formatMetadata(_msgValue, uint256(0), msg.sender, "");
|
||
1 year ago
|
}
|
||
|
|
||
|
/**
|
||
|
* @notice Formats the specified gas limit and refund address into global hook metadata.
|
||
|
* @param _gasLimit Gas limit for the message.
|
||
|
* @param _refundAddress Refund address for the message.
|
||
|
* @return ABI encoded global hook metadata.
|
||
|
*/
|
||
|
function formatMetadata(uint256 _gasLimit, address _refundAddress)
|
||
|
internal
|
||
|
pure
|
||
|
returns (bytes memory)
|
||
|
{
|
||
1 year ago
|
return formatMetadata(uint256(0), _gasLimit, _refundAddress, "");
|
||
1 year ago
|
}
|
||
|
}
|