Job Types
This guide outlines different job types.
Solidity cron jobs
Executes a job on a schedule. Does not rely on any kind of external trigger.
Spec format
type = "cron"
schemaVersion = 1
evmChainID = 1
schedule = "CRON_TZ=UTC * */20 * * * *"
externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F01"
observationSource = """
fetch [type="http" method=GET url="https://chain.link/ETH-USD"]
parse [type="jsonparse" path="data,price"]
multiply [type="multiply" times=100]
fetch -> parse -> multiply
"""
Shared fields
See shared fields.
Unique fields
schedule: the frequency with which the job is to be run. There are two ways to specify this:- Traditional UNIX cron format, but with 6 fields, not 5. The extra field allows for "seconds" granularity. Note: you must specify the
CRON_TZ=...parameter if you use this format. @shorthand, e.g.@every 1h. This shorthand does not take account of the node's timezone, rather, it simply begins counting down the moment that the job is added to the node (or the node is rebooted). As such, noCRON_TZparameter is needed.
- Traditional UNIX cron format, but with 6 fields, not 5. The extra field allows for "seconds" granularity. Note: you must specify the
For all supported schedules, please refer to the cron library documentation.
Job type specific pipeline variables
$(jobSpec.databaseID): the ID of the job spec in the local database. You shouldn't need this in 99% of cases.$(jobSpec.externalJobID): the globally-unique job ID for this job. Used to coordinate between node operators in certain cases.$(jobSpec.name): the local name of the job.$(jobRun.meta): a map of metadata that can be sent to a bridge, etc.
Direct request jobs
Executes a job upon receipt of an explicit request made by a user. The request is detected via a log emitted by an Oracle or Operator contract. This is similar to the legacy ethlog/runlog style of jobs.
Spec format
type = "directrequest"
schemaVersion = 1
evmChainID = 1
name = "example eth request event spec"
contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C"
# Optional fields:
# requesters = [
# "0xAaAA1F8ee20f5565510b84f9353F1E333e753B7a",
# "0xBbBb70f0E81c6F3430dfDc9fa02fB22bDD818c4E"
# ]
# minContractPaymentLinkJuels = "100000000000000"
# externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F02"
# minIncomingConfirmations = 10
observationSource = """
ds [type="http" method=GET url="http://example.com"]
ds_parse [type="jsonparse" path="USD"]
ds_multiply [type="multiply" times=100]
ds -> ds_parse -> ds_multiply
"""
Shared fields
See shared fields.
Unique fields
contractAddress: The Oracle or Operator contract to monitor for requestsrequesters: Optional - Allows whitelisting requestersminContractPaymentLinkJuelsOptional - Allows you to specify a job-specific minimum contract paymentminIncomingConfirmationsOptional - Allows you to specify a job-specificMIN_INCOMING_CONFIRMATIONSvalue, must be greater than globalMIN_INCOMING_CONFIRMATIONS
Job type specific pipeline variables
$(jobSpec.databaseID): the ID of the job spec in the local database. You shouldn't need this in 99% of cases.$(jobSpec.externalJobID): the globally-unique job ID for this job. Used to coordinate between node operators in certain cases.$(jobSpec.name): the local name of the job.$(jobRun.meta): a map of metadata that can be sent to a bridge, etc.$(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.logTxHash): the transaction hash that generated the initiating log.$(jobRun.logAddress): the address of the contract to which the initiating transaction was sent.$(jobRun.logTopics): the log's topics (indexedfields).$(jobRun.logData): the log's data (non-indexedfields).$(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).
Examples
Get > Uint256 job
Let's assume that a user makes a request to an oracle to call a public API, retrieve a number from the response, remove any decimals and return uint256.
Get > Int256 job
Let's assume that a user makes a request to an oracle to call a public API, retrieve a number from the response, remove any decimals and return int256.
- The job spec example can be found here.
Get > Bool job
Let's assume that a user makes a request to an oracle to call a public API, retrieve a boolean from the response and return bool.
- The job spec example can be found here.
Get > String job
Let's assume that a user makes a request to an oracle and would like to fetch a string from the response.
Get > Bytes job
Let's assume that a user makes a request to an oracle and would like to fetch bytes from the response (meaning a response that contains an arbitrary-length raw byte data).
Multi-Word job
Let's assume that a user makes a request to an oracle and would like to fetch multiple words in one single request.
Existing job
Using an existing Oracle Job makes your smart contract code more succinct. Let's assume that a user makes a request to an oracle that leverages Etherscan External Adapter to retrieve the gas price.
Flux Monitor Jobs
The Flux Monitor job type is for continually-updating data feeds that aggregate responses from multiple oracles. The oracles servicing the feed submit rounds based on several triggers:
- An occasional poll, which must show that there has been sufficient deviation from an offchain data source before a new result is submitted
- New rounds initiated by other oracles on the feeds. If another oracle notices sufficient deviation, all other oracles will submit their current observations as well.
- A heartbeat, which ensures that even if no deviation occurs, we submit a new result to prove liveness. This can take one of two forms:
- The "idle timer", which begins counting down each time a round is started
- The "drumbeat", which simply ticks at a steady interval, much like a
cronjob
Spec format
type = "fluxmonitor"
schemaVersion = 1
name = "example flux monitor spec"
contractAddress = "0x3cCad4715152693fE3BC4460591e3D3Fbd071b42"
externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F03"
threshold = 0.5
absoluteThreshold = 0.0 # optional
idleTimerPeriod = "1s"
idleTimerDisabled = false
pollTimerPeriod = "1m"
pollTimerDisabled = false
drumbeatEnabled = true
drumbeatSchedule = "CRON_TZ=UTC * */20 * * * *"
observationSource = """
// data source 1
ds1 [type="http" method=GET url="https://pricesource1.com"
requestData="{\\"coin\\": \\"ETH\\", \\"market\\": \\"USD\\"}"]
ds1_parse [type="jsonparse" path="data,result"]
// data source 2
ds2 [type="http" method=GET url="https://pricesource2.com"
requestData="{\\"coin\\": \\"ETH\\", \\"market\\": \\"USD\\"}"]
ds2_parse [type="jsonparse" path="data,result"]
ds1 -> ds1_parse -> medianized_answer
ds2 -> ds2_parse -> medianized_answer
medianized_answer [type=median]
"""
Shared fields
See shared fields.
Unique fields
contractAddress: the address of the FluxAggregator contract that manages the feed.threshold: the percentage threshold of deviation from the previous onchain answer that must be observed before a new set of observations are submitted to the contract.absoluteThreshold: the absolute numerical deviation that must be observed from the previous onchain answer before a new set of observations are submitted to the contract. This is primarily useful with data that can legitimately sometimes hit 0, as it's impossible to calculate a percentage deviation from 0.idleTimerPeriod: the amount of time (after the start of the last round) after which a new round will be automatically initiated, regardless of any observed offchain deviation.idleTimerDisabled: whether the idle timer is used to trigger new rounds.drumbeatEnabled: whether the drumbeat is used to trigger new rounds.drumbeatSchedule: the cron schedule of the drumbeat. This field supports the same syntax as the cron job type (see the cron library documentation for details). CRON_TZ is required.pollTimerPeriod: the frequency with which the offchain data source is checked for deviation against the previously submitted onchain answer.pollTimerDisabled: whether the occasional deviation check is used to trigger new rounds.- Notes:
- For duration parameters, the maximum unit of time is
h(hour). Durations of a day or longer must be expressed in hours. - If no time unit is provided, the default unit is nanoseconds, which is almost never what you want.
- For duration parameters, the maximum unit of time is
Job type specific pipeline variables
$(jobSpec.databaseID): the ID of the job spec in the local database. You shouldn't need this in 99% of cases.$(jobSpec.externalJobID): the globally-unique job ID for this job. Used to coordinate between node operators in certain cases.$(jobSpec.name): the local name of the job.$(jobRun.meta): a map of metadata that can be sent to a bridge, etc.
Keeper jobs
Keeper jobs occasionally poll a smart contract method that expresses whether something in the contract is ready for some onchain action to be performed. When it's ready, the job executes that onchain action.
Examples:
- Liquidations
- Rebalancing portfolios
- Rebase token supply adjustments
- Auto-compounding
- Limit orders
Spec format
type = "keeper"
schemaVersion = 1
evmChainID = 1
name = "example keeper spec"
contractAddress = "0x7b3EC232b08BD7b4b3305BE0C044D907B2DF960B"
fromAddress = "0xa8037A20989AFcBC51798de9762b351D63ff462e"
Shared fields
See shared fields.
Unique fields
evmChainID: The numeric chain ID of the chain on which Chainlink Automation Registry is deployedcontractAddress: The address of the Chainlink Automation Registry contract to poll and updatefromAddress: The Oracle node address from which to send updatesexternalJobID: This is an optional field. When omitted it will be generated
Offchain reporting jobs
Offchain Reporting (OCR) jobs are used very similarly to Flux Monitor jobs. They update data feeds with aggregated data from many Chainlink oracle nodes. However, they do this aggregation using a cryptographically-secure offchain protocol that makes it possible for only a single node to submit all answers from all participating nodes during each round (with proofs that the other nodes' answers were legitimately provided by those nodes), which saves a significant amount of gas.
The node starts offchainreporting jobs only when OCR.Enabled is true. The default is false, and the node then logs Off-chain reporting disabled and registers no delegate.
Bootstrap node
Every OCR cluster requires at least one bootstrap node as a kind of "rallying point" that enables the other nodes to find one another. Bootstrap nodes do not participate in the aggregation protocol and do not submit answers to the feed.
Spec format
type = "offchainreporting"
schemaVersion = 1
evmChainID = 1
contractAddress = "0x27548a32b9aD5D64c5945EaE9Da5337bc3169D15"
p2pBootstrapPeers = [
"/dns4/chain.link/tcp/1234/p2p/16Uiu2HAm58SP7UL8zsnpeuwHfytLocaqgnyaYKP8wu7qRdrixLju",
]
isBootstrapPeer = true
externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F05"
Shared fields
See shared fields.
Unique fields
-
contractAddress: The address of theOffchainReportingAggregatorcontract. -
evmChainID: The chain ID of the EVM chain in which the job will operate. -
p2pBootstrapPeers: A list of libp2p dial addresses of the other bootstrap nodes helping oracle nodes find one another on the network. It is used with P2P networking stack V1 as follows:p2pBootstrapPeers = [ "/dns4/HOST_NAME_OR_IP/tcp/PORT/p2p/BOOTSTRAP_NODE'S_P2P_ID" ] -
p2pv2Bootstrappers: A list of libp2p dial addresses of the other bootstrap nodes helping oracle nodes find one another on the network. It is used with P2P networking stack V2 as follows:p2pv2Bootstrappers = [ "BOOTSTRAP_NODE'S_P2P_ID@HOST_NAME_OR_IP:PORT" ] -
isBootstrapPeer: This must be set totrue.
Job type specific pipeline variables
$(jobSpec.databaseID): The ID of the job spec in the local database. You shouldn't need this in 99% of cases.$(jobSpec.externalJobID): The globally-unique job ID for this job. Used to coordinate between node operators in certain cases.$(jobSpec.name): The local name of the job.$(jobRun.meta): A map of metadata that can be sent to a bridge, etc.
Oracle node
Oracle nodes, on the other hand, are responsible for submitting answers.
Spec format
type = "offchainreporting"
schemaVersion = 1
evmChainID = 1
name = "OCR: ETH/USD"
contractAddress = "0x613a38AC1659769640aaE063C651F48E0250454C"
externalJobID = "0EEC7E1D-D0D2-476C-A1A8-72DFB6633F06"
p2pPeerID = "12D3KooWApUJaQB2saFjyEUfq6BmysnsSnhLnY5CF9tURYVKgoXK"
p2pBootstrapPeers = [
"/dns4/chain.link/tcp/1234/p2p/16Uiu2HAm58SP7UL8zsnpeuwHfytLocaqgnyaYKP8wu7qRdrixLju",
]
isBootstrapPeer = false
keyBundleID = "7f993fb701b3410b1f6e8d4d93a7462754d24609b9b31a4fe64a0cb475a4d934"
monitoringEndpoint = "chain.link:4321"
transmitterAddress = "0xF67D0290337bca0847005C7ffD1BC75BA9AAE6e4"
observationTimeout = "10s"
blockchainTimeout = "20s"
contractConfigTrackerSubscribeInterval = "2m"
contractConfigTrackerPollInterval = "1m"
contractConfigConfirmations = 3
observationSource = """
// data source 1
ds1 [type="bridge" name=eth_usd]
ds1_parse [type="jsonparse" path="one,two"]
ds1_multiply [type="multiply" times=100]
// data source 2
ds2 [type="http" method=GET url="https://chain.link/eth_usd"
requestData="{\\"hi\\": \\"hello\\"}"]
ds2_parse [type="jsonparse" path="three,four"]
ds2_multiply [type="multiply" times=100]
ds1 -> ds1_parse -> ds1_multiply -> answer
ds2 -> ds2_parse -> ds2_multiply -> answer
answer [type=median]
"""
Shared fields
See shared fields.
Unique fields
-
contractAddress: The address of theOffchainReportingAggregatorcontract. -
evmChainID: The chain ID of the EVM chain in which the job will operate. -
p2pPeerID: The base58-encoded libp2p public key of this node. -
p2pBootstrapPeers: A list of libp2p dial addresses of the other bootstrap nodes helping oracle nodes find one another on the network. It is used with P2P networking stack V1 as follows:p2pBootstrapPeers = [ "/dns4/<host name or ip>/tcp/<port>/p2p/<bootstrap node's P2P ID>" ] -
p2pv2Bootstrappers: A list of libp2p dial addresses of the other bootstrap nodes helping oracle nodes find one another on the network. It is used with P2P networking stack V2 as follows:p2pv2Bootstrappers = [ "<bootstrap node's P2P ID>@<host name or ip>:<port>" ] -
keyBundleID: The hash of the OCR key bundle to be used by this node. The Chainlink node keystore manages these key bundles. Use the node Key Management UI or thechainlink keys ocrsub-commands in the CLI to create and manage key bundles. -
monitoringEndpoint: The URL of the telemetry endpoint to send OCR metrics to. -
transmitterAddress: The Ethereum address from which to send aggregated submissions to the OCR contract. -
observationTimeout: The maximum duration to wait before an offchain request for data is considered to be failed/unfulfillable. -
blockchainTimeout: The maximum duration to wait before an onchain request for data is considered to be failed/unfulfillable. -
contractConfigTrackerSubscribeInterval: The interval at which to retry subscribing to onchain config changes if a subscription has not yet successfully been made. -
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.
Job type specific pipeline variables
$(jobSpec.databaseID): The ID of the job spec in the local database. You shouldn't need this in 99% of cases.$(jobSpec.externalJobID): The globally-unique job ID for this job. Used to coordinate between node operators in certain cases.$(jobSpec.name): The local name of the job.$(jobRun.meta): A map of metadata that can be sent to a bridge, etc.
Webhook Jobs
Webhook jobs can be initiated by HTTP request, either by a user or external initiator.
This is an example webhook job:
type = "webhook"
schemaVersion = 1
externalInitiators = [
{ name = "my-external-initiator-1", spec = "{\"foo\": 42}" },
{ name = "my-external-initiator-2", spec = "{}" }
]
observationSource = """
parse_request [type="jsonparse" path="data,result" data="$(jobRun.requestBody)"]
multiply [type="multiply" input="$(parse_request)" times="100"]
send_to_bridge [type="bridge" name="my_bridge" requestData="{ \\"result\\": $(multiply) }"]
parse_request -> multiply -> send_to_bridge
"""
All webhook jobs can have runs triggered by a logged in user.
Webhook jobs may additionally specify zero or more external initiators, which can also trigger runs for this job. The name must exactly match the name of the referred external initiator. The external initiator definition here must contain a spec which defines the JSON payload that will be sent to the External Initiator on job creation if the external initiator has a URL. If you don't care about the spec, you can simply use the empty JSON object.
Unique fields
externalInitiators- an array of{name, spec}objects, wherenameis the name registered with the node, andspecis the job spec to be forwarded to the external initiator when it is created.
Shared fields
See shared fields.
Job type specific pipeline variables
$(jobSpec.databaseID): the ID of the job spec in the local database. You shouldn't need this in 99% of cases.$(jobSpec.externalJobID): the globally-unique job ID for this job. Used to coordinate between node operators in certain cases.$(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 or VRF V2Plus task to generate the proof.
Spec format
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.
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 tominIncomingConfirmations, before fulfilling a request. Defaults to0.requestTimeout: optional. The timeout for a request. Defaults to 24 hours.gasLanePrice: optional. The gas lane price for this job. If the keys infromAddressesdo 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 to20.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 ifbatchFulfillmentEnabledistrue.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 theVRFOwnercontract 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 (indexedfields).
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
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.
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 theBlockhashStorecontract to store blockhashes into.trustedBlockhashStoreAddress: the address of the trustedBlockhashStorecontract 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
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.
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 theBlockhashStorecontract to store blockhashes into.batchBlockhashStoreAddress: the address of theBatchBlockhashStorecontract 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
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.
Unique fields
relay: the relay identifier inRelayID.Networkform, for exampleevm.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 thechainIDkey insiderelayConfig.relayConfig: relay-specific configuration.p2pv2Bootstrappers: a list ofpeer_id@ip_address:portstrings 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 examplemedian.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
type = "bootstrap"
schemaVersion = 1
name = "bootstrap"
relay = "evm"
contractID = "0x613a38AC1659769640aaE063C651F48E0250454C"
[relayConfig]
chainID = "1"
Shared fields
See shared fields.
Unique fields
relay: the relay identifier inRelayID.Networkform, for exampleevm.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
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.
Unique fields
streamID: optional. The stream ID that receives the final output of the pipeline run. Tasks in the pipeline may also carry astreamIDtag. 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 for the meaning of each setting.
Spec format
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.
Unique fields
gatewayConfig: the gateway configuration. It holds aConnectionManagerConfigblock, aNodeServerConfigblock, aUserServerConfigblock, anHTTPClientConfigblock, and a list ofDons.
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
type = "standardcapabilities"
schemaVersion = 1
name = "some-capability"
forwardingAllowed = false
command = "/home/capabilities/some_capability_linux_amd64"
config = ""
Shared fields
See 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 ofpeer_id@ip_address:portstrings 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.