// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "forge-std/Script.sol"; import {IRouterClient} from "@chainlink/contracts-ccip/contracts/interfaces/IRouterClient.sol"; import {Client} from "@chainlink/contracts-ccip/contracts/libraries/Client.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// @notice CCIP-send canonical mainnet LINK to a destination-chain bridge contract. /// Env: PRIVATE_KEY, CCIP_ROUTER_MAINNET, LINK_TOKEN_MAINNET, DEST_SELECTOR, DEST_BRIDGE, LINK_AMOUNT_WEI contract FundBridgeLinkViaCcipMainnet is Script { function run() external { uint256 deployerKey = vm.envUint("PRIVATE_KEY"); address router = vm.envAddress("CCIP_ROUTER_MAINNET"); address link = vm.envAddress("LINK_TOKEN_MAINNET"); uint64 destSelector = uint64(vm.envUint("DEST_SELECTOR")); address destBridge = vm.envAddress("DEST_BRIDGE"); uint256 amount = vm.envUint("LINK_AMOUNT_WEI"); Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); tokenAmounts[0] = Client.EVMTokenAmount({token: link, amount: amount}); Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: abi.encode(destBridge), data: "", tokenAmounts: tokenAmounts, feeToken: link, extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: 200_000})) }); 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(); } }