// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "forge-std/Script.sol"; 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 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"); uint256 amount = vm.envUint("LINK_AMOUNT_WEI"); IRouterClient.TokenAmount[] memory tokenAmounts = new IRouterClient.TokenAmount[](1); tokenAmounts[0] = IRouterClient.TokenAmount({ token: link, amount: amount, amountType: IRouterClient.TokenAmountType.Fiat }); IRouterClient.EVM2AnyMessage memory message = IRouterClient.EVM2AnyMessage({ receiver: abi.encode(destBridge), data: "", tokenAmounts: tokenAmounts, feeToken: link, extraArgs: "" }); uint256 fee = IRouterClient(router).getFee(destSelector, message); console2.log("destBridge", destBridge); console2.log("amount", amount); console2.log("fee", fee); vm.startBroadcast(deployerKey); IERC20(link).approve(router, amount + fee); (bytes32 messageId,) = IRouterClient(router).ccipSend(destSelector, message); console2.logBytes32(messageId); vm.stopBroadcast(); } }