Releases: smartcontractkit/chainlink-local
v0.2.7-beta.0
v0.2.7-beta.0 Release - 9 October 2025
This release adds support for a new Data Streams billing mechanism.
@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()
andenableOnChainBilling()
functionsgetBillingMechanism()
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
to1.6.2
version - Bumped
@chainlink/contracts
to1.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
- DEVREL-144 : Data Streams billing mechanism by @andrejrakic in #47
Full Changelog: v0.2.7-beta...v0.2.7-beta.0
v0.2.6
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 existingswitchChainAndRouteMessage(chainId)
in theCCIPLocalSimulatorFork.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)
- => call
- 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)
- => call
- 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)
- => call
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
- Add codeowners file by @andrejrakic in #44
- 0.2.6 Release by @andrejrakic in #46
Full Changelog: v0.2.5...v0.2.6
v0.2.6-beta.0
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
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
- V0.2.6-beta release by @andrejrakic in #41
Full Changelog: v0.2.5...v0.2.6-beta
v0.2.5
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
to1.6.0
version - Bumped
@chainlink/contracts
to1.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
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
to1.6.0
version - Bumped
@chainlink/contracts
to1.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
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
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) andMockReportGenerator.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
to1.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
- Update LICENSE details by @andrejrakic in #27
- Support for Chainlink Data Streams by @andrejrakic in #25
- Update README to include installation instructions for Foundry (soldeer by @EmanHerawy in #31
- Data Streams fixes - v0.2.4-beta.0 release candidate by @andrejrakic in #34
- Fix year in CHANGELOG by @andrejrakic in #35
- fix: Fix incorrect import path by @andrejrakic in #36
- 0.2.4 Release - Support for Data Streams by @andrejrakic in #37
New contributors
- @EmanHerawy made their first contribution in #31
Full Changelog: v0.2.3...v0.2.4
v0.2.4-beta.1
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
inMockFeeManager.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
- fix: Fix incorrect import path by @andrejrakic in #36
Full Changelog: v0.2.4-beta.0...v0.2.4-beta.1
v0.2.4-beta.0
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
to1.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
- Update README to include installation instructions for Foundry (soldeer by @EmanHerawy in #31
- Data Streams fixes - v0.2.4-beta.0 release candidate by @andrejrakic in #34
- Fix year in CHANGELOG by @andrejrakic in #35
New Contributors
- @EmanHerawy made their first contribution in #31
Full Changelog: v0.2.4-beta...v0.2.4-beta.0