-
#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