Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions .github/workflows/build-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,45 @@ jobs:
products: |
ccip-prereleases-prod-testnet

# Upgrade compatibility tests
df1-compat:
uses: ./.github/workflows/devenv-compat.yml
name: Data Feeds v1 Upgrade Test
needs: [docker-core]
with:
buildcmd: "just cli"
envcmd: "cl u env.toml,products/ocr2/basic.toml"
testcmd: "cl test ocr2 TestSmoke/rounds"
upgrade-nodes: "3"
node-name-template: "don-node%d"
versions-back: "2"
# uncomment once we have tested this pipeline with beta/rc releases
# exclude-refs: "beta,rc"
working-directory: "devenv"
logs-directory: "./devenv/tests/ocr2/logs"
ctf-log-level: "info"
strip-image-suffix: "v"
secrets: inherit

cre-compat:
uses: ./.github/workflows/devenv-compat.yml
name: CRE Upgrade Test
needs: [docker-core]
with:
buildcmd: "echo nothing-to-build" # added to prevent `just cli` from being used (default buildcmd if not provided)
envcmd: "go run -C ../../core/scripts/cre/environment . env start"
testcmd: "go test -v -run Test_Upgrade_Suite ./smoke/cre"
upgrade-nodes: "3"
node-name-template: "workflow-node%d"
versions-back: "2"
# uncomment once we have tested this pipeline with beta/rc releases
# exclude-refs: "beta,rc"
working-directory: "./system-tests/tests"
logs-directory: "./system-tests/tests/smoke/cre/logs"
ctf-log-level: "info"
strip-image-suffix: "v"
secrets: inherit

# Notify Slack channel for new git tags associated with pre-releases.
# Final release notifications originate from the release coordinator repo.
slack-notify:
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/cre-soak-memory-leak.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
environment:
name: integration
deployment: false
runs-on: runs-on=${{ github.run_id }}/cpu=8+16/ram=32+64/family=c6id+m6id+m6idn/spot=false/image=ubuntu24-full-x64/extras=s3-cache
runs-on: runs-on=${{ github.run_id }}/cpu=32/ram=128/family=m6id+m6idn/spot=false/image=ubuntu24-full-x64/extras=s3-cache
timeout-minutes: 270 # 4h30m — test timeout is 4h20m
permissions:
contents: read
Expand All @@ -43,6 +43,7 @@ jobs:

steps:
- name: Enable S3 Cache for Self-Hosted Runners
if: ${{ env.RUNS_ON_INSTANCE_ID != '' && env.ACTIONS_CACHE_URL != '' }}
uses: runs-on/action@742bf56072eb4845a0f94b3394673e4903c90ff0 # v2.1.0
with:
metrics: cpu,network,memory,disk
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/devenv-compat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ on:
description: "Git refs to test, should be used only for tool testing purposes. In all other cases refs are detected automatically either from Git or RANE SOT"
required: false
type: string
exclude-refs:
description: "Patterns to exclude specific refs (e.g., beta,rc,v0,v1)"
required: false
type: string
buildcmd:
description: "Build command to run"
required: true
Expand Down Expand Up @@ -83,6 +87,7 @@ jobs:
PRODUCT: ${{ inputs.product }}
NO_GIT_ROLLBACK: ${{ inputs.no-git-rollback && '--no-git-rollback' || '' }} # Convert boolean to flag string
REFS: ${{ inputs.refs }}
EXCLUDE_REFS: ${{ inputs.exclude-refs }}
BUILD_CMD: ${{ inputs.buildcmd }}
ENV_CMD: ${{ inputs.envcmd }}
TEST_CMD: ${{ inputs.testcmd }}
Expand Down Expand Up @@ -175,13 +180,18 @@ jobs:
if [ -n "${{ env.REFS }}" ]; then
REFS_ARGS="--refs ${{ env.REFS }}"
fi
EXCLUDE_REFS_ARGS=""
if [ -n "${{ env.EXCLUDE_REFS }}" ]; then
EXCLUDE_REFS_ARGS="--exclude-refs ${{ env.EXCLUDE_REFS }}"
fi
./bin/ctf compat backward \
--registry "${REGISTRY}" \
--buildcmd "${BUILD_CMD}" \
--envcmd "${ENV_CMD}" \
--testcmd "${TEST_CMD}" \
--product "${PRODUCT}" \
${REFS_ARGS} \
${EXCLUDE_REFS_ARGS} \
--upgrade-nodes "${UPGRADE_NODES}" \
--don_nodes "${DON_NODES}" \
--node-name-template "${NODE_NAME_TEMPLATE}" \
Expand Down
44 changes: 42 additions & 2 deletions .github/workflows/devenv-nightly-compat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ on:
schedule:
- cron: "0 6 * * *" # Run daily at 6 AM
workflow_dispatch:
inputs:
refs:
description: "Git refs to test, should be used only if automatically detected refs are not enough"
required: false
type: string

permissions:
id-token: write
Expand All @@ -14,7 +19,7 @@ jobs:
# CREcluster compatibility and upgrade test
# TODO

# Data Feeds v1 upgrade test
# Data Feeds v1 upgrade test
# this verifies that all the versions existing in RANE SOT for Data Feeds v1 can be upgraded to the latest version
# TODO: disabled for now until we have connectivity
# df1-upgrade:
Expand All @@ -40,6 +45,7 @@ jobs:
# use it as an example project
df1-compat:
uses: ./.github/workflows/devenv-compat.yml
name: Data Feeds v1 Upgrade Test
with:
# bash command to build your environment, omit if you are using 'devenv'
buildcmd: "just cli"
Expand All @@ -49,10 +55,14 @@ jobs:
testcmd: "cl test ocr2 TestSmoke/rounds"
# number of CL nodes to upgrade with new version
upgrade-nodes: "3"
# cl node Docker cocntainer name template, omit if you are using 'devenv'
# cl node Docker container name template, omit if you are using 'devenv'
node-name-template: "don-node%d"
# previous versions to test (sorted by tags, SemVer)
versions-back: "2"
# patterns to exclude specific refs
exclude-refs: "beta,rc"
# Git refs to test, should be used only for tool testing purposes.
refs: ${{ github.event_name == 'workflow_dispatch' && inputs.refs || '' }}
# directory with your developer environment to run buildcmd and envcmd
working-directory: "devenv"
# directory for executing your tests, to run testcmd
Expand All @@ -62,3 +72,33 @@ jobs:
# this is needed to remove 'v' from Git tags to match SDLC ECR tags
strip-image-suffix: "v"
secrets: inherit

cre-compat:
uses: ./.github/workflows/devenv-compat.yml
name: CRE Upgrade Test
with:
# bash command to build your environment, omit if you are using 'devenv'
buildcmd: "echo nothing-to-build"
# bash command to spin up your environment and product orchestration
envcmd: "go run -C ../../core/scripts/cre/environment . env start"
# bash command to run the test verifying your product
testcmd: "go test -v -run Test_Upgrade_Suite ./smoke/cre"
# number of CL nodes to upgrade with new version
upgrade-nodes: "3"
# cl node Docker container name template, omit if you are using 'devenv'
node-name-template: "workflow-node%d"
# previous versions to test (sorted by tags, SemVer)
versions-back: "2"
# patterns to exclude specific refs
exclude-refs: "beta,rc"
# Git refs to test, should be used only for tool testing purposes.
refs: ${{ github.event_name == 'workflow_dispatch' && inputs.refs || '' }}
# directory with your developer environment to run buildcmd and envcmd
working-directory: "./system-tests/tests"
# directory for executing your tests, to run testcmd
logs-directory: "./system-tests/tests/smoke/cre/logs"
# CTF log level
ctf-log-level: "info"
# this is needed to remove 'v' from Git tags to match SDLC ECR tags
strip-image-suffix: "v"
secrets: inherit
3 changes: 2 additions & 1 deletion core/scripts/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ require (
github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260119171452-39c98c3b33cd
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260320153346-314ec8dbe5a4
github.com/smartcontractkit/chainlink-protos/job-distributor v0.18.0
github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.5
github.com/smartcontractkit/chainlink-testing-framework/framework v0.15.8
github.com/smartcontractkit/chainlink-testing-framework/framework/components/dockercompose v0.1.20
github.com/smartcontractkit/chainlink-testing-framework/lib v1.54.5
github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.5
Expand Down Expand Up @@ -488,6 +488,7 @@ require (
github.com/smartcontractkit/chain-selectors v1.0.97 // indirect
github.com/smartcontractkit/chainlink-aptos v0.0.0-20260318173523-755cafb24200 // indirect
github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm v0.0.0-20260323224438-d819cb3228e1 // indirect
github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment v0.0.0-20260317185256-d5f7db87ae70 // indirect
github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260310183131-8d0f0e383288 // indirect
github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260310183131-8d0f0e383288 // indirect
github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260317185256-d5f7db87ae70 // indirect
Expand Down
4 changes: 2 additions & 2 deletions core/scripts/go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions deployment/ccip/changeset/testhelpers/test_environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -848,8 +848,8 @@ func NewEnvironmentWithJobsAndContracts(t *testing.T, tEnv TestEnvironment) Depl
state, err := stateview.LoadOnchainState(e.Env, stateview.WithLoadLegacyContracts(true))
require.NoError(t, err)

err = state.ValidatePostDeploymentState(e.Env, !tEnv.TestConfigs().SkipDONConfiguration)
require.NoError(t, err)
chainErrs := state.ValidatePostDeploymentStateWithoutMCMSOwnership(e.Env, !tEnv.TestConfigs().SkipDONConfiguration)
require.Empty(t, chainErrs)

return e
}
Expand Down
40 changes: 6 additions & 34 deletions deployment/ccip/changeset/v1_6/cs_chain_contracts.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ import (
"github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal"
commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset"
"github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
"github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm"
cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
)

Expand Down Expand Up @@ -1738,40 +1737,13 @@ func isOCR3ConfigSetOnOffRamp(

// DefaultFeeQuoterDestChainConfig returns the default FeeQuoterDestChainConfig
// with the config enabled/disabled based on the configEnabled flag.
// Fee values are set based on the destination chain type:
// - Any → Ethereum: NetworkFee=50, TokenFee=150
// - Any → Solana: NetworkFee=10, TokenFee=35
// - Any → other: NetworkFee=10, TokenFee=25
// - Ethereum -> any: NetworkFee=50, TokenFee=50 ( Source-chain-dependent override that must be applied by the caller)
func DefaultFeeQuoterDestChainConfig(configEnabled bool, destChainSelector ...uint64) fee_quoter.FeeQuoterDestChainConfig {
familySelector, _ := hex.DecodeString(EVMFamilySelector) // evm
if len(destChainSelector) > 0 {
destFamily, _ := chain_selectors.GetSelectorFamily(destChainSelector[0])
switch destFamily {
case chain_selectors.FamilySolana:
familySelector, _ = hex.DecodeString(SVMFamilySelector) // solana
case chain_selectors.FamilyAptos:
familySelector, _ = hex.DecodeString(AptosFamilySelector) // aptos
case chain_selectors.FamilyTon:
familySelector, _ = hex.DecodeString(TVMFamilySelector) // ton
case chain_selectors.FamilySui:
familySelector, _ = hex.DecodeString(SuiFamilySelector) // Sui
}
}
return fee_quoter.FeeQuoterDestChainConfig{
IsEnabled: configEnabled,
MaxNumberOfTokensPerMsg: 10,
MaxDataBytes: 30_000,
MaxPerMsgGasLimit: 3_000_000,
DestGasOverhead: ccipevm.DestGasOverhead,
DefaultTokenFeeUSDCents: 25,
DestGasPerPayloadByteBase: ccipevm.CalldataGasPerByteBase,
DestGasPerPayloadByteHigh: ccipevm.CalldataGasPerByteHigh,
DestGasPerPayloadByteThreshold: ccipevm.CalldataGasPerByteThreshold,
DestDataAvailabilityOverheadGas: 100,
DestGasPerDataAvailabilityByte: 16,
DestDataAvailabilityMultiplierBps: 1,
DefaultTokenDestGasOverhead: 90_000,
DefaultTxGasLimit: 200_000,
GasMultiplierWeiPerEth: 11e17, // Gas multiplier in wei per eth is scaled by 1e18, so 11e17 is 1.1 = 110%
NetworkFeeUSDCents: 10,
ChainFamilySelector: [4]byte(familySelector),
}
return ccipops.DefaultFeeQuoterDestChainConfig(configEnabled, destChainSelector...)
}

type ApplyFeeTokensUpdatesConfig struct {
Expand Down
30 changes: 1 addition & 29 deletions deployment/ccip/changeset/v1_6/cs_update_bidirectional_lanes.go
Original file line number Diff line number Diff line change
Expand Up @@ -446,33 +446,5 @@ func resolveUpdateLanesFeeQuoterAddressAndVersion(
addresses []datastore.AddressRef,
chainSel uint64,
) (common.Address, semver.Version, error) {
// Find the FeeQuoter with the highest version for this chain
var bestRef datastore.AddressRef
var bestVersion *semver.Version

for _, ref := range addresses {
if ref.ChainSelector != chainSel {
continue
}
if ref.Type != datastore.ContractType(fqv2ops.ContractType) {
continue
}
if ref.Version == nil {
continue
}
if bestVersion == nil || ref.Version.GreaterThan(bestVersion) {
bestVersion = ref.Version
bestRef = ref
}
}

if bestVersion == nil {
return common.Address{}, semver.Version{}, fmt.Errorf("no fee quoter address found for chain %d", chainSel)
}

if !common.IsHexAddress(bestRef.Address) {
return common.Address{}, semver.Version{}, fmt.Errorf("invalid fee quoter address %q for chain %d", bestRef.Address, chainSel)
}

return common.HexToAddress(bestRef.Address), *bestVersion, nil
return shared.ResolveFeeQuoterAddressAndVersion(addresses, chainSel)
}
37 changes: 30 additions & 7 deletions deployment/ccip/operation/evm/v1_6/ops_fee_quoter.go
Original file line number Diff line number Diff line change
Expand Up @@ -199,26 +199,43 @@ const (
EVMFamilySelector = "2812d52c"
SVMFamilySelector = "1e10bdc4"
AptosFamilySelector = "ac77ffec"
TVMFamilySelector = "647e2ba9"
SuiFamilySelector = "c4e05953"
)

// DefaultFeeQuoterDestChainConfig returns the default FeeQuoter dest chain config.
// If destChainSelector is provided, family-specific values (ChainFamilySelector,
// NetworkFeeUSDCents, DefaultTokenFeeUSDCents) are set accordingly.
func DefaultFeeQuoterDestChainConfig(configEnabled bool, destChainSelector ...uint64) fee_quoter.FeeQuoterDestChainConfig {
familySelector, _ := hex.DecodeString(EVMFamilySelector) // evm
familySelector, _ := hex.DecodeString(EVMFamilySelector)
networkFeeUSDCents := uint32(10)
defaultTokenFeeUSDCents := uint16(25)
if len(destChainSelector) > 0 {
destFamily, _ := chain_selectors.GetSelectorFamily(destChainSelector[0])
switch destFamily {
case chain_selectors.FamilySolana:
familySelector, _ = hex.DecodeString(SVMFamilySelector) // solana
familySelector, _ = hex.DecodeString(SVMFamilySelector)
defaultTokenFeeUSDCents = 35
case chain_selectors.FamilyAptos:
familySelector, _ = hex.DecodeString(AptosFamilySelector) // aptos
familySelector, _ = hex.DecodeString(AptosFamilySelector)
case chain_selectors.FamilyTon:
familySelector, _ = hex.DecodeString(TVMFamilySelector)
case chain_selectors.FamilySui:
familySelector, _ = hex.DecodeString(SuiFamilySelector)
case chain_selectors.FamilyEVM:
if isEthereumChain(destChainSelector[0]) {
networkFeeUSDCents = 50
defaultTokenFeeUSDCents = 150
}
}
}
return fee_quoter.FeeQuoterDestChainConfig{
IsEnabled: configEnabled,
MaxNumberOfTokensPerMsg: 10,
MaxDataBytes: 30_000,
MaxPerMsgGasLimit: 3_000_000, // TODO: this needs to be updated based on RMN sig verification per chain?! 220/250K
MaxPerMsgGasLimit: 3_000_000,
DestGasOverhead: ccipevm.DestGasOverhead,
DefaultTokenFeeUSDCents: 25,
DefaultTokenFeeUSDCents: defaultTokenFeeUSDCents,
DestGasPerPayloadByteBase: ccipevm.CalldataGasPerByteBase,
DestGasPerPayloadByteHigh: ccipevm.CalldataGasPerByteHigh,
DestGasPerPayloadByteThreshold: ccipevm.CalldataGasPerByteThreshold,
Expand All @@ -227,9 +244,15 @@ func DefaultFeeQuoterDestChainConfig(configEnabled bool, destChainSelector ...ui
DestDataAvailabilityMultiplierBps: 1,
DefaultTokenDestGasOverhead: 90_000,
DefaultTxGasLimit: 200_000,
GasMultiplierWeiPerEth: 11e17, // Gas multiplier in wei per eth is scaled by 1e18, so 11e17 is 1.1 = 110%
NetworkFeeUSDCents: 10,
GasMultiplierWeiPerEth: 11e17,
NetworkFeeUSDCents: networkFeeUSDCents,
ChainFamilySelector: [4]byte(familySelector),
GasPriceStalenessThreshold: 90000,
}
}

func isEthereumChain(selector uint64) bool {
return selector == chain_selectors.ETHEREUM_MAINNET.Selector ||
selector == chain_selectors.ETHEREUM_TESTNET_SEPOLIA.Selector ||
selector == chain_selectors.ETHEREUM_TESTNET_HOODI.Selector
}
Loading
Loading