- You must have `ExternalInitiatorsEnabled = true` in your config to enable these jobs. See{" "}
+ The `ExternalInitiatorsEnabled` config key is unused. It is retained for the legacy external initiator feature that
+ fed the `webhook` job type. See{" "}
ExternalInitiatorsEnabled in the config
reference for details.
@@ -472,3 +470,392 @@ See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields).
- `$(jobSpec.name)`: the local name of the job.
- `$(jobRun.meta)`: a map of metadata that can be sent to a bridge, etc.
- `$(jobRun.requestBody)`: the body of the request that initiated the job run.
+
+## VRF jobs
+
+The `vrf` job type watches a VRF coordinator contract for randomness requests and fulfills them by submitting the verifiable random proof. It covers both VRF v2 and VRF v2plus. The job pipeline uses the [VRF V2 task](/chainlink-nodes/oracle-jobs/all-tasks/#vrf-v2-task) or [VRF V2Plus task](/chainlink-nodes/oracle-jobs/all-tasks/#vrf-v2plus-task) to generate the proof.
+
+### Spec format
+
+```toml
+type = "vrf"
+schemaVersion = 1
+name = "VRF"
+coordinatorAddress = "0x..."
+evmChainID = "1"
+minIncomingConfirmations = 3
+publicKey = "0x..."
+fromAddresses = ["0x1111111111111111111111111111111111111111"]
+pollPeriod = "5s"
+observationSource = """
+decode_log [type=ethabidecodelog
+ abi="RandomWordsRequested(bytes32 indexed keyHash,uint256 requestId,uint256 preSeed,uint64 indexed subId,uint16 minimumRequestConfirmations,uint32 callbackGasLimit,uint32 numWords,address indexed sender)"
+ data="$(jobRun.logData)"
+ topics="$(jobRun.logTopics)"]
+vrf [type=vrfv2
+ publicKey="$(jobSpec.publicKey)"
+ requestBlockHash="$(jobRun.logBlockHash)"
+ requestBlockNumber="$(jobRun.logBlockNumber)"
+ topics="$(jobRun.logTopics)"]
+estimate_gas [type=estimategaslimit
+ to="0x..."
+ multiplier="1.1"
+ data="$(vrf.output)"]
+simulate [type=ethcall
+ to="0x..."
+ gas="$(estimate_gas)"
+ gasPrice="$(jobSpec.maxGasPrice)"
+ extractRevertReason=true
+ contract="0x..."
+ data="$(vrf.output)"]
+decode_log -> vrf -> estimate_gas -> simulate
+"""
+```
+
+### Shared fields
+
+See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields).
+
+### Unique fields
+
+- `coordinatorAddress`: the address of the VRF coordinator contract to watch for requests.
+- `publicKey`: the public key of the VRF key that this job uses to generate proofs.
+- `minIncomingConfirmations`: the minimum number of block confirmations before a request is fulfilled.
+- `evmChainID`: the chain ID of the EVM chain in which the job will operate.
+- `fromAddresses`: one or more addresses from which to submit fulfillment transactions. If left blank, a random address is selected on every send for the given chain ID.
+- `pollPeriod`: how often the job polls for new VRF requests.
+- `requestedConfsDelay`: optional. The number of blocks to wait, in addition to `minIncomingConfirmations`, before fulfilling a request. Defaults to `0`.
+- `requestTimeout`: optional. The timeout for a request. Defaults to 24 hours.
+- `gasLanePrice`: optional. The gas lane price for this job. If the keys in `fromAddresses` do not have the given gas price, the job does not start.
+- `chunkSize`: optional. The number of pending VRF v2 requests to process in parallel. Defaults to `20`.
+- `backoffInitialDelay`: the amount of time to wait before retrying a failed request after the first failure.
+- `backoffMaxDelay`: the maximum amount of time to wait before retrying a failed request.
+- `batchCoordinatorAddress`: the address of the batch VRF coordinator to use. Required if `batchFulfillmentEnabled` is `true`.
+- `batchFulfillmentEnabled`: whether the job uses the batch VRF coordinator to fulfill requests.
+- `batchFulfillmentGasMultiplier`: the multiplier used to determine the final gas estimate for batch fulfillment.
+- `customRevertsPipelineEnabled`: whether the job runs the custom reverted transactions pipeline alongside the VRF listener.
+- `vrfOwnerAddress`: the address of the `VRFOwner` contract to use. VRF v2 only.
+
+### Job type specific pipeline variables
+
+- `$(jobSpec.publicKey)`: the public key of the VRF key that this job uses.
+- `$(jobSpec.maxGasPrice)`: the maximum gas price configured for the job.
+- `$(jobRun.logBlockHash)`: the block hash in which the initiating log was received.
+- `$(jobRun.logBlockNumber)`: the block number in which the initiating log was received.
+- `$(jobRun.logTopics)`: the log's topics (`indexed` fields).
+
+## Blockhash store jobs
+
+The `blockhashstore` job type watches VRF coordinator contracts for unfulfilled requests and stores the blockhashes they need into a `BlockhashStore` contract. This lets a request still be fulfilled after its request block leaves the EVM blockhash window.
+
+### Spec format
+
+```toml
+type = "blockhashstore"
+schemaVersion = 1
+name = "blockhashstore"
+coordinatorV2Address = "0x..."
+waitBlocks = 59
+lookbackBlocks = 159
+blockhashStoreAddress = "0x..."
+trustedBlockhashStoreAddress = "0x..."
+trustedBlockhashStoreBatchSize = 20
+heartbeatPeriod = "1h"
+pollPeriod = "23s"
+runTimeout = "10s"
+evmChainID = "1"
+fromAddresses = ["0x1111111111111111111111111111111111111111"]
+```
+
+### Shared fields
+
+See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields).
+
+### Unique fields
+
+- `coordinatorV1Address`: a legacy VRF v1 field, kept for API and database compatibility. Non-zero values are rejected at spec validation.
+- `coordinatorV2Address`: the VRF v2 coordinator to watch for unfulfilled requests. If empty, no v2 coordinator is watched.
+- `coordinatorV2PlusAddress`: the VRF v2plus coordinator to watch for unfulfilled requests. If empty, no v2plus coordinator is watched.
+- `waitBlocks`: the minimum age of blocks whose hashes should be stored.
+- `lookbackBlocks`: the maximum age of blocks whose hashes should be stored.
+- `blockhashStoreAddress`: the address of the `BlockhashStore` contract to store blockhashes into.
+- `trustedBlockhashStoreAddress`: the address of the trusted `BlockhashStore` contract to store blockhashes into.
+- `trustedBlockhashStoreBatchSize`: the number of blockhashes to store in a single batch.
+- `heartbeatPeriod`: the period at which a blockhash is stored into the blockhash store contract even when nothing needs it, so that a blockhash is always available to anchor to.
+- `pollPeriod`: how often recent blocks are scanned for blockhash storage.
+- `runTimeout`: the timeout for a single run of the blockhash store feeder.
+- `evmChainID`: the chain ID for monitoring and storing blockhashes.
+- `fromAddresses`: the sender addresses used to store blockhashes.
+
+## Block header feeder jobs
+
+The `blockheaderfeeder` job type stores blockhashes for a batch of recent blocks into a `BatchBlockhashStore` contract, so that blockhashes remain available after the EVM blockhash window.
+
+### Spec format
+
+```toml
+type = "blockheaderfeeder"
+schemaVersion = 1
+name = "blockheaderfeeder"
+coordinatorV2Address = "0x..."
+waitBlocks = 59
+lookbackBlocks = 159
+blockhashStoreAddress = "0x..."
+batchBlockhashStoreAddress = "0x..."
+getBlockhashesBatchSize = 20
+storeBlockhashesBatchSize = 20
+pollPeriod = "23s"
+runTimeout = "10s"
+evmChainID = "1"
+fromAddresses = ["0x1111111111111111111111111111111111111111"]
+```
+
+### Shared fields
+
+See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields).
+
+### Unique fields
+
+- `coordinatorV1Address`: a legacy VRF v1 field, kept for API and database compatibility. Non-zero values are rejected at spec validation.
+- `coordinatorV2Address`: the VRF v2 coordinator to watch for unfulfilled requests. If empty, no v2 coordinator is watched.
+- `coordinatorV2PlusAddress`: the VRF v2plus coordinator to watch for unfulfilled requests. If empty, no v2plus coordinator is watched.
+- `waitBlocks`: the minimum age of blocks whose hashes should be stored.
+- `lookbackBlocks`: the maximum age of blocks whose hashes should be stored.
+- `blockhashStoreAddress`: the address of the `BlockhashStore` contract to store blockhashes into.
+- `batchBlockhashStoreAddress`: the address of the `BatchBlockhashStore` contract to store blockhashes into.
+- `getBlockhashesBatchSize`: the RPC call batch size for retrieving blockhashes.
+- `storeBlockhashesBatchSize`: the RPC call batch size for storing blockhashes.
+- `pollPeriod`: how often recent blocks are scanned for blockhash storage.
+- `runTimeout`: the timeout for a single run of the block header feeder.
+- `evmChainID`: the chain ID for monitoring and storing blockhashes.
+- `fromAddresses`: the sender addresses used to store blockhashes.
+
+## Offchain reporting 2 jobs
+
+Offchain Reporting 2 (OCR2) jobs use the second generation of the offchain reporting protocol. The job type is `offchainreporting2`. The protocol details, such as the plugin that consumes the reports, are selected by the job itself rather than by the node.
+
+The node starts `offchainreporting2` jobs only when `OCR2.Enabled` is `true`. The default is `false`, and the node then logs `Off-chain reporting v2 disabled`.
+
+### Spec format
+
+```toml
+type = "offchainreporting2"
+schemaVersion = 1
+name = "OCR2: ETH/USD"
+relay = "evm"
+contractID = "0x613a38AC1659769640aaE063C651F48E0250454C"
+p2pv2Bootstrappers = ["12D3KooWApUJaQB2saFjyEUfq6BmysnsSnhLnY5CF9tURYVKgoXK@10.0.0.1:9999"]
+transmitterID = "0xF67D0290337bca0847005C7ffD1BC75BA9AAE6e4"
+pluginType = "median"
+observationSource = """
+ ds [type=http method=GET url="https://chain.link/ETH-USD"];
+ ds_parse [type=jsonparse path="data.price" separator="."];
+ ds_multiply [type=multiply times=100];
+ ds -> ds_parse -> ds_multiply;
+"""
+
+[relayConfig]
+chainID = "1"
+
+[pluginConfig]
+```
+
+### Shared fields
+
+See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields).
+
+### Unique fields
+
+- `relay`: the relay identifier in `RelayID.Network` form, for example `evm`.
+- `contractID`: the address of the contract that the DON reports on.
+- `feedID`: optional. The feed ID that the job reports on.
+- `chainID`: the chain ID. This field is deprecated in favor of the `chainID` key inside `relayConfig`.
+- `relayConfig`: relay-specific configuration.
+- `p2pv2Bootstrappers`: a list of `peer_id@ip_address:port` strings that identify the bootstrap nodes of the P2P network.
+- `ocrKeyBundleID`: the OCR key bundle that this node uses to sign reports.
+- `transmitterID`: the address from which to submit aggregated reports.
+- `monitoringEndpoint`: the URL of the telemetry endpoint to send OCR metrics to.
+- `blockchainTimeout`: the maximum duration to wait before an onchain request for data is considered to be failed or unfulfillable.
+- `contractConfigTrackerPollInterval`: the interval at which to proactively poll the onchain config for changes.
+- `contractConfigConfirmations`: the number of blocks to wait after an onchain config change before considering it worthy of acting upon.
+- `onchainSigningStrategy`: the strategy used to select the onchain signing key.
+- `pluginType`: the OCR2 plugin that consumes the reports, for example `median`.
+- `pluginConfig`: plugin-specific configuration.
+- `captureEATelemetry`: whether to capture telemetry for the external adapter calls made by the pipeline.
+- `allowNoBootstrappers`: whether the job may start without any bootstrappers. Useful where the node is not configured to conduct consensus.
+
+## Bootstrap jobs
+
+A `bootstrap` job configures a node as a bootstrap peer. A bootstrap node does not take part in the aggregation protocol; it lets the other nodes of a DON find one another. The `bootstrap` job type is used for OCR2, CCIP, and other DONs that use the offchain reporting protocol.
+
+The node starts `bootstrap` jobs only when `OCR2.Enabled` is `true`. The default is `false`.
+
+### Spec format
+
+```toml
+type = "bootstrap"
+schemaVersion = 1
+name = "bootstrap"
+relay = "evm"
+contractID = "0x613a38AC1659769640aaE063C651F48E0250454C"
+
+[relayConfig]
+chainID = "1"
+```
+
+### Shared fields
+
+See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields).
+
+### Unique fields
+
+- `relay`: the relay identifier in `RelayID.Network` form, for example `evm`.
+- `contractID`: the contract that the DON reports on.
+- `feedID`: optional. The feed ID that the DON reports on.
+- `relayConfig`: relay-specific configuration.
+- `monitoringEndpoint`: the URL of the telemetry endpoint to send OCR metrics to.
+- `blockchainTimeout`: the maximum duration to wait before an onchain request for data is considered to be failed or unfulfillable.
+- `contractConfigTrackerPollInterval`: the interval at which to proactively poll the onchain config for changes.
+- `contractConfigConfirmations`: the number of blocks to wait after an onchain config change before considering it worthy of acting upon.
+
+## Stream jobs
+
+A `stream` job runs a pipeline on demand and publishes the results to a Data Streams feed. Each run must produce at least one stream ID, either from the top-level `streamID` field or from a `streamID` tag on a task in the pipeline.
+
+### Spec format
+
+```toml
+type = "stream"
+schemaVersion = 1
+name = "ETH-USD stream"
+streamID = 1234
+observationSource = """
+ ds [type=http method=GET url="https://chain.link/ETH-USD"];
+ ds_parse [type=jsonparse path="data.price" separator="."];
+ ds_multiply [type=multiply times=100];
+ ds -> ds_parse -> ds_multiply;
+"""
+```
+
+### Shared fields
+
+See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields).
+
+### Unique fields
+
+- `streamID`: optional. The stream ID that receives the final output of the pipeline run. Tasks in the pipeline may also carry a `streamID` tag. At least one stream ID must be present.
+
+## Gateway jobs
+
+A `gateway` job configures the node's gateway, which brokers connections between workflow nodes and external services. The `gatewayConfig` block holds the gateway settings. See [Gateway configuration](/cre) for the meaning of each setting.
+
+### Spec format
+
+```toml
+type = "gateway"
+schemaVersion = 1
+name = "Gateway"
+
+[gatewayConfig.ConnectionManagerConfig]
+AuthGatewayId = "gateway"
+AuthChallengeLen = 10
+AuthTimestampToleranceSec = 5
+HeartbeatIntervalSec = 20
+
+[gatewayConfig.NodeServerConfig]
+Path = "/node"
+Port = 8080
+HandshakeTimeoutMillis = 1000
+MaxRequestBytes = 100000
+ReadTimeoutMillis = 1000
+RequestTimeoutMillis = 10000
+WriteTimeoutMillis = 1000
+
+[gatewayConfig.UserServerConfig]
+Path = "/user"
+Port = 8081
+ContentTypeHeader = "application/jsonrpc"
+MaxRequestBytes = 100000
+ReadTimeoutMillis = 1000
+RequestTimeoutMillis = 10000
+WriteTimeoutMillis = 1000
+CORSEnabled = false
+CORSAllowedOrigins = []
+
+[gatewayConfig.HTTPClientConfig]
+MaxResponseBytes = 100000000
+```
+
+### Shared fields
+
+See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields).
+
+### Unique fields
+
+- `gatewayConfig`: the gateway configuration. It holds a `ConnectionManagerConfig` block, a `NodeServerConfig` block, a `UserServerConfig` block, an `HTTPClientConfig` block, and a list of `Dons`.
+
+## Standard capabilities jobs
+
+A `standardcapabilities` job starts a capability binary that the node hosts. The node launches the command in `command` and passes it the value of `config`.
+
+### Spec format
+
+```toml
+type = "standardcapabilities"
+schemaVersion = 1
+name = "some-capability"
+forwardingAllowed = false
+command = "/home/capabilities/some_capability_linux_amd64"
+config = ""
+```
+
+### Shared fields
+
+See [shared fields](/chainlink-nodes/oracle-jobs/jobs/#shared-fields).
+
+### Unique fields
+
+- `command`: the path to the capability binary that the node launches.
+- `config`: the configuration passed to the capability.
+- `oracle_factory`: the oracle factory configuration for the capability.
+
+## CCIP jobs
+
+The `ccip` job type starts a CCIP capability DON. Its configuration is defined by the CCIP capability, which is documented with the product rather than here.
+
+The node starts `ccip` jobs only when `OCR2.Enabled` is `true`. The default is `false`.
+
+### Unique fields
+
+- `p2pV2Bootstrappers`: a list of `peer_id@ip_address:port` strings that identify the bootstrap nodes of the P2P network. These bootstrappers are used to bootstrap all CCIP DONs.
+- `capabilityVersion`: the semantic version of the CCIP capability. This version must exist in the onchain capability registry.
+- `capabilityLabelledName`: the labelled name of the CCIP capability. It corresponds to the labelled name of the capability in the onchain capability registry.
+- `ocrKeyBundleIDs`: a mapping from chain type to OCR key bundle ID, for example `{"evm": "evm_key_bundle_id"}`.
+- `relayConfigs`: relay-specific configuration, keyed by chain family.
+- `p2pKeyID`: the ID of the node's P2P key. It must be present in the capability registry, otherwise the job does not start correctly.
+- `pluginConfig`: plugin-specific configuration.
+
+## CCV committee verifier jobs
+
+The `ccvcommitteeverifier` job type starts a CCV committee verifier capability. Its configuration is defined by the CCV capability, which is documented with the product rather than here.
+
+### Unique fields
+
+- `committeeVerifierConfig`: the TOML configuration for the CCV committee verifier. The configuration is multichain, using chain selectors as keys where applicable.
+
+## CCV executor jobs
+
+The `ccvexecutor` job type starts a CCV executor capability. Its configuration is defined by the CCV capability, which is documented with the product rather than here.
+
+### Unique fields
+
+- `executorConfig`: the TOML configuration for the CCV executor. The configuration is multichain, using chain selectors as keys where applicable.
+
+## CRE settings jobs
+
+The `cresettings` job type carries the settings for the Chainlink Runtime Environment on this node. It is managed by the product rather than written by node operators.
+
+### Unique fields
+
+- `hash`: the hash of the settings payload.
+- `settings`: the settings payload.
diff --git a/src/content/chainlink-nodes/oracle-jobs/all-tasks.mdx b/src/content/chainlink-nodes/oracle-jobs/all-tasks.mdx
index fd6982d646b..2492b5cbbe8 100644
--- a/src/content/chainlink-nodes/oracle-jobs/all-tasks.mdx
+++ b/src/content/chainlink-nodes/oracle-jobs/all-tasks.mdx
@@ -6,6 +6,35 @@ title: "Task Types"
This guide outlines different task types.
+## Anchor task
+
+Rebases a lower or upper sample stream onto a pre-winsorized reference stream, then returns the weighted mean. For each surviving source, the task derives a displacement from the spread between the low and high samples and applies it to the reference value. Sources missing from the low or high stream are dropped. This task is marked experimental in the node source.
+
+**Parameters**
+
+- `reference`: an array of samples to anchor to. This stream should already be winsorized.
+- `low`: an array of lower samples, one per source.
+- `high`: an array of upper samples, one per source.
+- `select`: optional. Whether to anchor to the low or the high stream. Use `low` or `high`. Defaults to `low`.
+- `minWeightMass`: optional. The minimum surviving weight mass required for the task to return a result. Defaults to `0`.
+- `precision`: optional. The number of decimal places to retain in the result.
+
+**Outputs**
+
+The weighted mean of the anchored samples.
+
+**Example**
+
+```toml
+anchor [type="anchor"
+ reference="$(winsorized)"
+ low="$(low_samples)"
+ high="$(high_samples)"
+ select="low"
+ minWeightMass="0"
+ precision=8]
+```
+
## 'Any' task
Returns a random value from the set of inputs passed in.
@@ -135,6 +164,51 @@ parse [type="jsonparse" path="$(decode_cbor.jsonPath)" data="$(fetch)"]
See the [Direct Request page](/chainlink-nodes/oracle-jobs/all-jobs/#direct-request-jobs) for a more comprehensive example.
+## Coalesce task
+
+Returns the first input that is neither an error nor nil, or nil if there are none.
+
+**Parameters**
+
+None.
+
+**Inputs**
+
+One or more inputs.
+
+**Outputs**
+
+The value of the first input that did not error and is not nil. Returns nil when every input errored or was nil.
+
+**Example**
+
+```toml
+primary [type="http" method=GET url="https://primary.example.com"]
+secondary [type="http" method=GET url="https://secondary.example.com"]
+pick [type="coalesce"]
+
+primary -> pick
+secondary -> pick
+```
+
+## Conditional task
+
+Fails the run unless `data` resolves to true.
+
+**Parameters**
+
+- `data`: the boolean to check. Can be a literal, a `$(variable)`, or the single pipeline input.
+
+**Outputs**
+
+`true` when the condition is satisfied. The task errors with `conditional was not satisfied` when it is not.
+
+**Example**
+
+```toml
+check [type="conditional" data="$(should_continue)"]
+```
+
## Divide task
Divides the provided `input` by the `divisor` and returns the result with a number of decimal places defined in the `precision` value.
@@ -172,6 +246,32 @@ my_divide_task [type="divide"
Given the input `10`, this example returns `3.33`.
+## Estimate Gas Limit task
+
+Estimates the gas required for a transaction and returns the estimate as a `uint64`. If the estimate cannot be obtained, the task falls back to the configured maximum gas limit for the job.
+
+**Parameters**
+
+- `from`: the address the transaction would be sent from. Defaults to the zero address.
+- `to`: the address of the contract to call.
+- `data`: the data to attach to the call, including the function selector.
+- `multiplier`: optional. The multiplier applied to the estimated gas. Defaults to `1`.
+- `evmChainID`: optional. The chain on which to estimate. Defaults to the chain ID of the job.
+- `block`: optional. The block at which to estimate, for example `latest`.
+
+**Outputs**
+
+The estimated gas limit as a `uint64`.
+
+**Example**
+
+```toml
+estimate_gas [type="estimategaslimit"
+ to="0x613a38AC1659769640aaE063C651F48E0250454C"
+ multiplier="1.1"
+ data="$(vrf.output)"]
+```
+
## ETH ABI Decode Log task
Decodes a log emitted by an ETH contract.
@@ -280,6 +380,28 @@ encode [type="ethabiencode"
]
```
+## ETH ABI Encode 2 task
+
+Encodes a bytes payload according to ETH ABI encoding, using a JSON method definition for the ABI. Unlike the [ETH ABI Encode task](#eth-abi-encode-task), which takes a Solidity signature string, this task takes the ABI as a JSON object with `name` and `inputs`. When `name` is set, the 4-byte method signature is prepended to the result.
+
+**Parameters**
+
+- `abi`: a JSON object describing the method, with a `name` and a list of `inputs`. Each input has a `name` and a `type`. Example:
+ - `{"name":"fulfillRequest","inputs":[{"name":"requestID","type":"bytes32"},{"name":"answer","type":"uint256"}]}`
+- `data`: a map of the values to be encoded.
+
+**Outputs**
+
+A byte array.
+
+**Example**
+
+```toml
+encode [type="ethabiencode2"
+ abi="{\\"name\\":\\"fulfillRequest\\",\\"inputs\\":[{\\"name\\":\\"requestID\\",\\"type\\":\\"bytes32\\"},{\\"name\\":\\"answer\\",\\"type\\":\\"uint256\\"}]}"
+ data="{\\"requestID\\": $(decode_log.requestId), \\"answer\\": $(parse)}"]
+```
+
## ETH Call task
Makes a non-mutating contract call to the specified contract with the specified data payload.
@@ -353,6 +475,24 @@ submit_tx [type="ethtx"
encode_tx -> submit_tx
```
+## Fail task
+
+Returns an error with the configured message. This task is marked as testing only in the node source.
+
+**Parameters**
+
+- `msg`: the error message.
+
+**Outputs**
+
+The task always errors with `msg`.
+
+**Example**
+
+```toml
+fail [type="fail" msg="stopping here"]
+```
+
## Hex Decode task
Accepts a hexadecimal encoded string and returns decoded bytes.
@@ -504,6 +644,28 @@ my_lessthan_task [type="lessthan" left="3" right="10"]
the task will return true which is the result of `3 LESS_THAN 10`
+## Lookup task
+
+Looks up a key in a map input and returns the value at that key.
+
+**Parameters**
+
+- `key`: the key to look up in the input map.
+
+**Inputs**
+
+A single map input.
+
+**Outputs**
+
+The value at `key`. The value is nil when the key is not present.
+
+**Example**
+
+```toml
+lookup [type="lookup" key="ethusd"]
+```
+
## Lowercase task
Accepts a string and returns a lowercase string.
@@ -524,6 +686,30 @@ my_lowercase_task [type="lowercase" input="Hello World!"]
Given the input `Hello World!`, the task will return `hello world!`.
+## Max task
+
+Accepts multiple numerical inputs and returns the maximum of them.
+
+**Parameters**
+
+- `values`: an array of values from which to select the maximum.
+- `allowedFaults` (optional): the maximum number of input tasks that can error without the Max task erroring. If not specified, this value defaults to `N - 1`, where `N` is the number of inputs.
+- `lax` (optional): when disabled (the default), the task errors if there are no input values or if the input includes nil values. When enabled, the task returns nil with no error if there are no valid input values, and nil values are excluded from the calculation and do not count as a fault.
+
+**Outputs**
+
+The maximum of the values in the `values` array.
+
+**Example**
+
+```toml
+my_max_task [type="max"
+ values=<[ $(fetch1), $(fetch2), $(fetch3) ]>
+ allowedFaults=1]
+```
+
+Given the inputs `2`, `5`, and `20`, the task will return `20`.
+
## Mean task
Accepts multiple numerical inputs and returns the mean (average) of them.
@@ -622,6 +808,30 @@ This example task returns the following map:
{ "foo": "abc", "bar": "xyz", "biz": "buzz" }
```
+## Min task
+
+Accepts multiple numerical inputs and returns the minimum of them.
+
+**Parameters**
+
+- `values`: an array of values from which to select the minimum.
+- `allowedFaults` (optional): the maximum number of input tasks that can error without the Min task erroring. If not specified, this value defaults to `N - 1`, where `N` is the number of inputs.
+- `lax` (optional): when disabled (the default), the task errors if there are no input values or if the input includes nil values. When enabled, the task returns nil with no error if there are no valid input values, and nil values are excluded from the calculation and do not count as a fault.
+
+**Outputs**
+
+The minimum of the values in the `values` array.
+
+**Example**
+
+```toml
+my_min_task [type="min"
+ values=<[ $(fetch1), $(fetch2), $(fetch3) ]>
+ allowedFaults=1]
+```
+
+Given the inputs `2`, `5`, and `20`, the task will return `2`.
+
## Mode task
Accepts multiple numerical inputs and returns the mode (most common) of them. If more than one value occur the maximum number of times, it returns all of them.
@@ -712,6 +922,73 @@ my_multiply_task [type="multiply" input="$(json_parse_result)" times=3]
Given the input `10`, the task will return `30`.
+## Normalize task
+
+Converts sample values onto a common unit using a unit to factor map. Samples that are already in the target unit, or that carry no unit, pass through unchanged. This task is marked experimental in the node source.
+
+**Parameters**
+
+- `samples`: an array of samples, or the pipeline input.
+- `unitMap`: an optional map of unit names to factors. Each factor may be a raw number or a sample. Required when `enabled` is true.
+- `targetUnit`: the unit that the output samples are converted to.
+- `enabled`: optional. Defaults to `true`.
+- `onMissingRate`: optional. What to do when a sample's unit has no factor in `unitMap`. Defaults to `drop`. Any other value makes the task error instead.
+
+**Outputs**
+
+An array of samples with all values expressed in `targetUnit`. Unconvertible samples are dropped, or cause an error, depending on `onMissingRate`.
+
+## Panic task
+
+Panics with the configured message. This task is marked as testing only in the node source.
+
+**Parameters**
+
+- `msg`: the panic message.
+
+**Example**
+
+```toml
+panic [type="panic" msg="stopping here"]
+```
+
+## Sample task
+
+Wraps an upstream result into a sample. A sample bundles a value with the metadata (source, weight, unit, timestamp) that the aggregation tasks consume. This task is marked experimental in the node source.
+
+**Parameters**
+
+- `input`: the upstream result to read the value from. Defaults to the single pipeline input.
+- `source`: the source name. Used for grouping and weighting.
+- `weight`: optional. The nominal weight of the sample. Defaults to `1`.
+- `unit`: optional. The unit of the value. An empty value means the value is already in the common unit.
+- `tag`: optional. A free label, used for diagnostics only.
+- `valuePath`: the JSON path to the value inside `input`.
+- `tsPath`: the JSON path to the timestamp inside `input`.
+- `tsUnit`: optional. The unit of the timestamp. Defaults to `ms`.
+- `decimals`: optional. The number of decimals to scale the value by.
+
+**Outputs**
+
+A sample with the fields `source`, `value`, `ts_ms`, `weight`, `unit`, and `tag`.
+
+## Staleness task
+
+Decays the weight of each sample by its age, so that older samples count for less in downstream aggregation. This task is marked experimental in the node source.
+
+**Parameters**
+
+- `samples`: an array of samples, or the pipeline input.
+- `method`: the decay method to apply.
+- `threshold`: optional. The age beyond which a sample is considered stale.
+- `halfLife`: optional. The age at which a sample's weight is halved. Defaults to `0s`.
+- `cutoff`: optional. The maximum age of a sample.
+- `decayThreshold`: optional. The weight below which a sample is dropped.
+
+**Outputs**
+
+An array of samples with adjusted `weight` values.
+
## Sum Task
Accepts multiple numerical inputs and returns the sum of them.
@@ -754,3 +1031,79 @@ my_uppercase_task [type="uppercase" input="Hello World!"]
```
Given the input `Hello World!`, the task will return `HELLO WORLD!`.
+
+## VRF V2 task
+
+Generates a VRF v2 proof from a request log. It takes the decoded log as its single input and returns the encoded proof.
+
+**Parameters**
+
+- `publicKey`: the public key of the VRF key that this node uses to generate the proof.
+- `requestBlockHash`: the hash of the block in which the request log was received. Usually set to `$(jobRun.logBlockHash)`.
+- `requestBlockNumber`: the number of the block in which the request log was received. Usually set to `$(jobRun.logBlockNumber)`.
+- `topics`: the log's topics. Usually set to `$(jobRun.logTopics)`.
+
+**Inputs**
+
+A single decoded request log, normally from an [ETH ABI Decode Log task](#eth-abi-decode-log-task).
+
+**Outputs**
+
+A map with an `output` key that holds the encoded proof.
+
+**Example**
+
+```toml
+vrf [type="vrfv2"
+ publicKey="$(jobSpec.publicKey)"
+ requestBlockHash="$(jobRun.logBlockHash)"
+ requestBlockNumber="$(jobRun.logBlockNumber)"
+ topics="$(jobRun.logTopics)"]
+```
+
+## VRF V2Plus task
+
+Generates a VRF v2plus proof from a request log. It is identical to the [VRF V2 task](#vrf-v2-task), except that it uses the V2Plus request commitment, which includes a flag that indicates whether the request is paid in native tokens or in LINK.
+
+**Parameters**
+
+- `publicKey`: the public key of the VRF key that this node uses to generate the proof.
+- `requestBlockHash`: the hash of the block in which the request log was received. Usually set to `$(jobRun.logBlockHash)`.
+- `requestBlockNumber`: the number of the block in which the request log was received. Usually set to `$(jobRun.logBlockNumber)`.
+- `topics`: the log's topics. Usually set to `$(jobRun.logTopics)`.
+
+**Inputs**
+
+A single decoded request log, normally from an [ETH ABI Decode Log task](#eth-abi-decode-log-task).
+
+**Outputs**
+
+A map with an `output` key that holds the encoded proof.
+
+**Example**
+
+```toml
+vrf [type="vrfv2plus"
+ publicKey="$(jobSpec.publicKey)"
+ requestBlockHash="$(jobRun.logBlockHash)"
+ requestBlockNumber="$(jobRun.logBlockNumber)"
+ topics="$(jobRun.logTopics)"]
+```
+
+## Weighted Mean task
+
+Gates on a minimum weight mass, optionally clamps each sample's value into a band around the cross-sectional median, then returns the weighted mean. With no `method` set it computes a plain weighted mean with no clamping. This task is marked experimental in the node source.
+
+**Parameters**
+
+- `samples`: an array of samples, or the pipeline input. Normally the output of a [Staleness task](#staleness-task), one sample per source.
+- `reference`: optional. An array of samples to derive the clamp band from.
+- `band`: optional. The width of the clamp band. Defaults to `0.03`.
+- `minWeightMass`: optional. The minimum surviving weight mass required for the task to return a result. Defaults to `0`.
+- `method`: optional. The winsorization method to apply. Empty, the default, means no clamping.
+- `winsorRef`: optional. The reference used for winsorization. Defaults to `median`.
+- `precision`: optional. The number of decimal places to retain in the result.
+
+**Outputs**
+
+The weighted mean as a decimal, winsorized when `method` is set. The task fails with `insufficient weight mass` when the surviving mass is below `minWeightMass`.
diff --git a/src/content/chainlink-nodes/oracle-jobs/jobs.mdx b/src/content/chainlink-nodes/oracle-jobs/jobs.mdx
index 41b89181f97..5db54470ce4 100644
--- a/src/content/chainlink-nodes/oracle-jobs/jobs.mdx
+++ b/src/content/chainlink-nodes/oracle-jobs/jobs.mdx
@@ -17,11 +17,27 @@ import { Aside } from "@components"
Chainlink nodes require jobs to do anything useful. For example, posting asset price data onchain requires jobs. Chainlink nodes support the following job types:
+- [`blockhashstore`](/chainlink-nodes/oracle-jobs/all-jobs/#blockhash-store-jobs)
+- [`blockheaderfeeder`](/chainlink-nodes/oracle-jobs/all-jobs/#block-header-feeder-jobs)
+- [`bootstrap`](/chainlink-nodes/oracle-jobs/all-jobs/#bootstrap-jobs) (requires `OCR2.Enabled = true`)
+- [`ccip`](/chainlink-nodes/oracle-jobs/all-jobs/#ccip-jobs) (requires `OCR2.Enabled = true`)
+- [`ccvcommitteeverifier`](/chainlink-nodes/oracle-jobs/all-jobs/#ccv-committee-verifier-jobs)
+- [`ccvexecutor`](/chainlink-nodes/oracle-jobs/all-jobs/#ccv-executor-jobs)
+- [`cresettings`](/chainlink-nodes/oracle-jobs/all-jobs/#cre-settings-jobs)
- [`cron`](/chainlink-nodes/oracle-jobs/all-jobs/#solidity-cron-jobs)
+- [`gateway`](/chainlink-nodes/oracle-jobs/all-jobs/#gateway-jobs)
+- [`offchainreporting`](/chainlink-nodes/oracle-jobs/all-jobs/#offchain-reporting-jobs) (requires `OCR.Enabled = true`)
+- [`offchainreporting2`](/chainlink-nodes/oracle-jobs/all-jobs/#offchain-reporting-2-jobs) (requires `OCR2.Enabled = true`)
+- [`standardcapabilities`](/chainlink-nodes/oracle-jobs/all-jobs/#standard-capabilities-jobs)
+- [`stream`](/chainlink-nodes/oracle-jobs/all-jobs/#stream-jobs)
+- [`vrf`](/chainlink-nodes/oracle-jobs/all-jobs/#vrf-jobs)
+
+The following job types are no longer supported. A spec that uses one of them does not start:
+
- [`directrequest`](/chainlink-nodes/oracle-jobs/all-jobs/#direct-request-jobs)
- [`fluxmonitor`](/chainlink-nodes/oracle-jobs/all-jobs/#flux-monitor-jobs)
- [`keeper`](/chainlink-nodes/oracle-jobs/all-jobs/#keeper-jobs)
-- [`offchainreporting`](/chainlink-nodes/oracle-jobs/all-jobs/#offchain-reporting-jobs)
+- `workflow`
- [`webhook`](/chainlink-nodes/oracle-jobs/all-jobs/#webhook-jobs)
Jobs are represented by TOML specifications.
@@ -50,15 +66,23 @@ Every job type supported by a node shares the following TOML fields:
- `name`: The name of the job in the Operator UI
- `type`: Specifies the v2 job type, which can be one of the following:
+ - `blockhashstore`
+ - `blockheaderfeeder`
+ - `bootstrap`
+ - `ccip`
+ - `ccvcommitteeverifier`
+ - `ccvexecutor`
+ - `cresettings`
- `cron`
- - `directrequest`
- - `fluxmonitor`
- - `keeper`
+ - `gateway`
- `offchainreporting`
- - `webhook`
+ - `offchainreporting2`
+ - `standardcapabilities`
+ - `stream`
+ - `vrf`
- `schemaVersion`: Must be present and set to a value of `1`. This field will handle progressive iterations of the job spec format gracefully with backwards-compatibility.
- `observationSource`: The v2 pipeline task DAG, which is specified in DOT syntax. See below for information on writing pipeline DAGs.
- `maxTaskDuration`: The default maximum duration that any task is allowed to run. If the duration is exceeded, the task is errored. This value can be overridden on a per-task basis using the `timeout` attribute. See the [Shared attributes](/chainlink-nodes/oracle-jobs/tasks#shared-attributes) section for details.
-- `externalJobID`: An optional way for a user to deterministically provide the ID of a job. The ID must be unique. For example, you can specify an `externalJobID` if you want to run the same `directrequest` job on two different Chainlink nodes with different bridge names. The spec contents differ slightly, but you can use the same `externalJobID` on both jobs, specify that in your onchain requests, and both nodes will pick it up. If you do not provide an `externalJobID`, the node generates the ID for you.
-- `gasLimit`: Optional gas limit for any outgoing transactions spawned by this job. When specified, it overrides `ETH_GAS_LIMIT_DEFAULT` env variable.
+- `externalJobID`: An optional way for a user to deterministically provide the ID of a job. The ID must be unique. For example, you can run the same `cron` job on two different Chainlink nodes and use the same `externalJobID` on both. The spec contents can differ, but the `externalJobID` identifies the job on either node. If you do not provide an `externalJobID`, the node generates the ID for you.
+- `gasLimit`: Optional gas limit for any outgoing transactions spawned by this job. When specified, it overrides `EVM.GasEstimator.LimitJobType` for the job's type, and `EVM.GasEstimator.LimitDefault` when no job-type limit is set.
- `forwardingAllowed`: Optional. When `true`, it allows forwarding transactions submitted by the job.
diff --git a/src/content/chainlink-nodes/oracle-jobs/migration-v1-v2.mdx b/src/content/chainlink-nodes/oracle-jobs/migration-v1-v2.mdx
index 6aa7127866d..af0aa860976 100644
--- a/src/content/chainlink-nodes/oracle-jobs/migration-v1-v2.mdx
+++ b/src/content/chainlink-nodes/oracle-jobs/migration-v1-v2.mdx
@@ -4,6 +4,8 @@ date: Last Modified
title: "Migrating to v2 Jobs"
---
+import { Aside } from "@components"
+
Chainlink nodes with version 1.0.0 and later support v2 jobs in TOML format. Support for v1 jobs in JSON format is removed.
## Comparison between v1 and v2 jobs
@@ -71,6 +73,12 @@ submit_btcusd [type="bridge"
## Example Migrations
+
+ The v2 job types used in these examples (`directrequest` and `webhook`) are not supported in this node, so a spec with
+ either type does not start. See [Job Types](/chainlink-nodes/oracle-jobs/all-jobs/#direct-request-jobs) for details.
+ The examples are kept as a record of the v1 to v2 migration.
+
+
### Runlog with ETH ABI encoding
**v1 spec**
diff --git a/src/content/chainlink-nodes/oracle-jobs/tasks.mdx b/src/content/chainlink-nodes/oracle-jobs/tasks.mdx
index 88bb75b51a9..ce16f499ce1 100644
--- a/src/content/chainlink-nodes/oracle-jobs/tasks.mdx
+++ b/src/content/chainlink-nodes/oracle-jobs/tasks.mdx
@@ -25,7 +25,9 @@ All tasks share a few common attributes:
```toml
data_1 [type="http" method=GET url="https://chain.link/eth_usd" index=0]
data_2 [type="http" method=GET url="https://chain.link/eth_dominance" index=1]
-multiword_abi_encode [type="eth_abi_encode" method="fulfill(uint256,uint256)"]
+multiword_abi_encode [type="ethabiencode"
+ abi="fulfill(uint256 ethUsd, uint256 ethDominance)"
+ data="{\\"ethUsd\\": $(data_1), \\"ethDominance\\": $(data_2)}"]
data_1 -> multiword_abi_encode
data_2 -> multiword_abi_encode
diff --git a/src/content/chainlink-nodes/resources/best-security-practices.mdx b/src/content/chainlink-nodes/resources/best-security-practices.mdx
index b52f3a9f391..0795ca2e8f6 100644
--- a/src/content/chainlink-nodes/resources/best-security-practices.mdx
+++ b/src/content/chainlink-nodes/resources/best-security-practices.mdx
@@ -58,7 +58,7 @@ To be proactive in detecting any issues before or when they occur, active monito
- Ethereum client disk, RAM and CPU usage.
Monitoring can be set up from the Docker container's output and fed into most major logging providers. For example, you can use Docker's docs to set up the logging driver for [Amazon CloudWatch](https://docs.docker.com/config/containers/logging/awslogs/) and [Google Cloud Logging](https://docs.docker.com/config/containers/logging/gcplogs/). You will want to set the [
-JSON_CONSOLE](/chainlink-nodes/v1/configuration) configuration variable to `true` so that the output of the container is JSON-formatted for logging.
+Log.JSONConsole](/chainlink-nodes/v1/node-config) configuration variable to `true` so that the output of the container is JSON-formatted for logging.
## Frequent updates
@@ -73,14 +73,14 @@ The following are suggestions for job specifications and configuration settings
[Job Specifications](/chainlink-nodes/oracle-jobs/jobs):
- Include the address of your oracle contract address for all RunLog initiated jobs, as shown in the [Fulfilling Requests](/chainlink-nodes/v1/fulfilling-requests/#add-a-job-to-the-node) guide.
-- Override the global `MIN_INCOMING_CONFIRMATIONS` config by setting a `confirmations` field in jobs which perform offchain payments to allow for greater security by making the node ensure the transaction is still valid after X blocks.
+- Override the global `EVM.MinIncomingConfirmations` config by setting a `confirmations` field in jobs which perform offchain payments to allow for greater security by making the node ensure the transaction is still valid after X blocks.
[Configuring Chainlink Nodes](/chainlink-nodes/v1/configuration):
-- [MINIMUM_CONTRACT_PAYMENT_LINK_JUELS](/chainlink-nodes/v1/configuration): ensure your required payment amount is high enough to meet the costs of responding onchain.
-- [MIN_INCOMING_CONFIRMATIONS](/chainlink-nodes/v1/configuration): this can be set to 0 for common data request jobs. See the bullet above on setting individual `confirmations` for specific jobs.
-- [LOG_FILE_MAX_SIZE](/chainlink-nodes/v1/configuration): Set this to `0` if you're using external log drivers which parse the output from Docker containers. This will save you disk space.
-- [JSON_CONSOLE](/chainlink-nodes/v1/configuration): Set to `true` if you're using external log drivers to parse the output of Docker containers. This will make it easier to parse individual fields of the log and set up alerts.
+- [EVM.MinContractPayment](/chainlink-nodes/v1/node-config): ensure your required payment amount is high enough to meet the costs of responding onchain.
+- [EVM.MinIncomingConfirmations](/chainlink-nodes/v1/node-config): this can be set to 0 for common data request jobs. See the bullet above on setting individual `confirmations` for specific jobs.
+- [Log.File.MaxSize](/chainlink-nodes/v1/node-config): Set this to `0` if you're using external log drivers which parse the output from Docker containers. This will save you disk space.
+- [Log.JSONConsole](/chainlink-nodes/v1/node-config): Set to `true` if you're using external log drivers to parse the output of Docker containers. This will make it easier to parse individual fields of the log and set up alerts.
## Addresses
diff --git a/src/content/chainlink-nodes/resources/connecting-to-a-remote-database.mdx b/src/content/chainlink-nodes/resources/connecting-to-a-remote-database.mdx
index bcfc68f7354..5f7c8fc9433 100644
--- a/src/content/chainlink-nodes/resources/connecting-to-a-remote-database.mdx
+++ b/src/content/chainlink-nodes/resources/connecting-to-a-remote-database.mdx
@@ -24,12 +24,13 @@ In order to connect to a remote database, you must obtain information about the
The user must be the owner of the desired database. On first run, the migrations will create the tables necessary for the Chainlink node.
-## Set Your DATABASE_URL environment variable
+## Set the database URL
-Below is an example for setting the `DATABASE_URL` environment variable for your Chainlink Node's `.env` configuration file:
+Below is an example for setting the database URL in the `[Database]` section of your `secrets.toml` file:
-```text DATABASE_URL
-DATABASE_URL=postgresql://[USERNAME]:[PASSWORD]@[SERVER]:[PORT]/[DATABASE]?sslmode=[SSL_MODE]
+```toml secrets.toml
+[Database]
+URL = 'postgresql://[USERNAME]:[PASSWORD]@[SERVER]:[PORT]/[DATABASE]?sslmode=[SSL_MODE]'
```
Change the following placeholders to their real values:
diff --git a/src/content/chainlink-nodes/resources/enabling-https-connections.mdx b/src/content/chainlink-nodes/resources/enabling-https-connections.mdx
index 22014b91336..5d80fba8431 100644
--- a/src/content/chainlink-nodes/resources/enabling-https-connections.mdx
+++ b/src/content/chainlink-nodes/resources/enabling-https-connections.mdx
@@ -56,23 +56,16 @@ openssl req -x509 -out ~/.chainlink/tls/server.crt -keyout ~/.chainlink/tls/se
-Next, add the `TLS_CERT_PATH` and `TLS_KEY_PATH` environment variables to your `.env` file.
+Next, add the certificate and key paths to the `[WebServer.TLS]` section of your `config.toml` file. Set `SecureCookies` to `true` and `HTTPSPort` to the HTTPS port:
-```shell Shell
-echo "TLS_CERT_PATH=/chainlink/tls/server.crt
-TLS_KEY_PATH=/chainlink/tls/server.key" >> .env
-```
-
-If `CHAINLINK_TLS_PORT=0` is present in your `.env` file, remove it by running:
-
-```shell Shell
-sed -i '/CHAINLINK_TLS_PORT=0/d' .env
-```
-
-Also remove the line that disables `SECURE_COOKIES` by running:
+```toml config.toml
+[WebServer]
+SecureCookies = true
-```shell Shell
-code": "sed -i '/SECURE_COOKIES=false/d' .env
+[WebServer.TLS]
+CertPath = '/chainlink/tls/server.crt'
+KeyPath = '/chainlink/tls/server.key'
+HTTPSPort = 6689
```
Finally, update your run command to forward port 6689 to the container instead of 6688:
@@ -83,14 +76,12 @@ Finally, update your run command to forward port 6689 to the container instead o
Mainnet
```shell Sepolia
- cd ~/.chainlink-sepolia && docker run -p 6689:6689 -v ~/.chainlink-sepolia:/chainlink -it
- --env-file=.env smartcontract/chainlink local n
+ cd ~/.chainlink-sepolia && docker run -p 6689:6689 -v ~/.chainlink-sepolia:/chainlink -it smartcontract/chainlink:2.66.0 node -config /chainlink/config.toml -secrets /chainlink/secrets.toml start
```
```shell Mainnet
- cd ~/.chainlink && docker run -p 6689:6689 -v ~/.chainlink:/chainlink -it --env-file=.env
- smartcontract/chainlink local n
+ cd ~/.chainlink && docker run -p 6689:6689 -v ~/.chainlink:/chainlink -it smartcontract/chainlink:2.66.0 node -config /chainlink/config.toml -secrets /chainlink/secrets.toml start
```
diff --git a/src/content/chainlink-nodes/resources/evm-performance-configuration.mdx b/src/content/chainlink-nodes/resources/evm-performance-configuration.mdx
index 22ee35c49dc..79464c021ea 100644
--- a/src/content/chainlink-nodes/resources/evm-performance-configuration.mdx
+++ b/src/content/chainlink-nodes/resources/evm-performance-configuration.mdx
@@ -40,46 +40,36 @@ You can configure as many send-only nodes as you want. Send-only nodes only broa
URL for a send-only node as an existing primary node, and it has no effect.
-Here is an example for how to specify the [`EVM_NODES` environment variable](/chainlink-nodes/v1/configuration):
-
-```shell
-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
- },
-]
-'
+Here is an example of how to specify multiple nodes in the `[[EVM.Nodes]]` section of your `config.toml`:
+
+```toml
+[[EVM]]
+ChainID = '137'
+
+[[EVM.Nodes]]
+Name = 'primary_1'
+WSURL = 'wss://endpoint-1.example.com/ws'
+HTTPURL = 'http://endpoint-1.example.com/'
+
+[[EVM.Nodes]]
+Name = 'primary_2'
+WSURL = 'ws://endpoint-2.example.com/ws'
+HTTPURL = 'http://endpoint-2.example.com/'
+
+[[EVM.Nodes]]
+Name = 'primary_3'
+WSURL = 'wss://endpoint-3.example.com/ws'
+HTTPURL = 'http://endpoint-3.example.com/'
+
+[[EVM.Nodes]]
+Name = 'sendonly_1'
+HTTPURL = 'http://endpoint-4.example.com/'
+SendOnly = true
+
+[[EVM.Nodes]]
+Name = 'sendonly_2'
+HTTPURL = 'http://endpoint-5.example.com/'
+SendOnly = true
```
Send-only nodes are used for broadcasting transactions only, and must support the following RPC calls:
@@ -95,24 +85,30 @@ Send-only nodes are used for broadcasting transactions only, and must support th
balancers must provide finality guarantees.