Skip to content

Releases: smartcontractkit/chainlink-local

v0.2.7-beta.0

09 Oct 23:54
1263371

Choose a tag to compare

v0.2.7-beta.0 Pre-release
Pre-release

chainlink local logo

v0.2.7-beta.0 Release - 9 October 2025

This release adds support for a new Data Streams billing mechanism.

⚠️ Important: This release updates the version of the @chainlink/contracts dependency to v1.5.0 and the @chainlink/contracts-ccip dependency to v1.6.2, in which the remappings related to OpenZeppelin contracts have been changed. If you experience any issues with Chainlink Local after upgrading to this release (v0.2.7-beta.0), please report them by opening a GitHub issue.

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.6.2
@chainlink/contracts 1.5.0

Added

  • Data Streams billing mechanism toggle in DataStreamsLocalSimulator.sol
  • enableOffChainBilling() and enableOnChainBilling() functions
  • getBillingMechanism() helper function
  • Developer-friendly error messages for billing mechanism mismatches
  • Comprehensive test suite for billing mechanisms
  • Trusted publishing workflow with OIDC authentication
  • Automatic version and branch validation in CI/CD

Changed

  • Bumped @chainlink/contracts-ccip to 1.6.2 version
  • Bumped @chainlink/contracts to 1.5.0 version
  • Updated import paths to use vendored OpenZeppelin contracts
  • Enhanced configuration() function to return current fee manager state
  • Unified publish workflows into single automated workflow

Fixed

  • Fixed Hardhat 2 compilation issues by vendoring OpenZeppelin contracts
  • Fixed import path issues that occurred with updated dependency versions

Basic usage

This PR adds support for toggling between on-chain and off-chain billing mechanisms in the DataStreamsLocalSimulator contract.

// Existing users - no changes needed!
DataStreamsLocalSimulator simulator = new DataStreamsLocalSimulator();
// Defaults to an old on-chain billing (existing behavior)

// For a new off-chain billing
simulator.enableOffChainBilling();

// Switch back to on-chain billing if needed
simulator.enableOnChainBilling();

// User contracts can check current state
address feeManager = address(verifierProxy.s_feeManager());
if (feeManager != address(0)) {
    // On-chain billing active
} else {
    // Off-chain billing active
}

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

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

import {CCIPLocalSimulator} from "@chainlink/local/src/ccip/CCIPLocalSimulator.sol";

Remix IDE

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

import {CCIPLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.7-beta.0/src/ccip/CCIPLocalSimulator.sol";

PRs included

Full Changelog: v0.2.7-beta...v0.2.7-beta.0

v0.2.6

19 Sep 12:27
b6a8950

Choose a tag to compare

chainlink local logo

v0.2.6 Release - 18 September 2025

This release refactors CCIPLocalSimulatorFork.sol so it can deliver more than one message to more than one chain in a same call.

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.6.0
@chainlink/contracts 1.4.0

Added

  • Added switchChainAndRouteMessage(uint256[] memory chainIds) function which is an overlap of already existing switchChainAndRouteMessage(chainId) in the CCIPLocalSimulatorFork.sol contract. This new function can be used to route multiple CCIP messages to multiple chains in a single call.

Changed

  • Refactored CCIPLocalSimulatorFork.sol so it can route all CCIP messages sent from a loop and not just the first one

Basic usage

The main change is that now one can:

  • Simulate sending one message to destination chain (was already possible)
  • Simulate sending multiple messages to a single destination chain at once
  • Simulate sending multiple messages to multiple destination chains at once

We accomplished that by introducing the new switchChainAndRouteMessage(uint256[] forkIds) function which is an overlap of an existing switchChainAndRouteMessage(uint256 forkId) function.

How to use it?

  • Simulate sending one message to destination chain (was already possible)
    • => call switchChainAndRouteMessage(uint256 forkId)
  • Simulate sending multiple messages to a single destination chain at once
    • => call switchChainAndRouteMessage(uint256 forkId) (it will deliver all messages, not just the first one)
  • Simulate sending multiple messages to multiple destination chains at once
    • => call switchChainAndRouteMessage(uint256[] forkIds) (one can pass chains A, B, C here, it will deliver all messages to their target chains without duplication)

Basically no matter when one calls it, it will loop through all unprocessed CCIP messages and try to deliver them to appropriate destination chains. However, keep in mind that if one doesn’t pass correct forkIds, undelivered messages would be lost due to nature of Foundry.

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "@chainlink/local/src/ccip/CCIPLocalSimulator.sol";

Remix IDE

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.6/src/ccip/CCIPLocalSimulator.sol";

PRs included

Full Changelog: v0.2.5...v0.2.6

v0.2.6-beta.0

10 Sep 21:43
c71aa37

Choose a tag to compare

v0.2.6-beta.0 Pre-release
Pre-release

chainlink local logo

v0.2.6-beta.0 Release - 10 September 2025

This release refactors CCIPLocalSimulatorFork.sol so it can deliver more than one message to more than one chain in a same call.

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.6.0
@chainlink/contracts 1.4.0

Services

  • Chainlink CCIP v1.6

Changed

  • Refactored CCIPLocalSimulatorFork.sol to deliver more than one message to more than one chain in a same call

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "@chainlink/local/src/ccip/CCIPLocalSimulator.sol";

Remix IDE

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.6-beta.0/src/ccip/CCIPLocalSimulator.sol";

PRs included

  • CCIP Fork: Route multiple messages to multiple chains at once by @andrejrakic in #45

Full Changelog: v0.2.6-beta...v0.2.6-beta.0

v0.2.6-beta

11 Jun 12:03
0769abf

Choose a tag to compare

v0.2.6-beta Pre-release
Pre-release

chainlink local logo

v0.2.6-beta Release - 11 June 2025

This release refactors CCIPLocalSimulatorFork.sol so it can route all CCIP messages sent from a loop and not just the first one.

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.6.0
@chainlink/contracts 1.4.0

Services

  • Chainlink CCIP v1.6

Changed

  • Refactored CCIPLocalSimulatorFork.sol so it can route all CCIP messages sent
    from a loop and not just the first one

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "@chainlink/local/src/ccip/CCIPLocalSimulator.sol";

Remix IDE

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.6-beta/src/ccip/CCIPLocalSimulator.sol";

PRs included

Full Changelog: v0.2.5...v0.2.6-beta

v0.2.5

10 Jun 15:04
e0954c8

Choose a tag to compare

chainlink local logo

v0.2.5 Release - 10 June 2025

This release adds support for Chainlink CCIP v1.6 (excluding SVM) to Chainlink Local

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.6.0
@chainlink/contracts 1.4.0

Services

  • Chainlink CCIP v1.6

Added

  • Added support for Chainlink CCIP v1.6

Changed

  • Bumped @chainlink/contracts-ccip to 1.6.0 version
  • Bumped @chainlink/contracts to 1.4.0 version

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "@chainlink/local/src/ccip/CCIPLocalSimulator.sol";

Remix IDE

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.5/src/ccip/CCIPLocalSimulator.sol";

Full Changelog: v0.2.4...v0.2.5

v0.2.5-beta.0

20 May 17:04
9fbeafb

Choose a tag to compare

v0.2.5-beta.0 Pre-release
Pre-release

chainlink local logo

v0.2.5-beta.0 Release - 20 May 2025

This release bumps @chainlink/contracts package version to v1.4.0 and @chainlink/contracts-ccip package version to v1.6.0.

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.6.0
@chainlink/contracts 1.4.0

Services

  • Chainlink CCIP v1.6

Changed

  • Bumped @chainlink/contracts-ccip to 1.6.0 version
  • Bumped @chainlink/contracts to 1.4.0 version

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "@chainlink/local/src/ccip/CCIPLocalSimulator.sol";

Remix IDE

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.5-beta.0/src/ccip/CCIPLocalSimulator.sol";

Full Changelog: v0.2.5-beta...v0.2.5-beta.0

v0.2.5-beta

14 May 18:43
b429481

Choose a tag to compare

v0.2.5-beta Pre-release
Pre-release

chainlink local logo

v0.2.5-beta Release - 14 May 2025

This release adds beta support for Chainlink CCIP v1.6 to Chainlink Local

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.6.0-beta.3
@chainlink/contracts 1.4.0-beta.0

Services

  • Chainlink CCIP v1.6

Added

  • Added support for Chainlink CCIP v1.6

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "@chainlink/local/src/ccip/CCIPLocalSimulator.sol";

Remix IDE

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

import {CCIPLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.5-beta/src/ccip/CCIPLocalSimulator.sol";

Full Changelog: v0.2.4...v0.2.5-beta

v0.2.4

25 Mar 13:54
e06bc40

Choose a tag to compare

chainlink local logo

v0.2.4 Release - 25 March 2025

This release adds support for Data Streams to Chainlink Local

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.5.1-beta.0
@chainlink/contracts 1.3.0

Services

  • Chainlink CCIP
  • Chainlink CCIP v1.5
  • Chainlink Data Feeds
  • Chainlink Data Streams
  • Chainlink Automation
  • Chainlink VRF 2
  • Chainlink VRF 2.5

Added

  • Added full support for Data Streams by adding DataStreamsLocalSimulator.sol
    (Foundry/Hardhat/Remix IDE local mode), DataStreamsLocalSimulatorFork.sol
    (Foundry forked mode), DataStreamsLocalSimulatorFork.js (Hardhat forked
    mode) and MockReportGenerator.sol & MockReportGenerator.js to mock
    generating unverified reports by Data Streams DON for local modes in Foundry
    and Hardhat respectively.
  • Instructions to install Chainlink Local using Soldeer

Changed

  • Bumped @chainlink/contracts to 1.3.0 version
  • Started returning raw Report structs from generateReportV2,
    generateReportV3 andgenerateReportV4 functions alongside the
    signedReport bytes blob which is already returned

Basic usage

Here's how you can test and simulate locally the basic Data Streams example from the Chainlink Official Documentation.

Foundry

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

import {Test, console2} from "forge-std/Test.sol";
import {
    DataStreamsLocalSimulator,
    MockVerifierProxy
} from "@chainlink/local/src/data-streams/DataStreamsLocalSimulator.sol";
import {MockReportGenerator} from "@chainlink/local/src/data-streams/MockReportGenerator.sol";

import {ClientReportsVerifier} from "../../../src/test/data-streams/ClientReportsVerifier.sol";

contract ClientReportsVerifierTest is Test {
    DataStreamsLocalSimulator public dataStreamsLocalSimulator;
    MockReportGenerator public mockReportGenerator;

    ClientReportsVerifier public consumer;
    int192 initialPrice;

    function setUp() public {
        dataStreamsLocalSimulator = new DataStreamsLocalSimulator();
        (,,, MockVerifierProxy mockVerifierProxy_,,) = dataStreamsLocalSimulator.configuration();

        initialPrice = 1 ether;
        mockReportGenerator = new MockReportGenerator(initialPrice);

        consumer = new ClientReportsVerifier(address(mockVerifierProxy_));
    }

    function test_smoke() public {
        mockReportGenerator.updateFees(1 ether, 0.5 ether);
        bytes memory signedReportV3 = mockReportGenerator.generateReportV3();

        dataStreamsLocalSimulator.requestLinkFromFaucet(address(consumer), 1 ether);

        consumer.verifyReport(signedReportV3);

        int192 lastDecodedPrice = consumer.lastDecodedPrice();
        assertEq(lastDecodedPrice, initialPrice);
    }
}

Hardhat

import { loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers";
import { ethers } from "hardhat";
import { assert } from "chai";
import { MockReportGenerator } from "@chainlink/local/scripts/data-streams/MockReportGenerator";

describe("ClientReportsVerifier", function () {

    async function deploy() {
        const localSimulatorFactory = await ethers.getContractFactory("DataStreamsLocalSimulator");
        const localSimulator = await localSimulatorFactory.deploy();

        const config: {
            wrappedNative_: string;
            linkToken_: string;
            mockVerifier_: string;
            mockVerifierProxy_: string;
            mockFeeManager_: string;
            mockRewardManager_: string;
        } = await localSimulator.configuration();

        const initialPrice = ethers.parseEther("1");
        const mockReportGenerator = new MockReportGenerator(initialPrice);

        const consumerFactory = await ethers.getContractFactory("ClientReportsVerifier");
        const consumer = await consumerFactory.deploy(config.mockVerifierProxy_);

        await mockReportGenerator.updateFees(ethers.parseEther("1"), ethers.parseEther("0.5"));

        await localSimulator.requestLinkFromFaucet(consumer.target, ethers.parseEther("1"));

        // const mockFeeManager = await ethers.getContractAt("MockFeeManager", config.mockFeeManager_);
        // await mockFeeManager.setMockDiscount(consumer.target, ethers.parseEther("1")); // 1e18 => 100% discount on fees

        return { consumer, initialPrice, mockReportGenerator };
    }

    it("should verify Data Streams report", async function () {
        const { consumer, initialPrice, mockReportGenerator } = await loadFixture(deploy);

        const unverifiedReport = await mockReportGenerator.generateReportV3();

        await consumer.verifyReport(unverifiedReport);

        const lastDecodedPrice = await consumer.lastDecodedPrice();
        assert(lastDecodedPrice === initialPrice);
    });
});

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

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

import {DataStreamsLocalSimulator} from "@chainlink/local/src/data-streams/DataStreamsLocalSimulator.sol";

Remix IDE

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

import {DataStreamsLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.4/src/data-streams/DataStreamsLocalSimulator.sol";

PRs included

New contributors

Full Changelog: v0.2.3...v0.2.4

v0.2.4-beta.1

23 Feb 23:21
eb2fca7

Choose a tag to compare

v0.2.4-beta.1 Pre-release
Pre-release

chainlink local logo

v0.2.4-beta.1 Release - 24 February 2025

This release fixes import path that causes installation issues.

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.5.1-beta.0
@chainlink/contracts 1.3.0

Services

  • Chainlink CCIP
  • Chainlink CCIP v1.5
  • Chainlink Data Feeds
  • Chainlink Data Streams
  • Chainlink Automation
  • Chainlink VRF 2
  • Chainlink VRF 2.5

Changed

  • Fixed incorrect import path for Math.sol in MockFeeManager.sol

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

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

import {DataStreamsLocalSimulator} from "@chainlink/local/src/data-streams/DataStreamsLocalSimulator.sol";

Remix IDE

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

import {DataStreamsLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.4-beta.1/src/data-streams/DataStreamsLocalSimulator.sol";

PRs included

Full Changelog: v0.2.4-beta.0...v0.2.4-beta.1

v0.2.4-beta.0

23 Feb 22:58
649b3b9

Choose a tag to compare

v0.2.4-beta.0 Pre-release
Pre-release

chainlink local logo

v0.2.4-beta.0 Release - 23 February 2025

This release includes couple of minor fixes found during the testing of Data Streams integration.

Changelog

Dependencies

Package Version
@chainlink/contracts-ccip 1.5.1-beta.0
@chainlink/contracts 1.3.0

Services

  • Chainlink CCIP
  • Chainlink CCIP v1.5
  • Chainlink Data Feeds
  • Chainlink Data Streams
  • Chainlink Automation
  • Chainlink VRF 2
  • Chainlink VRF 2.5

Added

  • Instructions to install Chainlink Local using Soldeer

Changed

  • Bumped @chainlink/contracts to 1.3.0 version
  • Started returning raw Report structs from generateReportV2,
    generateReportV3 andgenerateReportV4 functions alongside the
    signedReport bytes blob which is already returned

Testing the release

To test this release install @chainlink-local using the following commands:

Foundry (git)

forge install smartcontractkit/[email protected]

and then set remappings to: @chainlink/local/=lib/chainlink-local/ in either remappings.txt or foundry.toml file

Hardhat (npm)

npm install @chainlink/[email protected]

and then create the following contract and compile it:

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

import {DataStreamsLocalSimulator} from "@chainlink/local/src/data-streams/DataStreamsLocalSimulator.sol";

Remix IDE

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

import {DataStreamsLocalSimulator} from "https://github.com/smartcontractkit/chainlink-local/blob/v0.2.4-beta.0/src/data-streams/DataStreamsLocalSimulator.sol";

PRs included

New Contributors

Full Changelog: v0.2.4-beta...v0.2.4-beta.0