WIP: Chain138 deployment scripts, flash receivers, HYBX OMNL recovery

This commit is contained in:
defiQUG
2026-06-02 06:09:44 -07:00
parent e1560a880b
commit f04a7cb7c8
35 changed files with 2279 additions and 83 deletions

View File

@@ -4,7 +4,9 @@ pragma solidity ^0.8.19;
import {Test} from "forge-std/Test.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IRouterClient} from "../../contracts/ccip/IRouterClient.sol";
import {IRouterClient} from "@chainlink/contracts-ccip/contracts/interfaces/IRouterClient.sol";
import {Client} from "@chainlink/contracts-ccip/contracts/libraries/Client.sol";
import {IRouterClient as LegacyRouterClient} from "../../contracts/ccip/IRouterClient.sol";
import {CWMultiTokenBridgeL1} from "../../contracts/bridge/CWMultiTokenBridgeL1.sol";
import {CWMultiTokenBridgeL2} from "../../contracts/bridge/CWMultiTokenBridgeL2.sol";
import {CompliantWrappedToken} from "../../contracts/tokens/CompliantWrappedToken.sol";
@@ -21,7 +23,7 @@ contract MockCanonicalToken is ERC20 {
contract MockRouter is IRouterClient {
uint256 public fee;
bytes32 public nextMessageId = keccak256("message");
EVM2AnyMessage internal _lastMessage;
Client.EVM2AnyMessage internal _lastMessage;
uint64 public lastDestinationChainSelector;
function setFee(uint256 newFee) external {
@@ -30,31 +32,19 @@ contract MockRouter is IRouterClient {
function ccipSend(
uint64 destinationChainSelector,
EVM2AnyMessage memory message
) external payable returns (bytes32 messageId, uint256 fees) {
fees = fee;
Client.EVM2AnyMessage memory message
) external payable returns (bytes32 messageId) {
if (message.feeToken == address(0)) {
require(msg.value >= fees, "native fee");
require(msg.value >= fee, "native fee");
}
lastDestinationChainSelector = destinationChainSelector;
_lastMessage = message;
emit MessageSent(
nextMessageId,
destinationChainSelector,
msg.sender,
message.receiver,
message.data,
message.tokenAmounts,
message.feeToken,
message.extraArgs
);
return (nextMessageId, fees);
messageId = nextMessageId;
return messageId;
}
function getFee(uint64, EVM2AnyMessage memory) external view returns (uint256) {
function getFee(uint64, Client.EVM2AnyMessage memory) external view returns (uint256) {
return fee;
}
@@ -145,7 +135,9 @@ contract CWMultiTokenBridgeTest is Test {
assertEq(l2Bridge.mintedTotal(address(wrapped)), amount);
assertEq(l2Bridge.burnedTotal(address(wrapped)), amount);
(, bytes memory returnData,,) = routerAvax.lastMessage();
(, bytes memory returnData, address feeToken, bytes memory extraArgs) = routerAvax.lastMessage();
assertTrue(extraArgs.length > 0, "missing CCIP extraArgs");
assertEq(feeToken, address(0));
vm.prank(address(0x138138));
l1Bridge.ccipReceive(_message(returnMessageId, AVALANCHE_SELECTOR, address(l2Bridge), returnData));
@@ -308,8 +300,8 @@ contract CWMultiTokenBridgeTest is Test {
relayRouter.authorizeBridge(address(receiveBridge));
relayRouter.grantRelayerRole(address(this));
IRouterClient.TokenAmount[] memory noTokens = new IRouterClient.TokenAmount[](0);
IRouterClient.Any2EVMMessage memory message = IRouterClient.Any2EVMMessage({
LegacyRouterClient.TokenAmount[] memory noTokens = new LegacyRouterClient.TokenAmount[](0);
LegacyRouterClient.Any2EVMMessage memory message = LegacyRouterClient.Any2EVMMessage({
messageId: keccak256("three-field"),
sourceChainSelector: CHAIN138_SELECTOR,
sender: abi.encode(address(0xCAFE)),
@@ -326,14 +318,13 @@ contract CWMultiTokenBridgeTest is Test {
uint64 sourceChainSelector,
address sender,
bytes memory data
) internal pure returns (IRouterClient.Any2EVMMessage memory message) {
IRouterClient.TokenAmount[] memory noTokens = new IRouterClient.TokenAmount[](0);
message = IRouterClient.Any2EVMMessage({
) internal pure returns (Client.Any2EVMMessage memory message) {
message = Client.Any2EVMMessage({
messageId: messageId,
sourceChainSelector: sourceChainSelector,
sender: abi.encode(sender),
data: data,
tokenAmounts: noTokens
destTokenAmounts: new Client.EVMTokenAmount[](0)
});
}
}

View File

@@ -4,7 +4,8 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IRouterClient} from "../../contracts/ccip/IRouterClient.sol";
import {IRouterClient} from "@chainlink/contracts-ccip/contracts/interfaces/IRouterClient.sol";
import {Client} from "@chainlink/contracts-ccip/contracts/libraries/Client.sol";
import {CWMultiTokenBridgeL1} from "../../contracts/bridge/CWMultiTokenBridgeL1.sol";
import {CWMultiTokenBridgeL2} from "../../contracts/bridge/CWMultiTokenBridgeL2.sol";
import {CompliantWrappedToken} from "../../contracts/tokens/CompliantWrappedToken.sol";
@@ -23,18 +24,18 @@ contract MockCanonicalBTC is ERC20 {
contract MockRouterBTC is IRouterClient {
bytes32 public nextMessageId = keccak256("btc-message");
EVM2AnyMessage internal _lastMessage;
Client.EVM2AnyMessage internal _lastMessage;
function ccipSend(
uint64 destinationChainSelector,
EVM2AnyMessage memory message
) external payable returns (bytes32 messageId, uint256 fees) {
Client.EVM2AnyMessage memory message
) external payable returns (bytes32 messageId) {
destinationChainSelector;
_lastMessage = message;
return (nextMessageId, fees);
return nextMessageId;
}
function getFee(uint64, EVM2AnyMessage memory) external pure returns (uint256) {
function getFee(uint64, Client.EVM2AnyMessage memory) external pure returns (uint256) {
return 0;
}
@@ -122,14 +123,13 @@ contract CWMultiTokenBridgeBTCTest is Test {
uint64 sourceChainSelector,
address sender,
bytes memory data
) internal pure returns (IRouterClient.Any2EVMMessage memory message) {
IRouterClient.TokenAmount[] memory noTokens = new IRouterClient.TokenAmount[](0);
message = IRouterClient.Any2EVMMessage({
) internal pure returns (Client.Any2EVMMessage memory message) {
message = Client.Any2EVMMessage({
messageId: messageId,
sourceChainSelector: sourceChainSelector,
sender: abi.encode(sender),
data: data,
tokenAmounts: noTokens
destTokenAmounts: new Client.EVMTokenAmount[](0)
});
}
}

View File

@@ -3,7 +3,8 @@ pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {IRouterClient} from "../../contracts/ccip/IRouterClient.sol";
import {IRouterClient} from "@chainlink/contracts-ccip/contracts/interfaces/IRouterClient.sol";
import {Client} from "@chainlink/contracts-ccip/contracts/libraries/Client.sol";
import {OfficialStableMirrorToken} from "../../contracts/tokens/OfficialStableMirrorToken.sol";
import {CompliantUSDCTokenV2} from "../../contracts/tokens/CompliantUSDCTokenV2.sol";
import {CompliantUSDTTokenV2} from "../../contracts/tokens/CompliantUSDTTokenV2.sol";
@@ -16,19 +17,19 @@ import {CompliantWrappedToken} from "../../contracts/tokens/CompliantWrappedToke
contract MockRouterVaultVerifierV2 is IRouterClient {
uint256 public fee;
bytes32 public nextMessageId = keccak256("cw-reserve-vault-v2-message");
EVM2AnyMessage internal _lastMessage;
Client.EVM2AnyMessage internal _lastMessage;
uint64 public lastDestinationChainSelector;
function ccipSend(
uint64 destinationChainSelector,
EVM2AnyMessage memory message
) external payable returns (bytes32 messageId, uint256 fees) {
Client.EVM2AnyMessage memory message
) external payable returns (bytes32 messageId) {
lastDestinationChainSelector = destinationChainSelector;
_lastMessage = message;
return (nextMessageId, fee);
return nextMessageId;
}
function getFee(uint64, EVM2AnyMessage memory) external view returns (uint256) {
function getFee(uint64, Client.EVM2AnyMessage memory) external view returns (uint256) {
return fee;
}
@@ -182,14 +183,13 @@ contract CWReserveVerifierVaultV2IntegrationTest is Test {
uint64 sourceChainSelector,
address sender,
bytes memory data
) internal pure returns (IRouterClient.Any2EVMMessage memory message) {
IRouterClient.TokenAmount[] memory noTokens = new IRouterClient.TokenAmount[](0);
message = IRouterClient.Any2EVMMessage({
) internal pure returns (Client.Any2EVMMessage memory message) {
message = Client.Any2EVMMessage({
messageId: messageId,
sourceChainSelector: sourceChainSelector,
sender: abi.encode(sender),
data: data,
tokenAmounts: noTokens
destTokenAmounts: new Client.EVMTokenAmount[](0)
});
}
}