Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(contracts): ValueRouter #4814

Open
wants to merge 27 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
3e2f9e3
refactor: implement outbound and inbound warp route amount transforms…
yorhodes Oct 22, 2024
a51b288
fix(contracts): check for sufficient msgValue for `AggregationHook` …
aroralanuk Oct 29, 2024
7215577
init
aroralanuk Nov 5, 2024
4556e24
Merge branch 'main' into kunal/value-router
aroralanuk Nov 7, 2024
99647fe
revert
aroralanuk Nov 7, 2024
6876905
more
aroralanuk Nov 7, 2024
2514043
more
aroralanuk Nov 7, 2024
670912b
fixes
aroralanuk Nov 8, 2024
3fec6a0
rename
aroralanuk Nov 11, 2024
1e54bf6
account.balance
aroralanuk Nov 11, 2024
d8d4d2f
resolve sdk imports
aroralanuk Nov 20, 2024
e302e9c
Merge branch 'main' into kunal/value-router
aroralanuk Nov 20, 2024
ecd1e90
override if more
aroralanuk Nov 27, 2024
8fb963c
testpostdispatchhook
aroralanuk Nov 28, 2024
bee6d22
rm quote fetch
aroralanuk Nov 28, 2024
bab9928
Merge branch 'main' into kunal/value-router
aroralanuk Dec 10, 2024
139ba55
rm extra insuff check
aroralanuk Dec 13, 2024
9fcc4d9
rm comment
aroralanuk Dec 13, 2024
41ff083
inherit from hypnativecollateral
aroralanuk Dec 13, 2024
9c38a7a
interchange names
aroralanuk Dec 13, 2024
5c1f2e8
more
aroralanuk Dec 13, 2024
ec225b4
revert
aroralanuk Dec 13, 2024
d996b3a
Merge branch 'main' into kunal/value-router
aroralanuk Dec 13, 2024
4f04099
rm override if higher
aroralanuk Dec 13, 2024
7cf2d75
docs(changeset): Added a new router HypNativeCollateral with a unifie…
aroralanuk Dec 13, 2024
b541129
revrt
aroralanuk Dec 13, 2024
13e79af
Update long-llamas-fly.md
aroralanuk Dec 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions solidity/contracts/hooks/OPL2ToL1Hook.sol
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,12 @@ contract OPL2ToL1Hook is AbstractMessageIdAuthHook {
bytes calldata metadata,
bytes calldata message
) internal view override returns (uint256) {
bytes memory metadataWithGasLimit = metadata.overrideGasLimit(
Fixed Show fixed Hide fixed
MIN_GAS_LIMIT
aroralanuk marked this conversation as resolved.
Show resolved Hide resolved
);
return
metadata.msgValue(0) + childHook.quoteDispatch(metadata, message);
metadata.msgValue(0) +
childHook.quoteDispatch(metadataWithGasLimit, message);
}

// ============ Internal functions ============
Expand All @@ -83,9 +87,12 @@ contract OPL2ToL1Hook is AbstractMessageIdAuthHook {
(message.id(), metadata.msgValue(0))
);

bytes memory metadataWithGasLimit = metadata.overrideGasLimit(
Fixed Show fixed Hide fixed
MIN_GAS_LIMIT
);
aroralanuk marked this conversation as resolved.
Show resolved Hide resolved
childHook.postDispatch{
value: childHook.quoteDispatch(metadata, message)
}(metadata, message);
value: childHook.quoteDispatch(metadataWithGasLimit, message)
Fixed Show fixed Hide fixed
}(metadataWithGasLimit, message);
l2Messenger.sendMessage{value: metadata.msgValue(0)}(
TypeCasts.bytes32ToAddress(ism),
payload,
Expand Down
38 changes: 38 additions & 0 deletions solidity/contracts/hooks/libs/StandardHookMetadata.sol
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,42 @@ library StandardHookMetadata {
) internal pure returns (bytes memory) {
return formatMetadata(uint256(0), uint256(0), _refundAddress, "");
}

/**
* @notice Overrides the msg.value in the metadata.
* @param _metadata encoded standard hook metadata.
* @param _msgValue msg.value for the message.
* @return encoded standard hook metadata.
*/
function overrideMsgValue(
bytes calldata _metadata,
uint256 _msgValue
) internal view returns (bytes memory) {
return
formatMetadata(
Fixed Show fixed Hide fixed
_msgValue,
gasLimit(_metadata, 0),
refundAddress(_metadata, msg.sender),
Comment on lines +182 to +183
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dont understand the 0 and msg.sender here
this will also memcopy for every field iiuc

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these are just default values in case the specific part of the metadata is null
true but memcopy is cheap

Copy link
Member

@yorhodes yorhodes Nov 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

0 gas limit and msg.sender for refund address as defaults does not make sense to me

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what would you have in their place?

getCustomMetadata(_metadata)
Fixed Show fixed Hide fixed
Fixed Show fixed Hide fixed
);
}

/**
* @notice Overrides the gas limit in the metadata.
* @param _metadata encoded standard hook metadata.
* @param _gasLimit gas limit for the message.
* @return encoded standard hook metadata.
*/
function overrideGasLimit(
bytes calldata _metadata,
uint256 _gasLimit
) internal view returns (bytes memory) {
return
formatMetadata(
Fixed Show fixed Hide fixed
msgValue(_metadata, 0),
_gasLimit,
refundAddress(_metadata, msg.sender),
getCustomMetadata(_metadata)
Fixed Show fixed Hide fixed
);
}
}
166 changes: 166 additions & 0 deletions solidity/contracts/token/HypValue.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.8.0;

/*@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@ HYPERLANE @@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@*/

// ============ Internal Imports ============
import {TokenRouter} from "./libs/TokenRouter.sol";
import {StandardHookMetadata} from "../hooks/libs/StandardHookMetadata.sol";

// ============ External Imports ============
import {Address} from "@openzeppelin/contracts/utils/Address.sol";

/**
* @title HypValue
* @author Abacus Works
* @notice This contract facilitates the transfer of value between chains using value transfer hooks
*/
contract HypValue is TokenRouter {
aroralanuk marked this conversation as resolved.
Show resolved Hide resolved
// ============ Errors ============
error InsufficientValue(uint256 amount, uint256 value);

constructor(address _mailbox) TokenRouter(_mailbox) {}

// ============ Initialization ============

/**
* @notice Initializes the contract
* @param _valuehook The address of the value transfer hook
* @param _interchainSecurityModule The address of the interchain security module
* @param _owner The owner of the contract
*/
function initialize(
address _valuehook,
address _interchainSecurityModule,
address _owner
) public initializer {
_MailboxClient_initialize(
_valuehook,
_interchainSecurityModule,
_owner
);
}

// ============ External Functions ============

/**
* @inheritdoc TokenRouter
* @dev use _hook with caution, make sure that this hook can handle msg.value transfer using the metadata.msgValue()
*/
function transferRemote(
uint32 _destination,
bytes32 _recipient,
uint256 _amount,
bytes calldata _hookMetadata,
address _hook
) external payable virtual override returns (bytes32 messageId) {
uint256 quote = _checkSufficientValue(_destination, _amount, _hook);
aroralanuk marked this conversation as resolved.
Show resolved Hide resolved

bytes memory hookMetadata = StandardHookMetadata.overrideMsgValue(
_hookMetadata,
_amount
);

return
_transferRemote(
_destination,
_recipient,
_amount,
_amount + quote,
hookMetadata,
_hook
);
}

/// @inheritdoc TokenRouter
function transferRemote(
uint32 _destination,
bytes32 _recipient,
uint256 _amount
) external payable virtual override returns (bytes32 messageId) {
uint256 quote = _checkSufficientValue(
_destination,
_amount,
address(hook)
);
bytes memory hookMetadata = StandardHookMetadata.formatMetadata(
_amount,
destinationGas[_destination],
msg.sender,
""
);

aroralanuk marked this conversation as resolved.
Show resolved Hide resolved
return
_transferRemote(
_destination,
_recipient,
_amount,
_amount + quote,
hookMetadata,
address(hook)
);
}

// ============ Internal Functions ============

/**
* @inheritdoc TokenRouter
* @dev No token metadata is needed for value transfers
*/
function _transferFromSender(
uint256
) internal pure override returns (bytes memory) {
return bytes(""); // no token metadata
}

/**
* @inheritdoc TokenRouter
* @dev Sends the value to the recipient
*/
function _transferTo(
address _recipient,
uint256 _amount,
bytes calldata // no token metadata
) internal virtual override {
Address.sendValue(payable(_recipient), _amount);
}

/**
* @inheritdoc TokenRouter
* @dev This contract doesn't hold value
aroralanuk marked this conversation as resolved.
Show resolved Hide resolved
*/
function balanceOf(
address /* _account */
) external pure override returns (uint256) {
return 0;
}
aroralanuk marked this conversation as resolved.
Show resolved Hide resolved

/// @dev Checks if the provided value is sufficient for the transfer
function _checkSufficientValue(
uint32 _destination,
uint256 _amount,
address _hook
) internal view returns (uint256) {
uint256 quote = _GasRouter_quoteDispatch(
_destination,
new bytes(0),
aroralanuk marked this conversation as resolved.
Show resolved Hide resolved
_hook
);
if (msg.value < _amount + quote) {
revert InsufficientValue(_amount + quote, msg.value);
}
return quote;
aroralanuk marked this conversation as resolved.
Show resolved Hide resolved
}

receive() external payable {}
aroralanuk marked this conversation as resolved.
Show resolved Hide resolved
}
Loading
Loading