-
#14696
072bfb667a
Thanks @0xsuryansh! - #internal add getNextDonId() and getNodes(bytes32[] calldata p2pIds) in CapabilitiesRegistry and define interface for node infoPR issue: CCIP-3569
-
#14305
5ca0d1f19f
Thanks @DeividasK! - #added oracle support in standard capabilities -
#14308
3e9e058da4
Thanks @kidambisrinivas! - #added log-event-trigger LOOPP capability, using ChainReader -
#14741
89fcfea8a4
Thanks @amit-momin! - Added the compute unit limit estimation feature for the Solana TXM #added -
#14602
002296d9db
Thanks @dimriou! - Update dynamic fee types to align with geth #internal -
#14765
ca31213970
Thanks @graham-chainlink! - #updated support aptos creation in chain config UI -
#14651
8ca41fc8f7
Thanks @0xnogo! - #added Use ApplyDefaultsAndValidate -
#14536
4b977021ed
Thanks @jinhoonbang! - #wip implement gateway handler that forwards outgoing request from http target capability. introduce gateway http client -
#14622
c654322ace
Thanks @ilija42! - #internal Add support for data word detail manual input in Contract Reader for searching through EVM log event data with Contract Reader QueryKey ValueComparators. -
#14588
fc1fefcba7
Thanks @0xnogo! - #added Add RMNRemote in the chain reader definition -
#14857
b8ae4adcfc
Thanks @dimriou! - FHE empty reward fix #internal -
#14718
16499e5cb7
Thanks @graham-chainlink! - #updated introduce network field on chain resolver -
#14574
accbf0fe96
Thanks @reductionista! - #added LogPoller MaxLogsKept feature: recency count-based instead of time based log retention -
#14729
770d2bc9b0
Thanks @graham-chainlink! - #added Introduce aptosKeys Graphql query -
#14576
0e35bc794c
Thanks @aalu1418! - #added solana: compute unit limit configuration and transaction instruction -
#14661
9641ea29da
Thanks @emate! - #added Add prometheus metrics exposing health of telemetry client -
#14702
ca9fb64356
Thanks @dimriou! - Return ErrConnectivity error when halting bumping #internal -
#14706
f7abc3eb0e
Thanks @pavel-raykov! - #removed Removing unreferenced unused files. -
#14511
8fa9a67dfc
Thanks @silaslenihan! - #internal Updated QueryKey to be able to do advanced queries on contract event data words -
#14697
4c3e7ec8c3
Thanks @dimriou! - Fix TXM flakey test #internal -
#14620
09145baa9b
Thanks @Farber98! - add address bytes to string modifier to chainReader. #internal -
#13386
4b21c32e25
Thanks @DylanTinianov! - Implemented new chain agnostic MultiNode design along with the corresponding EVM implementation. The chain agnostic components enable Multinode to be integrated with Solana and other non-EVM chains. Previously the Multinode was coupled with EVM specific actions, and was called to execute these actions direclty. With this change, the MultiNode's responsibility has been simplified to focus on RPC selection along with performing health checks. Chain specific actions will instead be executed on the RPC directly after being selected by MultiNode. The Chain Agnostic MultiNode provides improved reliability and metrics for all chain integrations using it.These are following main components: Node: Common component which wraps an RPC with state information, health checks, and an alive loop to handle state changes along with maintaining chain information. RPCClient: Chain-specific RPC wrapper which implements required interface for MultiNode along with any chain-specific functionality needed. MultiNode: Perform RPCClient selection and performs health checks on all RPCs. TransactionSender: Chain agnostic component which broadcasts transactions to all healthy RPCs and aggregates results. A chain-specific error classifier must be implemented.
MultiNode picks the "best" RPC based on one of the configurable criteria:
- Priority defined in the config.
- Highest latest block.
- Round-robin within the same priority level (or using other configurable selection algorithms)
Benefits of Chain Agnostic MultiNode: Reliability: Improved RPC reliability scaleable to all chains Maintainability: Can apply changes across all chain integrations through the use of common code Extendability: Can add new health checks, RPC selection and ranking algorithms Integration Speed: Much faster to integrate MultiNode with new chains Reduced Generics: Significantly less bulky code!
#updated #changed #internal
-
#14629
4928e60ddf
Thanks @huangzhen1997! - Support Zircuit fraud transactions detection and zk overflow detection #added -
#14334
0ad624673f
Thanks @krehermann! - #added keystone contract deployment -
#14709
1560aa9167
Thanks @KuphJr! - Add encryptionPublicKey to CapabilitiesRegistry.sol -
#14364
5d96be59a2
Thanks @huangzhen1997! - Make websocket URLWSURL
forEVM.Nodes
optional, and apply logic so that:- If WS URL was not provided, SubscribeFilterLogs should fail with an explicit error
- If WS URL was not provided LogBroadcaster should be disabled #nops
-
#14789
5dfb13071e
Thanks @0xnogo! - #internal: Adding test for rmn home reader -
#14491
c6e6e213a6
Thanks @jinhoonbang! - #added HTTP target capability and gateway connector handler -
#14496
25c469880f
Thanks @cedric-cordenier! - Add compute capability #internal -
#14764
56d4b84cc2
Thanks @graham-chainlink! - #added introduce cosmosKeys and starknetKeys graphql query -
#14500
d435981038
Thanks @0xnogo! - #added Pass the home chain selector to the commit plugin factory -
#14564
8b01661e03
Thanks @momentmaker! - start of next release -
#14855
7cd384b945
Thanks @dimriou! - Rename SequenceAt to NonceAt #internal -
#14670
ad29b19612
Thanks @dimriou! - Fix BHE PriceMax bug #bugfix
- #14509
dbd42db9b8
Thanks @huangzhen1997! - Remove finality depth as the default value for minConfirmation for tx jobs. Update the sql query for fetching pending callback transactions: if minConfirmation is not null, we check difference if the current block - tx block > minConfirmation else we check if the tx block is <= finalizedBlock #updated - #14685
c5e9f932ca
Thanks @huangzhen1997! - The findBroadcastedAttempts in detectStuckTransactionsHeuristic can returns uninitialized struct that potentially cause nil pointer error. Changed the return type of findBroadcastedAttempts to be pointers and added nil pointer check. #bugfix - #14631
ad9398a8fd
Thanks @martin-cll! - Fix for Mercury transmitter decoding reports of a different codec version #internal - #14829
83c3a329b8
Thanks @asoliman92! - #added #fix add chain fee tests to initial deploy - #14798
26e22eb6cf
Thanks @0xsuryansh! - #internal Update gethwrapper for FeeQuoter, Internal.sol comment and byte calc update - #14558
133e347872
Thanks @dhaidashenko! - AddedEVM.HeadTracker.PersistenceEnabled
config option to disable persistence for HeadTracker. #added - #14719
de9ce674c6
Thanks @amit-momin! - Set chainType in chain client #internal - #14760
3af39c8032
Thanks @KuphJr! - Enable rotating encryptionPublicKey in CapabilitiesRegistry contract - #14835
468fc4cd35
Thanks @ogtownsend! - Add DA oracle type to arbitrum and zksync configs #bugfix - #14603
19690b0c44
Thanks @mateusz-sekara! - Implementing evm specific token data encoder for CCIP #internal - #14375
816b25c001
Thanks @vyzaldysanchez! - #updated Workflows Engine loop refactored - #14599
4ac405a6d5
Thanks @ogtownsend! - Refactor OP oracle to accept generic DA oracle config #wip - #14607
eec0ff9469
Thanks @winder! - #internal update ccip chainreader config. - #14693
03df8989e8
Thanks @ChrisAmora! - #updated Consume Feeds Manager WSRPC protos from Chainlink Protos Repository. - #14694
e9b3397f46
Thanks @mateusz-sekara! - Adjustments for usdc reader tests #internal - #14624
be774f00a9
Thanks @mateusz-sekara! - Registering USDC/CCTP events in the ChainReader during oracle creation #internal - #14534
de268e98b8
Thanks @huangzhen1997!- register polling subscription to avoid subscription leaking when rpc client gets closed.
- add a temporary special treatment for SubscribeNewHead before we replace it with SubscribeToHeads. Add a goroutine that forwards new head from poller to caller channel.
- fix a deadlock in poller, by using a new lock for subs slice in rpc client. #bugfix
- #14656
004a0de233
Thanks @dimkouv! - #added graceful shutdown for ccip oracles - #14720
4f8c55eb01
Thanks @vyzaldysanchez! - #updated Refactors store_db - #14530
2c16f46311
Thanks @Madalosso! - #updated default config values for FinalityTagEnabled to match CCIP configs - #14859
80b0501bee
Thanks @ma33r! - Added a custom client error message for Mantle to capture NonceTooLow error. #added - #14628
6ec5ab8315
Thanks @samsondav! - Implement blue-green Configurator contract and retirement report handover for LLO #added - #14743
d5dfe4af8c
Thanks @ogtownsend! - Rename DA oracle consts to be more descriptive #wip - #14734
ca71878aa5
Thanks @RyanRHall! - #added new config field to FeeQuoter - #14575
1b41e69cca
Thanks @DylanTinianov! - Bump chainlink-solana and fix tests #internal - #14668
dacb6a8c70
Thanks @winder! - #internal ccip contract reader config. - #14814
f708ebb094
Thanks @DylanTinianov! - Fix testWSServer issue causing panic in testing #internal - #14635
ee1d6e3b1a
Thanks @dhaidashenko! - Hedera chain type: broadcast transactions only to a single healthy RPC instead of all healthy RPCs to avoid redundant relay fees. #changed - #15031
6951f9e74a
Thanks @ogtownsend! - #bugfix Update DA oracle config struct members to pointers
-
#14316
2a21b170f3
Thanks @graham-chainlink! - #internal updated to latest operator-ui to bring in new UI changes for supporting multiple job distributors -
#14264
33e6a0c1e4
Thanks @chainchad! - Bump to start the next version -
#14109
2761cd5bc5
Thanks @Farber98! - FilteredLogs receive Expression instead of whole KeyFilter. #internal -
#14239
674eac31cc
Thanks @bolekk! - #added Implements rate limiter for capabilities dispatcher -
#14470
5885454e9a
Thanks @austinborn! - #changed: Add new OCR3DataFeeds telemetry type for Mercury jobs -
#14266
c323e0d600
Thanks @asoliman92! - #updated move latest capabilities code from ccip repo to chainlink repo [CCIP-2946]PR issue: CCIP-2946
-
#14197
7f69993c86
Thanks @graham-chainlink! - #changed Connect to multiple feeds managers on app start instead of just one (default to first) -
#14373
5acca3719e
Thanks @huangzhen1997! - This PR introduce few changes:- Add a new config option
EVM.NodePool.NewHeadsPollInterval
(0 by default indicate disabled), which is an interval for polling new block periodically using http client rather than subscribe to ws feed. - Updated new head handler for polling new head over http, and register the subscription in node lifecycle logic.
- If the polling new heads is enabled, WS new heads subscription will be replaced with the new http based polling.
Note: There will be another PR for making WS URL optional with some extra condition. #added
- Add a new config option
-
#14438
6814bcef45
Thanks @graham-chainlink! - #internal Update to latest UI - PeerId field is introduced for OCR2 bootstrap node in chain config page -
#14354
bf6618da8a
Thanks @huangzhen1997! - Adding feature flag forLogBroadcaster
calledLogBroadcasterEnabled
, which istrue
by default to support backwards compatibility. AddingLogBroadcasterEnabled
allows certain chains to completely disable theLogBroadcaster
feature, which is an old feature (getting replaced by logPoller) that only few products are using it:- OCR1 Median
- *OCR2 Median when ChainReader is disabled
- *pre-OCR2 Keeper
- Flux Monitor
- Direct RequestOCR1 Median
#added
-
#13735
920413c3ce
Thanks @silaslenihan! - #internal Added ChainWriter to ChainReader tests -
#14041
8d818ea265
Thanks @amit-momin! - Added gas limit estimation feature to EVM gas estimators. Introduced a new configEVM.GasEstimator.EstimateLimit
to toggle this feature. #added -
#14207
328b62ae50
Thanks @ilija42! - #internal Implement EVM ChainReader ValueComparator filtering by non-indexed event data. Right now only simple non indexed data where byte offsets don't exist is supported.PR issue: BCFR-203
-
#14197
7f69993c86
Thanks @graham-chainlink! - #changed Allow registration of more than 1 feeds manager on CreateFeedsManager -
#14394
28989b30d9
Thanks @ilija42! - #internal Implement LatestHead for ChainService -
#14234
a234e14ebd
Thanks @huangzhen1997! - use new estimation for insufficient fund instead of retry to overcome gas spike #internal -
#14369
e51472763d
Thanks @archseer! - Small fixes to multichain keyring adapter #internal -
#13833
1ea9f79793
Thanks @dimriou! - Introduce new gas estimator #internal -
#14110
8454f46db1
Thanks @jmank88! - #added Full Open Telemetry support, configurable viaTelemetry
-
#14504
10f7aabc29
Thanks @austinborn! - #bugfix Fix potential nil ptr reference for LinkFeedID and NativeFeedID in Mercury specs #bugfix Ensure Streams PluginConfig is checked for contents correctly when validated #changed New Feed IDs with 0x01 prefix can be parsed for Mercury report schemas -
#14370
882cdce681
Thanks @dimriou! - Remove PriceMin and TipCapMin check from attempt builder #internal -
#13888
37c5a2ff29
Thanks @karen-stepanyan! - #updated mercury plugin to consider PluginConfig as optional if EnableTriggerCapability relay config is true. Then if PluginConfig is nil, skip fetching latestPrice for linkFeedId and nativeFeedId.
-
#14350
070b272f30
Thanks @DeividasK! - #internal -
#14317
72f4cc8aaa
Thanks @ettec! - #internal changes required for capability api chance to sync -
#14471
a9a4f746bf
Thanks @matYang! - #changed Make Mantle use default OP stack l1 gas oracle in core -
#14416
3c5bdf8d4b
Thanks @dimkouv! - RMNCrypto evm implementation for CCIP - RMN Integration #added -
#14313
b71e692e7b
Thanks @ferglor! - Use a lock to sync access to the ConfigDigest #internal -
#14423
0187f18ba6
Thanks @asoliman92! - #updated refactor ccip oracle creator -
#14314
8fa3ebee3e
Thanks @DeividasK! - #internal validate capability trigger event ID before executing -
#14366
27d5cbf578
Thanks @dhaidashenko! - LogPoller polls logs even if chain have not reached finality #internal -
#14401
f6443a14e8
Thanks @george-dorin! - #updated Changed TelemetryIngress.UniConn default to false -
#14282
1a2b7b61cb
Thanks @amit-momin! - Updated TXM Confirmer logic to resume pending task runs with failure if transaction is terminally stuck #internal -
#14325
b1c59ddfe3
Thanks @DavidOrchard! - configuration updates -
#14486
1d6a88ee73
Thanks @simsonraj! - #added Soneium testnet chain configs -
#14315
adb3c95799
Thanks @friedemannf! - Handle zkEVM node level OOC error as TerminallyStuck #internal -
#14541
d9894d129d
Thanks @friedemannf! - #added #nops Add Zircuit Configs -
#14241
7c248e7c46
Thanks @cds95! - #internal index don ID in ConfigSet event -
#14543
c4fa565f54
Thanks @DeividasK! - #internal -
#14129
85a8d09845
Thanks @simsonraj! - #added Hedera configs -
#14252
8490c9610b
Thanks @martin-cll! - Remove bid/ask fields for Mercury v4 schema #internal -
#14516
0e32c07d22
Thanks @mateusz-sekara! - Adding USDCReaderTester contract for CCIP integration tests #internal -
#14345
c83c68735b
Thanks @makramkd! - #internal merge ccip contracts -
#14392
3f83f9e8e6
Thanks @kalverra! - #added Adds the ability to use out of order execution transactions in CCIP E2E tests -
#14318
544ded0afa
Thanks @winder! - #internal ccip reader nonces work. -
#13992
c1878f7374
Thanks @EasterTheBunny! - #internalContractReader
interface update to acceptBoundContract
for all methods -
#14130
31874ba5a4
Thanks @dhaidashenko! - Optimize HeadTracker's memory usage #internal -
#14474
aa04bfab89
Thanks @dimkouv! - bump chainlink-ccip #updated -
#14488
700dd7c074
Thanks @ettec! - #internal add support for values.Value type in the contract reader GetLatestValue and QueryKey methods -
#14361
3a89dceab7
Thanks @dhaidashenko! - Use tx in insertLogsWithinTx #internal -
#14258
7905901c40
Thanks @ettec! - #internal gas limit default value -
#14415
d2d9568318
Thanks @martin-cll! - Skip telemetry for market-status bridges #internal -
#14484
d2a01ca51b
Thanks @ogtownsend! - #internal KMS client for deployment -
#14398
52b480fcc5
Thanks @bolekk! - #added [Keystone] Batch identical trigger events -
#14355
356c70cb80
Thanks @samsondav! - #changedProductionize transmitter for LLO
Note that some minor changes to prometheus metrics will occur in the transition to LLO. Since feed IDs no longer apply, the metrics for transmissions change as follows:
"mercury_transmit_*" []string{"feedID", ...},
Will change to:
"llo_mercury_transmit_*" []string{"donID", ...},
-
#14352
718e885a53
Thanks @winder! - #internal update chainlink-ccip version -
#14161
2b1e8ad51b
Thanks @friedemannf! - Enable FeeHistory estimator for Polygon zkEVM #nops -
#14367
cd8be702ff
Thanks @bolekk! - Support per-method handlers in GatewayConnector -
#14298
85b33fd9ac
Thanks @AnieeG! - moved deployments ccip tooling from ccip repo to chainlink repo #added -
#14281
73c41d1f27
Thanks @eutopian! - skip checking isJobManaged if the proposal in fms has already been deleted #changed -
#14467
358fc17d5b
Thanks @akuzni2! - #added- Adds support for "tags" to Tasks that can be used generically.
- Adds a descendent task search method
- Added support in Mercury EA telemetry to utilize tags for telemetry extraction
-
#14418
a2c03fc380
Thanks @mateusz-sekara! - Updating CCIP OCR3 integration tests according to changes in the chainlink-ccip repo #internal -
#14357
ac3523aaa4
Thanks @AnieeG! - #internal Add ccip JobType in feeds service and other jobtype validations -
#14461
22a8c993ae
Thanks @asoliman92! - #added feed deployment to ccip integration tests
-
#14138
69335dc6b0
Thanks @silaslenihan! - #internal Exposed Confirmed state to ChainWriter GetTransactionStatus method -
#14157
1852353bbf
Thanks @dimriou! - Fix bhe datarace #internal -
#14132
2e314cddf0
Thanks @amit-momin! - Updated ZK overflow detection to skip transactions with non-broadcasted attempts. Delayed detection for zkEVM using the MinAttempts config. Updated XLayer to use the same detection logic as zkEVM. #internal -
#13948
3b4c2b58c3
Thanks @chainchad! - Initialize start of v2.16.0 release -
#14100
6a9528db29
Thanks @huangzhen1997! - add error handling when arbitrum sequencer is not accessible #added -
#13794
c330defde2
Thanks @Farber98! - remove dependency on FinalityDepth in EVM TXM code. #internal -
#14099
1d1af81c51
Thanks @huangzhen1997! - add error handle for gnosis chiado for seen tx #added -
#14039
b0e31e08d5
Thanks @huangzhen1997! - Improve TXM performance by optimizing Confirmer and Finalizer queries to stop pulling EVM receipt. #internal -
#14096
3f0fad643d
Thanks @Farber98! - use FilteredLogs in EventBinding GetLatestValue instead of manual filtering. #internal -
#14068
6ab3eb5b67
Thanks @asoliman92! - #added merging core/capabilities/ccip from https://github.com/smartcontractkit/ccip -
#14095
aa4e981c8f
Thanks @cedric-cordenier! - #internal Change CapabilityType to string; remove possiblity of a panic -
#13957
20dbba8e76
Thanks @amit-momin! - Added nonce validation immediately after broadcast for Hedera #internal -
#13638
2312827156
Thanks @amit-momin! - Introduced finalized transaction state. Added a finalizer component to the TXM to mark transactions as finalized. #internal -
#14041
8d818ea265
Thanks @amit-momin! - Added gas limit estimation feature to EVM gas estimators. Introduced a new configEVM.GasEstimator.EstimateLimit
to toggle this feature. #added -
#14165
e76463cfa9
Thanks @silaslenihan! - #internal Add hexutil Bytes encoding to batchcall data -
#11654
bf2b72d164
Thanks @reductionista! - #bugfix More robust error handling in LogPoller, including no more misleading CRITICAL errors emitted under non-critical conditions -
#13647
a41b353a20
Thanks @bukata-sa! - #added Report new heads as a telemetry to OTI -
#13981
6ef1d6eb44
Thanks @amaechiokolobi! - error handling for Treasure #added -
#14057
e0850a6a31
Thanks @reductionista! - #bugfix Addresses 2 minor issues with the pruning of LogPoller's db tables: logs not matching any filter will now be pruned, and rows deleted are now properly reported for observability -
#14146
d0d2f3046d
Thanks @Farber98! - remove chainReader from the Relayer struct. #internal -
#14016
8b9f2b6b90
Thanks @ilija42! - #internal Add evm Chain Reader GetLatestValue support for filtering on indexed topic types that get hashed. -
#14033
375e17b70f
Thanks @Farber98! - Change ChainReader Block primitive field from int to string. #internal -
#14160
c98feb205d
Thanks @ma33r! - Edited the Optimism Stack L1 Oracle to add support for Mantle #added -
#13999
2a032e83a5
Thanks @amit-momin! - Updated AutoPurge.Threshold and AutoPurge.MinAttempts configs to only be required for heuristic and added content-type header for Scroll API #internal -
#14021
bd648bd73d
Thanks @dhaidashenko! - Added custom finality calculation for Astar #internal -
#14145
567ce229ed
Thanks @cedric-cordenier! - Formalize trigger API #internal -
#14127
5e99bdb764
Thanks @amit-momin! - Added client error classification for terminally stuck transactions in the TXM #internal -
#14043
55e7c8b505
Thanks @asoliman92! - Added CCIP plugins code from https://github.com/smartcontractkit/ccip/ #added
-
#14148
0ceb9b5fc6
Thanks @vyzaldysanchez! - #bugfix Fixes test flake -
#14174
b9a433bff5
Thanks @DeividasK! - #added Allow workflows to run without external registry configured -
#13987
c1bd103e9b
Thanks @KodeyThomas! - #added L3X Config -
#14236
0294e1f381
Thanks @dhaidashenko! - Fixed deadlock in RPCClient causing CL Node to stop performing RPC requests for the affected chain #bugfix -
#14206
621e87538c
Thanks @bukata-sa! - #bugfix head reporter non-zero reporting period -
#13862
05ef7fdbb1
Thanks @martin-cll! - New Mercury v4 report schema #added -
#14112
1b584366d6
Thanks @giogam! - #updated Sync feeds-manager wsrpc proto -
#14246
f1bc2e7ad3
Thanks @amit-momin! - Updated gas limit estimation feature to set From address #internal -
#14018
82accfff5c
Thanks @ettec! - #internal fix to keystone e2e test dispatcher to correctly mock duplicate registration error -
#13990
98fc8813dd
Thanks @flodesi! - #added Add Astar TerminallyUnderpriced error mapping -
#14179
633eb41a44
Thanks @bukata-sa! - #internal log info on missed finalized head instead of returning an error -
#14154
a937d5c577
Thanks @mateusz-sekara! - Separate price updates schedule for token prices in CCIP #updated -
#14185
b563d77dd3
Thanks @mateusz-sekara! - Reporting all the token prices from the job spec for CCIP #updated -
#13756
c92a7212ee
Thanks @vyzaldysanchez! - #updated Adds DB syncing for registry syncer -
#13876
15dc74cabd
Thanks @dhaidashenko! - Custom (30s) timeout for Hedera RPC requests with large payloads (SendTransaction, CallContext, etc.) #internal -
#14214
32a2ccd2ba
Thanks @ettec! - #internal allow gas limit to be specified when submitting transaction -
#14092
3399dd6d7f
Thanks @cds95! - #internal prevent editing whether or not a DON accepts workflows -
#13780
af335c1a52
Thanks @samsondav! - Further development of LLO plugin (parallel composition) #wip -
#14030
d90bb66934
Thanks @ettec! - #internal restore common version to head of develop -
#14105
eb31cf7970
Thanks @ettec! - #internal speed up keystone e2e tests -
#14047
d963b0aaac
Thanks @ettec! - #internal fix the mock trigger to ensure events are sent -
#13853
0f557ae1e0
Thanks @flodesi! - #bugfix Bump BSC PriceMin to 3 gwei to match BSC node's required gas price. This value can be pushed back down to 1 gwei to enable cheaper transactions if the GasPrice field under the Eth.Miner header in the BSC node's config is also pushed down to 1000000000 -
#13935
7ec99efc64
Thanks @ettec! - #internal ensure remote target request hash is deterministic -
#14017
1257d33913
Thanks @DeividasK! - #internal -
#14053
4f0f7802a8
Thanks @DylanTinianov! - Added custom client error messages for Mantle to capture InsufficientEth and Fatal errors. #added -
#14059
40f4becb1e
Thanks @DeividasK! - #internal -
#14116
7fdc0c8e95
Thanks @ettec! - #internal ks-404 validate ids before using as seed of transmission schedule -
#13993
f5e0bd614a
Thanks @DeividasK! - #internal -
#14209
c00ac968e6
Thanks @AnieeG! - #internal Adding deployment package as new pattern for product deployment/configuration -
#14183
35f68c806b
Thanks @graham-chainlink! - #bugfix Fix incorrect error handling when registering a new feed manager -
#14212
25d2961154
Thanks @bukata-sa! - #internal add head report chain_id -
#14066
98b9054397
Thanks @DeividasK! - #internal -
#14014
c2c31c05ac
Thanks @Madalosso! - #updated Update Polygon configs to match PIP-35 -
#14125
8fa8c3a075
Thanks @bukata-sa! - #bugfix balance shutdown deadlock -
#14181
ee57b4f940
Thanks @ettec! - #internal topeerid should validate []byte length -
#14074
a865709ea1
Thanks @mateusz-sekara! - Simplify how token and gas prices are stored in the database - user upsert instead of insert/delete flow #db_update -
#14050
537d2ec1ad
Thanks @ettec! - #internal fix data race in syncer launcher -
#13970
cefbb09797
Thanks @cds95! - #internal prevent reentrancy when configuring DON in Capabilities Registry -
#13907
1eaf5e087a
Thanks @dhaidashenko! - Added new health check that ensures RPC provides new finalized heads at least everyNoNewFinalizedHeadsThreshold
#added
-
#13472
685681e1b3
Thanks @vreff! - Remove ocr2vrf#removed all ocr2vrf and dkg OCR2 plugin materials.
-
#13787
e065b82d2b
Thanks @cedric-cordenier! - Initialize registry syncer' contract reader lazily #keystone #internal -
#13514
f84a3f2f27
Thanks @ilija42! - #internal Change CR GetLatestValue to accept confidenceLevels that map to finality for contract read and event querying. Also remove Pending from BoundContract which used to map to finality for log events. -
#13805
5daee38379
Thanks @silaslenihan! - #internal Added small check to allow for nil TxMeta in CW SubmitTransaction -
#13635
055a9d24f8
Thanks @ilija42! - #internal Add BatchGetLatestValues to ChainReader -
#13753
8beda6093f
Thanks @snehaagni! - Bump to start the next version -
#13678
4e3f5e8d4f
Thanks @krehermann! - #internal refactor goose migrations to use provider -
#13843
31557117b2
Thanks @krehermann! - #internal cleanup heavyweight test databases automatically -
#13861
b3c93a7f25
Thanks @reductionista! - #bugfix Set LatestFinalizedBlock for finalized blocks saved by logpoller -
#13821
5b668c186a
Thanks @ferglor! - Use the new log buffer in automation #changed
-
#13749
e28f8a4386
Thanks @shileiwill! - add chaos and reorg tests #added -
#13937
27d9c71b19
Thanks @cds95! - #internal address security vulnerabilities around updating nodes and node operators on capabilities registry -
#13692
5f3d58ba67
Thanks @samsondav! - Add "VerboseLogging" option to mercuryOff by default, can be enabled like so:
[Mercury] VerboseLogging = true
#updated
-
#13687
df0b06ee1c
Thanks @KodeyThomas! - #added support for EIP-1559 transactions for Scroll -
#13857
6bf25fc01c
Thanks @Farber98! - remove tautological err check within evm txm. #internal -
#13839
48b11ddff4
Thanks @jinhoonbang! - #db_update add an empty BAL spec in migrations -
#13653
b1c9315776
Thanks @ferglor! - Dequeue minimum guaranteed upkeeps as a priority #changed -
#13906
6adb82788a
Thanks @ettec! - #internal change chain reader to use nil blocknumber when reading latest value -
#13793
741351107b
Thanks @nickcorin! - #internal Bumped dependencies forchainlink-common
,chainlink-solana
, andchainlink-starknet
. -
#13789
e140a2bc1c
Thanks @nickcorin! - #internal addNewChainWriter
method onto the dummy relayer. -
#13761
89196f1fb8
Thanks @agusaldasoro! - Make send signatures configurable when Transmit in Contract Transmitter #internal -
#13795
683a12e85e
Thanks @KuphJr! - Updated Functions ToS contract wrappers #internal -
#13838
d6ebada1b6
Thanks @ettec! - #internal end to end test for streams capabilities -
#13815
fb177f4ee7
Thanks @KuphJr! - #internal Updated wrappers for improved L1 -> L2 fee calculation for Functions -
#13335
697e469e41
Thanks @ibrajer! - VRFV2Plus coordinator and wrapper split contracts between L1 and L2 chains #updated -
#13785
873abacbc6
Thanks @martin-cll! - #internal Mercury v3: Include telemetry if bid/ask violation is detected -
#13877
81a21bb56c
Thanks @ettec! - #internal logging of non determinism in target server -
#13868
00ef51a7c1
Thanks @samsondav! - Protocol-level support for preventing bid/ask variant violations in mercury #added -
#13120
68a6a66919
Thanks @george-dorin! - #changed Rename theInBackupHealthReport
toStartUpHealthReport
and enable it for DB migrations as well. This will enable health report to be available during long start-up tasks (db backups and migrations). -
#13852
ced300beeb
Thanks @ettec! - #internal additional logging to remote target capability -
#13829
51225f83f3
Thanks @nickcorin! - #internal Use txid as the idempotency key in the evm chainwriter -
#13712
535d2795c6
Thanks @dhaidashenko! - Fix TestHeadTracker_CallsHeadTrackableCallbacks flaky test #internal -
#13713
6d2b5faf10
Thanks @dhaidashenko! - Fix TestIntegration_KeeperPluginLogUpkeep_ErrHandler flaky test #internal
-
#13356
0228243f20
Thanks @ilija42! - #internal Add Log Poller support to Chain Reader through setting them in config. All filters should be part of the contract wide filter unless an event needs specific polling configuration, which can be set on a per event basis.. -
#13718
f33cd1915c
Thanks @nickcorin! - #internal Added a chain writer constructor onto the evm relayer. -
#13040
0ac790b37f
Thanks @amit-momin! - Added API for products to query a transaction's status in the TXM #internal -
#13413
9e733a07fe
Thanks @silaslenihan! - #added EVM implementation of GetFeeComponents function for ChainWriter -
#13478
9f6e454bc5
Thanks @snehaagni! - Bump to start the next version -
#13501
15f02f65c1
Thanks @ettec! - #internal remove shared secret from transmission schedule -
#13691
f2630b280d
Thanks @nickcorin! - #internal Implemented theGetTransactionStatus
method on the EVM implementation of theChainWriter
. -
#13551
f7e036244c
Thanks @ettec! - #internal capability dispatcher threading and context usage -
#13564
2c2ca6a278
Thanks @yongkangchia! - #changed Added Aptos Keystore to Core. This includes Aptos Key which uses ED25519, Keystore, Relevant tests -
#13427
66f154745d
Thanks @cedric-cordenier! - #internal Add RegistrySyncer -
#13661
363e8290bb
Thanks @amit-momin! - Updated L1 gas price calculations for Optimism Ecotone and Fjord upgrades #internal -
#13297
e55e0424a2
Thanks @amit-momin! - #changed Refactored the BlockHistoryEstimator check to prevent excessively bumping transactions. Check no longer waits for CheckInclusionBlocks to pass before assessing an attempt. #bugfix Fixed a bug that would use the oldest blocks in the cached history instead of the latest to perform gas estimations. -
#13524
d736d9e083
Thanks @ettec! - #internal remote target wait until initiated threads exit on close -
#13169
3f56b3eecd
Thanks @HenryNguyen5! - #internal rework operator_ui installer -
#13601
c3f6b704f1
Thanks @cedric-cordenier! - #internal Allow outputs to be passed directly to the inputs -
#13621
3eb0a3736f
Thanks @cedric-cordenier! - #internal Add script to provision capability registry -
#13522
90924dcc26
Thanks @krehermann! - #internal moves workflow name and owner to the yaml spec -
#13668
e5dc01e844
Thanks @cedric-cordenier! - Add registry syncer package #internal
-
#13498
c6f1b30f34
Thanks @simsonraj! - #added zkSync L1 GasPrice calculation -
#13487
5e27da95f0
Thanks @bolekk! - #internal Use audited version of OCR2Base.sol in OCR3Capability.sol -
#13612
98108568dc
Thanks @nickcorin! - #internal bumpchainlink-common
version to commit 6d926be950a6f6ca289a84edad938d4eef2ee337. -
#13726
2ecf45d381
Thanks @ferglor! - Only encode non nil block numbers for eth_call #changed -
#13048
3f8c00a6f1
Thanks @dhaidashenko! - Fixed local finality violation caused by an RPC lagging behind on latest finalized block.Added
EVM.FinalizedBlockOffset
andEVM.NodePool.EnforceRepeatableRead
config options. WithEnforceRepeatableRead = true
, RPC is considered healthy only if its most recent finalized block is larger or equal to the highest finalized block observed by the Node minusFinalizedBlockOffset
. #bugfix -
#13554
22cab6c152
Thanks @nickcorin! - #internal Bumpedchainlink-common
package version to commit1fb0b48758af25d689b6957ebfb76598c9fb27ea
. -
#13670
253a962fa3
Thanks @nickcorin! - #internal bumped chainlink-common version to commit 1eff5dedc9857ed8811186dd2996603942dc1107 -
#13459
8fdc77f6a7
Thanks @makramkd! - #db_update ccip capability specs migration -
#13494
a830fe093f
Thanks @HelloKashif! - #internal removed HistoryDepth to FinalityDepth validation -
#13580
0d4a3b2cd8
Thanks @DeividasK! - #internal -
#13569
f5a70eb09a
Thanks @DeividasK! - #internal -
#13528
95502ad269
Thanks @DeividasK! - #internal -
#13563
99fa0e68d1
Thanks @HenryNguyen5! - #internal Clean up workflow engine logging -
#13443
955566fb9b
Thanks @Tofel! - #changed Expand EVM implementation compatibility pipeline -
#13602
fc3a291d6c
Thanks @nickcorin! - #internal fixed a bug where we weren't sending the value param to the txm -
#13714
4b19e37553
Thanks @shileiwill! - add native billing in smoke test #added -
#13426
592b2bb5a8
Thanks @archseer! - #internal -
#13546
10ddafaebe
Thanks @cds95! - #internal upgrade keystone contracts to 0.8.24 -
#13504
815c5ea871
Thanks @shileiwill! - move v23 contracts #bugfix -
#13583
8ccaa140ae
Thanks @samsondav! - Add new relayer type "dummy" for testing.#added
-
#13671
4493b96f62
Thanks @poopoothegorilla! - #bugfix fixed ureachable code bug which could result in stuck txns -
#13376
bb40d51502
Thanks @shileiwill! - add events, add getter and add comments #bugfix -
#13495
483ee6ae06
Thanks @pavel-raykov! - #updated Fix verb formatting in the log outputs. -
#13599
e0ce0795b4
Thanks @pavel-raykov! - #internal Add loggercheck linter to verify that *w logging methods have even number of args.
-
#13354
58d73ecf61
Thanks @friedemannf! - #breaking_change Remove thexdai
ChainType
config option. Moving forward, onlygnosis
can be used. -
#13221
0b100ad3db
Thanks @ilija42! - Added a mechanism to validate forwarders for OCR2 and fallback to EOA if necessary #added -
#13384
bc087f1de2
Thanks @augustbleeds! - bump chainlink-starknet so it builds reports with median gas price #updated -
#13353
7a86103474
Thanks @pavel-raykov! - #updated Remove deprecated app.shortcut links -
#13181
c14576a945
Thanks @krehermann! - #added workflow spec auto-approval via CLO -
#13455
066afc0877
Thanks @krehermann! - #bugfix use correct internal id in workflow auto-approval -
#12881
d675d864f0
Thanks @amit-momin! - #added Added an auto-purge feature to the EVM TXM that identifies terminally stuck transactions either through a chain specific method or heurisitic then purges them to unblock the nonce. Included 4 new toml configs under Transactions.AutoPurge to configure this new feature: Enabled, Threshold, MinAttempts, and DetectionApiUrl. -
#13401
905830c3ff
Thanks @krehermann! - #db_update add persistence for DON-2-DON discovery announcements -
#13200
4718aa7ec2
Thanks @augustbleeds! - Add option to include GasPriceSubunits pipeline to include gasPriceSubunits in median ocr2 transmission (only to be used with Starknet chain for now) #added #nops #updated -
#13259
76dbe19282
Thanks @archseer! - #added A ChainWriter implementation in the EVM relay. -
#13265
5db47b63b3
Thanks @krehermann! - #db_update Add name to workflow spec. Add unique constraint to (owner,name) for workflow spec
-
#13315
3af83ed014
Thanks @mateusz-sekara! - Reducing the scope of 0233 migration to include only 5th word index which is required for CCIP #db_update -
#13144
49f1bf3ba2
Thanks @jmank88! - improve handling of postgres connection settings and driver versions #db -
#13286
6139126034
Thanks @EasterTheBunny! - enforce proper result indexing on pipeline results #breaking_change -
#13279
5a87f4a59e
Thanks @DylanTinianov! - #changed Remove ClientErrors interface from common -
#13230
6f1ebca197
Thanks @dhaidashenko! - Fixed CPU usage issues caused by inefficiencies in HeadTracker.HeadTracker's support of finality tags caused a drastic increase in the number of tracked blocks on the Arbitrum chain (from 50 to 12,000), which has led to a 30% increase in CPU usage.
The fix improves the data structure for tracking blocks and makes lookup more efficient. BenchmarkHeadTracker_Backfill shows 40x time reduction. #bugfix
-
#13231
c4ef6c6398
Thanks @samsondav! - Fix panic if mercury server returns error #bugfix -
#13364
fc007a9484
Thanks @FelixFan1992! - #bugfix fix a funding bug in LinkAvailableBalanceMonitor -
#13174
e778a3202b
Thanks @FelixFan1992! - #changed: AUTO-10539: adjust logging for offchain config and gas control -
#12952
7572a50a78
Thanks @FelixFan1992! - #added compare user-defined max gas price with current gas price in automation simulation pipeline -
#13216
6099abbdbf
Thanks @ibrajer! - Added Base Sepolia to ChainUtils #changed -
#13177
0d58a8d5db
Thanks @shileiwill! - link transfer status check #bugfix -
#13058
a34a17ae9d
Thanks @shileiwill! - withdraw in offchain mode #bugfix -
#13213
1b1e31ebfc
Thanks @FelixFan1992! - #bugfix fix an automation smoke test flake -
#12813
ac893364e6
Thanks @matYang! - #db_update created 2 new CCIP tables in migration 0236, one for observed gas prices, one for observed token prices; setup indexing for these tables.#added ORM for CCIP gas prices and token prices
-
#13173
a9717f05e9
Thanks @ferglor! - Revert block number tracking #changed -
#12952
7572a50a78
Thanks @FelixFan1992! - #added pass a gas estimator to registry 2.1 pipeline -
#13132
eed5668e3c
Thanks @akuzni2! - #nops fix metric description on mercury_transmit_queue_load -
#13084
d79bdf16c5
Thanks @austinborn! - #updated Add gethwrappers for operatorforwarder contracts -
#13421
c429772fe8
Thanks @eutopian! - #db_update Add account_address_public_key to feeds_manager_chain_configs -
#12756
50870c37f9
Thanks @poopoothegorilla! - update finality depth for chains #nops -
#13133
2e668372ac
Thanks @matYang! - #changed CCIP price cache to use DB timestamp -
#13096
2c08c8c1a5
Thanks @shileiwill! - add upkeepCharged event #bugfix -
#13078
0917394a46
Thanks @finleydecker! - bumpThreshold config setting for chains using suggestPrice estimator #updated -
#13336
4c7e5a0efa
Thanks @dhaidashenko! - Added config optionHeadTracker.FinalityTagBypass
to forceHeadTracker
to track blocks up toFinalityDepth
even ifFinalityTagsEnabled = true
. This option is a temporary measure to address high CPU usage on chains with extremely large actual finality depth (gap between the current head and the latest finalized block). #addedAdded config option
HeadTracker.MaxAllowedFinalityDepth
maximum gap between current head to the latest finalized block thatHeadTracker
considers healthy. #added -
#13263
14ec6c4a91
Thanks @shileiwill! - tune debugging script #bugfix -
#13088
29b16360fb
Thanks @shileiwill! - get available erc20 for payment #bugfix -
#13165
143741012c
Thanks @cedric-cordenier! - #db_update Add ON DELETE CASCADE to workflow tables -
#12952
7572a50a78
Thanks @FelixFan1992! - #added an integration test for max gas price check -
#13272
c7a6356f49
Thanks @friedemannf! - #bugfix allow ChainType to be set to xdai
-
#13246
119df08eec
Thanks @ilija42! - Added a mechanism to validate forwarders for OCR2 and fallback to EOA if necessary #added -
#12867
27d9413286
Thanks @dhaidashenko! - Added a new CLI command,blocks find-lca,
which finds the latest block that is available in both the database and on the chain for the specified chain. Added a new CLI command,node remove-blocks,
which removes all blocks and logs greater than or equal to the specified block number. #nops #added -
#12686
2e768c150b
Thanks @nolag! - Add a comment to Chain Reader Service constructor that specifies that anonymous events are not supported. -
#12605
1d9dd466e2
Thanks @reductionista! - core/chains/evm/logpoller: Stricter finality checks in LogPoller, to be more robust during rpc failover events #updated -
#12533
ccb8cd85fe
Thanks @DylanTinianov! - #added : Re-enable abandoned transaction tracker -
#12760
3f4573479c
Thanks @DylanTinianov! - #nops : Enable configurable client error regexes for error classification #added : New toml configuration options for [EVM.NodePool.Errors] to pass regexes on NonceTooLow, NonceTooHigh, ReplacementTransactionUnderpriced, LimitReached, TransactionAlreadyInMempool, TerminallyUnderpriced, InsufficientEth, TxFeeExceedsCap, L2FeeTooLow, L2FeeTooHigh, L2Full, TransactionAlreadyMined, Fatal, and ServiceUnavailable. -
#12595
e6d4814bda
Thanks @ilija42! - Move JuelsPerFeeCoinCacheDuration under JuelsPerFeeCoinCache struct in config. Rename JuelsPerFeeCoinCacheDuration to updateInterval. Add stalenessAlertThreshold to JuelsPerFeeCoinCache config. StalenessAlertThreshold cfg option has a default of 24 hours which means that it doesn't have to be set unless we want to override the duration after which a stale cache should start throwing errors. -
#12767
8db5ccfb39
Thanks @pavel-raykov! - Validate user email before asking for a password in the chainlink CLI.
-
#13327
0abe09d785
Thanks @reductionista! - Reducing the scope of 0233 migration to include only 5th word index which is required for CCIP #db_update -
#13316
4fbcf7d2f8
Thanks @friedemannf! - #bugfix allow ChainType to be set to xdai -
#13260
5daefad14c
Thanks @dhaidashenko! - Fixed CPU usage issues caused by inefficiencies in HeadTracker.HeadTracker's support of finality tags caused a drastic increase in the number of tracked blocks on the Arbitrum chain (from 50 to 12,000), which has led to a 30% increase in CPU usage.
The fix improves the data structure for tracking blocks and makes lookup more efficient. BenchmarkHeadTracker_Backfill shows 40x time reduction. #bugfix
-
#13256
d133da44a9
Thanks @samsondav! - Fix panic if mercury server returns error #bugfix -
#12907
f0439ec840
Thanks @ilija42! - Fix in memory data source cache changes/bug that only allowed pipeline results where none of the data sources failed. #bugfix -
#12923
274a988985
Thanks @shileiwill! - use safe lib for approve #bugfix -
#12754
4d9875ecba
Thanks @amirylm! - Bumping chainlink-automation version to v1.0.3 -
#12887
e87b83cd78
Thanks @jinhoonbang! - #bugfix vrf fix replay number of blocks logic and add logging for job specs -
#12848
91698020fb
Thanks @poopoothegorilla! - bump mockery in makefile #updated -
#11936
2b38bd8738
Thanks @erikburt! - Validate support for postgresql-client 16, and update docker image's bundled postgresql-client from 15 to 16. #nops #updated -
#12845
63abd08cd5
Thanks @bolekk! - #internal Remote Trigger setup -
#12997
8c8994e242
Thanks @george-dorin! - #bugfix Fixed an issue where therebroadcast-transactions
commands did not execute config validation. -
#13026
e21be2a890
Thanks @mateusz-sekara! - Improving LogPoller read queries by properly sorting by multiple columns #updated -
#12638
bcf7653486
Thanks @dhaidashenko! - #changed Added prefixRPCClient returned error ({RPC_NAME})
to RPC errors to simplify filtering of RPC related issues. -
#12786
fbb705c4f1
Thanks @mateusz-sekara! - Narrowing topic, data_word indexes by adding (evm_chain_id, address, event_sig) to the index definition #db_update -
#12747
2729ef76f3
Thanks @friedemannf! - Add support for X Layer (X1) #added -
#12680
f55d8be495
Thanks @samsondav! - #addedAdd configurability to mercury transmitter
[Mercury.Transmitter] TransmitQueueMaxSize = 10_000 # Default TransmitTimeout = "5s" # Default
-
#12902
d1845e22d3
Thanks @samsondav! - Bump libocr => fd3cab206b2ca3b7ff207996b95673b2d6303ec4 -
#12669
3134ce8868
Thanks @leeyikjiun! - vrfv2plus - account for num words in coordinator gas overhead in v2plus wrapper -
#12951
c98ea6413d
Thanks @ogtownsend! - #changed Updating the log trigger log provider's readMaxBatchSize to 56 -
#12944
167782c680
Thanks @shileiwill! - minor fixes #bugfix -
#12966
ac7d3409ed
Thanks @george-dorin! - #added JuelsPerFeeCoinCache is enabled by default for OCR2 jobs, addedDisable
field under [pluginConfig.JuelsPerFeeCoinCache] tag to disable this feature (e.g. Disable=true) -
#12916
7ec1d5b7ab
Thanks @shileiwill! - offchain settlement fix #bugfix -
#12998
d50936ce38
Thanks @mateusz-sekara! - Support for retention in LogPoller's filters registered by ContractTransmitter #changed
- #13254
c0d201a9a8
Thanks [@samsondav!] - Fix panic if mercury server returns error #bugfix
-
#12920
2d2a42876d
Thanks @ilija42! - Move JuelsPerFeeCoinCacheDuration under JuelsPerFeeCoinCache struct in config. Rename JuelsPerFeeCoinCacheDuration to updateInterval. Add stalenessAlertThreshold to JuelsPerFeeCoinCache config. StalenessAlertThreshold cfg option has a default of 24 hours which means that it doesn't have to be set unless we want to override the duration after which a stale cache should start throwing errors. -
#12348
efead72965
Thanks @reductionista! - Update config for zkevm polygon chains -
#12082
608ea0a467
Thanks @dhaidashenko! - HeadTracker now respects theFinalityTagEnabled
config option. If the flag is enabled, HeadTracker backfills blocks up to the latest finalized block provided by the corresponding RPC call. To address potential misconfigurations,HistoryDepth
is now calculated from the latest finalized block instead of the head. NOTE: Consumers (e.g. TXM and LogPoller) do not fully utilize Finality Tag yet. -
#12489
3a49094db2
Thanks @kidambisrinivas! - - Misc VRF V2+ contract changes- Reuse struct RequestCommitmentV2Plus from VRFTypes
- Fix interface name IVRFCoordinatorV2PlusFulfill in BatchVRFCoordinatorV2Plus to avoid confusion with IVRFCoordinatorV2Plus.sol
- Remove unused errors
- Rename variables for readability
- Fix comments
- Minor gas optimisation (++i)
- Fix integration tests
-
#12093
3f6d901fe6
Thanks @friedemannf! - Thexdai
ChainType
has been renamed tognosis
to match the chain's new name. The old value is still supported but has been deprecated and will be removed in v2.13.0. -
#12503
dc224a2924
Thanks @amit-momin! - Added a tx simulation feature to the chain client to enable testing for zk out-of-counter (OOC) errors -
#12634
e9e903bf4b
Thanks @ettec! - Update keyvalue store to be compatible with the interface required in chainlink common -
#12496
31350477ae
Thanks @silaslenihan! - Change LimitTransfer gasLimit type from uint32 to uint64 -
#12339
96d2fe13b8
Thanks @dhaidashenko! - Add thepool_rpc_node_highest_finalized_block
metric that tracks the highest finalized block seen per RPC. IfFinalityTagEnabled = true
, a positiveNodePool.FinalizedBlockPollInterval
is needed to collect the metric. If the finality tag is not enabled, the metric is populated with a calculated latest finalized block based on the latest head and finality depth. -
#12473
f1d1f249eb
Thanks @justinkaseman! - Copy common transmitter methods into FunctionsContractTransmitter to enable product specific modification -
#12534
bd532b5e2a
Thanks @silaslenihan! - Extracted Gas Limit Multiplier from gas estimators to WrappedEvmEstimator. -
#12578
ffd492295f
Thanks @RensR! - Remove 0.6 and 0.7 Solidity source code
-
#12973
02d3f2fee9
Thanks @george-dorin! - JuelsPerFeeCoinCache is enabled by default for OCR2 jobs, addedDisable
field under [pluginConfig.JuelsPerFeeCoinCache] tag to disable this feature (e.g. Disable=true) -
#12920
be50a8370a
Thanks @ilija42! - Fix in memory data source cache changes/bug that only allowed pipeline results where none of the data sources failed. #bugfix -
#12570
2d33524a35
Thanks @samsondav! - VerboseLogging is now turned on by default.You may disable if this results in excessive log volume. Disable like so:
[JobPipeline] VerboseLogging = false
-
#12458
51b134700a
Thanks @HenryNguyen5! - Add json schema support to workflows -
#12697
33398b7945
Thanks @samsondav! - Increase default config for postgres max open conns from 20 to 100.Also, add autoscaling for mercury jobs. The max open conns limit will be automatically increased to the number of mercury jobs if this exceeds the configured value.
-
#12540
17c037678d
Thanks @RyanRHall! - Change auto 2.3 flat fees from link to USD -
#12696
ee52be7cf9
Thanks @KuphJr! - Remove LogPoller filters for outdated Functions coordinator contracts -
#12405
2bd210bfa8
Thanks @jinhoonbang! - Soft delete consumer nonce in VRF coordinator v2.5 -
#12387
42e72d2d26
Thanks @ogtownsend! - Adds prometheus metrics for automation streams error handling -
#12388
30b73a804d
Thanks @justinkaseman! - Chainlink Functions contracts v1.3 audit findings -
#12332
89abd726b6
Thanks @Tofel! - Add new pipeline for testing EVM node compatibility on go-ethereum dependency bump -
#12621
9c2764adbf
Thanks @KuphJr! - Add GetFilters function to the log_poller -
#12592
b512ef5a7d
Thanks @ibrajer! - Set LINK native feed in VRFV2PlusWrapper to immutable -
#12404
b74079b672
Thanks @HenryNguyen5! - Add OCR3 capability contract wrapper -
#12498
1c576d0e34
Thanks @samsondav! - Add new config option JobPipeline.VerboseLoggingVerboseLogging enables detailed logging of pipeline execution steps. This is disabled by default because it increases log volume for pipeline runs, but can be useful for debugging failed runs without relying on the UI or database. Consider enabling this if you disabled run saving by setting MaxSuccessfulRuns to zero.
Set it like the following example:
[JobPipeline] VerboseLogging = true
-
#12357
a532accd6a
Thanks @amirylm! - Added log buffer v1 with improved performance, stability and control over scaling parameters.Added a feature flag for using log buffer v1.
-
#12152
a6a2acfe20
Thanks @ferglor! - Calculate blockRate and logLimit defaults in the log provider based on chain ID -
#12584
c7cacd0710
Thanks @matYang! - L1Oracle handles OP Stack Ecotone encoded l1 gas price -
#12564
246762ceeb
Thanks @mateusz-sekara! - Exposing information about LogPoller finality violation via Healthy method. It's raised whenever LogPoller sees reorg deeper than the finality -
#12575
23254c4bf5
Thanks @augustbleeds! - Update starknet relayer to fix nonce issue. introduces optional api-key for starknet toml config. -
#12353
07c9f6cadd
Thanks @amit-momin! - Fixed a race condition bug around EVM nonce management, which could cause the Node to skip a nonce and get stuck. -
#12344
6fa1f5dddc
Thanks @eutopian! - Add rebalancer support for feeds manager ocr2 plugins -
#12484
590cad6126
Thanks @mateusz-sekara! - Making LogPoller's replay more robust by backfilling up to finalized block and processing rest in the main loop -
#12612
d44abe3769
Thanks @RensR! - Upgraded transmission to 0.8.19 -
#12444
dde7fdff33
Thanks @ogtownsend! - Updating prometheus metrics for Automation log triggers -
#12479
93762ccbd8
Thanks @jinhoonbang! - Update solc version for vrf v2.5 coordinators -
#12337
195b504a93
Thanks @samsondav! - Mercury jobs can now broadcast to multiple mercury servers.Previously, a single mercury server would be specified in a job spec as so:
[pluginConfig] serverURL = "example.com/foo" serverPubKey = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93"
You may now specify multiple mercury servers, as so:
[pluginConfig] servers = { "example.com/foo" = "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93", "mercury2.example:1234/bar" = "524ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93" }
-
#11899
67560b9f1d
Thanks @DylanTinianov! - Refactor EVM ORMs to remove pg dependency -
#12531
88e010d604
Thanks @jinhoonbang! - Increase num optimizations to 500 for vrf v2.5 coordinator -
#12375
831aea819d
Thanks @shileiwill! - Add liquidity pool for automation 2.3 -
#12412
83c8688a14
Thanks @poopoothegorilla! - Bump grafana to 1.1.1 -
#12248
e1950769ee
Thanks @FelixFan1992! - Add version support for automation registry 2.*
- Gas bumping logic to the
SuggestedPriceEstimator
. The bumping mechanism for this estimator refetches the price from the RPC and adds a buffer on top using the greater ofBumpPercent
andBumpMin
. - Added a new configuration field named
NodeIsSyncingEnabled
forEVM.NodePool
that will check on every reconnection to an RPC if it's syncing and should not be transitioned toAlive
state. Disabled by default. - Add preliminary support for "llo" job type (Data Streams V1)
- Add
LogPrunePageSize
parameter to the EVM configuration. This parameter controls the number of logs removed during prune phase in LogPoller. Default value is 0, which deletes all logs at once - exactly how it used to work, so it doesn't require any changes on the product's side. - Add Juels Fee Per Coin data source caching for OCR2 Feeds. Cache is time based and is turned on by default with default cache refresh of 5 minutes. Cache can be configured through pluginconfig using "juelsPerFeeCoinCacheDuration" and "juelsPerFeeCoinCacheDisabled" tags. Duration tag accepts values between "30s" and "20m" with default of "0s" that is overridden on cache startup to 5 minutes.
- Add rebalancer support for feeds manager ocr2 plugins.
P2P.V2
is required in configuration when eitherOCR
orOCR2
are enabled. The node will fail to boot ifP2P.V2
is not enabled.- Removed unnecessary gas price warnings in gas estimators when EIP-1559 mode is enabled.
- Minimum required version of Postgres is now >= 12. Postgres 11 was EOL'd in November 2023. Added a new version check that will prevent Chainlink from running on EOL'd Postgres. If you are running Postgres <= 11 you should upgrade to the latest version. The check can be forcibly overridden by setting SKIP_PG_VERSION_CHECK=true.
- Updated the
LimitDefault
andLimitMax
configs types touint64
eth_call
RPC requests are now sent with bothinput
anddata
fields to increase compatibility with servers that recognize only one.- GasEstimator will now include Type
0x3
(Blob) transactions in the gas calculations to estimate it more accurately.
chainlink health
CLI command and HTML/health
endpoint, to provide human-readable views of the underlying JSON health data.- New job type
stream
to represent streamspecs. This job type is not yet used anywhere but will be required for Data Streams V1. - Environment variables
CL_MEDIAN_ENV
,CL_SOLANA_ENV
, andCL_STARKNET_ENV
for setting environment variables in LOOP Plugins with an.env
file.echo "Foo=Bar" >> median.env echo "Baz=Val" >> median.env CL_MEDIAN_ENV="median.env"
- Fixed the encoding used for transactions when resending in batches
P2P.V1
is no longer supported and must not be set in TOML configuration in order to boot. UseP2P.V2
instead. If you are using both,V1
can simply be removed.- Removed
TelemetryIngress.URL
andTelemetryIngress.ServerPubKey
from TOML configuration, these fields are replaced by[[TelemetryIngress.Endpoints]]
:
[[TelemetryIngress.Endpoints]]
Network = '...' # e.g. EVM. Solana, Starknet, Cosmos
ChainID = '...' # e.g. 1, 5, devnet, mainnet-beta
URL = '...'
ServerPubKey = '...'
-
Added distributed tracing in the OpenTelemetry trace format to the node, currently focused at the LOOPP Plugin development effort. This includes a new set of
Tracing
TOML configurations. The default for collecting traces is off - you must explicitly enable traces and setup a valid OpenTelemetry collector. Refer to.github/tracing/README.md
for more details. -
Added a new, optional WebServer authentication option that supports LDAP as a user identity provider. This enables user login access and user roles to be managed and provisioned via a centralized remote server that supports the LDAP protocol, which can be helpful when running multiple nodes. See the documentation for more information and config setup instructions. There is a new
[WebServer].AuthenticationMethod
config option, when set toldap
requires the new[WebServer.LDAP]
config section to be defined, see the referencedocs/core.toml
. -
New prom metrics for mercury transmit queue:
mercury_transmit_queue_delete_error_count
mercury_transmit_queue_insert_error_count
mercury_transmit_queue_push_error_count
Nops should consider alerting on these. -
Mercury now implements a local cache for fetching prices for fees, which ought to reduce latency and load on the mercury server, as well as increasing performance. It is enabled by default and can be configured with the following new config variables:
[Mercury] # Mercury.Cache controls settings for the price retrieval cache querying a mercury server [Mercury.Cache] # LatestReportTTL controls how "stale" we will allow a price to be e.g. if # set to 1s, a new price will always be fetched if the last result was # from 1 second ago or older. # # Another way of looking at it is such: the cache will _never_ return a # price that was queried from now-LatestReportTTL or before. # # Setting to zero disables caching entirely. LatestReportTTL = "1s" # Default # MaxStaleAge is that maximum amount of time that a value can be stale # before it is deleted from the cache (a form of garbage collection). # # This should generally be set to something much larger than # LatestReportTTL. Setting to zero disables garbage collection. MaxStaleAge = "1h" # Default # LatestReportDeadline controls how long to wait for a response from the # mercury server before retrying. Setting this to zero will wait indefinitely. LatestReportDeadline = "5s" # Default
-
New prom metrics for the mercury cache:
mercury_cache_fetch_failure_count
mercury_cache_hit_count
mercury_cache_wait_count
mercury_cache_miss_count
-
Added new
EVM.OCR
TOML config fieldsDeltaCOverride
andDeltaCJitterOverride
for overriding the config DeltaC. -
Mercury v0.2 has improved consensus around current block that uses the most recent 5 blocks instead of only the latest one
-
Two new prom metrics for mercury, nops should consider adding alerting on these:
mercury_insufficient_blocks_count
mercury_zero_blocks_count
-
Added new
Mercury.TLS
TOML config fieldCertFile
for configuring transport credentials when the node acts as a client and initiates a TLS handshake.
PromReporter
no longer directly reads txm related status from the db, and instead uses the txStore API.L2Suggested
mode is now calledSuggestedPrice
- Console logs will now escape (non-whitespace) control characters
- Following EVM Pool metrics were renamed:
evm_pool_rpc_node_states
→multi_node_states
evm_pool_rpc_node_num_transitions_to_alive
→pool_rpc_node_num_transitions_to_alive
evm_pool_rpc_node_num_transitions_to_in_sync
→pool_rpc_node_num_transitions_to_in_sync
evm_pool_rpc_node_num_transitions_to_out_of_sync
→pool_rpc_node_num_transitions_to_out_of_sync
evm_pool_rpc_node_num_transitions_to_unreachable
→pool_rpc_node_num_transitions_to_unreachable
evm_pool_rpc_node_num_transitions_to_invalid_chain_id
→pool_rpc_node_num_transitions_to_invalid_chain_id
evm_pool_rpc_node_num_transitions_to_unusable
→pool_rpc_node_num_transitions_to_unusable
evm_pool_rpc_node_highest_seen_block
→pool_rpc_node_highest_seen_block
evm_pool_rpc_node_num_seen_blocks
→pool_rpc_node_num_seen_blocks
evm_pool_rpc_node_polls_total
→pool_rpc_node_polls_total
evm_pool_rpc_node_polls_failed
→pool_rpc_node_polls_failed
evm_pool_rpc_node_polls_success
→pool_rpc_node_polls_success
- Removed
Optimism2
as a supported gas estimator mode
- Corrected Ethereum Sepolia
LinkContractAddress
to0x779877A7B0D9E8603169DdbD7836e478b4624789
- Fixed a bug that caused the Telemetry Manager to report incorrect health
Starting in v2.9.0
:
TelemetryIngress.URL
andTelemetryIngress.ServerPubKey
will no longer be allowed. Any TOML configuration that sets this fields will prevent the node from booting. These fields will be replaced by[[TelemetryIngress.Endpoints]]
P2P.V1
will no longer be supported and must not be set in TOML configuration in order to boot. UseP2P.V2
instead. If you are using both,V1
can simply be removed.
- Fixed a bug that caused nodes without OCR or OCR2 enabled to fail config validation if
P2P.V2
was not explicitly disabled. With this fix, NOPs will not have to make changes to their config.
- Fixed a bug that causes the node to shutdown if all configured RPC's are unreachable during startup.
- Added new configuration field named
LeaseDuration
forEVM.NodePool
that will periodically check if internal subscriptions are connected to the "best" (as defined by theSelectionMode
) node and switch to it if necessary. Setting this value to0s
will disable this feature. - Added multichain telemetry support. Each network/chainID pair must be configured using the new fields:
[[TelemetryIngress.Endpoints]]
Network = '...' # e.g. EVM. Solana, Starknet, Cosmos
ChainID = '...' # e.g. 1, 5, devnet, mainnet-beta
URL = '...'
ServerPubKey = '...'
These will eventually replace TelemetryIngress.URL
and TelemetryIngress.ServerPubKey
. Setting TelemetryIngress.URL
and TelemetryIngress.ServerPubKey
alongside [[TelemetryIngress.Endpoints]]
will prevent the node from booting. Only one way of configuring telemetry endpoints is supported.
-
Added bridge_name label to
pipeline_tasks_total_finished
prometheus metric. This should make it easier to see directly what bridge was failing out from the CL NODE perspective. -
LogPoller will now use finality tags to dynamically determine finality on evm chains if
EVM.FinalityTagEnabled=true
, rather than the fixedEVM.FinalityDepth
specified in toml config
P2P.V1
is now disabled (Enabled = false
) by default. It must be explicitly enabled withtrue
to be used. However, it is deprecated and will be removed in the future.P2P.V2
is now enabled (Enabled = true
) by default.
Starting in v2.9.0
:
TelemetryIngress.URL
andTelemetryIngress.ServerPubKey
will no longer be allowed. Any TOML configuration that sets this fields will prevent the node from booting. These fields will be replaced by[[TelemetryIngress.Endpoints]]
P2P.V1
will no longer be supported and must not be set in TOML configuration in order to boot. UseP2P.V2
instead. If you are using both,V1
can simply be removed.
- Removed the ability to set a next nonce value for an address through CLI
- Simple password use in production builds is now disallowed - nodes with this configuration will not boot and will not pass config validation.
- Helper migrations function for injecting env vars into goose migrations. This was done to inject chainID into evm chain id not null in specs migrations.
- OCR2 jobs now support querying the state contract for configurations if it has been deployed. This can help on chains such as BSC which "manage" state bloat by arbitrarily deleting logs older than a certain date. In this case, if logs are missing we will query the contract directly and retrieve the latest config from chain state. Chainlink will perform no extra RPC calls unless the job spec has this feature explicitly enabled. On chains that require this, nops may see an increase in RPC calls. This can be enabled for OCR2 jobs by specifying
ConfigContractAddress
in the relay config TOML.
- Removed support for sending telemetry to the deprecated Explorer service. All nodes will have to remove
Explorer
related keys from TOML configuration and env vars. - Removed default evmChainID logic where evmChainID was implicitly injected into the jobspecs based on node EVM chainID toml configuration. All newly created jobs(that have evmChainID field) will have to explicitly define evmChainID in the jobspec.
- Removed keyset migration that migrated v1 keys to v2 keys. All keys should've been migrated by now, and we don't permit creation of new v1 keys anymore
All nodes will have to remove the following secret configurations:
Explorer.AccessKey
Explorer.Secret
All nodes will have to remove the following configuration field: ExplorerURL
- Unauthenticated users executing CLI commands previously generated a confusing error log, which is now removed:
[ERROR] Error in transaction, rolling back: session missing or expired, please login again pg/transaction.go:118
- Fixed a bug that was preventing job runs to be displayed when the job
chainID
was disabled. chainlink txs evm create
returns a transaction hash for the attempted transaction in the CLI. Previously only the sender, recipient andunstarted
state were returned.- Fixed a bug where
evmChainId
is requested instead ofid
orevm-chain-id
in CLI error verbatim - Fixed a bug that would cause the node to shut down while performing backup
- Fixed health checker to include more services in the prometheus
health
metric and HTTP/health
endpoint - Fixed a bug where prices would not be parsed correctly in telemetry data
- New prometheus metrics for mercury:
mercury_price_feed_missing
mercury_price_feed_errors
Nops may wish to add alerting on these.
- Starting in 2.6.0, chainlink nodes will no longer allow insecure configuration for production builds. Any TOML configuration that sets the following line will fail validation checks in
node start
ornode validate
:
AllowSimplePasswords=true
- To migrate on production builds, update the database password set in Database.URL to be 16 - 50 characters without leading or trailing whitespace. URI parsing rules apply to the chosen password - refer to RFC 3986 for special character escape rules.
- Various Functions improvements
- Updated
v2/keys/evm
andv2/keys/eth
routes to return 400 and 404 status codes where appropriate. Previously 500s were returned when requested resources were not found or client requests could not be parsed. - Fixed withdrawing ETH from CL node for EIP1559 enabled chains. Previously would error out unless validation was overridden with
allowHigherAmounts
.
- Added the ability to specify and merge fields from multiple secrets files. Overrides of fields and keys are not allowed.
- Added new database table
evm_upkeep_states
to persist eligibility state for recently checked upkeeps.
- Starting in 2.6.0, chainlink nodes will no longer allow insecure configuration for production builds. Any TOML configuration that sets the following line will fail validation checks in
node start
ornode validate
:
AllowSimplePasswords=true
- To migrate on production builds, update the database password set in Database.URL to be 16 - 50 characters without leading or trailing whitespace. URI parsing rules apply to the chosen password - refer to RFC 3986 for special character escape rules.
- Add a new field called
Order
(range from 1 to 100) toEVM.Nodes
that is used for thePriorityLevel
node selector and also as a tie-breaker forHighestHead
andTotalDifficulty
.Order
levels are considered in ascending order. If not defined it will default toOrder = 100
(last level). - Added new node selection mode called
PriorityLevel
for EVM, it is a tiered round-robin in ascending order of theOrder
field. Example:
[EVM.NodePool]
SelectionMode = 'PriorityLevel'
[[EVM.Nodes]]
Name = '...'
WSURL = '...'
HTTPURL = '...'
Order = 5
-
The config keys
WebServer.StartTimeout
andWebServer.HTTPMaxSize
. These keys respectively set a timeout for the node server to start and set the max request size for HTTP requests. Previously these attributes were set byJobPipeline.DefaultHTTPLimit
/JobPipeline.DefaultHTTPTimeout
. To migrate to these new fields, set their values to be identical toJobPipeline.DefaultHTTPLimit
/JobPipeline.DefaultHTTPTimeout
. -
Low latency oracle jobs now support in-protocol block range guarantees. This is necessary in order to produce reports with block number ranges that do not overlap. It can now be guaranteed at the protocol level, so we can use local state instead of relying on an unreliable round-trip to the Mercury server.
-
New settings
Evm.GasEstimator.LimitJobType.OCR2
,OCR2.DefaultTransactionQueueDepth
,OCR2.SimulateTransactions
for OCR2 jobs. These replace the settingsEvm.GasEstimator.LimitJobType.OCR
,OCR.DefaultTransactionQueueDepth
, andOCR.SimulateTransactions
for OCR2. -
Add new config parameter to OCR and OCR2 named
TraceLogging
that enables trace logging of OCR and OCR2 jobs, previously this behavior was controlled from theP2P.TraceLogging
parameter. To maintain the same behavior setOCR.TraceLogging
andOCR2.TraceLogging
to the same valueP2P.TraceLogging
was set. -
Add two new config parameters
WebServer.ListenIP
andWebServer.TLS.ListenIP
which allows binding Chainlink HTTP/HTTPS servers to a particular IP. The default is '0.0.0.0' which listens to all IP addresses (same behavior as before). Set to '127.0.0.1' to only allow connections from the local machine (this can be handy for local development). -
Add several new metrics for mercury feeds, related to WSRPC connections:
mercury_transmit_timeout_count
mercury_dial_count
mercury_dial_success_count
mercury_dial_error_count
mercury_connection_reset_count
Node operators may wish to add alerting based around these metrics.
- Fixed a bug in the
nodes xxx list
command that caused results to not be displayed correctly
- Assumption violations for MaxFeePerGas >= BaseFeePerGas and MaxFeePerGas >= MaxPriorityFeePerGas in EIP-1559 effective gas price calculation will now use a gas price if specified
- Config validation now enforces protection against duplicate chain ids and node fields per provided TOML file. Duplicates accross multiple configuration files are still valid. If you have specified duplicate chain ids or nodes in a given configuration file, this change will error out of all
node
subcommands. - Restricted scope of the
Evm.GasEstimator.LimitJobType.OCR
,OCR.DefaultTransactionQueueDepth
, andOCR.SimulateTransactions
settings so they apply only to OCR. Previously these settings would apply to OCR2 as well as OCR. You must use the OCR2 equivalents added above if you want your settings to apply to OCR2.
- Legacy chain types Optimism and Optimism2. OptimismBedrock is now used to handle Optimism's special cases.
- Optimism Kovan configurations along with legacy error messages.
- New prometheus metric for mercury transmit queue:
mercury_transmit_queue_load
. This is a gauge, scoped by feed ID, that measures how many pending transmissions are in the queue. This should generally speaking be small (< 10 or so). Nops may wish to add alerting if this exceeds some amount. - Experimental support of runtime process isolation for Solana data feeds. Requires plugin binaries to be installed and
configured via the env vars
CL_SOLANA_CMD
andCL_MEDIAN_CMD
. See plugins/README.md.
- Fixed a bug which made it impossible to re-send the same transaction after abandoning it while manually changing the nonce.
- Set default for EVM.GasEstimator.BumpTxDepth to EVM.Transactions.MaxInFlight.
- Bumped batch size defaults for EVM specific configuration. If you are overriding any of these fields in your local config, please consider if it is necessary:
LogBackfillBatchSize = 1000
RPCDefaultBatchSize = 250
GasEstimator.BatchSize = 25
- Dropped support for Development Mode configuration.
CL_DEV
is now ignored on production builds. - Updated Docker image's PostgreSQL client (used for backups) to v15 in order to support PostgreSQL v15 servers.
- The 1.13.2 release showed the 1.13.1 version in its VERSION file. This updates the VERSION file to now show 1.13.3.
- Made logging level improvements for the Solana Transaction Manager to reduce excessive noise
- Fixed race condition in Solana TXM for sanity check and preventing misfired errors
- Upgraded WSRPC to v0.7.2
- Fixed a bug that would cause telemetry to be sent with the wrong type.
- Database commands
chainlink db ...
validate TOML configuration and secrets before executing. This change of behavior will report errors if any Database-specific configuration is invalid.
- Add OCR2 Plugin selection for FMS
- Added kebab case aliases for the following flags:
evm-chain-id
alias forevmChainID
in commands:chainlink blocks replay
,chainlink forwarders track
,chainlink keys ... chain
old-password
alias foroldpassword
in commands:chainlink keys ... import
new-password
alias fornewpassword
in commands:chainlink keys ... export
new-role
alias fornewrole
in commands:admin users chrole
set-next-nonce
alias forsetNextNonce
in commands:chainlink keys ... chain
- TOML configuration and secrets are now scoped to
chainlink node
command rather than being global flags. - TOML configuration validation has been moved from
chainlink config validate
tochainlink node validate
. - Move
chainlink node {status,profile}
tochainlink admin {status,profile}
.
- Configuration with legacy environment variables is no longer supported. TOML is required.
- Bumped the WSPRC dependency version to fix a bug that could lead to race conditions
- Support for sending Bootstrap job specs to the feeds manager
- Support for sending OCR2 job specs to the feeds manager
- Log poller filters now saved in db, restored on node startup to guard against missing logs during periods where services are temporarily unable to start
- Add support for new job type
mercury
(low-latency oracle) - New config option for EVM-based chains
AutoCreateKey
. If set to false, chainlink will not automatically create any keys for this chain. This can be used in conjunction with mercury to prevent creating useless keys. Example:
[[EVM]]
ChainID = "1"
AutoCreateKey = false
- Add new option for relayConfig
feedID
that handles multi-config contracts. Can be applied to any OCR2 job.
- TOML env var
CL_CONFIG
always processed as the last configuration, with the effect of being the final override of any values provided via configuration files.
- The config option
FeatureFeedsManager
/FEATURE_FEEDS_MANAGER
is now true by default.
- Terra is no longer supported
- Prometheus gauge
mailbox_load_percent
for percent of "Mailbox
" capacity used. - New config option,
JobPipeline.MaxSuccessfulRuns
caps the total number of saved completed runs per job. This is done in response to thepipeline_runs
table potentially becoming large, which can cause performance degradation. The default is set to 10,000. You can set it to 0 to disable run saving entirely. NOTE: This can only be configured via TOML and not with an environment variable. - Prometheus gauge vector
feeds_job_proposal_count
to track counts of job proposals partitioned by proposal status. - Support for variable expression for the
minConfirmations
parameter on theethtx
task.
- Removed
KEEPER_TURN_FLAG_ENABLED
as all networks/nodes have switched this totrue
now. The variable should be completely removed my NOPs. - Removed
Keeper.UpkeepCheckGasPriceEnabled
config (KEEPER_CHECK_UPKEEP_GAS_PRICE_FEATURE_ENABLED
in old env var configuration) as this feature is deprecated now. The variable should be completely removed by NOPs.
- Fixed (SQLSTATE 42P18) error on Job Runs page, when attempting to view specific older or infrequenty run jobs
- The
config dump
subcommand was fixed to dump the correct config data.- The
P2P.V1.Enabled
config logic incorrectly matched V2, by only setting explicit true values so that otherwise the default is used. TheV1.Enabled
default value is actually true already, and is now updated to only set explicit false values. - The
[EVM.Transactions]
config fieldsMaxQueued
&MaxInFlight
will now correctly matchETH_MAX_QUEUED_TRANSACTIONS
Ð_MAX_IN_FLIGHT_TRANSACTIONS
.
- The
- New
EVM.NodePool.SelectionMode
TotalDifficulty
to use the node with the greatest total difficulty. - Add the following prometheus metrics (labelled by bridge name) for monitoring external adapter queries:
bridge_latency_seconds
bridge_errors_total
bridge_cache_hits_total
bridge_cache_errors_total
EVM.NodePool.SyncThreshold
to ensure that live nodes do not lag too far behind.
SyncThreshold = 5 # DefaultSyncThreshold controls how far a node may lag behind the best node before being marked out-of-sync. Depending on
SelectionMode
, this represents a difference in the number of blocks (HighestHead
,RoundRobin
), or total difficulty (TotalDifficulty
).Set to 0 to disable this check.
Chainlink now supports static configuration via TOML files as an alternative to the existing combination of environment variables and persisted database configurations.
This is currently experimental, but in the future (with v2.0.0
), it will become mandatory as the only supported configuration method. Avoid using TOML for configuration unless running on a test network for this release.
TOML configuration can be enabled by simply using the new -config <filename>
flag or CL_CONFIG
environment variable.
Multiple files can be used (-c configA.toml -c configB.toml
), and will be applied in order with duplicated fields overriding any earlier values.
Existing nodes can automatically generate their equivalent TOML configuration via the config dump
subcommand.
Secrets must be configured manually and passed via -secrets <filename>
or equivalent environment variables.
Format details: CONFIG.md • SECRETS.md
Note: You cannot mix legacy environment variables with TOML configuration. Leaving any legacy env vars set will fail validation and prevent boot.
Dump your current configuration as TOML.
chainlink config dump > config.toml
Inspect your full effective configuration, and ensure it is valid. This includes defaults.
chainlink --config config.toml --secrets secrets.toml config validate
Run the node.
chainlink -c config.toml -s secrets.toml node start
- Default: 0s
When set to d
units of time, this variable enables using cached bridge responses that are at most d
units old. Caching is disabled by default.
Example BridgeCacheTTL=10s
, BridgeCacheTTL=1m
- Fixed a minor bug whereby Chainlink would not always resend all pending transactions when using multiple keys
NODE_NO_NEW_HEADS_THRESHOLD=0
no longer requiresNODE_SELECTION_MODE=RoundRobin
.
- Default: none
When set, this environment variable configures and enables an optional HTTP logger which is used specifically to send audit log events. Audit logs events are emitted when specific actions are performed by any of the users through the node's API. The value of this variable should be a full URL. Log items will be sent via POST
There are audit log implemented for the following events:
- Auth & Sessions (new session, login success, login failed, 2FA enrolled, 2FA failed, password reset, password reset failed, etc.)
- CRUD actions for all resources (add/create/delete resources such as bridges, nodes, keys)
- Sensitive actions (keys exported/imported, config changed, log level changed, environment dumped)
A full list of audit log enum types can be found in the source within the audit
package (audit_types.go
).
The following AUDIT_LOGGER_*
environment variables below configure this optional audit log HTTP forwarder.
- Default: none
An optional list of HTTP headers to be added for every optional audit log event. If the above AUDIT_LOGGER_FORWARD_TO_URL
is set, audit log events will be POSTed to that URL, and will include headers specified in this environment variable. One example use case is auth for example: AUDIT_LOGGER_HEADERS="Authorization||{{token}}"
.
Header keys and values are delimited on ||, and multiple headers can be added with a forward slash delimiter ('\'). An example of multiple key value pairs:
AUDIT_LOGGER_HEADERS="Authorization||{{token}}\Some-Other-Header||{{token2}}"
- Default: none
When the audit log HTTP forwarder is enabled, if there is a value set for this optional environment variable then the POST body will be wrapped in a dictionary in a field specified by the value of set variable. This is to help enable specific logging service integrations that may require the event JSON in a special shape. For example: AUDIT_LOGGER_JSON_WRAPPER_KEY=event
will create the POST body:
{
"event": {
"eventID": EVENT_ID_ENUM,
"data": ...
}
}
Automatic connectivity detection; Chainlink will no longer bump excessively if the network is broken
This feature only applies on EVM chains when using BlockHistoryEstimator (the most common case).
Chainlink will now try to automatically detect if there is a transaction propagation/connectivity issue and prevent bumping in these cases. This can help avoid the situation where RPC nodes are not propagating transactions for some reason (e.g. go-ethereum bug, networking issue etc) and Chainlink responds in a suboptimal way by bumping transactions to a very high price in an effort to get them mined. This can lead to unnecessary expense when the connectivity issue is resolved and the transactions are finally propagated into the mempool.
This feature is enabled by default with fairly conservative settings: if a transaction has been priced above the 90th percentile of the past 12 blocks, but still wants to bump due to not being mined, a connectivity/propagation issue is assumed and all further bumping will be prevented for this transaction. In this situation, Chainlink will start firing the block_history_estimator_connectivity_failure_count
prometheus counter and logging at critical level until the transaction is mined.
The default settings should work fine for most users. For advanced users, the values can be tweaked by changing BLOCK_HISTORY_ESTIMATOR_CHECK_INCLUSION_BLOCKS
and BLOCK_HISTORY_ESTIMATOR_CHECK_INCLUSION_PERCENTILE
.
To disable connectivity checking completely, set BLOCK_HISTORY_ESTIMATOR_CHECK_INCLUSION_BLOCKS=0
.
-
The default maximum gas price on most networks is now effectively unlimited.
- Chainlink will bump as high as necessary to get a transaction included. The connectivity checker is relied on to prevent excessive bumping when there is a connectivity failure.
- If you want to change this, you can manually set
ETH_MAX_GAS_PRICE_WEI
.
-
EVMChainID field will be auto-added with default chain id to job specs of newly created OCR jobs, if not explicitly included.
- Old OCR jobs missing EVMChainID will continue to run on any chain ETH_CHAIN_ID is set to (or first chain if unset), which may be changed after a restart.
- Newly created OCR jobs will only run on a single fixed chain, unaffected by changes to ETH_CHAIN_ID after the job is added.
- It should no longer be possible to end up with multiple OCR jobs for a single contract running on the same chain; only one job per contract per chain is allowed
- If there are any existing duplicate jobs (per contract per chain), all but the job with the latest creation date will be pruned during upgrade.
- Fixed minor bug where Chainlink would attempt (and fail) to estimate a tip cap higher than the maximum configured gas price in EIP1559 mode. It now caps the tipcap to the max instead of erroring.
- Fixed bug whereby it was impossible to remove eth keys that had extant transactions. Now, removing an eth key will drop all associated data automatically including past transactions.
- Added
length
andlessthan
tasks (pipeline). - Added
gasUnlimited
parameter toethcall
task. /keys
page in Operator UI now exposes several admin commands, namely:- "abandon" to abandon all current txes
- enable/disable a key for a given chain
- manually set the nonce for a key See this PR for a screenshot example.
- New
GAS_ESTIMATOR_MODE
for Arbitrum to support Nitro's multi-dimensional gas model, with dynamic gas pricing and limits.- NOTE: It is recommended to remove
GAS_ESTIMATOR_MODE
as an env var if you have it set in order to use the new default. - This new, default estimator for Arbitrum networks uses the suggested gas price (up to
ETH_MAX_GAS_PRICE_WEI
, with1000 gwei
default) as well as an estimated gas limit (up toETH_GAS_LIMIT_MAX
, with1,000,000,000
default).
- NOTE: It is recommended to remove
ETH_GAS_LIMIT_MAX
to put a maximum on the gas limit returned by theArbitrum
estimator.
- EIP1559 is now enabled by default on Goerli network
- Added
hexencode
andbase64encode
tasks (pipeline). forwardingAllowed
per job attribute to allow forwarding txs submitted by the job.- Keypath now supports paths with any depth, instead of limiting it to 2
Arbitrum
chains are no longer restricted to onlyFixedPrice
GAS_ESTIMATOR_MODE
- Updated
Arbitrum Rinkeby & Mainnet & Mainnet
configurationss for Nitro - Add
Arbitrum Goerli
configuration - It is now possible to use the same key across multiple chains.
NODE_SELECTION_MODE
(EVM.NodePool.SelectionMode
) controls node picking strategy. Supported values:HighestHead
(default) andRoundRobin
:RoundRobin
mode simply iterates among available alive nodes. This was the default behavior prior to this release.HighestHead
mode picks a node having the highest reported head number among other alive nodes. When several nodes have the same latest head number, the strategy sticks to the last used node. For chains havingNODE_NO_NEW_HEADS_THRESHOLD=0
(such as Arbitrum, Optimism), the implementation will fall back toRoundRobin
mode.
- New
keys eth chain
command- This can also be accessed at
/v2/keys/evm/chain
. - Usage examples:
- Manually (re)set a nonce:
chainlink keys eth chain --address "0xEXAMPLE" --evmChainID 99 --setNextNonce 42
- Enable a key for a particular chain:
chainlink keys eth chain --address "0xEXAMPLE" --evmChainID 99 --enable
- Disable a key for a particular chain:
chainlink keys eth chain --address "0xEXAMPLE" --evmChainID 99 --disable
- Abandon all currently pending transactions (use with caution!):
chainlink evm keys chain --address "0xEXAMPLE" --evmChainID 99 --abandon
- Manually (re)set a nonce:
- Commands can be combined e.g.
- Reset nonce and abandon all currently pending transaction:
chainlink evm keys chain --address "0xEXAMPLE" --evmChainID 99 --setNextNonce 42 --abandon
- Reset nonce and abandon all currently pending transaction:
- This can also be accessed at
- The
setnextnonce
local client command has been removed, and replaced by a more general key/chain client command. chainlink admin users update
command is replaced withchainlink admin users chrole
(only the role can be changed for a user)
Arbitrum Nitro
client error support
p2pv2Bootstrappers
has been added as a new optional property of OCR1 job specs; default may still be specified with P2PV2_BOOTSTRAPPERS config param- Added official support for Sepolia chain
- Added
hexdecode
andbase64decode
tasks (pipeline). - Added support for Besu execution client (note that while Chainlink supports Besu, Besu itself has multiple bugs that make it unreliable).
- Added the functionality to allow the root admin CLI user (and any additional admin users created) to create and assign tiers of role based access to new users. These new API users will be able to log in to the Operator UI independently, and can each have specific roles tied to their account. There are four roles:
admin
,edit
,run
, andview
.- User management can be configured through the use of the new admin CLI command
chainlink admin users
. Be sure to runchainlink adamin login
. For example, a readonly user can be created with:chainlink admin users create --email=operator-ui-read-only@test.com --role=view
. - Updated documentation repo with a break down of actions to required role level
- User management can be configured through the use of the new admin CLI command
- Added per job spec and per job type gas limit control. The following rule of precedence is applied:
- task-specific parameter
gasLimit
overrides anything else when specified (e.g.ethtx
task has such a parameter). - job-spec attribute
gasLimit
has the scope of the current job spec only. - job-type limits
ETH_GAS_LIMIT_*_JOB_TYPE
affect any jobs of the corresponding type:
ETH_GAS_LIMIT_OCR_JOB_TYPE # EVM.GasEstimator.LimitOCRJobType
ETH_GAS_LIMIT_DR_JOB_TYPE # EVM.GasEstimator.LimitDRJobType
ETH_GAS_LIMIT_VRF_JOB_TYPE # EVM.GasEstimator.LimitVRFJobType
ETH_GAS_LIMIT_FM_JOB_TYPE # EVM.GasEstimator.LimitFMJobType
ETH_GAS_LIMIT_KEEPER_JOB_TYPE # EVM.GasEstimator.LimitKeeperJobType
- global
ETH_GAS_LIMIT_DEFAULT
(EVM.GasEstimator.LimitDefault
) value is the last resort.
- Addressed a very rare bug where using multiple nodes with differently configured RPC tx fee caps could cause missed transaction. Reminder to everyone to ensure that your RPC nodes have no caps (for more information see the performance and tuning guide).
- Improved handling of unknown transaction error types, making Chainlink more robust in certain cases on unsupported chains/RPC clients
- After feedback from users, password complexity requirements have been simplified. These are the new, simplified requirements for any kind of password used with Chainlink:
- Must be 16 characters or more
- Must not contain leading or trailing whitespace
- User passwords must not contain the user's API email
- Simplified the Keepers job spec by removing the observation source from the required parameters.
- Fix rare out-of-sync to invalid-chain-id transaction
- Fix key-specific max gas limits for gas estimator and ensure we do not bump gas beyond key-specific limits
- Fix EVM_FINALITY_DEPTH => ETH_FINALITY_DEPTH
- Chainlink will now log a warning if the postgres database password is missing or too insecure. Passwords should conform to the following rules:
Must be longer than 12 characters
Must comprise at least 3 of:
lowercase characters
uppercase characters
numbers
symbols
Must not comprise:
More than three identical consecutive characters
Leading or trailing whitespace (note that a trailing newline in the password file, if present, will be ignored)
For backward compatibility all insecure passwords will continue to work, however in a future version of Chainlink insecure passwords will prevent application boot. To bypass this check at your own risk, you may set SKIP_DATABASE_PASSWORD_COMPLEXITY_CHECK=true
.
-
MIN_OUTGOING_CONFIRMATIONS
has been removed and no longer has any effect.ETH_FINALITY_DEPTH
is now used as the default forethtx
confirmations instead. You may override this on a per-task basis by settingminConfirmations
in the task definition e.g.foo [type=ethtx minConfirmations=42 ...]
. NOTE: This may have a minor impact on performance on very high throughput chains. If you don't care about reporting task status in the UI, it is recommended to setminConfirmations=0
in your job specs. For more details, see the relevant section of the performance tuning guide. -
The following ENV variables have been deprecated, and will be removed in a future release:
INSECURE_SKIP_VERIFY
,CLIENT_NODE_URL
,ADMIN_CREDENTIALS_FILE
. These vars only applied to Chainlink when running in client mode and have been replaced by command line args, notably:--insecure-skip-verify
,--remote-node-url URL
and--admin-credentials-file FILE
respectively. More information can be found by running./chainlink --help
. -
The
Optimism2
GAS_ESTIMATOR_MODE
has been renamed toL2Suggested
. The old name is still supported for now. -
The
p2pBootstrapPeers
property on OCR2 job specs has been renamed top2pv2Bootstrappers
.
- Added
ETH_USE_FORWARDERS
config option to enable transactions forwarding contracts. - In job pipeline (direct request) the three new block variables are exposed:
$(jobRun.blockReceiptsRoot)
: the root of the receipts trie of the block (hash)$(jobRun.blockTransactionsRoot)
: the root of the transaction trie of the block (hash)$(jobRun.blockStateRoot)
: the root of the final state trie of the block (hash)
ethtx
tasks can now be configured to error if the transaction reverts on-chain. You must setfailOnRevert=true
on the task to enable this behavior, like so:
foo [type=ethtx failOnRevert=true ...]
So the ethtx
task now works as follows:
If minConfirmations == 0, task always succeeds and nil is passed as output If minConfirmations > 0, the receipt is passed through as output If minConfirmations > 0 and failOnRevert=true then the ethtx task will error on revert
If minConfirmations
is not set on the task, the chain default will be used which is usually 12 and always greater than 0.
http
task now allows specification of request headers. Use like so:foo [type=http headers="[\\"X-Header-1\\", \\"value1\\", \\"X-Header-2\\", \\"value2\\"]"]
.
- Fixed
max_unconfirmed_age
metric. Previously this would incorrectly report the max time since the last rebroadcast, capping the upper limit to the EthResender interval. This now reports the correct value of total time elapsed since the first broadcast. - Correctly handle the case where bumped gas would exceed the RPC node's configured maximum on Fantom (note that node operators should check their Fantom RPC node configuration and remove the fee cap if there is one)
- Fixed handling of Metis internal fee change
- The
Optimism
OVM 1.0GAS_ESTIMATOR_MODE
has been removed.
- Ensure failed EthSubscribe didn't register a (*rpc.ClientSubscription)(nil) which would lead to a panic on Unsubscribe
- Fixes parsing of float values on job specs
- JSON parse tasks (v2) now support a custom
separator
parameter to substitute for the default,
. - Log slow SQL queries
- Fantom and avalanche block explorer urls
- Display
requestTimeout
in job UI - Keeper upkeep order is shuffled
LOG_FILE_MAX_SIZE
handling- Improved websocket subscription management (fixes issues with multiple-primary-node failover from 1.3.x)
- VRFv2 fixes and enhancements
- UI support for
minContractPaymentLinkJuels
- Added support for Keeper registry v1.2 in keeper jobs
- Added disk rotating logs. Chainlink will now always log to disk at debug level. The default output directory for debug logs is Chainlink's root directory (ROOT_DIR) but can be configured by setting LOG_FILE_DIR. This makes it easier for node operators to report useful debugging information to Chainlink's team, since all the debug logs are conveniently located in one directory. Regular logging to STDOUT still works as before and respects the LOG_LEVEL env var. If you want to log in disk at a particular level, you can pipe STDOUT to disk. This automatic debug-logs-to-disk feature is enabled by default, and will remain enabled as long as the
LOG_FILE_MAX_SIZE
ENV var is set to a value greater than zero. The amount of disk space required for this feature to work can be calculated with the following formula:LOG_FILE_MAX_SIZE
* (LOG_FILE_MAX_BACKUPS
+ 1). If your disk doesn't have enough disk space, the logging will pause and the application will log Errors until space is available again. New environment variables related to this feature:LOG_FILE_MAX_SIZE
(default: 5120mb) - this env var allows you to override the log file's max size (in megabytes) before file rotation.LOG_FILE_MAX_AGE
(default: 0) - ifLOG_FILE_MAX_SIZE
is set, this env var allows you to override the log file's max age (in days) before file rotation. Keeping this config with the default value means not to remove old log files.LOG_FILE_MAX_BACKUPS
(default: 1) - ifLOG_FILE_MAX_SIZE
is set, this env var allows you to override the max amount of old log files to retain. Keeping this config with the default value means to retain 1 old log file at most (thoughLOG_FILE_MAX_AGE
may still cause them to get deleted). If this is set to 0, the node will retain all old log files instead.
- Added support for the
force
flag onchainlink blocks replay
. If set to true, already consumed logs that would otherwise be skipped will be rebroadcasted. - Added version compatibility check when using CLI to login to a remote node. flag
bypass-version-check
skips this check. - Interrim solution to set multiple nodes/chains from ENV. This gives the ability to specify multiple RPCs that the Chainlink node will constantly monitor for health and sync status, detecting dead nodes and out of sync nodes, with automatic failover. This is a temporary stand-in until configuration is overhauled and will be removed in future in favor of a config file. Set as such:
EVM_NODES='{...}'
where the var is a JSON array containing the node specifications. This is not compatible with using any other way to specify node via env (e.g.ETH_URL
,ETH_SECONDARY_URL
,ETH_CHAIN_ID
etc). WARNING: Setting this environment variable will COMPLETELY ERASE yourevm_nodes
table on every boot and repopulate from the given data, nullifying any runtime modifications. Make sure to carefully read the EVM performance configuration guide for best practices here.
For example:
export EVM_NODES='
[
{
"name": "primary_1",
"evmChainId": "137",
"wsUrl": "wss://endpoint-1.example.com/ws",
"httpUrl": "http://endpoint-1.example.com/",
"sendOnly": false
},
{
"name": "primary_2",
"evmChainId": "137",
"wsUrl": "ws://endpoint-2.example.com/ws",
"httpUrl": "http://endpoint-2.example.com/",
"sendOnly": false
},
{
"name": "primary_3",
"evmChainId": "137",
"wsUrl": "wss://endpoint-3.example.com/ws",
"httpUrl": "http://endpoint-3.example.com/",
"sendOnly": false
},
{
"name": "sendonly_1",
"evmChainId": "137",
"httpUrl": "http://endpoint-4.example.com/",
"sendOnly": true
},
{
"name": "sendonly_2",
"evmChainId": "137",
"httpUrl": "http://endpoint-5.example.com/",
"sendOnly": true
}
]
'
- Changed default locking mode to "dual". Bugs in lease locking have been ironed out and this paves the way to making "lease" the default in the future. It is recommended to set
DATABASE_LOCKING_MODE=lease
, default is set to "dual" only for backwards compatibility. - EIP-1559 is now enabled by default on mainnet. To disable (go back to legacy mode) set
EVM_EIP1559_DYNAMIC_FEES=false
. The default settings should work well, but if you wish to tune your gas controls, see the documentation.
Note that EIP-1559 can be manually enabled on other chains by setting EVM_EIP1559_DYNAMIC_FEES=true
but we only support it for official Ethereum mainnet and testnets. It is not recommended enabling this setting on Polygon since during our testing process we found that the EIP-1559 fee market appears to be broken on all Polygon chains and EIP-1559 transactions are actually less likely to get included than legacy transactions.
See issue: maticnetwork/bor#347
- The pipeline task runs have changed persistence protocol (database), which will result in inability to decode some existing task runs. All new runs should be working with no issues.
LOG_TO_DISK
ENV var.
This release hotfixes issues from moving a new CI/CD system. Feature-wise the functionality is the same as v1.2.0
.
- Fixed CI/CD issue where environment variables were not being passed into the underlying build
- Added support for the Nethermind Ethereum client.
- Added support for batch sending telemetry to the ingress server to improve performance.
- Added v2 P2P networking support (alpha)
New ENV vars:
ADVISORY_LOCK_CHECK_INTERVAL
(default: 1s) - when advisory locking mode is enabled, this controls how often Chainlink checks to make sure it still holds the advisory lock. It is recommended to leave this at the default.ADVISORY_LOCK_ID
(default: 1027321974924625846) - when advisory locking mode is enabled, the application advisory lock ID can be changed using this env var. All instances of Chainlink that might run on a particular database must share the same advisory lock ID. It is recommended to leave this at the default.LOG_FILE_DIR
(default: chainlink root directory) - ifLOG_FILE_MAX_SIZE
is set, this env var allows you to override the output directory for logging.SHUTDOWN_GRACE_PERIOD
(default: 5s) - when node is shutting down gracefully and exceeded this grace period, it terminates immediately (trying to close DB connection) to avoid being SIGKILLed.SOLANA_ENABLED
(default: false) - set to true to enable Solana supportTERRA_ENABLED
(default: false) - set to true to enable Terra supportBLOCK_HISTORY_ESTIMATOR_EIP1559_FEE_CAP_BUFFER_BLOCKS
- if EIP1559 mode is enabled, this optional env var controls the buffer blocks to add to the current base fee when sending a transaction. By default, the gas bumping threshold + 1 block is used. It is not recommended to change this unless you know what you are doing.TELEMETRY_INGRESS_BUFFER_SIZE
(default: 100) - the number of telemetry messages to buffer before dropping new onesTELEMETRY_INGRESS_MAX_BATCH_SIZE
(default: 50) - the maximum number of messages to batch into one telemetry requestTELEMETRY_INGRESS_SEND_INTERVAL
(default: 500ms) - the cadence on which batched telemetry is sent to the ingress serverTELEMETRY_INGRESS_SEND_TIMEOUT
(default: 10s) - the max duration to wait for the request to complete when sending batch telemetryTELEMETRY_INGRESS_USE_BATCH_SEND
(default: true) - toggles sending telemetry using the batch client to the ingress serverNODE_NO_NEW_HEADS_THRESHOLD
(default: 3m) - RPC node will be marked out-of-sync if it does not receive a new block for this length of time. Set to 0 to disable head monitoring for liveness checking,NODE_POLL_FAILURE_THRESHOLD
(default: 5) - number of consecutive failed polls before an RPC node is marked dead. Set to 0 to disable poll liveness checking.NODE_POLL_INTERVAL
(default: 10s) - how often to poll. Set to 0 to disable all polling.
Added a new bootstrap
job type. This job removes the need for every job to implement their own bootstrapping logic.
OCR2 jobs with isBootstrapPeer=true
are automatically migrated to the new format.
The spec parameters are similar to a basic OCR2 job, an example would be:
type = "bootstrap"
name = "bootstrap"
relay = "evm"
schemaVersion = 1
contractID = "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B"
[relayConfig]
chainID = 4
Chainlink now supports hot failover and liveness checking for EVM nodes. This completely supercedes and replaces the Fiews failover proxy and should remove the need for any kind of failover proxy between Chainlink and its RPC nodes.
In order to use this feature, you'll need to set multiple primary RPC nodes.
deleteuser
CLI command.
EVM_DISABLED
has been deprecated and replaced by EVM_ENABLED
for consistency with other feature flags.
ETH_DISABLED
has been deprecated and replaced by EVM_RPC_ENABLED
for consistency, and because this was confusingly named. In most cases you want to set EVM_ENABLED=false
and not EVM_RPC_ENABLED=false
.
Log colorization is now disabled by default because it causes issues when piped to text files. To re-enable log colorization, set LOG_COLOR=true
.
Due to increasingly hostile network conditions on Polygon we have had to increase a number of default limits. This is to work around numerous and very deep re-orgs, high mempool pressure and a failure by the network to propagate transactions properly. These new limits are likely to increase load on both your Chainlink node and database, so please be sure to monitor CPU and memory usage on both and make sure they are adequately specced to handle the additional load.
BLOCK_HISTORY_ESTIMATOR_EIP1559_FEE_CAP_BUFFER_BLOCKS
- if EIP1559 mode is enabled, this optional env var controls the buffer blocks to add to the current base fee when sending a transaction. By default, the gas bumping threshold + 1 block is used. It is not recommended to change this unless you know what you are doing.EVM_GAS_FEE_CAP_DEFAULT
- if EIP1559 mode is enabled, and FixedPrice gas estimator is used, this env var controls the fixed initial fee cap.- Allow dumping pprof even when not in dev mode, useful for debugging (go to /v2/debug/pprof as a logged in user)
- Update timeout so we don’t exit early on very large log broadcaster backfills
Fixed issues with EIP-1559 related to gas bumping. Due to go-ethereum's implementation which introduces additional restrictions on top of the EIP-1559 spec, we must bump the FeeCap at least 10% each time in order for the gas bump to be accepted.
The new EIP-1559 implementation works as follows:
If you are using FixedPriceEstimator:
- With gas bumping disabled, it will submit all transactions with
feecap=ETH_MAX_GAS_PRICE_WEI
andtipcap=EVM_GAS_TIP_CAP_DEFAULT
- With gas bumping enabled, it will submit all transactions initially with
feecap=EVM_GAS_FEE_CAP_DEFAULT
andtipcap=EVM_GAS_TIP_CAP_DEFAULT
.
If you are using BlockHistoryEstimator (default for most chains):
- With gas bumping disabled, it will submit all transactions with
feecap=ETH_MAX_GAS_PRICE_WEI
andtipcap=<calculated using past blocks>
- With gas bumping enabled (default for most chains) it will submit all transactions initially with
feecap = ( current block base fee * (1.125 ^ N) + tipcap )
where N is configurable by setting BLOCK_HISTORY_ESTIMATOR_EIP1559_FEE_CAP_BUFFER_BLOCKS but defaults togas bump threshold+1
andtipcap=<calculated using past blocks>
Bumping works as follows:
- Increase tipcap by
max(tipcap * (1 + ETH_GAS_BUMP_PERCENT), tipcap + ETH_GAS_BUMP_WEI)
- Increase feecap by
max(feecap * (1 + ETH_GAS_BUMP_PERCENT), feecap + ETH_GAS_BUMP_WEI)
- Added support for Sentry error reporting. Set
SENTRY_DSN
at run-time to enable reporting. - Added Prometheus counters:
log_warn_count
,log_error_count
,log_critical_count
,log_panic_count
andlog_fatal_count
representing the corresponding number of warning/error/critical/panic/fatal messages in the log. - The new prometheus metric
tx_manager_tx_attempt_count
is a Prometheus Gauge that should represent the total number of Transactions attempts that awaiting confirmation for this node. - The new prometheus metric
version
that displays the node software version (tag) as well as the corresponding commit hash. - CLI command
keys eth list
is updated to display key specific max gas prices. - CLI command
keys eth create
now supports optionalmaxGasPriceGWei
parameter. - CLI command
keys eth update
is added to update key specific parameters likemaxGasPriceGWei
. - Add partial support for Moonriver chain
- For OCR jobs,
databaseTimeout
,observationGracePeriod
andcontractTransmitterTransmitTimeout
can be specified to override chain-specific default values.
Two new log levels have been added.
[crit]
: Critical level logs are more severe than[error]
and require quick action from the node operator.[debug] [trace]
: Trace level logs contain extra[debug]
information for development, and must be compiled in via-tags trace
.
As a beta feature, Chainlink now supports connecting to multiple different EVM chains simultaneously.
This means that one node can run jobs on Goerli, Kovan, BSC and Mainnet (for example). Note that you can still have as many eth keys as you like, but each eth key is pegged to one chain only.
Extensive efforts have been made to make migration for existing nops as seamless as possible. Generally speaking, you should not have to make any changes when upgrading your existing node to this version. All your jobs will continue to run as before.
The overall summary of changes is such:
EVM chains are now represented as a first class object within the chainlink node. You can create/delete/list them using the CLI or API.
At least one primary node is required in order for a chain to connect. You may additionally specify zero or more send-only nodes for a chain. It is recommended to use the CLI/API or GUI to add nodes to chain.
chainlink chains evm create -id 42 # creates an evm chain with chain ID 42 (see: https://chainlist.org/)
chainlink nodes create -chain-id 42 -name 'my-primary-kovan-full-node' -type primary -ws-url ws://node.example/ws -http-url http://node.example/rpc # http-url is optional but recommended for primaries
chainlink nodes create -chain-id 42 -name 'my-send-only-backup-kovan-node' -type sendonly -http-url http://some-public-node.example/rpc
chainlink chains evm list
chainlink nodes list
chainlink nodes delete 'my-send-only-backup-kovan-node'
chainlink chains evm delete 42
The old way of specifying chains using environment variables is still supported but discouraged. It works as follows:
If you specify ETH_URL
then the values of ETH_URL
, ETH_CHAIN_ID
, ETH_HTTP_URL
and ETH_SECONDARY_URLS
will be used to create/update chains and nodes representing these values in the database. If an existing chain/node is found it will be overwritten. This behavior is used mainly to ease the process of upgrading, and on subsequent runs (once your old settings have been written to the database) it is recommended to unset these ENV vars and use the API commands exclusively to administer chains and nodes.
By default, all jobs/tasks will continue to use the default chain (specified by ETH_CHAIN_ID
). However, the following jobs now allow an additional evmChainID
key in their TOML:
- VRF
- DirectRequest
- Keeper
- OCR
- Fluxmonitor
You can pin individual jobs to a particular chain by specifying the evmChainID
explicitly. Here is an example job to demonstrate:
type = "keeper"
evmChainID = 3
schemaVersion = 1
name = "example keeper spec"
contractAddress = "0x9E40733cC9df84636505f4e6Db28DCa0dC5D1bba"
externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F49"
fromAddress = "0xa8037A20989AFcBC51798de9762b351D63ff462e"
The above keeper job will always run on chain ID 3 (Ropsten) regardless of the ETH_CHAIN_ID
setting. If no chain matching this ID has been added to the chainlink node, the job cannot be created (you must create the chain first).
In addition, you can also specify evmChainID
on certain pipeline tasks. This allows for cross-chain requests, for example:
type = "directrequest"
schemaVersion = 1
evmChainID = 42
name = "example cross chain spec"
contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C"
externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F90"
observationSource = """
decode_log [type=ethabidecodelog ... ]
...
submit [type=ethtx to="0x613a38AC1659769640aaE063C651F48E0250454C" data="$(encode_tx)" minConfirmations="2" evmChainID="3"]
decode_log-> ... ->submit;
"""
In the example above (which excludes irrelevant pipeline steps for brevity) a log can be read from the chain with ID 42 (Kovan) and a transaction emitted on chain with ID 3 (Ropsten).
Tasks that support the evmChainID
parameter are as follows:
ethcall
estimategaslimit
ethtx
If the job- or task-specific evmChainID
is not given, the job/task will simply use the default as specified by the ETH_CHAIN_ID
env variable.
Generally speaking, the default config values for each chain are good enough. But in some cases it is necessary to be able to override the defaults on a per-chain basis.
This used to be done via environment variables e.g. MINIMUM_CONTRACT_PAYMENT_LINK_JUELS
.
These still work, but if set they will override that value for all chains. This may not always be what you want. Consider a node that runs both Matic and Mainnet. You may want to set a higher value for MINIMUM_CONTRACT_PAYMENT
on Mainnet, due to the more expensive gas costs. However, setting MINIMUM_CONTRACT_PAYMENT_LINK_JUELS
using env variables will set that value for all chains including matic.
To help you work around this, Chainlink now supports setting per-chain configuration options.
Examples
To set initial configuration when creating a chain, pass in the full json string as an optional parameter at the end:
chainlink evm chains create -id 42 '{"BlockHistoryEstimatorBlockDelay": "100"}'
To set configuration on an existing chain, specify key values pairs as such:
chainlink evm chains configure -id 42 BlockHistoryEstimatorBlockDelay=100 GasEstimatorMode=FixedPrice
The full list of chain-specific configuration options can be found by looking at the ChainCfg
struct in core/chains/evm/types/types.go
.
External Adapters making async callbacks can now error job runs. This required a slight change to format, the correct way to callback from an asynchronous EA is using the following JSON:
SUCCESS CASE:
{
"value": < any valid json object >
}
ERROR CASE:
{
"error": "some error string"
}
This only applies to EAs using the X-Chainlink-Pending
header to signal that the result will be POSTed back to the Chainlink node sometime 'later'. Regular synchronous calls to EAs work just as they always have done.
(NOTE: Official documentation for EAs needs to be updated)
Added a new optional field for VRF v2 jobs called requestedConfsDelay
, which configures a
number of blocks to wait in addition to the request specified requestConfirmations
before servicing
the randomness request, i.e. the Chainlink node will wait max(nodeMinConfs, requestConfirmations + requestedConfsDelay)
blocks before servicing the request.
It can be used in the following way:
type = "vrf"
externalJobID = "123e4567-e89b-12d3-a456-426655440001"
schemaVersion = 1
name = "vrf-v2-secondary"
coordinatorAddress = "0xABA5eDc1a551E55b1A570c0e1f1055e5BE11eca7"
requestedConfsDelay = 10
# ... rest of job spec ...
Use of this field requires a database migration.
Chainlink now supports a new environment variable DATABASE_LOCKING_MODE
. It can be set to one of the following values:
dual
(the default - uses both locking types for backwards and forwards compatibility)advisorylock
(advisory lock only)lease
(lease lock only)none
(no locking at all - useful for advanced deployment environments when you can be sure that only one instance of chainlink will ever be running)
The database lock ensures that only one instance of Chainlink can be run on the database at a time. Running multiple instances of Chainlink on a single database at the same time would likely to lead to strange errors and possibly even data integrity failures and should not be allowed.
Ideally, node operators would be using a container orchestration system (e.g. Kubernetes) that ensures that only one instance of Chainlink ever runs on a particular postgres database.
However, we are aware that many node operators do not have the technical capacity to do this. So a common use case is to run multiple Chainlink instances in failover mode (as recommended by our official documentation, although this will be changing in future). The first instance will take some kind of lock on the database and subsequent instances will wait trying to take this lock in case the first instance disappears or dies.
Traditionally Chainlink has used an advisory lock to manage this. However, advisory locks come with several problems, notably:
- Postgres does not really like it when you hold locks open for a very long time (hours/days). It hampers certain internal cleanup tasks and is explicitly discouraged by the postgres maintainers.
- The advisory lock can silently disappear on postgres upgrade, meaning that a new instance can take over even while the old one is still running.
- Advisory locks do not play nicely with pooling tools such as pgbouncer.
- If the application crashes, the advisory lock can be left hanging around for a while (sometimes hours) and can require manual intervention to remove it before another instance of Chainlink will allow itself to boot.
For this reason, we have introduced a new locking mode, lease
, which is likely to become the default in the future. lease
-mode works as follows:
- Have one row in a database which is updated periodically with the client ID.
- CL node A will run a background process on start that updates this e.g. once per second.
- CL node B will spinlock, checking periodically to see if the update got too old. If it goes more than a set period without updating, it assumes that node A is dead and takes over. Now CL node B is the owner of the row, and it updates this every second.
- If CL node A comes back somehow, it will go to take out a lease and realise that the database has been leased to another process, so it will exit the entire application immediately.
The default is set to dual
which used both advisory locking AND lease locking, for backwards compatibility. However, it is recommended that node operators who know what they are doing, or explicitly want to stop using the advisory locking mode set DATABASE_LOCKING_MODE=lease
in their env.
Lease locking can be configured using the following ENV vars:
LEASE_LOCK_REFRESH_INTERVAL
(default 1s)
LEASE_LOCK_DURATION
(default 30s)
It is recommended to leave these set to the default values.
When duplicating a job, the new job's configuration settings that have not been overridden by the user can still reflect the chainlink node configuration.
Added new automatic pprof profiling service. Profiling is triggered when the node exceeds certain resource thresholds (currently, memory and goroutine count). The following environment variables have been added to allow configuring this service:
AUTO_PPROF_ENABLED
: Set totrue
to enable the automatic profiling service. Defaults tofalse
.AUTO_PPROF_PROFILE_ROOT
: The location on disk where pprof profiles will be stored. Defaults to$CHAINLINK_ROOT
.AUTO_PPROF_POLL_INTERVAL
: The interval at which the node's resources are checked. Defaults to10s
.AUTO_PPROF_GATHER_DURATION
: The duration for which profiles are gathered when profiling is kicked off. Defaults to10s
.AUTO_PPROF_GATHER_TRACE_DURATION
: The duration for which traces are gathered when profiling is kicked off. This is separately configurable because traces are significantly larger than other types of profiles. Defaults to5s
.AUTO_PPROF_MAX_PROFILE_SIZE
: The maximum amount of disk space that profiles may consume before profiling is disabled. Defaults to100mb
.AUTO_PPROF_CPU_PROFILE_RATE
: See https://pkg.go.dev/runtime#SetCPUProfileRate. Defaults to1
.AUTO_PPROF_MEM_PROFILE_RATE
: See https://pkg.go.dev/runtime#pkg-variables. Defaults to1
.AUTO_PPROF_BLOCK_PROFILE_RATE
: See https://pkg.go.dev/runtime#SetBlockProfileRate. Defaults to1
.AUTO_PPROF_MUTEX_PROFILE_FRACTION
: See https://pkg.go.dev/runtime#SetMutexProfileFraction. Defaults to1
.AUTO_PPROF_MEM_THRESHOLD
: The maximum amount of memory the node can actively consume before profiling begins. Defaults to4gb
.AUTO_PPROF_GOROUTINE_THRESHOLD
: The maximum number of actively-running goroutines the node can spawn before profiling begins. Defaults to5000
.
Adventurous node operators are encouraged to read this guide on how to analyze pprof profiles.
A new task type has been added, called merge
. It can be used to merge two maps/JSON values together. Merge direction is from right to left such that right
will clobber values of left
. If no left
is provided, it uses the input of the previous task. Example usage as such:
decode_log [type=ethabidecodelog ...]
merge [type=merge right=<{"foo": 42}>];
decode_log -> merge;
Or, to reverse merge direction:
decode_log [type=ethabidecodelog ...]
merge [type=merge left=<{"foo": 42}> right="$(decode_log)"];
decode_log -> merge;
The ethabiencode2
task supports ABI encoding using the abi specification generated by solc
. e.g:
{
"name": "call",
"inputs": [
{
"name": "value",
"type": "tuple",
"components": [
{
"name": "first",
"type": "bytes32"
},
{
"name": "last",
"type": "bool"
}
]
}
]
}
This would allow for calling of a function call
with a tuple containing two values, the first a bytes32
and the second a bool
. You can supply a named map or an array.
Chainlink now supports transaction simulation for certain types of job. When this is enabled, transactions will be simulated using eth_call
before initial send. If the transaction reverted, the tx is marked as errored without being broadcast, potentially avoiding an expensive on-chain revert.
This can add a tiny bit of latency (upper bound 2s, generally much shorter under good conditions) and will add marginally more load to the eth client, since it adds an extra call for every transaction sent. However, it may help to save gas in some cases especially during periods of high demand by avoiding unnecessary reverts (due to outdated round etc.).
This option is EXPERIMENTAL and disabled by default.
To enable for FM or OCR:
FM_SIMULATE_TRANSACTIONs=true
OCR_SIMULATE_TRANSACTIONS=true
To enable in the pipeline, use the simulate=true
option like so:
submit [type=ethtx to="0xDeadDeadDeadDeadDeadDeadDeadDead" data="0xDead" simulate=true]
Use at your own risk.
Chainlink now supports more than one primary eth node per chain. Requests are round-robined between available primaries.
Add CRUD functionality for EVM Chains and Nodes through Operator UI.
Non-fatal errors to a pipeline run are preserved including any run that succeeds but has more than one fatal error.
Chainlink now supports configuring max gas price on a per-key basis (allows implementation of keeper "lanes").
The Operator UI now supports login MFA with hardware security keys. MFA_RPID
and MFA_RPORIGIN
environment variables have been added to the config and are required if using the new MFA feature.
Keys and Configuration navigation links have been moved into a settings dropdown to make space for multichain navigation links.
Chainlink now includes experimental support for submitting transactions using type 0x2 (EIP-1559) envelope.
EIP-1559 mode is off by default but can be enabled on a per-chain basis or globally.
This may help to save gas on spikes: Chainlink ought to react faster on the upleg and avoid overpaying on the downleg. It may also be possible to set BLOCK_HISTORY_ESTIMATOR_BATCH_SIZE
to a smaller value e.g. 12 or even 6 because tip cap ought to be a more consistent indicator of inclusion time than total gas price. This would make Chainlink more responsive and ought to reduce response time variance. Some experimentation will be needed here to find optimum settings.
To enable globally, set EVM_EIP1559_DYNAMIC_FEES=true
. Set with caution, if you set this on a chain that does not actually support EIP-1559 your node will be broken.
In EIP-1559 mode, the total price for the transaction is the minimum of base fee + tip cap and fee cap. More information can be found on the official EIP.
Chainlink's implementation of this is to set a large fee cap and modify the tip cap to control confirmation speed of transactions. So, when in EIP1559 mode, the tip cap takes the place of gas price roughly speaking, with the varying base price remaining a constant (we always pay it).
A quick note on terminology - Chainlink uses the same terms used internally by go-ethereum source code to describe various prices. This is not the same as the externally used terms. For reference:
Base Fee Per Gas = BaseFeePerGas Max Fee Per Gas = FeeCap Max Priority Fee Per Gas = TipCap
In EIP-1559 mode, the following changes occur to how configuration works:
- All new transactions will be sent as type 0x2 transactions specifying a TipCap and FeeCap (NOTE: existing pending legacy transactions will continue to be gas bumped in legacy mode)
- BlockHistoryEstimator will apply its calculations (gas percentile etc.) to the TipCap and this value will be used for new transactions (GasPrice will be ignored)
- FixedPriceEstimator will use
EVM_GAS_TIP_CAP_DEFAULT
instead ofETH_GAS_PRICE_DEFAULT
ETH_GAS_PRICE_DEFAULT
is ignored for new transactions andEVM_GAS_TIP_CAP_DEFAULT
is used instead (default 20GWei)ETH_MIN_GAS_PRICE_WEI
is ignored for new transactions andEVM_GAS_TIP_CAP_MINIMUM
is used instead (default 0)ETH_MAX_GAS_PRICE_WEI
controls the FeeCapKEEPER_GAS_PRICE_BUFFER_PERCENT
is ignored in EIP-1559 mode andKEEPER_TIP_CAP_BUFFER_PERCENT
is used instead
The default tip cap is configurable per-chain but can be specified for all chains using EVM_GAS_TIP_CAP_DEFAULT
. The fee cap is derived from ETH_MAX_GAS_PRICE_WEI
.
When using the FixedPriceEstimator, the default gas tip will be used for all transactions.
When using the BlockHistoryEstimator, Chainlink will calculate the tip cap based on transactions already included (in the same way it calculates gas price in legacy mode).
Enabling EIP1559 mode might lead to marginally faster transaction inclusion and make the node more responsive to sharp rises/falls in gas price, keeping response times more consistent.
In addition, ethcall
tasks now accept gasTipCap
and gasFeeCap
parameters in addition to gasPrice
. This is required for Keeper jobs, i.e.:
check_upkeep_tx [type=ethcall
failEarly=true
extractRevertReason=true
contract="$(jobSpec.contractAddress)"
gas="$(jobSpec.checkUpkeepGasLimit)"
gasPrice="$(jobSpec.gasPrice)"
gasTipCap="$(jobSpec.gasTipCap)"
gasFeeCap="$(jobSpec.gasFeeCap)"
data="$(encode_check_upkeep_tx)"]
NOTE: AccessLists are part of the 0x2 transaction type spec and Chainlink also implements support for these internally. This is not currently exposed in any way, if there is demand for this it ought to be straightforward enough to do so.
Avalanche AP4 defaults have been added (you can remove manually set ENV vars controlling gas pricing).
CHAIN_TYPE
- Configure the type of chain (if not standard). Arbitrum
, ExChain
, Optimism
, or XDai
. Replaces LAYER_2_TYPE
. NOTE: This is a global override, to set on a per-chain basis you must use the CLI/API or GUI to change the chain-specific config for that chain (ChainType
).
BLOCK_EMISSION_IDLE_WARNING_THRESHOLD
- Controls global override for the time after which node will start logging warnings if no heads are received.
ETH_DEFAULT_BATCH_SIZE
- Controls the default number of items per batch when making batched RPC calls. It is unlikely that you will need to change this from the default value.
NOTE: ETH_URL
used to default to "ws://localhost:8546" and ETH_CHAIN_ID
used to default to 1. These defaults have now been removed. The env vars are no longer required, since node configuration is now done via CLI/API/GUI and stored in the database.
belt/
andevm-test-helpers/
removed from the codebase.
LAYER_2_TYPE
- Use CHAIN_TYPE
instead.
FEATURE_CRON_V2
, FEATURE_FLUX_MONITOR_V2
, FEATURE_WEBHOOK_V2
- all V2 job types are now enabled by default.
- Fixed a regression whereby the BlockHistoryEstimator would use a bumped value on old gas price even if the new current price was larger than the bumped value.
- Fixed a bug where creating lots of jobs very quickly in parallel would cause the node to hang
- Propagating
evmChainID
parameter in job specs supporting this parameter.
Fixed LOG_LEVEL
behavior in respect to the corresponding UI setting: Operator can override LOG_LEVEL
until the node is restarted.
- The default
GAS_ESTIMATOR_MODE
for Optimism chains has been changed toOptimism2
. - Default minimum payment on mainnet has been reduced from 1 LINK to 0.1 LINK.
- Logging timestamp output has been changed from unix to ISO8601 to aid in readability. To keep the old unix format, you may set
LOG_UNIX_TS=true
- Added WebAuthn support for the Operator UI and corresponding support in the Go backend
This feature has been disabled by default, turn on with LOG_TO_DISK. For most production uses this is not desirable.
- Improved error reporting
- Panic and recovery improvements
- Resolved config conversion errors for ETH_FINALITY_DEPTH, ETH_HEAD_TRACKER_HISTORY, and ETH_GAS_LIMIT_MULTIPLIER
- Proper handling for "nonce too low" errors on Avalanche
chainlink node db status
will now display a table of applied and pending migrations.- Add support for OKEx/ExChain.
Legacy job pipeline (JSON specs) are no longer supported
This version will refuse to migrate the database if job specs are still present. You must manually delete or migrate all V1 job specs before upgrading.
For more information on migrating, see the docs.
This release will DROP legacy job tables so please take a backup before upgrading.
- We no longer support "soft deleting", or archiving keys. From now on, keys can only be hard-deleted.
- Eth keys can no longer be imported directly to the database. If you with to import an eth key, you must start the node first and import through the remote client.
LAYER_2_TYPE
- For layer 2 chains only. Configure the type of chain, either Arbitrum
or Optimism
.
- Head sampling can now be optionally disabled by setting
ETH_HEAD_TRACKER_SAMPLING_INTERVAL = "0s"
- this will result in every new head being delivered to running jobs, regardless of the head frequency from the chain. - When creating new FluxMonitor jobs, the validation logic now checks that only one of: drumbeat ticker or idle timer is enabled.
- Added a new Prometheus metric:
uptime_seconds
which measures the number of seconds the node has been running. It can be helpful in detecting potential crashes.
Fixed a regression whereby the BlockHistoryEstimator would use a bumped value on old gas price even if the new current price was larger than the bumped value.
It is highly recommended upgrading to this version before upgrading to any newer versions to avoid any complications.
- Prevent release from clobbering databases that have previously been upgraded
-
FMv2 spec now contains DrumbeatRandomDelay parameter that can be used to introduce variation between round of submits of different oracles, if drumbeat ticker is enabled.
-
OCR Hibernation
V2 direct request specs now support two additional keys:
- "requesters" key which allows whitelisting requesters
- "minContractPaymentLinkJuels" key which allows to specify a job-specific minimum contract payment.
For example:
type = "directrequest"
schemaVersion = 1
requesters = ["0xaaaa1F8ee20f5565510B84f9353F1E333E753B7a", "0xbbbb70F0e81C6F3430dfdC9fa02fB22BdD818C4e"] # optional
minContractPaymentLinkJuels = "100000000000000" # optional
name = "example eth request event spec with requesters"
contractAddress = "..."
externalJobID = "..."
observationSource = """
...
"""
- Resolved exiting Hibernation bug on FMv2
- Resolved FMv2 stalling in Hibernation mode
- Resolved rare issue when the Gas Estimator fails on start
- Resolved the handling of nil values for gas price
A new configuration variable, BLOCK_BACKFILL_SKIP
, can be optionally set to "true" in order to strongly limit the depth of the log backfill.
This is useful if the node has been offline for a longer time and after startup should not be concerned with older events from the chain.
Three new configuration variables are added for the new telemetry ingress service support. TELEMETRY_INGRESS_URL
sets the URL to connect to for telemetry ingress, TELEMETRY_INGRESS_SERVER_PUB_KEY
sets the public key of the telemetry ingress server, and TELEMETRY_INGRESS_LOGGING
toggles verbose logging of the raw telemetry messages being sent.
- Fixes the logging configuration form not displaying the current values
- Updates the design of the configuration cards to be easier on the eyes
- View Coordinator Service Authentication keys in the Operator UI. This is hidden behind a feature flag until usage is enabled.
- Adds support for the new telemetry ingress service.
The legacy job pipeline (JSON specs) has been officially deprecated and support for these jobs will be dropped in an upcoming release.
Any node operators still running jobs with JSON specs should migrate their jobs to TOML format instead.
The format for V2 Webhook job specs has changed. They now allow specifying 0 or more external initiators. Example below:
type = "webhook"
schemaVersion = 1
externalInitiators = [
{ name = "foo-ei", spec = '{"foo": 42}' },
{ name = "bar-ei", spec = '{"bar": 42}' }
]
observationSource = """
ds [type=http method=GET url="https://chain.link/ETH-USD"];
ds_parse [type=jsonparse path="data,price"];
ds_multiply [type=multiply times=100];
ds -> ds_parse -> ds_multiply;
"""
These external initiators will be notified with the given spec after the job is created, and also at deletion time.
Only the External Initiators listed in the toml spec may trigger a run for that job. Logged-in users can always trigger a run for any job.
-
OCR All OCR jobs are already using v2 pipeline by default - no need to do anything here.
-
Flux Monitor v1 We have created a tool to help you automigrate flux monitor specs in JSON format to the new TOML format. You can migrate a job like this:
chainlink jobs migrate <job id>
This can be automated by using the API like so:
POST http://yournode.example/v2/migrate/<job id>
-
VRF v1 Automigration is not supported for VRF jobs. They must be manually converted into v2 format.
-
Ethlog/Runlog/Cron/web All other job types must also be manually converted into v2 format.
Why are we doing this?
To give some background, the legacy job pipeline has been around since before Chainlink went to mainnet and is getting quite long in the tooth. The code is brittle and difficult to understand and maintain. For a while now we have been developing a v2 job pipeline in parallel which uses the TOML format. The new job pipeline is simpler, more performant and more powerful. Every job that can be represented in the legacy pipeline should be able to be represented in the v2 pipeline - if it can't be, that's a bug, so please let us know ASAP.
The v2 pipeline has now been extensively tested in production and proved itself reliable. So, we made the decision to drop V1 support entirely in favour of focusing developer effort on new features like native multichain support, EIP1559-compatible fees, further gas saving measures and support for more blockchains. By dropping support for the old pipeline, we can deliver these features faster and better support our community.
- Key export files are changing format and will not be compatible between versions. Ex, a key exported in 0.10.12, will not be importable by a node running 1.0.0, and vice-versa.
- We no longer support "soft deleting", or archiving keys. From now on, keys can only be hard-deleted.
- Eth keys can no longer be imported directly to the database. If you with to import an eth key, you must start the node first and import through the remote client.
This update will truncate pipeline_runs
, pipeline_task_runs
, flux_monitor_round_stats_v2
DB tables as a part of the migration.
Gas estimation has been revamped and full support for Optimism has been added.
The following env vars have been deprecated, and will be removed in a future release:
GAS_UPDATER_ENABLED
GAS_UPDATER_BATCH_SIZE
GAS_UPDATER_BLOCK_DELAY
GAS_UPDATER_BLOCK_HISTORY_SIZE
GAS_UPDATER_TRANSACTION_PERCENTILE
If you are using any of the env vars above, please switch to using the following instead:
GAS_ESTIMATOR_MODE
BLOCK_HISTORY_ESTIMATOR_BATCH_SIZE
BLOCK_HISTORY_ESTIMATOR_BLOCK_DELAY
BLOCK_HISTORY_ESTIMATOR_BLOCK_HISTORY_SIZE
BLOCK_HISTORY_ESTIMATOR_TRANSACTION_PERCENTILE
Valid values for GAS_ESTIMATOR_MODE
are as follows:
GAS_ESTIMATOR_MODE=BlockHistory
(equivalent to GAS_UPDATER_ENABLED=true
)
GAS_ESTIMATOR_MODE=FixedPrice
(equivalent to GAS_UPDATER_ENABLED=false
)
GAS_ESTIMATOR_MODE=Optimism
(new)
New gas estimator modes may be added in the future.
In addition, a minor annoyance has been fixed whereby previously if you enabled the gas updater, it would overwrite the locally stored value for gas price and continue to use this even if it was disabled after a reboot. This will no longer happen: BlockHistory mode will not clobber the locally stored value for fixed gas price, which can still be adjusted via remote API call or using chainlink config setgasprice XXX
. In order to use this manually fixed gas price, you must enable FixedPrice estimator mode.
Added support for latest version of libocr with the V2 networking stack. New env vars to configure this are:
P2P_NETWORKING_STACK
P2PV2_ANNOUNCE_ADDRESSES
P2PV2_BOOTSTRAPPERS
P2PV2_DELTA_DIAL
P2PV2_DELTA_RECONCILE
P2PV2_LISTEN_ADDRESSES
All of these are currently optional, by default OCR will continue to use the existing V1 stack. The new env vars will be used internally for OCR testing.
- Fix inability to create jobs with a cron schedule.
FMv2, Keeper and OCR jobs now use a new strategy for sending transactions. By default, if multiple transactions are queued up, only the latest one will be sent. This should greatly reduce the number of stale rounds and reverted transactions, and help node operators to save significant gas especially during times of high congestion or when catching up on a deep backlog.
Defaults should work well, but it can be controlled if necessary using the following new env vars:
FM_DEFAULT_TRANSACTION_QUEUE_DEPTH
KEEPER_DEFAULT_TRANSACTION_QUEUE_DEPTH
OCR_DEFAULT_TRANSACTION_QUEUE_DEPTH
Setting to 0 will disable (the old behaviour). Setting to 1 (the default) will keep only the latest transaction queued up at any given time. Setting to 2, 3 etc. will allow this many transactions to be queued before starting to drop older items.
Note that it has no effect on FMv1 jobs. Node operators will need to upgrade to FMv2 to take advantage of this feature.
-
The HTTP adapter would remove a trailing slash on a subdirectory when specifying an extended path, so for instance
http://example.com/subdir/
with a param of?query=
extended path would produce the URLhttp://example.com/subdir?query=
, but should now produce:http://example.com/subdir/?query=
. -
Matic autoconfig is now enabled for mainnet. Matic nops should remove any custom tweaks they have been running with. In addition, we have better default configs for Optimism, Arbitrum and RSK.
-
It is no longer required to set
DEFAULT_HTTP_ALLOW_UNRESTRICTED_NETWORK_ACCESS=true
to enable local fetches on bridge or http tasks. If the URL for the http task is specified as a variable, then set the AllowUnrestrictedNetworkAccess option for this task. Please remove this if you had it set and no longer need it, since it introduces a slight security risk. -
Chainlink can now run with ETH_DISABLED=true without spewing errors everywhere
-
Removed prometheus metrics that were no longer valid after recent changes to head tracking:
head_tracker_heads_in_queue
,head_tracker_callback_execution_duration
,head_tracker_callback_execution_duration_hist
,head_tracker_num_heads_dropped
-
MINIMUM_CONTRACT_PAYMENT_LINK_JUELS replaces MINIMUM_CONTRACT_PAYMENT, which will be deprecated in a future release.
-
INSECURE_SKIP_VERIFY configuration variable disables verification of the Chainlink SSL certificates when using the CLI.
-
JSON parse tasks (v2) now permit an empty
path
parameter. -
Eth->eth transfer gas limit is no longer hardcoded at 21000 and can now be adjusted using
ETH_GAS_LIMIT_TRANSFER
-
HTTP and Bridge tasks (v2 pipeline) now log the request parameters (including the body) upon making the request when
LOG_LEVEL=debug
. -
Webhook v2 jobs now support two new parameters,
externalInitiatorName
andexternalInitiatorSpec
. The v2 version of the following v1 spec:{ "initiators": [ { "type": "external", "params": { "name": "substrate", "body": { "endpoint": "substrate", "feed_id": 0, "account_id": "0x7c522c8273973e7bcf4a5dbfcc745dba4a3ab08c1e410167d7b1bdf9cb924f6c", "fluxmonitor": { "requestData": { "data": { "from": "DOT", "to": "USD" } }, "feeds": [{ "url": "http://adapter1:8080" }], "threshold": 0.5, "absoluteThreshold": 0, "precision": 8, "pollTimer": { "period": "30s" }, "idleTimer": { "duration": "1m" } } } } } ], "tasks": [ { "type": "substrate-adapter1", "params": { "multiply": 1e8 } } ] }
is:
type = "webhook" schemaVersion = 1 jobID = "0EEC7E1D-D0D2-475C-A1A8-72DFB6633F46" externalInitiatorName = "substrate" externalInitiatorSpec = """ { "endpoint": "substrate", "feed_id": 0, "account_id": "0x7c522c8273973e7bcf4a5dbfcc745dba4a3ab08c1e410167d7b1bdf9cb924f6c", "fluxmonitor": { "requestData": { "data": { "from": "DOT", "to": "USD" } }, "feeds": [{ "url": "http://adapter1:8080" }], "threshold": 0.5, "absoluteThreshold": 0, "precision": 8, "pollTimer": { "period": "30s" }, "idleTimer": { "duration": "1m" } } } """ observationSource = """ submit [type=bridge name="substrate-adapter1" requestData=<{ "multiply": 1e8 }>] """
-
Task definitions in v2 jobs (those with TOML specs) now support quoting strings with angle brackets (which DOT already permitted). This is particularly useful when defining JSON blobs to post to external adapters. For example:
my_bridge [type=bridge name="my_bridge" requestData="{\\"hi\\": \\"hello\\"}"]
... can now be written as:
my_bridge [type=bridge name="my_bridge" requestData=<{"hi": "hello"}>]
Multiline strings are supported with this syntax as well:
my_bridge [type=bridge name="my_bridge" requestData=<{ "hi": "hello", "foo": "bar" }>]
-
v2 jobs (those with TOML specs) now support variable interpolation in pipeline definitions. For example:
fetch1 [type=bridge name="fetch"] parse1 [type=jsonparse path="foo,bar"] fetch2 [type=bridge name="fetch"] parse2 [type=jsonparse path="foo,bar"] medianize [type=median] submit [type=bridge name="submit" requestData=<{ "result": $(medianize), "fetchedData": [ $(parse1), $(parse2) ] }>] fetch1 -> parse1 -> medianize fetch2 -> parse2 -> medianize medianize -> submit
This syntax is supported by the following tasks/parameters:
bridge
requestData
http
requestData
jsonparse
data
(falls back to the first input if unspecified)
median
values
(falls back to the array of inputs if unspecified)
multiply
input
(falls back to the first input if unspecified)times
-
Add
ETH_MAX_IN_FLIGHT_TRANSACTIONS
configuration option. This defaults to 16 and controls how many unconfirmed transactions may be in-flight at any given moment. This is set conservatively by default, node operators running many jobs on high throughput chains will probably need to increase this above the default to avoid lagging behind. However, before increasing this value, you MUST first ensure your ethereum node is configured not to ever evict local transactions that exceed this number otherwise your node may get permanently stuck. Set to 0 to disable the limit entirely (the old behaviour). Disabling this setting is not recommended.
Relevant settings for geth (and forks e.g. BSC)
[Eth.TxPool]
Locals = ["0xYourNodeAddress1", "0xYourNodeAddress2"] # Add your node addresses here
NoLocals = false # Disabled by default but might as well make sure
Journal = "transactions.rlp" # Make sure you set a journal file
Rejournal = 3600000000000 # Default 1h, it might make sense to reduce this to e.g. 5m
PriceBump = 10 # Must be set less than or equal to chainlink's ETH_GAS_BUMP_PERCENT
AccountSlots = 16 # Highly recommended to increase this, must be greater than or equal to chainlink's ETH_MAX_IN_FLIGHT_TRANSACTIONS setting
GlobalSlots = 4096 # Increase this as necessary
AccountQueue = 64 # Increase this as necessary
GlobalQueue = 1024 # Increase this as necessary
Lifetime = 10800000000000 # Default 3h, this is probably ok, you might even consider reducing it
Relevant settings for parity/openethereum (and forks e.g. xDai)
NOTE: There is a bug in parity (and xDai) where occasionally local transactions are inexplicably culled. See: openethereum/parity-ethereum#10228
Adjusting the settings below might help.
tx_queue_locals = ["0xYourNodeAddress1", "0xYourNodeAddress2"] # Add your node addresses here
tx_queue_size = 8192 # Increase this as necessary
tx_queue_per_sender = 16 # Highly recommended to increase this, must be greater than or equal to chainlink's ETH_MAX_IN_FLIGHT_TRANSACTIONS setting
tx_queue_mem_limit = 4 # In MB. Highly recommended to increase this or set to 0
tx_queue_no_early_reject = true # Recommended to set this
tx_queue_no_unfamiliar_locals = false # This is disabled by default but might as well make sure
- Keeper jobs now support prometheus metrics, they are considered a pipeline with a single
keeper
task type. Example:
pipeline_run_errors{job_id="1",job_name="example keeper spec"} 1
pipeline_run_total_time_to_completion{job_id="1",job_name="example keeper spec"} 8.470456e+06
pipeline_task_execution_time{job_id="1",job_name="example keeper spec",task_type="keeper"} 8.470456e+06
pipeline_tasks_total_finished{job_id="1",job_name="example keeper spec",status="completed",task_type="keeper"} 1
-
The v2 (TOML)
bridge
task'sincludeInputAtKey
parameter is being deprecated in favor of variable interpolation. Please migrate your jobs to the new syntax as soon as possible. -
Chainlink no longer writes/reads eth key files to disk
-
Add sensible default configuration settings for Fantom
-
Rename
ETH_MAX_UNCONFIRMED_TRANSACTIONS
toETH_MAX_QUEUED_TRANSACTIONS
. It still performs the same function but the name was misleading and would have caused confusion with the newETH_MAX_IN_FLIGHT_TRANSACTIONS
. -
The VRF keys are now managed remotely through the node only. Example commands:
// Starting a node with a vrf key
chainlink node start -p path/to/passwordfile -vp path/to/vrfpasswordfile
// Remotely managing the vrf keys
chainlink keys vrf create // Creates a key with path/to/vrfpasswordfile
chainlink keys vrf list // Lists all keys on the node
chainlink keys vrf delete // Lists all keys on the node
// Archives (soft deletes) vrf key with compressed pub key 0x788..
chainlink keys vrf delete 0x78845e23b6b22c47e4c81426fdf6fc4087c4c6a6443eba90eb92cf4d11c32d3e00
// Hard deletes vrf key with compressed pub key 0x788..
chainlink keys vrf delete 0x78845e23b6b22c47e4c81426fdf6fc4087c4c6a6443eba90eb92cf4d11c32d3e00 --hard
// Exports 0x788.. key to file 0x788_exported_key on disk encrypted with path/to/vrfpasswordfile
// Note you can re-encrypt it with a different password if you like when exporting.
chainlink keys vrf export 0x78845e23b6b22c47e4c81426fdf6fc4087c4c6a6443eba90eb92cf4d11c32d3e00 -p path/to/vrfpasswordfile -o 0x788_exported_key
// Import key material in 0x788_exported_key using path/to/vrfpasswordfile to decrypt.
// Will be re-encrypted with the nodes vrf password file i.e. "-vp"
chainlink keys vrf import -p path/to/vrfpasswordfile 0x788_exported_key
-
If a CLI command is issued after the session has expired, and an api credentials file is found, auto login should now work.
-
GasUpdater now works on RSK and xDai
-
Offchain reporting jobs that have had a latest round requested can now be deleted from the UI without error
-
Add
ETH_GAS_LIMIT_MULTIPLIER
configuration option, the gas limit is multiplied by this value before transmission. So a value of 1.1 will add 10% to the on chain gas limit when a transaction is submitted. -
Add
ETH_MIN_GAS_PRICE_WEI
configuration option. This defaults to 1Gwei on mainnet. Chainlink will never send a transaction at a price lower than this value. -
Add
chainlink node db migrate
for running database migrations. It's recommended to use this and setMIGRATE_DATABASE=false
if you want to run the migrations separately outside of application startup.
-
Chainlink now automatically cleans up old eth_txes to reduce database size. By default, any eth_txes older than a week are pruned on a regular basis. It is recommended to use the default value, however the default can be overridden by setting the
ETH_TX_REAPER_THRESHOLD
env var e.g.ETH_TX_REAPER_THRESHOLD=24h
. Reaper can be disabled entirely by settingETH_TX_REAPER_THRESHOLD=0
. The reaper will run on startup and again every hour (interval is configurable usingETH_TX_REAPER_INTERVAL
). -
Heads corresponding to new blocks are now delivered in a sampled way, which is to improve node performance on fast chains. The frequency is by default 1 second, and can be changed by setting
ETH_HEAD_TRACKER_SAMPLING_INTERVAL
env var e.g.ETH_HEAD_TRACKER_SAMPLING_INTERVAL=5s
. -
Database backups: default directory is now a subdirectory 'backup' of chainlink root dir, and can be changed to any chosen directory by setting a new configuration value:
DATABASE_BACKUP_DIR
-
Add
MockOracle.sol
for testing contracts -
Web job types can now be created from the operator UI as a new job.
-
See example web job spec below:
type = "webhook"
schemaVersion = 1
jobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F46"
observationSource = """
ds [type=http method=GET url="http://example.com"];
ds_parse [type=jsonparse path="data"];
ds -> ds_parse;
"""
- New CLI command to convert v1 flux monitor jobs (JSON) to v2 flux monitor jobs (TOML). Running it will archive the v1 job and create a new v2 job. Example:
// Get v1 job ID:
chainlink job_specs list
// Migrate it to v2:
chainlink jobs migrate fe279ed9c36f4eef9dc1bdb7bef21264
// To undo the migration:
1. Archive the v2 job in the UI
2. Unarchive the v1 job manually in the db:
update job_specs set deleted_at = null where id = 'fe279ed9-c36f-4eef-9dc1-bdb7bef21264'
update initiators set deleted_at = null where job_spec_id = 'fe279ed9-c36f-4eef-9dc1-bdb7bef21264'
-
Improved support for Optimism chain. Added a new boolean
OPTIMISM_GAS_FEES
configuration variable which makes a call to estimate gas before all transactions, suitable for use with Optimism's L2 chain. When this option is usedETH_GAS_LIMIT_DEFAULT
is ignored. -
Chainlink now supports routing certain calls to the eth node over HTTP instead of websocket, when available. This has a number of advantages - HTTP is more robust and simpler than websockets, reducing complexity and allowing us to make large queries without running the risk of hitting websocket send limits. The HTTP url should point to the same node as the ETH_URL and can be specified with an env var like so:
ETH_HTTP_URL=https://my.ethereumnode.example/endpoint
.
Adding an HTTP endpoint is particularly recommended for BSC, which is hitting websocket limitations on certain queries due to its large block size.
- Support for legacy pipeline (V1 job specs) can now be turned off by setting
ENABLE_LEGACY_JOB_PIPELINE=false
. This can yield marginal performance improvements if you don't need to support the legacy JSON job spec format.
- Add
MockOracle.sol
for testing contracts - Cron jobs can now be created for the v2 job pipeline:
type = "cron"
schemaVersion = 1
schedule = "*/10 * * * *"
observationSource = """
ds [type=http method=GET url="http://example.com"];
ds_parse [type=jsonparse path="data"];
ds -> ds_parse;
"""
- Default for
JOB_PIPELINE_REAPER_THRESHOLD
has been reduced from 1 week to 1 day to save database space. This variable controls how long past job run history for OCR is kept. To keep the old behaviour, you can setJOB_PIPELINE_REAPER_THRESHOLD=168h
- Removed support for the env var
JOB_PIPELINE_PARALLELISM
. - OCR jobs no longer show
TaskRuns
in success cases. This reduces DB load and significantly improves the performance of archiving OCR jobs. - Archiving OCR jobs should be 5-10x faster.
-
Added
GAS_UPDATER_BATCH_SIZE
option to workaroundwebsocket: read limit exceeded
issues on BSC -
Basic support for Optimism chain: node no longer gets stuck with 'nonce too low' error if connection is lost
-
VRF Jobs now support an optional
coordinatorAddress
field that, when present, will tell the node to check the fulfillment status of any VRF request before attempting the fulfillment transaction. This will assist in the effort to run multiple nodes with one VRF key. -
Experimental: Add
DATABASE_BACKUP_MODE
,DATABASE_BACKUP_FREQUENCY
andDATABASE_BACKUP_URL
configuration variables- It's now possible to configure database backups: on node start and separately, to be run at given frequency.
DATABASE_BACKUP_MODE
enables the initial backup on node start (with one of the values:none
,lite
,full
wherelite
excludes potentially large tables related to job runs, among others). Additionally, ifDATABASE_BACKUP_FREQUENCY
variable is set to a duration of at least '1m', it enables periodic backups. DATABASE_BACKUP_URL
can be optionally set to point to e.g. a database replica, in order to avoid excessive load on the main one. Example settings:DATABASE_BACKUP_MODE="full"
andDATABASE_BACKUP_FREQUENCY
not set, will run a full back only at the start of the node.DATABASE_BACKUP_MODE="lite"
andDATABASE_BACKUP_FREQUENCY="1h"
will lead to a partial backup on node start and then again a partial backup every one hour.
- It's now possible to configure database backups: on node start and separately, to be run at given frequency.
-
Added periodic resending of eth transactions. This means that we no longer rely exclusively on gas bumping to resend unconfirmed transactions that got "lost" for whatever reason. This has two advantages:
- Chainlink no longer relies on gas bumping settings to ensure our transactions always end up in the mempool
- Chainlink will continue to resend existing transactions even in the event that heads are delayed. This is especially useful on chains like Arbitrum which have very long wait times between heads.
- Periodic resending can be controlled using the
ETH_TX_RESEND_AFTER_THRESHOLD
env var (default 30s). Unconfirmed transactions will be resent periodically at this interval. It is recommended to leave this at the default setting, but it can be set to any valid duration or to 0 to disable periodic resending.
-
Logging can now be configured in the Operator UI.
-
Tuned defaults for certain Eth-compatible chains
-
Chainlink node now uses different sets of default values depending on the given Chain ID. Tuned configs are built-in for the following chains:
- Ethereum Mainnet and test chains
- Polygon (Matic)
- BSC
- HECO
-
If you have manually set ENV vars specific to these chains, you may want to remove those and allow the node to use its configured defaults instead.
-
New prometheus metric "tx_manager_num_tx_reverted" which counts the number of reverted transactions on chain.
-
Under certain circumstances a poorly configured Explorer could delay Chainlink node startup by up to 45 seconds.
-
Chainlink node now automatically sets the correct nonce on startup if you are restoring from a previous backup (manual setnextnonce is no longer necessary).
-
Flux monitor jobs should now work correctly with outlier-detection and market-closure external adapters.
-
Performance improvements to OCR job adds. Removed the pipeline_task_specs table and added a new column
dot_id
to the pipeline_task_runs table which links a pipeline_task_run to a dotID in the pipeline_spec.dot_dag_source. -
Fixed bug where node will occasionally submit an invalid OCR transmission which reverts with "address not authorized to sign".
-
Fixed bug where a node will sometimes double submit on runlog jobs causing reverted transactions on-chain
-
Add
STATS_PUSHER_LOGGING
to toggle stats pusher raw message logging (DEBUG level). -
Add
ADMIN_CREDENTIALS_FILE
configuration variable
This variable defaults to $ROOT/apicredentials
and when defined / the
file exists, any command using the CLI that requires authentication will use it
to automatically log in.
- Add
ETH_MAX_UNCONFIRMED_TRANSACTIONS
configuration variable
Chainlink node now has a maximum number of unconfirmed transactions that may be in flight at any one time (per key).
If this limit is reached, further attempts to send transactions will fail and the relevant job will be marked as failed.
Jobs will continue to fail until at least one transaction is confirmed and the queue size is reduced. This is introduced as a sanity limit to prevent unbounded sending of transactions e.g. in the case that the eth node is failing to broadcast to the network.
The default is set to 500 which considered high enough that it should
never be reached under normal operation. This limit can be changed
by setting the ETH_MAX_UNCONFIRMED_TRANSACTIONS
environment variable.
- Support requestNewRound in libocr
requestNewRound enables dedicated requesters to request a fresh report to be sent to the contract right away regardless of heartbeat or deviation.
- New prometheus metric:
Name: "head_tracker_eth_connection_errors",
Help: "The total number of eth node connection errors",
-
Gas bumping can now be disabled by setting
ETH_GAS_BUMP_THRESHOLD=0
-
Support for arbitrum
- Improved handling of the case where we exceed the configured TX fee cap in geth.
Node will now fatally error jobs if the total transaction costs exceeds the configured cap (default 1 Eth). Also, it will no longer continue to bump gas on transactions that started hitting this limit and instead continue to resubmit at the highest price that worked.
Node operators should check their geth nodes and remove this cap if configured,
you can do this by running your geth node with --rpc.gascap=0 --rpc.txfeecap=0
or setting these values in your config toml.
-
Make head backfill asynchronous. This should eliminate some harmless but annoying errors related to backfilling heads, logged on startup and occasionally during normal operation on fast chains like Kovan.
-
Improvements to the GasUpdater
Various efficiency and correctness improvements have been made to the GasUpdater. It places less load on the ethereum node and now features re-org detection.
Most notably, GasUpdater no longer takes a 24 block delay to "warm up" on application start and instead loads all relevant block history immediately. This means that the application gas price will always be updated correctly after reboot before the first transaction is ever sent, eliminating the previous scenario where the node could send underpriced or overpriced transactions for a period after a reboot, until the gas updater caught up.
- Bump
ORM_MAX_OPEN_CONNS
default from 10 to 20 - Bump
ORM_MAX_IDLE_CONNS
default from 5 to 10
Each Chainlink node will now use a maximum of 23 database connections (up from previous max of 13). Make sure your postgres database is tuned accordingly, especially if you are running multiple Chainlink nodes on a single database. If you find yourself hitting connection limits, you can consider reducing ORM_MAX_OPEN_CONNS
but this may result in degraded performance.
- The global env var
JOB_PIPELINE_MAX_TASK_DURATION
is no longer supported for OCR jobs.
- Add contexts so that database queries timeout when necessary.
- Use manual updates instead of gorm update associations.
- Prevent autosaving Task Spec on when Task Runs are saved to lower database load.
- Fix a case where archiving jobs could try to delete it from the external initiator even if the job was not an EI job.
- Improved performance of the transaction manager by fetching receipts in batches. This should help prevent the node from getting stuck when processing large numbers of OCR jobs.
- Fixed a fluxmonitor job bug where submitting a value outside the acceptable range would stall the job permanently. Now a job spec error will be thrown if the polled answer is outside the acceptable range and no ethtx will be submitted. As additional protection, we also now check the receipts of the ethtx's and if they were reverted, we mark the ethtx task as failed.
- Squashed migrations into a single 1_initial migration. If you were running a version older than 0.9.10, you need to upgrade to 0.9.10 first before upgrading to the next version so that the migrations are run.
- A new Operator UI feature that visualize JSON and TOML job spec tasks on a 'New Job' page.
- Fixed a UI bug with fluxmonitor jobs where initiator params were bunched up.
- Improved performance of OCR jobs to reduce database load. OCR jobs now run with unlimited parallelism and are not affected by
JOB_PIPELINE_PARALLELISM
.
- A new env var
JOB_PIPELINE_MAX_RUN_DURATION
has been added which controls maximum duration of the total run.
- New CLI commands for key management:
chainlink keys eth import
chainlink keys eth export
chainlink keys eth delete
- All keys other than VRF keys now share the same password. If you have OCR, P2P, and ETH keys encrypted with different passwords, re-insert them into your DB encrypted with the same password prior to upgrading.
- Fixed reading of function selector values in DB.
- Support for bignums encoded in CBOR
- Silence spurious
Job spawner ORM attempted to claim locally-claimed job
warnings - OCR now drops transmissions instead of queueing them if the node is out of Ether
- Fixed a long-standing issue where standby nodes would hold transactions open forever while waiting for a lock. This was preventing postgres from running necessary cleanup operations, resulting in bad database performance. Any node operators running standby failover chainlink nodes should see major database performance improvements with this release and may be able to reduce the size of their database instances.
- Fixed an issue where expired session tokens in operator UI would cause a large number of requests to be sent to the node, resulting in a temporary rate-limit and 429 errors.
- Fixed issue whereby http client could leave too many open file descriptors
- Key-related API endpoints have changed. All key-related commands are now namespaced under
/v2/keys/...
, and are standardized across key types. - All key deletion commands now perform a soft-delete (i.e. archive) by default. A special CLI flag or query string parameter must be provided to hard-delete a key.
- Node now supports multiple OCR jobs sharing the same peer ID. If you have more than one key in your database, you must now specify
P2P_PEER_ID
to indicate which key to use. DATABASE_TIMEOUT
is now set to 0 by default, so that nodes will wait forever for a lock. If you already haveDATABASE_TIMEOUT=0
set explicitly in your env (most node operators) then you don't need to do anything. If you didn't have it set, and you want to keep the old default behaviour where a node exits shortly if it can't get a lock, you can manually setDATABASE_TIMEOUT=500ms
in your env.- OCR bootstrap node no longer sends telemetry to the endpoint specified in the OCR job spec under
MonitoringEndpoint
.
- An issue where the node would emit warnings on startup for fluxmonitor contracts
- OCR bootstrap node now sends telemetry to the endpoint specified in the OCR job spec under
MonitoringEndpoint
. - Adds "Account addresses" table to the
/keys
page.
- Old jobs now allow duplicate job names. Also, if the name field is empty we no longer generate a name.
- Removes broken
ACCOUNT_ADDRESS
field from/config
page.
- Brings
/runs
tab back to the operator UI. - Signs out a user from operator UI on authentication error.
- OCR jobs no longer require defining v1 bootstrap peers unless
P2P_NETWORKING_STACK=V1
- Commands for creating/managing legacy jobs and OCR jobs have changed, to reduce confusion and accommodate additional types of jobs using the new pipeline.
- If
P2P_NETWORKING_STACK=V1V2
, thenP2PV2_BOOTSTRAPPERS
must also be set
jobs archive
=> job_specs archive
jobs create
=> job_specs create
jobs list
=> job_specs list
jobs show
=> job_specs show
jobs createocr
=> jobs create
jobs deletev2
=> jobs delete
jobs run
=> jobs run
- OCR pipeline specs can now be configured on a per-task basis to allow unrestricted network access for http tasks. Example like so:
ds1 [type=http method=GET url="http://example.com" allowunrestrictednetworkaccess="true"];
ds1_parse [type=jsonparse path="USD" lax="true"];
ds1_multiply [type=multiply times=100];
ds1 -> ds1_parse -> ds1_multiply;
- New prometheus metrics as follows:
Name: "pipeline_run_errors",
Help: "Number of errors for each pipeline spec",
Name: "pipeline_run_total_time_to_completion",
Help: "How long each pipeline run took to finish (from the moment it was created)",
Name: "pipeline_tasks_total_finished",
Help: "The total number of pipline tasks which have finished",
Name: "pipeline_task_execution_time",
Help: "How long each pipeline task took to execute",
Name: "pipeline_task_http_fetch_time",
Help: "Time taken to fully execute the HTTP request",
Name: "pipeline_task_http_response_body_size",
Help: "Size (in bytes) of the HTTP response body",
Name: "pipeline_runs_queued",
Help: "The total number of pipline runs that are awaiting execution",
Name: "pipeline_task_runs_queued",
Help: "The total number of pipline task runs that are awaiting execution",
Numerous key-related UX improvements:
- All key-related commands have been consolidated under the
chainlink keys
subcommand:chainlink createextrakey
=>chainlink keys eth create
chainlink admin info
=>chainlink keys eth list
chainlink node p2p [create|list|delete]
=>chainlink keys p2p [create|list|delete]
chainlink node ocr [create|list|delete]
=>chainlink keys ocr [create|list|delete]
chainlink node vrf [create|list|delete]
=>chainlink keys vrf [create|list|delete]
- Deleting OCR key bundles and P2P key bundles now archives them (i.e., soft delete) so that they can be recovered if needed. If you want to hard delete a key, pass the new
--hard
flag to the command, e.g.chainlink keys p2p delete --hard 6
. - Output from ETH/OCR/P2P/VRF key CLI commands now renders consistently.
- Deleting an OCR/P2P/VRF key now requires confirmation from the user. To skip confirmation (e.g. in shell scripts), pass
--yes
or-y
. - The
--ocrpassword
flag has been removed. OCR/P2P keys now share the same password at the ETH key (i.e., the password specified with the--password
flag).
Misc:
- Two new env variables are added
P2P_ANNOUNCE_IP
andP2P_ANNOUNCE_PORT
which allow node operators to override locally detected values for the chainlink node's externally reachable IP/port. OCR_LISTEN_IP
andOCR_LISTEN_PORT
have been renamed toP2P_LISTEN_IP
andP2P_LISTEN_PORT
for consistency.- Support for adding a job with the same name as one that was deleted.
- Fixed an issue where the HTTP adapter would send an empty body on retries.
- Changed the default
JOB_PIPELINE_REAPER_THRESHOLD
value from7d
to168h
(hours are the highest time unit allowed bytime.Duration
).
- Updated from Go 1.15.4 to 1.15.5.
- Hotfix to fix an issue with httpget adapter
- Add new subcommand
node hard-reset
which is used to remove all state for unstarted and pending job runs from the database.
- Chainlink now requires Postgres >= 11.x. Previously this was a recommendation, this is now a hard requirement. Migrations will fail if run on an older version of Postgres.
- Database improvements that greatly reduced the number of open Postgres connections
- Operator UI /jobs page is now searchable
- Jobs now accept a name field in the jobspecs
- Bulletproof transaction manager enabled by default
- Fluxmonitor support enabled by default
- Improve transaction manager architecture to be more compatible with
ETH_SECONDARY_URL
option (i.e. concurrent transaction submission to multiple different eth nodes). This also comes with some minor performance improvements in the tx manager and more correct handling of some extremely rare edge cases. - As a side effect, we now no longer handle the case where an external wallet used the chainlink ethereum private key to send a transaction. This use-case was already explicitly unsupported, but we made a best-effort attempt to handle it. We now make no attempt at all to handle it and doing this WILL result in your node not sending the data that it expected to be sent for the nonces that were used by an external wallet.
- Operator UI now shows booleans correctly
- ETH_MAX_GAS_PRICE_WEI now 1500Gwei by default
- Prometheus gas_updater_set_gas_price metric now only shows last gas price instead of every block since restart
- Add new env variable ETH_SECONDARY_URL. Default is unset. You may optionally set this to a http(s) ethereum RPC client URL. If set, transactions will also be broadcast to this secondary ethereum node. This allows transaction broadcasting to be more robust in the face of primary ethereum node bugs or failures.
- Remove configuration option ORACLE_CONTRACT_ADDRESS, it had no effect
- Add configuration option OPERATOR_CONTRACT_ADDRESS, it filters the contract addresses the node should listen to for Run Logs
- At startup, the chainlink node will create a new funding address. This will initially be used to pay for cancelling stuck transactions.
- Gas bumper no longer hits database constraint error if ETH_MAX_GAS_PRICE_WEI is reached (this was actually mostly harmless, but the errors were annoying)
- ETH_MAX_GAS_PRICE_WEI now defaults to 1500 gwei
- The chainlink node now will bump a limited configurable number of transactions at once. This is configured with the ETH_GAS_BUMP_TX_DEPTH variable which is 10 by default. Set to 0 to disable (the old behaviour).
- ETH_DISABLED flag works again
- Chainlink header images to the following
README.md
files: root, core, evm-contracts, and evm-test-helpers. - Database migrations: new log_consumptions records will contain the number of the associated block. This migration will allow future version of chainlink to automatically clean up unneeded log_consumption records. This migration should execute very fast.
- External Adapters for the Flux Monitor will now receive the Flux Monitor round state info as the meta payload.
- Reduce frequency of balance checking.
Previously when the node was overloaded with heads there was a minor possibility it could get backed up with a very large head queue, and become unstable. Now, we drop heads instead in this case and noisily emit an error. This means the node should more gracefully handle overload conditions, although this is still dangerous and node operators should deal with it immediately to avoid missing jobs.
A new environment variable is introduced to configure this, called ETH_HEAD_TRACKER_MAX_BUFFER_SIZE
. It is recommended to leave this set to the default of "3".
A new prometheus metric is also introduced to track dropped heads, called head_tracker_num_heads_dropped
. You may wish to set an alert on a rule such as increase(chainlink_dropped_heads[5m]) > 0
.
- Fix for gas bumper
- Fix for broadcast-transactions function
- Fix for gas bumper
- Fix for broadcast-transactions function
- Performance improvements when using BulletproofTxManager.
- Added a workaround for Infura users who are seeing "error getting balance: header not found".
This behaviour is due to Infura announcing it has a block, but when we request our balance in this block, the eth node doesn't have the block in memory. The workaround is to add a configurable lag time on balance update requests. The default is set to 1 but this is configurable via a new environment variable
ETH_BALANCE_MONITOR_BLOCK_DELAY
.
- Job specs now support pinning to multiple keys using the new
fromAddresses
field in the ethtx task spec.
- Using
fromAddress
in ethtx task specs has been deprecated. Please usefromAddresses
instead.
- Support for RunLogTopic0original and RunLogTopic20190123withFullfillmentParams logs has been dropped. This should not affect any users since these logs predate Chainlink's mainnet launch and have never been used on mainnet.
IMPORTANT: The selection mechanism for keys has changed. When an ethtx task spec is not pinned to a particular key by defining fromAddress
or fromAddresses
, the node will now cycle through all available keys in round-robin fashion. This is a change from the previous behaviour where nodes would only pick the earliest created key.
This is done to allow increases in throughput when a node operator has multiple whitelisted addresses for their oracle.
If your node has multiple keys, you will need to take one of the three following actions:
- Make sure all keys are valid for all job specs
- Pin job specs to a valid subset of key(s) using
fromAddresses
- Delete the key(s) you don't want to use
If your node only has one key, no action is required.
- Incorrect sequence on keys table in some edge cases
- Added a check on sensitive file ownership that gives a warning if certain files are not owned by the user running chainlink
- Added mechanism to asynchronously communicate when a job spec has an ethereum interaction error (or any async error) with a UI screen
- Gas Bumper now bumps based on the current gas price instead of the gas price of the original transaction
- Support for multiple node addresses
ethtx
tasks now support a new parameter,minRequiredOutgoingConfirmations
which allows you to tune how many confirmations are required before moving on from anethtx
task on a per-task basis (only works with BulletproofTxManager). If it is not supplied, the default ofMIN_OUTGOING_CONFIRMATIONS
is used (same as the old behaviour).
- HeadTracker now automatically backfills missing heads up to
ETH_FINALITY_DEPTH
- The strategy for gas bumping has been changed to produce a potentially higher gas cost in exchange for the transaction getting through faster.
admin withdraw
command has been removed. This was only ever useful to withdraw LINK if the Oracle contract was owned by the Chainlink node address. It is no longer recommended having the Oracle owner be the chainlink node address.- Fixed
txs create
to send the amount in Eth not in Wei (as per the documentation)
This release contains a number of features aimed at improving the node's reliability when putting transactions on-chain.
- An experimental new transaction manager is introduced that delivers reliability improvements compared to the old one, especially when faced with difficult network conditions or spiking gas prices. It also reduces load on the database and makes fewer calls to the eth node compared to the old tx manager.
- Along with the new transaction manager is a local client command for manually controlling the node nonce -
setnextnonce
. This should never be necessary under normal operation and is included only for use in emergencies. - New prometheus metrics for the head tracker:
head_tracker_heads_in_queue
- The number of heads currently waiting to be executed. You can think of this as the 'load' on the head tracker. Should rarely or never be more than 0.head_tracker_callback_execution_duration
- How long it took to execute all callbacks. If the average of this exceeds the time between blocks, your node could lag behind and delay transactions.
- Nodes transmit their build info to Explorer for better debugging/tracking.
ENABLE_BULLETPROOF_TX_MANAGER
- set this to true to enable the experimental new transaction managerETH_GAS_BUMP_PERCENT
default value has been increased from 10% to 20%ETH_GAS_BUMP_THRESHOLD
default value has been decreased from 12 to 3ETH_FINALITY_DEPTH
specifies how deep protection should be against re-orgs. The default is 50. It only applies if BulletproofTxManager is enabled. It is not recommended changing this setting.EthHeadTrackerHistoryDepth
specifies how many heads the head tracker should keep in the database. The default is 100. It is not recommended changing this setting.- Update README.md with links to mockery, jq, and gencodec as they are required to run
go generate ./...
- The node now logs the eth client RPC calls
- More reliable Ethereum block header tracking
- Limit the amount of an HTTP response body that the node will read
- Make Aggregator contract interface viewable
- More resilient handling of chain reorganizations
- The chainlink node can now be configured to backfill logs from
n
blocks after a connection to the ethereum client is reset. This value is specified with an environment variableBLOCK_BACKFILL_DEPTH
. - The chainlink node now sets file permissions on sensitive files on startup (tls, .api, .env, .password and secret)
- AggregatorInterface now has description and version fields.
- Solidity: Renamed the previous
AggregatorInterface.sol
toHistoricAggregatorInterface.sol
. Users are encouraged to use the new methods introduced on theAggregatorInterface
(getRoundData
andlatestRoundData
), as they return metadata to indicate freshness of the data in a single cross-contract call. - Solidity: Marked
HistoricAggregatorInterface
methods (latestAnswer
,latestRound
,latestTimestamp
,getAnswer
,getTimestamp
) as deprecated onFluxAggregator
,WhitelistedAggregator
,AggregatorProxy
,WhitelistedAggregatorProxy
. - Updated the solidity compiler version for v0.6 from 0.6.2 to 0.6.6.
- AccessControlledAggregatorProxy checks an external contract for users to be able to read functions.
- Fluxmonitor jobs now respect the
minPayment
field on job specs and won't poll if the contract does not have sufficient funding. This allows certain jobs to require a larger payment thanMINIMUM_CONTRACT_PAYMENT
.
- Fluxmonitor initiators may now optionally include an
absoluteThreshold
parameter. To trigger a new on-chain report, the absolute difference in the feed value must change by at least theabsoluteThreshold
value. If it is unspecified or zero, fluxmonitor behavior is unchanged. - Database Migrations: Add created_at and updated_at to all tables allowing for better historical insights. This migration may take a minute or two on large databases.
- Fix incorrect permissions on some files written by the node Prevent a case where duplicate ethereum keys could be added Improve robustness and reliability of ethtx transaction logic
- Added Changelog.
- Database Migrations: There a number of database migrations included in this release as part of our ongoing effort to make the node even more reliable and stable, and build a firm foundation for future development.
- New cron strings MUST now include time zone. If you want your jobs to run in
UTC for example:
CRON_TZ=UTC * * * * *
. Previously, jobs specified without a time zone would run in the server's native time zone, which in most cases is UTC but this was never guaranteed.
- Fix crash in experimental gas updater when run on Kovan network