Add Monad CCIP deploy scripts, relay hardening, and bridge contract updates.
Some checks failed
CI/CD Pipeline / Solidity Contracts (push) Failing after 1m12s
CI/CD Pipeline / Security Scanning (push) Successful in 2m21s
CI/CD Pipeline / Lint and Format (push) Failing after 25s
CI/CD Pipeline / Terraform Validation (push) Failing after 24s
CI/CD Pipeline / Kubernetes Validation (push) Successful in 22s
Deploy ChainID 138 / Deploy ChainID 138 (push) Failing after 41s
Validation / validate-genesis (push) Successful in 27s
Validation / validate-terraform (push) Failing after 25s
Validation / validate-kubernetes (push) Failing after 9s
Validation / validate-smart-contracts (push) Failing after 9s
Validation / validate-security (push) Failing after 1m6s
Validation / validate-documentation (push) Failing after 16s
OMNL reconcile anchor / Run omnl:reconcile and upload artifacts (push) Failing after 23s
Verify Deployment / Verify Deployment (push) Failing after 13m52s

Includes Monad↔Chain138 CCIP proof/deploy/verify tooling, relay service guards,
bridge integration tweaks, and frontend ENS/network config follow-ups.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
defiQUG
2026-06-13 12:52:49 -07:00
parent 78edb86c3b
commit 1ec308c3a0
26 changed files with 5292 additions and 79 deletions

View File

@@ -22,6 +22,7 @@ import {CCIPWETH10Bridge} from "../contracts/ccip/CCIPWETH10Bridge.sol";
* - Base (chainId 8453): Deploys all contracts
* - Arbitrum (chainId 42161): Deploys all contracts
* - Optimism (chainId 10): Deploys all contracts
* - Monad (chainId 143): Deploys all contracts (WMON as wrapped native; native MON CCIP fees if LINK unset)
*/
contract DeployAll is Script {
// Chain IDs
@@ -34,6 +35,13 @@ contract DeployAll is Script {
uint256 constant BASE = 8453;
uint256 constant ARBITRUM = 42161;
uint256 constant OPTIMISM = 10;
uint256 constant MONAD = 143;
// Canonical wrapped native on Monad mainnet (WMON)
address constant WMON_MAINNET = 0x754704Bc059F8C67012fEd69BC8A327a5aafb603;
// Chainlink CCIP router on Monad mainnet
address constant CCIP_ROUTER_MONAD_DEFAULT = 0x33566fE5976AAa420F3d5C64996641Fc3858CaDB;
uint64 constant MONAD_SELECTOR_DEFAULT = 8481857512324358265;
// CCIP Configuration per chain
struct CCIPConfig {
@@ -209,6 +217,12 @@ contract DeployAll is Script {
linkToken: vm.envAddress("CCIP_OPTIMISM_LINK_TOKEN"),
chainSelector: uint64(vm.envUint("OPTIMISM_SELECTOR"))
});
} else if (chainId == MONAD) {
return CCIPConfig({
router: vm.envOr("CCIP_MONAD_ROUTER", CCIP_ROUTER_MONAD_DEFAULT),
linkToken: vm.envOr("CCIP_MONAD_LINK_TOKEN", address(0)),
chainSelector: uint64(vm.envOr("MONAD_SELECTOR", uint256(MONAD_SELECTOR_DEFAULT)))
});
} else {
revert("Unsupported chain");
}
@@ -255,6 +269,16 @@ contract DeployAll is Script {
address weth9 = vm.envOr("WETH9_OPTIMISM", address(0));
address weth10 = vm.envOr("WETH10_OPTIMISM", address(0));
return WETHConfig({weth9: weth9, weth10: weth10});
} else if (chainId == MONAD) {
address weth9 = vm.envOr("WETH9_MONAD", address(0));
address weth10 = vm.envOr("WETH10_MONAD", address(0));
if (weth9 == address(0)) {
weth9 = WMON_MAINNET;
}
if (weth10 == address(0)) {
weth10 = WMON_MAINNET;
}
return WETHConfig({weth9: weth9, weth10: weth10});
} else {
revert("Unsupported chain");
}

View File

@@ -6,14 +6,15 @@ import {IRouterClient} from "../contracts/ccip/IRouterClient.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/// @notice CCIP-send Chain 138 LINK to a destination-chain bridge contract (operator funding).
/// Env: PRIVATE_KEY, CCIP_ROUTER_CHAIN138, LINK_TOKEN_CHAIN138, DEST_SELECTOR, DEST_BRIDGE, LINK_AMOUNT_WEI
/// Env: PRIVATE_KEY, CCIP_ROUTER_CHAIN138, LINK_TOKEN_CHAIN138, DEST_SELECTOR,
/// RECIPIENT_ADDRESS (or DEST_BRIDGE), LINK_AMOUNT_WEI
contract FundBridgeLinkViaCcip138 is Script {
function run() external {
uint256 deployerKey = vm.envUint("PRIVATE_KEY");
address router = vm.envAddress("CCIP_ROUTER_CHAIN138");
address link = vm.envAddress("LINK_TOKEN_CHAIN138");
uint64 destSelector = uint64(vm.envUint("DEST_SELECTOR"));
address destBridge = vm.envAddress("DEST_BRIDGE");
address recipient = vm.envOr("RECIPIENT_ADDRESS", vm.envAddress("DEST_BRIDGE"));
uint256 amount = vm.envUint("LINK_AMOUNT_WEI");
IRouterClient.TokenAmount[] memory tokenAmounts = new IRouterClient.TokenAmount[](1);
@@ -24,15 +25,15 @@ contract FundBridgeLinkViaCcip138 is Script {
});
IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({
receiver: abi.encode(destBridge),
data: "",
receiver: abi.encode(recipient),
data: abi.encode(recipient, amount),
tokenAmounts: tokenAmounts,
feeToken: link,
extraArgs: ""
});
uint256 fee = IRouterClient(router).getFee(destSelector, message);
console2.log("destBridge", destBridge);
console2.log("recipient", recipient);
console2.log("amount", amount);
console2.log("fee", fee);