Skip to content

v0.3.0 Release - #73

Merged
andrejrakic merged 56 commits into
mainfrom
develop
Oct 5, 2026
Merged

andrejrakic merged 56 commits into
mainfrom
develop

Conversation

@andrejrakic

@andrejrakic andrejrakic commented Oct 5, 2026 •

Copy link
Copy Markdown
Collaborator

Promotes develop to main for the v0.3.0 stable release (Chainlink Local V3). 0.3.0-beta.0 was published and tested; no code changes since, only the release prep from #72 (version bump, CHANGELOG 0.3.0 entry, README install instructions and GenericExtraArgsV3 example).

See the 0.3.0 and 0.3.0-beta entries in CHANGELOG.md for the full list of changes and the 0.2.x -> 0.3.0 migration guide. Hardhat 2 users stay on 0.2.x.

Merge instructions

⚠️ Use "Create a merge commit", not squash. Squashing re-creates the main/develop divergence that caused conflicts for this release.

After merge: GitHub release v0.3.0 targeting main (pre-release off) triggers the npm publish (latest -> 0.3.0).

andrejrakic and others added 30 commits June 8, 2024 17:16
…axAnswer functions. Add functionality to MockV3Aggregator to change underlying aggregator
* feat: Add new changes to support CCIP v1.5 version

* forge: Update ccip
…tnet lanes. Prepare for 0.2.2-beta.0 release (#21)
…hainAndRouteMessage function of CCIPLocalSimulatorFork (#23)
- Bump @chainlink/contracts-ccip to v1.5.0
- Delete DOCUMENTATION.md and related assets, and point to official documentation at README
- Update CHANGELOG
* feat: Add mock data streams contracts

* feat: smoke test data streams in local mode in Foundry with docs examples

* feat: Add GMX-like test example

* feat: Add DataStreamsLocalSimulatorFork implemented in both Solidity and JavaScript

* feat: Add MockReportGenerator.js to support local mode in Hardhat; Support Forking mode in Hardhat

* chore: Prepare for 0.2.4-beta release

* chore: Generate docs artifacts
…er) with chainlink-local versioning (#31)

Co-authored-by: emanherawy <eman.herawy@gmaail.com>
* chore: Bumped @chainlink/contracts to 1.3.0. Started returning raw report structs from generateReportV- functions which is handful for tests

* chore: Generate docs artifacts for this adjustment
* chore: Bumped @chainlink/contracts to 1.3.0. Started returning raw report structs from generateReportV- functions which is handful for tests

* chore: Generate docs artifacts for this adjustment

* fix: Year should be 2025 instead of 2024
* fix: Fix incorrect import path

* chore: Prepared changelog and package.json for v0.2.4-beta.1 release
* feat: Add support for CCIP v1.6

* chore: Removed lib/ccip and lib/chainlink-brownie-contracts dependencies

* fix: Accept copilot's suggestions
…o v1.4.0 and @chainlink/contracts-ccip to v1.6.0
* fix: Refactored CCIPLocalSimulatorFork.sol so it can route all CCIP messages sent from a loop and not just the first one

* fix: Correct loop variable k
* fix: Refactor switchChainAndRouteMessage to deliver more than 1 message to more than 1 chain in a same call

* chore: Ran `npm run generate-docs`

* fix: Correct offRamp index in executeSingleMessage call in CCIPLocalSimulatorFork
andrejrakic and others added 21 commits October 10, 2025 01:36
* feat: Implement fee manager toggle for on-chain and off-chain billing in DataStreamsLocalSimulator

* feat: Add developer friendly error messages when wrong Data Streams billing mechanism is used

* fix: Vendor Chainlink contracts that caused compilation issues with Hardhat 2

* chore: Merge publishing beta releases into a single workflow file
* Added script to update Register.sol

- Added script to query CCIP API and update Register.sol constructor
- Updated Register.sol with latest contents

* Added npm scripts

- Added npm script to update the register contract
- Added pre script that updates the register contract whenever generate-docs is called

* Include both testnet and mainnet networks in ccip register.sol

- Updated updateRegisterContract.js to include both mainnet and testnet networks in Register.sol
- Updated Register.sol with latest contents for both mainnet and testnet networks
- Updated package.json scripts to reflect the changes

* chore: Prepare for 0.2.8-beta release

---------

Co-authored-by: andrejrakic <andrej.rakic@smartcontract.com>
Modified the updateRegisterContract helper to use a base url from env variables. Includes new helper function to construct apiUrl from path and parameters.

Base url can be set with: CCIP_API_BASE_URL=<base_url>

Commit includes update to Register contract.
* fix: Use abi.encode for v1.6 message sender in CCIPLocalSimulatorFork

fix: Use abi.encode for v1.6 message sender in CCIPLocalSimulatorFork

`_executePostV1dot6` built `Internal.Any2EVMRampMessage.sender` with
`abi.encodePacked(address)` (20 bytes). Production v1.6 lanes with an EVM
source chain deliver it as `abi.encode(address)` (32-byte word), which is
what `Client.Any2EVMMessage.sender` documents ("abi.decode(sender) if
coming from an EVM chain") and what the OffRamp passes straight through to
the receiver.

The 20-byte form broke receivers two ways during fork testing: an
`abi.decode(message.sender, (address))` reverted, and a raw-bytes
comparison against `abi.encode(trustedRemote)` fell through to the
untrusted-sender branch.

This completes the 20-vs-32-byte encoding corrections made in 0.2.9 for
`receiver` and `destTokenAddress`, and restores parity with local mode,
where `MockCCIPRouter` already uses `abi.encode(msg.sender)`.

Adds a unit regression test that drives `_executePostV1dot6` against a
recording OffRamp mock and asserts the delivered `sender` is 32 bytes and
decodes back to the original address. Verified non-vacuous: it fails with
`20 != 32` without the fix.

Closes #62

* test: Assert v1.6 sender matches an encoded trusted remote

Receivers consume `Client.Any2EVMMessage.sender` in two ways, and they fail
differently when it arrives as 20 packed bytes instead of a 32-byte ABI word:

- `abi.decode(sender, (address))` reverts, so the message is never delivered.
- `keccak256(sender) == keccak256(abi.encode(trustedRemote))` returns false,
  so the receiver runs without error and silently takes its untrusted-sender
  branch

The existing assertions covered only the first. This pins the raw-bytes
comparison as well, so both documented consumption patterns are checked
against the bytes `_executePostV1dot6` actually produces.
* DEVREL 147: Migrate to HH3 (#53)

* refactor: Migrate to HH3, update dependencies, delete vendor folder

* feat: Add ExtraArgsV3 test

* feat: Adapt CCIPLocalSimulatorFork to be backwards compatible with all CCIP versions

* feat: Add tests for scenarios around ExtraArgsV3

* chore: Use MockVerifier in CCVs tests; Fix LooperFork test

* feat: Add CCT related tests

* devrel-207: fix publishing beta release workflow

* chore: Improve generate-docs script by removing external rimraf and solidity-docgen dependencies and relying on forge docs instead plus some scripts to keep the formatting bacwards compatible

* devrel-206: Create AGENTS.md file

* fix: Remove --no-commit flag from AGENTS.md

* refactor: Replace requireFinality bool with setMinBlockDepth

* chore: Extract release workflow into .agent/playbooks

* feat: route CCIP 2.0 messages with OffRamp-derived CCV selection

Adds V2VerificationMode.OFFRAMP_DERIVED: the required CCV list comes from the
destination OffRamp (getCCVsForMessage) and the raw encoded message is executed
through the permissionless execute entrypoint, so fork routing does not depend
on the local MessageV1 codec. Keeps V2 fork tests working when the on-chain wire
format moves ahead of the pinned chainlink-ccip (today: finality uint16 -> bytes4,
chainlink-ccip #1898).

- CCIPLocalSimulatorFork: new mode + _routeV2MessageOffRampDerived /
  _executeOffRampDerivedV2; destination chain resolved from the event topics with
  no MessageV1 decode; falls back across candidate OffRamps and marks processed
  only on success.
- Fork-only test helpers ported onto V3: getOffRampForLane, setLaneDefaultCCVs,
  IOffRampSourceConfigV2Fork, plus the CCVNoOpVerifier test double.
- IOffRampExecuteV2 gains the bytes-based execute entrypoint.
- New e2e: test/e2e/ccip/CCIPv2Fork.t.sol (Sepolia -> Arb Sepolia message and
  token transfer over the live 2.0 lane with a no-op default CCV).
- Unit 42/42; live e2e 2/2 with public RPCs.

* feat!: support CCIP 2.0 in Chainlink Local (V3)

- Pin chainlink-ccip to contracts-ccip-v2.0.0 and @chainlink/contracts-ccip
  to 2.0.0; migrate finality to bytes4 FinalityCodec (extraArgs V3,
  receivers, pools, test helpers).
- CCIPLocalSimulatorFork: make OFFRAMP_DERIVED (magiodev-cll#3)
  the default V2 mode; mark processed only on SUCCESS, execute only the lane
  OffRamp, honour the NO_EXEC queue, synthetic results for resolver CCVs.
- Fix the OffRamp lookup reverting on mixed-era router lists: dispatch on
  typeAndVersion, isolate every decode, skip unknown shapes.
- Route dedicated CCIP 2.0 routers (getCCIPV2RouterAddress /
  setCCIPV2RouterAddress; Sepolia and Fuji seeded).
- Local mode: CCIPLocalRouter enforces CCIP 2.0 receiver finality for
  Fast Transfers.
- Hardhat 3 JS helpers: CCIP (all eras) and Data Streams rebuilt as ESM
  taking a network connection; fix npm files casing.
- Remove dead code: abi/*.json (no longer shipped), Hardhat 2 examples and
  .spec.ts tests, duplicate IRouterFork.OffRamp and _decodeEVMAddress.
- evm_version = cancun; version 0.3.0-beta.0.
- Tests: unit tests for lookup, V2 routing and local finality; fork suites
  for Sepolia<->Fuji 2.0, mainnet 2.0, pinned-block 1.6; Hardhat 3 JS tests.
- Docs: CHANGELOG (breaking changes, support matrix, migration, known
  limitations), README, AGENTS.md, api_reference.

BREAKING CHANGE: see CHANGELOG.md "Breaking changes", "Removed" and
"Migration guide".

* chore: forge fmt

* feat: harden CCIP 2.0 routing, JS helper and packaging for 0.3.0-beta

- Fork routing: CCV quorum selection, 1.6 destination filter, strict routing
  with getMessageStatus, per-destination routing (QUEUED until its fork is
  routed), stamped OffRamp preference, resolver re-check after fork resets,
  zero token gas overrides, destination fork selected after routing
- Register data generated into code; simulator deploys in ~14.4M gas
- Register regenerated from the CCIP directory API (134 chains); wrapped native
  token selection fixed (was GHO on Ethereum, Sepolia, Arbitrum, Base)
- Local router: CCIP 2.0 OnRamp/OffRamp rules, unique messageIds,
  MessageGasLimitTooHigh above uint32
- Hardhat 3 JS helper: 1.6 destination check, decoded execution errors,
  TypeScript declarations, offline unit tests
- npm packaging for Hardhat 3 / Foundry consumers; chainlink-ccip pinned to
  contracts-ccip-v2.0.0
- CI workflow with tarball consumer smoke test

BREAKING CHANGE: see CHANGELOG "Breaking changes" and migration guide.

* fix: widen MessageV1 onRamp length before offset arithmetic

* chore: release 0.3.0-beta changelog

---------

Co-authored-by: Stefano Magini <265085634+magiodev-cll@users.noreply.github.com>
#69)

* fix: split Register network details into data shards (EIP-170)

Register's built-in network details are generated into readable RegisterData0..N shards placed with vm.etch, so every generated contract runtime stays under the EIP-170 limit for consumers that size-gate artifacts. Register keeps the override storage and dispatches lookups to the shards.

* refactor: enforce IRegisterDataShard in generated shards

Also drop the unused buildShards export and fold the built-in details unit test into the multi-shard decode test.
chore: prepare repo for v0.3.0 release
@andrejrakic
andrejrakic requested a review from a team as a code owner October 5, 2026 15:28
Comment thread .github/workflows/test.yml Fixed
Comment thread .github/workflows/test.yml Fixed
Comment thread .github/workflows/test.yml Fixed
Comment thread .github/workflows/test.yml Fixed
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown

👋 andrejrakic, thanks for creating this pull request!

To help reviewers, please consider creating future PRs as drafts first. This allows you to self-review and make any final changes before notifying the team.

Once you're ready, you can mark it as "Ready for review" to request feedback. Thanks!

@andrejrakic
andrejrakic marked this pull request as draft October 5, 2026 15:34
@andrejrakic
andrejrakic marked this pull request as ready for review October 5, 2026 15:42
@andrejrakic
andrejrakic merged commit 5e63b91 into main Oct 5, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants