Chainlink CCIP integration

We design and develop full-cycle blockchain solutions: from smart contract architecture to launching DeFi protocols, NFT marketplaces and crypto exchanges. Security audits, tokenomics, integration with existing infrastructure.
Showing 1 of 1 servicesAll 1306 services
Chainlink CCIP integration
Medium
~3-5 business days
FAQ
Blockchain Development Services
Blockchain Development Stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1214
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    852
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    823

Chainlink CCIP (Cross-Chain Interoperability Protocol) Integration

CCIP is a bridge and messaging protocol from Chainlink, built on their decentralized oracle network. Main positioning: enterprise-grade security with independent Risk Management Network on top of core DON.

Security Architecture

CCIP uses two independent validation layers:

  • Primary DON — Chainlink oracle network, transmits and validates messages
  • Risk Management Network (ARM) — independent network of nodes monitoring anomalies and can block suspicious messages

Dual protection: even if Primary DON compromised, ARM can stop fraudulent transaction. This design positions CCIP for financial institutions with high security requirements.

Sending Messages and Tokens

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import {IRouterClient} from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol";
import {Client} from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol";
import {IERC20} from "@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
import {LinkTokenInterface} from "@chainlink/contracts/src/v0.8/shared/interfaces/LinkTokenInterface.sol";

contract CCIPSender {
    IRouterClient public router;
    LinkTokenInterface public linkToken;
    
    constructor(address _router, address _link) {
        router = IRouterClient(_router);
        linkToken = LinkTokenInterface(_link);
    }
    
    function sendMessage(
        uint64 destinationChainSelector,
        address receiver,
        bytes calldata data,
        address tokenAddress,
        uint256 tokenAmount
    ) external returns (bytes32 messageId) {
        
        Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1);
        tokenAmounts[0] = Client.EVMTokenAmount({
            token: tokenAddress,
            amount: tokenAmount,
        });
        
        Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
            receiver: abi.encode(receiver),
            data: data,
            tokenAmounts: tokenAmounts,
            extraArgs: Client._argsToBytes(
                Client.EVMExtraArgsV1({ gasLimit: 200_000 })
            ),
            feeToken: address(linkToken),
        });
        
        uint256 fee = router.getFee(destinationChainSelector, message);
        linkToken.approve(address(router), fee);
        
        IERC20(tokenAddress).approve(address(router), tokenAmount);
        
        messageId = router.ccipSend(destinationChainSelector, message);
        
        emit MessageSent(messageId, destinationChainSelector, receiver, fee);
    }
}

Receiving Messages

import {CCIPReceiver} from "@chainlink/contracts-ccip/src/v0.8/ccip/applications/CCIPReceiver.sol";

contract CCIPReceiver is CCIPReceiver {
    mapping(uint64 => address) public allowedSenders;
    
    constructor(address router) CCIPReceiver(router) {}
    
    function _ccipReceive(
        Client.Any2EVMMessage memory message
    ) internal override {
        address sender = abi.decode(message.sender, (address));
        
        require(
            allowedSenders[message.sourceChainSelector] == sender,
            "Unknown sender"
        );
        
        for (uint i = 0; i < message.destTokenAmounts.length; i++) {
            address token = message.destTokenAmounts[i].token;
            uint256 amount = message.destTokenAmounts[i].amount;
        }
        
        (address recipient, uint256 action) = abi.decode(
            message.data,
            (address, uint256)
        );
        
        _executeAction(recipient, action, message.destTokenAmounts);
    }
}

Chain Selectors

Chain Selector
Ethereum Mainnet 5009297550715157269
Polygon 4051577828743386545
Avalanche 6433500567565415381
Arbitrum 4949039107694359620
Optimism 3734403246176062136
Base 15971525489660198786

Pay with Native Token Instead of LINK

Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
    receiver: abi.encode(receiver),
    data: data,
    tokenAmounts: tokenAmounts,
    extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({ gasLimit: 200_000 })),
    feeToken: address(0), // native token
});

uint256 fee = router.getFee(destinationChainSelector, message);
messageId = router.ccipSend{value: fee}(destinationChainSelector, message);

CCIP is good for: enterprise projects with security audit requirements; DeFi protocols with large TVL where Chainlink reputation matters; when already using Chainlink Price Feeds — CCIP integrates well.

CCIP integration — 2-3 weeks. Official documentation and examples high quality, Chainlink supports enterprise clients.